\documentclass[12pt,a4paper,russianb]{book}
\usepackage{amssymb,amsmath}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
 \textwidth=16cm
 \textheight=25cm
 \voffset=-25mm
 \hoffset=-5mm
 \renewcommand{\cleardoublepage}{\clearpage}
 \renewcommand{\chaptername}{Глава}
 \makeatletter
 \renewcommand{\l@section}{\@dottedtocline{1}{1.5em}{3em}}
 \renewcommand{\l@subsection}{\@dottedtocline{2}{3.8em}{3.8em}}
 \makeatother
 \begin{document}
 \begin{titlepage}
 \vspace{2cm}
 \begin{center}
 {\Large\bf А.С.Подколзин}
 \end{center}
\vspace{5.5cm}
 \begin{center}
 {\huge\bf Компьютерное моделирование \\[10pt] логических процессов}
 \end{center}
 \vspace{2cm}
 \begin{center}
 {\LARGE Архитектура и языки решателя задач}
 \end{center}
 \vspace{7cm}
 \begin{center}
 {\LARGE\bf 2007 г.}
 \end{center}
 \end{titlepage}

 \frontmatter
 \vspace*{2cm}
 \begin{center}
 {\huge\bf Введение}
 \end{center}
 \vspace{0.6cm}
 Прогресс в развитии вычислительной техники неоднократно приводил
 к активизации исследований по искусственному интеллекту. Наиболее
 важными рубежами здесь являются пери\-од первого появления электронных
 вычислительных машин и пери\-од распространения
 персональных компьютеров. Вычислительная техника стала широ\-ко
 доступной, а программирование приобрело массовый характер.
 Несмотря на это, искусственный интеллект так и не появился, а
 первоначальный оптимизм в отноше\-нии перспектив его создания стал
 постепенно вытесняться пессимизмом. Успехи и неудачи в
 программировании определяются на сегодняшний день границей,
 отде\-ля\-ю\-щей те области, в которых имеются эффективные алгоритмы
 для решения за\-дач, от областей, для которых эти алгоритмы не
 созданы. К числу последних относятся, к сожалению, не только
 творческая деятельность, но даже такие "простейшие" \ спо\-соб\-нос\-ти
 человека, как понимание естественного языка и изображений. Успехи
 здесь пока достаточно скромны.

 Вместе с тем, отсутствие простого общего алгоритма решения задач
 в ка\-кой-либо из трудных для программирования областей, например,
 школьной геометрии, не является препятствием для решения таких задач
 человеком. Хотя общего алгоритма в учебниках и нет, но в каждом
 отдельном случае логика принятия решения вполне поддается анализу
 и объяснению. Обучаясь на сотнях и тысячах примеров, постоянно
 пополняя и корректируя свои умения, человек постепенно
 аккумулирует в себе не\-об\-хо\-ди\-мый ему алгоритм, нигде не
 изложенный в явном виде. Чтобы получить ана\-ло\-гич\-ный алгоритм в
 компьютере, остается только следовать этому примеру. Видимо, это
 и есть реальный способ создавать программы "там, где нет
 алгоритмов". Если не овладеть таким искусством, то никакое,
 даже самое впечатляющее, развитие вы\-чис\-ли\-тельной техники
 сколь-нибудь существенным образом положения дел с искус\-ст\-вен\-ным
 интеллектом не улучшит.

 Алгоритмы, извлекаемые человеком из процесса обучения на примерах,
 силь\-но отличаются от алгоритмов обычного программирования. Прежде
 всего, они почти лишены циклов - на каждом шаге для решения
 задачи привлекаются какие-то новые знания и приемы, зачастую из
 совершенно различных областей. Алгоритмы эти плохо
 декомпозируются на блоки. Скорее, они представляют собой что-то
 типа век\-тор\-но\-го поля приемов, в котором перемещается решаемая
 задача и которое созда\-ет\-ся путем длительной трудоемкой дрессировки.
 Срабатывание каждого приема про\-дви\-гает задачу на один шаг вперед
 по ее траектории. До тех пор, пока не получено до\-ста\-то\-чно полной
 коллекции приемов, обеспечивающей с большой вероятностью
 "цепную ре\-ак\-цию" \ процесса решения задачи, эти алгоритмы
 практически бесполезны. А так как обычно критический минимум достаточно
 велик и насчитывает многие тысячи элементов, то возникает серьезный
 психологический барьер - у программиста пос\-ле проработки первых сотен
 задач может возникнуть впечатление, что проект без\-на\-де\-жен и его
 следует бросить.

 Еще одно отличие алгоритмов рассуждений от алгоритмов вычислений
 связано со способом кодирования информации. Вычислительная программа
 обычно исполь\-зу\-ет технические структуры данных, семантика которых
 остается за кадром, так как непосредственно при вычислениях не
 нужна. Приемы интеллектуальной сис\-те\-мы анализируют задачу независимо
 друг от друга, и чтобы они могли понимать текущий контекст,
 необходимо сохранить всю его семантику, используя для представле\-ния
 данных универсальный логический язык. Решение трудных для алгоритмизации
 задач - это почти всегда процесс преобразования логических структур
 данных или, иными словами, логический процесс.

 История развития математики тесно связана с изучением процессов
 различ\-ных типов. Многие разделы классической "непрерывной" \
 математики, и в первую оче\-редь теория дифференциальных уравнений,
 возникли для изучения физических про\-цессов. Изучение процессов обработки
 дискретной информации в электронике при\-ве\-ло к появлению теории автоматов
 и других разделов математической кибернетики. К сожалению,
 логические процессы оказались настолько сложны, что попытки
 изуче\-ния их математическими методами так и не привели к созданию
 эффективных ре\-ша\-телей в сколь-нибудь нетривиальных областях.
 Поэтому единственным подходом к созданию науки о логических процессах
 на сегодняшний день остается компьютер\-ное моделирование, т.е.
 указанная выше дрессировка "логических векторных по\-лей" \ на потоках
 обучающих примеров.

 Создание больших решателей вручную чрезвычайно трудоемко, так
 как тре\-бу\-ет постоянной регулировки взаимодействий в многотысячной
 системе активных эле\-мен\-тов. Такие решатели, как правило, изначально
 не очень качественные и требу\-ют последующей, еще более трудоемкой
 оптимизации. Однако, они дают матери\-ал, позволяющий начать
 исследования по автоматизации синтеза приемов и само\-раз\-ви\-тию
 "логических векторных полей", без которого невозможно было бы
 созда\-ние подлинно интеллектуальной системы. Объектом изучения
 здесь являются процес\-сы синтеза алгоритмов по теоремам и процессы
 автоматического развития тео\-рий, ориентированного на синтез алгоритмов.
 Это - еще одна разновидность логичес\-ких процессов.

 Данная монография описывает многолетний опыт компьютерного моделиро\-ва\-ния
 логических процессов, в результате которого возникла развитая
 технология обуче\-ния решателей. Обучение компьютерной системы
 предпринималось в различных областях математики и в элементарной физике.
 Моделировались также логичес\-кие процессы, возникающие при анализе
 текстов естественного языка, анализе изо\-бра\-же\-ний и принятии
 решений в игровых ситуациях. Всего было проработано около 9 тысяч
 задач и создано около 25 тысяч приемов. Поведение системы в
 тех областях, где был накоплен необходимый критический минимум
 приемов, выглядит впол\-не целесообразным и доказывает правильность
 предлагаемого подхода. Ход рассуж\-де\-ний демонстрируется по шагам,
 причем во многих разделах уровень слож\-нос\-ти решаемых задач достаточно
 серьезен.

 Материал монографии разбит на три книги. Данная, первая книга
 посвя\-ще\-на общему описанию архитектуры компьютерной системы и
 языкам программирова\-ния, созданным для ускорения процесса
 обучения. Эти языки, ЛОС (Логический Описатель Ситуаций) и
 ГЕНОЛ\'ОГ (ГЕНетический язык ЛОГического про\-грам\-ми\-ро\-вания),
 подняли обучение решателей практически до уровня формулировки
 ма\-те\-ма\-ти\-ческих теорем. Первый из них - чуть выше уровня ПРОЛОГ'а,
 второй - относится к первому примерно так же, как ПРОЛОГ к
 ассемблеру. Планиру\-ет\-ся выпуск второй и третьей книг.
 Вторая книга будет посвящена описанию собст\-вен\-но решателей;
 одновременно она может рассматриваться как курс программирования на
 ГЕНОЛОГе. Наконец, третья книга включит в себя материал,
 связанный с вопро\-са\-ми автоматического развития решателей и
 автоматизации теоретических исследований.

 К книге прилагается диск, на котором находится текущая версия
 системы. Для установки системы на компьютере нужно создать новую
 папку, скопировать в нее содержимое папки LOGSYST с диска, и
 вынести ярлык "ЛСИ" \ на рабочий стол. Со\-дер\-жимое первой книги
 позволяет научиться пользоваться решателем в тех разделах, где он
 достаточно "укомплектован" \ приемами.

 Однако, система никоим образом не претендует на роль коммерческой
 программы. Скорее, она представляет собой попытку создания среды
 программирования для обучения интеллектуальной системы, интегрирующей
 в себе знания из множества различных областей, способной к проведению
 самостоятельных исследований и саморазвитию. Архитектура системы
 допускает увеличение ее сегодняшних размеров (около 60 Мб)
 в тысячи раз без сколь-нибудь значимого замедления для уже
 освоенных разделов. Совместная работа над развитием универсального
 интеллектуального комплекса представляется единственно возможным
 способом объединения усилий многих исследователей в создании
 науки о логических процессах. Только таким образом можно
 обеспечить появление единой логической формализации по\-ня\-тий и
 добиться разумного взаимодействия приемов в рамках общего
 "логи\-чес\-ко\-го векторного поля". Получение широкого спектра
 основанных на единой техно\-ло\-гии решателей является необходимой
 предпосылкой для проведения исследо\-ва\-ний по автоматическому
 их синтезу.

 Обучение логической системы требует постоянного развития
 программ интер\-фей\-сов и компилятора. Вторая половина книги (начиная с
 главы 13) содержит достаточно подробное описание этих программ. Она
 будет необходима тем, кто захочет проводить самостоятельные
 исследования по моделированию логических процессов. При чтении этой
 части книги нужно иметь перед собой соответствующий раздел программы,
 отображаемый на экране компьютера. Представленный здесь материал имеет
 чисто справочный характер, и для начала работы вполне достаточно извлечь
 из него лишь общее представление об архитектуре программ.

 Проработав сравнительно полно ряд разделов элементарной
 математики, автор взялся за развитие решателей в целом ряде новых
 разделов, не собираясь своими силами доводить их до конца, а лишь
 с целью преодолеть стартовые трудности и предоставить тем,
 кто захотел бы продолжить исследование логических процессов,
 возможно более благоприятные исходные позиции.

 Как и всякая большая программа, к тому же созданная единственным
 про\-грам\-мис\-том, решатель, вероятно, имеет множество недостатков и
 ошибок. Автор зара\-нее приносит за них свои извинения. Однако, будучи
 первой попыткой в развитии но\-вых технологий, этот решатель, все же,
 заслуживает определенного снисхождения.

 В заключение автор выражает искреннюю благодарность В.Б.Кудрявцеву,
 под\-держ\-ка которого сделала возможным проведение данного исследования.

 \mainmatter

 \tableofcontents
  \chapter{Общие замечания о логических процессах и их моделировании}
 Логические процессы играют исключительно важную роль в поведении
 любой интел\-лектуальной системы. Они необходимы для распознавания
 зрительных либо звуковых образов, для управления динамикой системы,
 для понимания языка, планирования действий, анализа потока событий,
 решения технических и теоретических задач. Хотя основной объем
 обработки информации во многих случаях берут на себя сред\-ства
 автоматики, использующие не логические, а "технические" \ структуры
 дан\-ных, логика играет роль диспетчера, организующего и контролирующего
 работу этой автоматики, а в необходимых случаях обеспечивает ее
 развитие. В тех случаях, когда для решения задачи имеется заранее
 выработанный план действий, обычно логический вывод не требуется -
 вместо него создается специализированный вычис\-лительный алгоритм.
 Это обычный и хорошо известный путь развития программи\-рования,
 на котором создаются различные системы численного моделирования,
 ком\-пиляции и оптимизации технических проектов, управления
 сложными системами и т.п. Потребность в логических процессах
 появляется лишь при отсутствии известного заранее плана действий.
 Тогда планирование действий происходит непосредственно во время
 решения задачи, причем для обеспечения возможности нахождения
 прием\-лемых вариантов система должна располагать достаточно обширным
 и разнообраз\-ным запасом знаний. Использование того или иного
 элемента этого запаса знаний заранее непредсказуемо - задача из
 одной предметной области может потребовать для своего решения
 весьма удаленных от этой области идей. По этой причине, вряд ли
 возможно создавать подлинно интеллектуальные системы для
 ограниченных классов задач - например, только для распознавания
 изображений, или только для понимания естественного языка, или
 только для написания программ, синтеза "чип"ов, и т.д. Чтобы
 достаточно эффективно действовать хотя бы в одной из таких
 областей, необходимо заложить в интеллектуальную систему
 универсальное "фундаменталь\-ное" \  образование, как это и
 происходит обычно при обучении человека. Уже один только
 количественный аспект этой не решенной на сегодняшний день
 задачи далеко выводит ее за рамки трудностей традиционного
 программирования. Заметим, что даже в случае обучения человека,
 с отлаженной и оптимизированной веками системой образо\-вания,
 процесс подготовки полноценного специалиста (с учетом весьма
 су\-щест\-вен\-ного дошкольного периода) занимает более 20 лет.

 Попытки исследования логических процессов математическими
 методами привели к появлению и развитию такой науки, как
 математическая логика. В ее рамках удалось дать точные
 определения фундаментальным понятиям логического языка,
 аксиоматической теории, формального доказательства, алгоритма
 решения задачи, сложности вычислительной процедуры. Был накоплен
 значительный запас математи\-ческих результатов, характеризующих
 общие свойства этих понятий. Возникли новые представления о
 математической строгости и формализации теорий, которые при\-ве\-ли
 к переизложению многих разделов математики в виде формальных
 дедуктивных систем. Изучение общих свойств этих формальных
 теорий методами математической логики позволило решить ряд
 важных общематематических проблем: доказать не\-за\-висимость
 континуум - гипотезы; установить алгоритмическую неразрешимость
 дио\-фантовых уравнений и др. Однако, основные продвижения
 математической логики оказались связаны не столько с логической
 "динамикой", сколько с логической "ста\-тикой". Несмотря на
 интенсивные исследования в области процедур автоматического
 доказательства теорем, не удалось не только предложить эффективно
 работающие общие процедуры решения задач, но даже найти общие
 принципы, на основе которых такие процедуры могли бы быть созданы.
 Основной проблемой, с которой здесь пришлось столкнуться, явилась
 проблема трудоемкости поиска решения задачи по деревьям прямого
 либо обратного логического вывода, экспоненциально возрастаю\-щей с
 ростом глубины поиска. Всевозможные результаты по отсечению
 ветвей рас\-смат\-риваемого дерева для уменьшения объема перебора
 и различные эвристичес\-кие общие принципы упорядочения перебора
 не изменили ситуации сколь-нибудь ощутимым образом.

 В сложившейся ситуации, когда поиски математических методов,
 позволяю\-щих создавать эффективные решатели задач, фактически
 зашли в тупик, единственной возможностью создания таких
 решателей становится компьютерное моделирование логики рассуждений
 человека. Компьютерная модель здесь должна сыграть роль
 "микроскопа" \ для изучения процессов поиска решения и
 самообучения, с помощью которого были бы выявлены
 фундаментальные принципы их организации. Возмож\-но, что
 по мере развития такой "экспериментальной" \ теории
 логических про\-цес\-сов вновь окажутся востребованы и математические
 методы исследования.

 Компьютерное моделирование логических процессов естественно
 начинать с моде\-лирования автоматики, управляющей ходом рассуждений,
 остав\-ляя пока в сторо\-не значительно более сложные процессы
 саморазвития этой автоматики. Чтобы раз\-ра\-ба\-тывать
 механизмы самообучения и самопроектирования, необходимо преж\-де
 всего получить определенный запас созданных вручную "эталонных" \
 алгоритми\-чес\-ких конструкций, моделирующих процессы решения задач.
 По-видимому, без та\-ких "образцов для подражания" \ трудно
 определить необходимый для эффектив\-но\-го функ\-ционирования
 запас архитектурных стандартов, который могла бы исполь\-зо\-вать
 процедура самопрограммирования системы. Многократно предпринимав\-ши\-еся
 ранее попытки создания саморазвивающихся интеллектуальных
 систем, основан\-ных на тех или иных простых общих принципах,
 без анализа реальной логической авто\-ма\-ти\-ки во всей ее сложности
 и разнообразии, оказывались вполне бесплодными.

  В самых общих чертах, процесс расшифровки логической автоматики,
  обеспечива\-ющей решение задач в некоторой предметной области,
  можно представить происходя\-щим по следующей схеме.
  Рассматривается некоторая обучающая последователь\-ность задач в
  этой области, решение которых известно эксперту, осуществляю\-ще\-му
  развитие компьютерной модели. Предпринимается анализ траектории
  решения очередной зада\-чи из выбранной последовательности.
  Если эта задача не представ\-ля\-ет собой простей\-ший тест, для которого
  имеется заранее известный стандартный план действий, то процесс
  ее решения складывается из отдельных этапов, состоя\-щих из
  локального планирования и реализации выработанного плана
  действий. Каждый такой этап локального планирования
  анализируется, и для него предлагается неко\-то\-рый гипоте\-тический
  алгоритм, приводящий в рассматриваемой ситуации к тому же результату.
  Эти алгоритмы накапливаются в компьютерной модели, так что в
  новой задаче некоторые из них могут сработать и предложить свою
  версию раз\-ви\-тия решения. Каждое такое срабатывание анализируется
  на предмет целесообразности, и в решаю\-щие правила алгоритма
  локального планирования вводятся необходи\-мые коррективы. Эта
  процедура повторяется для многих сотен задач предметной области
  - до тех пор, пока сложившаяся мозаика алгоритмов локального
  планирования дейст\-вий не обнаружит достаточно устойчивого и
  эффективного поведения. В целом, процесс напоминает обучение
  нейросистемы методом "поощрений и наказаний"; от\-ли\-чие сос\-тоит
  лишь в более сложной процедуре коррекции, которая не сводится к
  изменению каких-либо числовых параметров, как у нейрокомпьютера,
  а требует привлечения логики для очередного перепроектирования
  алгоритмов планирования.

  Многообразие алгоритмов локального планирования создает своего
  рода "логи\-чес\-кое векторное поле", в котором перемещается
  решаемая задача - от исходной формули\-ровки к ответу. Разумеется,
  это лишь упрощенная аналогия; отдельные шаги в таком перемещении
  могут представлять собой целые иерархии вложен\-ных логических
  проце\-ссов, с различными циклами ограниченного поиска и отбора.
  Од\-на\-ко, она отражает главное обстоятельство: по завершении
  реализации каждого ло\-каль\-но\-го плана пред\-принимается
  независимое рассмотрение всей текущей ситуации заново, для
  выработки следующего плана. К сожалению, на сегодняшний день
  не известно другого способа создания эффективных "логических
  векторных полей" \ автоматического решения за\-дач, кроме весьма
  трудоемкого процесса их дресси\-ров\-ки на тысячах обучающих
  примеров.

  Так как алгоритмы локального планирования (для краткости,
  далее условимся называть такие алгоритмы приемами решения задач)
  берут всю инициативу на себя, не имея какого-либо стоящего над
  ними управляющего центра (ведь никто, кроме конкретного приема,
  и не располагает достаточной для принятия решения в области его
  компетенции информацией), то особо важную роль приобретает
  точный учет взаимодействий различных приемов в цепи решения задачи.
  Трудоемкость этого учета, в среднем, должна быть пропорциональна
  квадрату числа приемов, по крайней мере в той предметной области,
  где проводится обучение. Разу\-меется, адекватно большим должен
  быть и обучающий материал - иначе качество работы решателя будет
  весьма посредственным. По-видимому, единственной возмож\-ностью
  преодоле\-ния этого недостатка логической автоматики (как и вообще
  любой автоматики, огра\-ни\-ченной определенными разумными рамками)
  является развитие средств ее авто\-ма\-ти\-ческого пополнения и
  оптимизациии, которые подключались бы при решении зада\-чи по мере
  надобности. Анализ многих и многих математических задач так
  называе\-мого "нестандартного характера" \ показывает, что выход за рамки
  накопленных за\-па\-сов приемов (обычно связанный с попыткой
  скомби\-нировать несколько известных теорем и извлечь из них
  новую идею) является, в общем, обыденным явлением и даже по
  своей трудоемкости иногда вполне сопоставим с работой автоматики
  стандарт\-ных приемов. Впрочем, автоматика мышления в поведении любых
  интеллектуальных систем играет огромную роль, и лишь в ситуациях
  "аварий\-ного" \ типа включаются дополняющие ее средства более
  высоких уровней.

  Описанная выше общая схема моделирования логической автоматики
  была реали\-зована на примере процессов решения математических задач.
  Причины, по кото\-рым на первом этапе была рассмотрена математика,
  вполне понятны: именно в ней при решении задач возникают
  наиболее сложные и разнообразные ло\-ги\-ческие процес\-сы, причем
  имеются огромные запасы обучающего мате\-ри\-ала. В последнее
  время начато моделирование логических процессов и в ряде
  нематематических областей. Было проработано свыше 9 тысяч задач из таких
  разделов, как элементар\-ные алгебра и геометрия,
  математический анализ, аналитическая геометрия, линейная
  ал\-геб\-ра, дифференци\-альные уравнения, теория вероятностей,
  комплексный анализ, эле\-мен\-тар\-ная физика, школьные текстовые задачи
  (с синтаксическим и семантичес\-ким анализом текста). На основе этого
  обучающего материала сформирована база прие\-мов решателя задач,
  насчитывающая в настоящее время более 25 тысяч приемов.
  Фактически, возникла мощная система символьной компьютерной
  математики но\-во\-го типа, позволяющая не только получать ответы,
  но и прослеживать ход решения по шагам, а при необходимости
  вмешиваться в процесс решения. В отличие от тра\-ди\-ци\-он\-ных
  систем компьютерной математики, где накапливались тысячи
  функций для пользователя, который должен был вручную находить
  их в каталоге системы и применять к текущей задаче, новая
  система накапливает тысячи приемов, которые самостоятельно
  анализируют задачу и принимают решение о выполнении
  преобразо\-ваний. Пользователь здесь может вообще не
  интересоваться содержимым базы прие\-мов. Разумеется, это более
  высокая степень автоматизации, и как следствие нового подхода,
  системе становятся доступны значительно более сложные задачи.
  Преиму\-щества нового подхода становятся особенно заметны в тех
  разделах, где велика роль логического вывода. В элементарной
  алгебре это решение уравнений и неравенств с параметрами; в
  математическом анализе - качественное исследование функций с
  помощью пределов и производных, исследование сходимости рядов,
  вычисление кратных интегралов и применение их для нахождения
  площадей и объемов. Разумеет\-ся, наиболее интересными с точки
  зрения моделирования логических процессов оказа\-лись элементарная
  и аналитическая геометрии. В распространенных системах
  ком\-пью\-терной математики эти разделы представлены совсем слабо,
  причем элементар\-ная геометрия по существу отсутствует, а
  аналитическая - связана лишь с выполне\-нием стандартных операций
  явно одношагового характера.

  Работа над моделированием процессов решения математических задач
  потребова\-ла создания целого технологического комплекса, позволившего
  существенно прибли\-зить язык для программирования приемов к языку для
  формулировки теорем пред\-метной области. Фактически, прием задается
  как теорема, снабженная системой указателей для компилятора,
  генерирующего на основе этой теоремы программу приема. Задачей
  компилятора является синтез такой программы, которая была бы
  способна усматривать возможность применения теоремы даже в неявных,
  "замаски\-рованных" \ ситуациях, оценивать целесообразность такого
  применения и осущест\-влять его. Программирование приемов имеет
  рекурсивный характер: в описании приема допускаются обращения к
  всевозможным вспомогательным процедурам и задачам, применяемым к
  фрагментам теоремы. Это означает, что при реализации приема может
  быть использована не только та теорема, на которой он основан, но
  и сотни других теорем, востребованных его вспомогательными операторами.
  Ис\-поль\-зо\-вание стандартной математической записи для изображения
  теоремы при\-ема, а также соп\-ро\-вождение геометрических теорем
  чертежами позволили прибли\-зить наглядность опи\-сания приема к
  наглядности текста решаемой задачи. Сочетание этой наглядности
  с развитием системы семантической трассировки процесса ре\-ше\-ния,
  выдающей на экран подробные объяснения выполняемых преобразований,
  зна\-чи\-тельно уменьшило трудоемкость процесса анализа решений и
  коррекции приемов. Вместе с тем, новый язык для записи приемов не
  просто создает определен\-ные преимущества для процесса обучения решателя.
  В действительности, его при\-бли\-женность к логическому языку
  предметной области ориентирована в первую очередь на последующие
  исследования в области автоматического синтеза приемов; на весь
  круг проблем, относящихся к пограничному слою между логикой и
  алгоритмами.

  Фактически, развитие техники обучения сделало доступным продолжение
  обуче\-ния системы ее пользователям - так же, как и в случае обычных
  систем компьютер\-ной математики, которые предоставляют пользователю
  средства для программирова\-ния новых функций. Отличие здесь заключается
  в том, что вместо мало приспо\-соб\-лен\-ных для логических процессов
  традиционных средств процедурного про\-грам\-ми\-рова\-ния развит мощный
  комплекс программиро\-ва\-ния продукционного. Чтобы срав\-нить уровень
  используемого языка с уровнем известного языка логического
  про\-грам\-ми\-ро\-вания "ПРОЛОГ", заметим лишь, что программы на
  промежуточном языке уровня "ПРОЛОГ"а возникают как результат компиляции
  описания приема; ест\-ест\-венно, они значительно больше и, в сравнении с
  первоначальным описанием, совершенно "нечитабельны".

  Собственно работе по моделированию логических процессов в математике
  пред\-шес\-твовало решение ряда важных технических проблем, определившее
  общую ар\-хи\-тек\-ту\-ру компьютерной системы. Прежде всего, необходимо
  было выбрать логичес\-кий язык для представления задач. Разумеется, для
  адекватного моделирования процессов решения такой язык должен быть
  возможно более приближен к "ест\-ест\-венному" \ мате\-матическому языку.
  Языки математической логики, создававшиеся для теоретическо\-го
  исследования свойств аксиоматических теорий, обычно вводи\-лись
  как можно менее избыточным образом - для упрощения связанных с
  с ними формулировок теорем и доказательств этих теорем.
  Использование таких языков в решателе привело бы к неоправданному
  усложнению формулировок и повлекло бы существенные расхожде\-ния
  между моделью и моделируемым процессом. Фактически, оказалось,
  что несмотря на огромное количество работ в математической
  логике, посвященных формализации различных разделов математики,
  никакой практически пригодной формализации "сквозного" \ характера,
  сохраняющей все введенные для удобства логических вычисле\-ний
  в обычной математической практике условнос\-ти, создано не было.
  Поэтому для решателя пришлось создавать свой собственный ло\-ги\-ческий
  язык, пополняемый по мере проработки новых предметных областей.
  Одним из важных наблюдений, которые здесь были сделаны,
  оказался определенный кон\-фликт между требованиями к языку,
  предъявляемыми к нему традиционными для формальной логики
  соображе\-ниями логической аккуратности с одной стороны, и
  соображениями вычислительной целесообразности - с другой.
  Аккуратная логичес\-кая запись иногда становится избы\-точно громоздкой,
  и в определенных контекстах ее можно заменить упрощенными суррогатами,
  достаточными для корректных вы\-чис\-лений. Возникло, таким образом,
  явление "контекстной семантики" \ языка, ко\-гда смысл того или иного
  утверждения задачи определяется лишь в контексте всей задачи в целом.
  Простейшим примером такого рода является обычное использование
  в математическом анализе утверждений вида $f(x)= O(g(x))$,
  для понимания смысла которых в контекс\-те должно содержаться
  что-нибудь вроде $x \to 0$.

  Учет контекста при обработке логических структур данных позволяет
  вводить в язык различного рода нечеткие понятия, что часто бывает
  необходимо в немате\-ма\-ти\-ческих областях. Для уточнения их смысла в
  конкретной ситуации можно обращать\-ся к сопровождающей информации -
  как логической, так и технической (например, анализировать
  изображения, протоколы и т.п.). Разумеется, какие-либо формальные
  аксиоматические теории для таких понятий будут отсутствовать,
  однако в про\-цес\-се "дрессировки" \ системы на обучающем материале
  можно выработать достаточно хоро\-шие алгоритмические правила
  правдоподобных рассуждений, аппрок\-си\-ми\-ру\-ю\-щие действия эксперта.
  Таким образом, созданный аппарат обучения баз приемов никоим
  образом не ограничен рамками хорошо формализованных предметных
  об\-лас\-тей. Нача\-тый при рассмотрении математических задач процесс
  создания неко\-то\-ро\-го всеобъем\-лющего логического языка, используемого
  решателем, предполагает продолжение и на нематематические
  области, включающие нечеткие понятия и не\-чет\-кие рассужде\-ния.
  Для работы с нечеткой логикой, по-видимому, потребуются адаптивные
  алгорит\-мичес\-кие конструкции, компенсирующие нечеткость понятий
  ак\-куратным учетом контекста и накапливающие "четкие" \ аппроксимации
  нечет\-ких понятий в виде слож\-ных логичес\-ких описаний образов,
  стоящих за такими по\-ня\-ти\-ями. Заметим, наконец, что работа над
  указанной выше широкой логической фор\-ма\-ли\-зацией, с развитием
  многообразия сопутствующих приемов, совершенно не\-об\-хо\-дима для
  создания системы, способной адекватно понимать естественные языки.

  Чтобы при обучении решателя легко распознавались отклонения его
  реального поведения от желаемого, необходима хорошая визуализация
  процесса решения. В частности, при отображении на экране
  математических утверждений, сформулиро\-ван\-ных на внутреннем
  логическом языке решателя, необходим перевод этих утверж\-дений на
  язык общепринятой математической символики. Обратный перевод
  также является весьма существенным, так как ускоряет ввод нового
  обучающего материала и новых приемов. В системе реализован
  редактор математических формул, обеспечи\-вающий быстрый ввод
  математических утверждений и выражений, а также осущест\-вляющий
  перевод во внутреннее логическое представление и обратно.
  Размеры эле\-мен\-тов вводимой формулы определяются и корректируются
  в процессе ввода автома\-тически; широко используется ввод
  длинного термина с помощью нескольких нажа\-тий клавиш (в большинстве
  случаев - первые две-три буквы термина). Это позволяет набирать даже
  весьма громоздкие на вид выражения с помощью сравнительно малого
  числа нажатий клавиатуры. Так как для подавляющего большинства
  рассматрива\-емых в неэлементарной математике понятий не предусмотрена
  специальная символи\-ка, пришлось вводить в формульном редакторе
  словесное их представление (как правило, такое понятие $F$ используется
  в скобочной записи вида $F(t_1, \cdots, t_n)$). Логика действий
  формульного редактора достаточно сложна, и хотя он реализован в духе
  обычного процедурного программирования, но фактически сам является
  небольшим решателем. По-видимому, для увеличения динамики
  обмена информацией с системой было бы полезно более явным образом
  ввести логические процессы в процедуры визуализации и перевода
  формульно-графических данных на внутренний язык, обу\-чая
  соответствующие редакторы примерно так же, как обучаются решатели задач.

  Следующий вопрос после выбора логического языка - формализация
  понятия задачи, достаточная для работы с обучающим материалом.
  На начальном этапе исследований по искусственному интеллекту
  предпринимались многочисленные по\-пытки дать математически строгие
  определения понятия задачи, решения задачи и ответа на задачу.
  В самом общем виде, задача представлялась как логическое условие
  $P(x)$ на элементы $x$ некоторого универсального множества объектов
  $U$; ответ на задачу - как утверждение логического языка, определяющее
  в некоторых "явных" тер\-минах конкретный элемент $x$ множества $U$,
  для которого $P(x)$ истинно; решение задачи - как цепочка
  преобразований исходного условия, преобразующая его к виду ответа.
  Вводя в универсум $U$ классы объектов, в таком виде легко представить
  не только задачу поиска единственного элемента некоторого множества,
  удовлетворяю\-щего заданному условию, но и задачу описания всех таких
  элементов. Однако, это простое и, казалось бы, весьма общее
  представление о задаче сразу же сталкивается с трудностями при
  сопоставлении его даже с простейшими реальными задачами по
  элементарной алгебре. Так, при решении задачи на упрощение
  алгебраического выражения вовсе не накладывается какого - либо
  строгого ограничения $P(x)$ на предъявляемый школьником ответ $x$ -
  например, не требуется предъявления доказа\-тельства того, что
  этот ответ минимален по числу символов или по какому-либо
  другому функционалу сложности выражения. Все, что в таких
  случаях требуется - это применять определенный запас стандартных
  приемов упрощения до тех пор, пока дальнейшие попытки не будут
  давать каких-либо улучшений, и выдать полученное выражение в
  качестве ответа. Этот и другие примеры приводят к выводу, что
  более адекватным является представление о задаче, как о сочетании
  некоторого строгого условия на допустимость ответа с рядом целевых
  установок на его оптимизацию, учиты\-ваемых при решении по мере
  возможности. Тогда понятие ответа становится "субъек\-тивным",
  зависящим от уровня обученности системы. Впрочем, при акку\-рат\-ной
  фор\-мализации целевых функционалов появляется возможность некоторой
  "объек\-ти\-виза\-ции", заключающейся в последовательном обучении или
  самообучении для повыше\-ния качества ответов.

  Даже в хорошо формализованных областях, реально используемое
  понятие задачи является в значительной степени нечетким. Целевая
  установка на проведение исследо\-вания в математике, или задание на
  разработку проекта в технике, как правило, требуют существенного
  доопределения, опирающегося на всю сумму знаний из рас\-сматриваемой
  области. Значительную часть таких знаний составляют различного
  рода условности и эвристические приемы, необходимые для адекватной
  расшифровки и уточнения задания уже в процессе его реализации.
  Поэтому при разработке архи\-тектуры решателя следует в первую
  очередь четко определить лишь структуры данных, которые будут
  определять "текущее состояние" \ задачи в процессе ее ре\-ше\-ния, а
  допустимые шаги преобразования задачи и способ усмотрения ответа
  на нее, дости\-гаемого в конце цепочки таких преобразований, уточнять
  по мере прора\-бот\-ки кон\-кретного обучающего материала.

  Применительно к логическим процессам, понятие задачи должно быть
  определен\-ным образом ограничено. Если речь идет о разработке
  технической системы, написа\-нии программы, составлении плана
  действий и т.п., то синтезируемый объект обычно задается не на
  логическом, а на специализированном техническом языке. Такое
  зада\-ние часто имеет иерархический характер, причем на каждом уровне
  структуры дан\-ных приспособлены для быстрых вычислений, необходимых
  при компиляции и опти\-мизации проекта. Собственно логические
  процессы возникают тогда, когда заранее созданных средств
  вычислительной автоматики оказывается недостаточно. В этом
  случае из всего контекста технической информации извлекаются
  данные, необходи\-мые для "локального" \ логического рассмотрения
  , формулируется задача, и после ее решения вносятся необходимые
  коррективы в технические структуры данных. Роль решателя задач,
  реализующего логические процессы, здесь можно уподобить роли
  головки машины Тьюринга, выполняющей вычисления на ленте - она
  сугубо локальна. С этой точки зрения, процессы проектирования
  или исследования представ\-ляют собой макрозадачи - обращения
  к решению задач (в указанном выше узком смысле применения
  логического процесса для получения ответа) в них являют\-ся лишь
  отдельными атомарными шагами и тесно переплетаются с нелогическими
  про\-цессами. Вообще, взаимодействие логических и нелогических
  процессов в интеллекту\-альных системах происходит практически
  постоянно. Для объектов, упоминаемых в логических структурах
  данных, создаются модели (мысленные или иные). Наблюде\-ние за
  структурой и функционированием моделей подсказывает
  гипотезы, направля\-ющие ход рассуждений; при проектировании
  - позволяет поставить новые задачи, после решения которых
  предпринимается коррекция модели, и т.п. Важной пробле\-мой,
  связанной с использованием нелогических моделей объектов
  и процессов, оказы\-ва\-ется проблема перевода результатов
  наблюдения за моделью на логический язык. Частными случаями
  этой проблемы являются распознавание изображений и анализ
  динамических образов.

  Предварительная классификация "логических типов" \ задач,
  возникшая при ана\-лизе математических предметных областей,
  привела к рассмотрению 4 основных типов задач: на доказательство,
  на преобразование, на описание, и на исследование. Любая такая
  задача имеет, прежде всего, некоторый (возможно, пустой) список
  утверждений относительно встречающихся в ней "известных" \ объектов,
  истинность которых считается априори данной. Эти утверждения
  будем называть посылками задачи. Типичные примеры списков
  посылок - перечисление условий на известные параметры в системе
  уравнений; логическое описание чертежа в геометрической задаче
  на вычисление; список "данных" \ утверждений в задаче на доказательство.
  В зависимости от типа задачи, список посылок сопровождается
  рядом дополнитель\-ных элементов.

  В случае задачи на доказательство добавляется то утверждение,
  относительно которого требуется установить, что оно является
  следствием посылок; будем назы\-вать такое утверждение условием
  задачи на доказательство.

  В случае задачи на преобразование добавляется то выражение
  (называемое ее условием), которое должно быть преобразовано
  к некоторому специальному виду в предположении истинности посылок.
  В отличие от задачи на доказательство, здесь возникает необходимость
  сформулировать целевую установку, уточня\-ющую желае\-мые
  вид и оптимизацию ответа (упростить; разложить на множители;
  проинтегриро\-вать, и т.п.). Эта формулировка уже не относится к
  тому логическому языку "пред\-метного уровня", на котором задаются
  посылки и условие. Хотя ее можно было бы задавать на некотором
  логическом языке, предназначенном для записи утверждений о
  логических структурах данных, на практике оказалось более удобным
  представлять целевую установку задачи как список специальных
  техничес\-ких "поме\-ток", называе\-мых далее целями задачи.
  Это объясняется тем, что учетом целевых "пометок" \ зани\-мается
  автоматика, управляющая логическим процессом и, как всякая
  автоматика, использующая свои узкоспециализированные
  нелогические структуры данных.

  Задача на описание - это обобщение таких типов задач, как
  решение системы уравнений или неравенств. У нее, кроме списка
  посылок, имеется также некоторый список утверждений с
  неизвестными - они называются далее условиями задачи.
  Тре\-буется дать описание
  всех или части значений неизвестных, при которых выполнены условия.
  Как и в случае задачи на преобразование, списки посылок и условий
  задачи на описание приходится сопровождать целевой установкой.
  Она уточняет вид ис\-ко\-мо\-го описания; определяет, нужно ли получить
  полное описание или доста\-точ\-но лишь частичного (например,
  единственного примера значений неизвестных). Ответ задачи на
  описание обычно достигается в процессе последовательных
  преобра\-зо\-ва\-ний ее списка условий. Однако, во многих случаях
  для получения ответа бывает необходимо накапливать некоторое
  многообразие следствий объединенного списка ее условий и
  посылок. В таком режиме решаются системы уравнений: извлекая
  следствия из исходных уравнений, иногда удается получить
  равенства, указывающие значения неизвестных. Этот же режим
  определения значений неизвестных путем вывода след\-ствий типичен
  для геометрических задач на вычисление. Занесение след\-ствий
  непо\-средственно в список условий задачи нежелательно, так как
  впо\-след\-ст\-вии пришлось бы расчищать этот список, исключая все
  избыточные его элементы, что потребовало бы дополнительных
  вычислительных затрат на проверку избыточ\-нос\-ти. Поэтому в
  структуре данных задачи на описание предусмотрен специальный
  накопитель след\-ствий условий и посылок. Роль такого накопителя
  играет вспо\-мо\-га\-тельная задача на исследование (см.ниже), вводимая в
  процессе решения задачи на описание. Изна\-чально она имеет своими
  посылками все посылки и условия зада\-чи на описание.

  Задача на исследование, в дополнение к списку посылок, имеет
  лишь целевую установку, уточняющую направленность логического
  вывода в этом списке. При решении ее исходное логическое
  описание некоторой ситуации в том или ином смы\-сле "упрощается"
  \ и пополняется утверждениями, представляющими интерес
  в кон\-тек\-сте целевой установки. Этот процесс обрывается либо по
  исчерпании возмож\-нос\-тей доба\-вления к имеющейся "картине" \ каких-либо
  ценных новых фактов, либо при получении следствий, требующих
  немедленного возвращения к внешней за\-да\-че, для которой
  предпринимается исследование. Заметим, что в решателе задачи на
  исследование используются только как вспомогательные - например,
  в роли на\-ко\-пи\-теля следствий условий и посылок задачи на
  описание; в роли на\-ко\-пи\-теля следст\-вий при доказатель\-стве от
  противного некоторого утверждения, и т.д. Различные
  математические задачи "на исследование" \ - такие, как исследование
  поведения фун\-кции вещественного пере\-менного с помощью пределов
  и производных; исследо\-ва\-ние вида кривой или поверх\-ности,
  заданной своим уравнением, и т.п., - оказалось целесообразно
  представлять в виде задачи на описание, сводя ее решение
  практичес\-ки целиком к выводу следствий в связанной с ней задаче
  на иссле\-дование, и отби\-рая затем в качестве результата лишь
  некоторые из полученных фактов. Кроме того, отметим, что
  проведение иссле\-дований согласно заданной целевой установке
  для получения новых теоретических утверждений вообще не является
  задачей в рассматриваемом здесь узком смысле и никак не связано
  с применением вве\-ден\-ных выше задач на исследование. Различные
  теоретические факты в математике являются замкнутыми логическими
  конструк\-ци\-ями, не имеющими общих варь\-иру\-е\-мых параметров, в то
  время как в рамках одной задачи обычно объединяются лишь такие
  утверждения, которые относятся к общим варьируемым переменным.
  Поэ\-то\-му попытки организации исследований в теории как процесса
  логического вывода в списке посылок некоторой задачи не выявили
  никаких преимуществ и лишь при\-ве\-ли к неоправданному замедлению
  вычислений. Процесс исследований в теории представляет собой
  "макрозадачу", для которой постановка обычной задачи и ее решение
  являются лишь атомарным шагами.

  Кроме логических структур данных, задача содержит также
  некоторые вспомога\-тельные технические структуры данных, вводимые
  в процессе работы самим решате\-лем и используеыме для сохранения
  информации, направляющей его действия. Пре\-ж\-де всего, это
  пометки, указывающие на различные ранее предпринимавшиеся
  не\-у\-дач\-ные попытки, блокирующие их повторение, а также сообщения
  управляю\-ще\-го харак\-тера, которыми обмениваются между собой приемы.
  Для ускорения поиска в задаче объектов, связанных определенным
  образом с заданным объектом, со\-з\-да\-ют\-ся древо\-видные адресные
  конструкции. Работа приемов сопровождается пото\-ком
  многократ\-ных обращений к различным вспомогательным процедурам,
  осу\-щест\-вля\-ющим быст\-рые логические вычисления. Результаты таких
  обращений сохраняются в специаль\-ных буферах, что существенно
  ускоряет работу системы и упрощает ор\-га\-ни\-зацию взаимодействия
  между приемами. Фактически эти буферы создают что-то типа
  само\-организующейся сетевой структуры данных, позволяющей быстро
  опре\-де\-лять свойст\-ва объектов и связи между ними. Их применение
  оказалось осо\-бен\-но эффективным в геометрических задачах,
  насчитывающих сотни посылок.

  Преобразования задачи, а также ввод и рассмотрение различных
  вспомо\-га\-тель\-ных задач в процессе решения обеспечиваются
  приемами - процедурами локального ана\-лиза ситуации, способными
  усматривать целесообразность определенных дейст\-вий и выполнять
  эти действия. Таких приемов в процессе обучения накапливают\-ся
  многие тысячи, и для обеспечения быстрого поиска нужного приема
  необхо\-ди\-ма специальная организация базы приемов. В принципе,
  здесь возможны два подхода. Первый из них состоит в
  использовании древовидной поисковой системы, охва\-ты\-ва\-ю\-щей все
  многообразие приемов. Вершины такого древовидного каталога
  определяют некото\-рые проверки, выполняемые для текущего
  состояния задачи, и в зависимости от результатов этих
  проверок осуществляется отсечение отдельных ветвей каталога,
  заведомо не содержащих нужного приема. Если после отсечения
  осталось более одной ветви рассматриваемой вершины, то далее
  поиск предпринимается независимо в каждой из оставшихся ветвей.
  После того, как нужный прием найден, он реализуется, и далее
  цикл поиска повторяется заново. Недостатком этого подхода
  оказалось в первую очередь то, что в реальном многообразии
  приемов не удалось найти сколь-нибудь хороших принципов
  отсечения, ввиду слабой зависимости между условиями применимости
  различных приемов. Кроме того, по мере обучения и увеличения
  чис\-ла приемов время поиска очередного приема будет при данном
  подходе увеличиваться. Это, безусловно, создаст (а при плохом
  отсечении - достаточно скоро) сильные огра\-ничения на объем
  базы приемов, при котором возможна эффективная работа ре\-ша\-теля.
  Первый подход представляет собой, по существу, цикл просмотра
  базы приемов на каждом шаге работы системы. В противоположность
  этому, второй подход ос\-но\-ван на цикле просмотра задачи. Большинство
  приемов, используемых при решении задач, допускает явное указание
  такого понятия, что для возможности применения приема необходимо
  появление данного понятия в задаче. Это позволяет организо\-вать
  базу приемов по принципу энциклопедии: за каждым понятием
  логического языка закреп\-ляется сравнительно небольшая группа
  приемов этого понятия. Как показывает опыт, исключение
  составляет лишь крайне незначительная группа при\-емов, для
  кото\-рых не выделяется какого-либо естественного
  "инициализирующего" \ понятия. Оче\-редной шаг решения задачи
  при втором подходе состоит в последо\-ва\-тель\-ном, понятие за
  понятием, просмотре всего текста задачи, с обращением для
  каждого текущего понятия к поиску внутри группы его приемов.
  Эта группа не\-ве\-ли\-ка, и во многих случаях ее можно организовать
  по древовидному принципу, получая таким образом дополнительное
  ускорение поиска. Преимуществом данного подхода является то,
  что при обучении системы новым разделам мы практически не
  уменьшаем скорости ее работы на ранее проработанных разделах.
  Это происходит потому, что "новые" \ поня\-тия не встречаются
  в "старых" \ задачах, и наличие даже очень большого числа
  "но\-вых" \ приемов никак не сказывается на времени поиска "старых",
  связанных с другими понятиями. Фактически, здесь снимаются
  сколь-нибудь сильные ограничения на рост числа приемов и
  появляется принципиаль\-ная возможность создавать гигантские
  логи\-ческие системы, имеющие фундаментальное разностороннее
  образование. Заметим, что нынешняя версия решателя, охва\-ты\-ва\-ю\-щая
  многие разделы элементарной и высшей математики и насчитывающая
  более 25000 приемов, занимает всего лишь порядка 60 мегабайт,
  в то время как исполь\-зу\-е\-мая организация базы приемов и размеры
  жесткого диска компьютера позволяют довести ее размеры до
  гигабайт без существенного ухудшения быстродействия.

  Таким образом, рабочий цикл решателя состоит в сканировании
  текста задачи - последовательном просмотре встречающихся в
  задаче понятий и обращении для текущего понятия к его программе,
  объединяющей в себе все закрепленные за поня\-тием приемы.
  Эта процедура представляет собой что-то типа внутреннего
  "логичес\-кого зрения", обеспечивающего контроль за развитием
  событий. Как и чело\-век, в процессе решения система предпринимает
  мысленное "рассмотрение" \ объектов зада\-чи и связей между ними для
  выработки плана ближайших действий. Чтобы выбрать из всех
  возможных действий наилучшее, необходимо каким-то образом
  сравнивать между собой результаты применения различных приемов
  в текущем контексте. Для этого естественно ввести числовые
  оценки приоритетности, выбирая каждый раз, например, прием с
  наименьшей такой оценкой. Вообще говоря, нерационально при
  сканировании задачи находить все возможные варианты применения
  приемов и лишь по окончании сканирования отбирать лучший - это
  может потребовать рассмот\-ре\-ния слишком большого числа вариантов,
  причем по своей априорной ценности анализи\-руемые варианты тоже
  будут сильно различаться. К меньшим вычислительным за\-тра\-там
  можно прийти, если разбить все приемы на группы или уровни,
  объединяя более-менее равноценные, и поиск нужного приема вести
  с последовательным уве\-ли\-че\-нием номера уровня, обрывая его, как
  только найден применимый в текущей ситуации прием. Фактически,
  здесь оценкой приоритетности приема становится но\-мер уровня.
  Так как обработка каждого уровня приемов требует своего цикла
  ска\-ни\-ро\-вания задачи, то число уровней целесообразно сделать
  не очень большим; в решателе это число равно 16, причем как
  правило срабатывание приема проис\-хо\-дит на первых 5-6 уровнях.
  В действительности, один и тот же прием может в различных
  ситуациях относиться к различным уровням - номер уровня
  определяется, в зависимости от контекста, самой программой
  приема. Если этот уровень не соот\-вет\-ствует тому, для которого
  выполняется текущее сканирование задачи, то дальней\-шие действия
  по рассмотрению приема обрываются, и система переходит к другим
  приемам.

  Важную роль при сканировании задачи играет управление переключением
  вни\-мания. Вообще говоря, различные элементы описания задачи
  неравноценны при поиске очередного приема. Одни из них находятся
  в задаче давно, другие - только что занесены либо изменены.
  Вероятность обнаружить при рассмотрении первых ситуацию,
  требующую немедленных действий, обычно значительно ниже, чем для
  вторых. Чтобы учесть такую статистическую неоднородность
  элементов задачи и уменьшить среднее время поиска приема,
  элементы задачи (посылки и условия) снабжаются весами - целыми
  неотрицательными числами, указывающими номер того уровня
  сканирования, до которого ранее доходило рассмотрение элемента.
  Как только элемент изменяется, его вес уменьшается до 0; веса
  новых элементов также полагаются равными 0. При сканировании,
  связанном с приемами $i$ - го уровня, игнорируются все посылки
  и условия, веса которых больше $i$ - они образуют "тене\-вую" \
  часть задачи. По мере прохождения $i$ - го уровня веса тех
  элементов задачи, для которых не произошло срабатывание приема,
  автоматически увеличиваются до $i+1$. Как только срабатывает
  какой-либо прием и возникают элементы задачи с весом 0,
  сканирование задачи возобновляется начиная с нулевого уровня.
  При этом в "зону внимания" \ попадут только те элементы задачи,
  которые имеют вес 0, т.е. только что были изменены либо введены.
  Эта простая автоматика уже обеспечивает в большинстве случаев
  разумную стратегию переключения внимания и значительно
  увеличивает быстродействие системы. В особенности это ощутимо
  для задач геомет\-рического типа, имеющих сотни посылок и
  условий. Конечно, необходим ряд допол\-нительных средств,
  обеспечивающих переключение внимания в специальных слу\-ча\-ях.
  Некоторые из этих средств включены в "общую автоматику" \
  решателя; другие - реализованы непосредственно в приемах,
  которые могут избирательно изменять веса различных элементов
  задачи и таким образом управлять зоной внимания.

  Следующий важный вопрос, возникающий после выбора механизма
  сканирования задачи как диспетчера, организующего работу
  базы приемов, - это вопрос о языке для записи приемов.
  В приеме выделяются такие основные части, как описание
  ситуации, в которой логически допустимы реализуемые им действия;
  описание ситуации, в которой эти действия целесообразны, и
  описание процедуры, собственно реализую\-щей действия приема.
  Первые две части предполагают использование некоторого
  логического языка, на котором формулируются соответствующие
  условия. Эти усло\-вия относятся не к объектам предметной
  области, рассматриваемым в задаче (числам, точкам,
  векторам и т.п.), а к тем структурам данных, с помощью
  которых задача представлена в системе: к термам логического
  языка, вхождениям в эти термы, к спискам термов, к различного
  рода техническим пометкам и конструкциям, вводи\-мым решателем
  для управления процессом. Чтобы формулировать такие условия,
  необ\-ходимо обеспечить достаточно богатый набор понятий
  логического языка, ори\-енти\-рованных на используемые в решателе
  структуры данных, и прежде всего - на задачи и их элементы.
  Именно этот набор и составил основную часть нового языка
  ЛОС (Логический Описатель Ситуаций) для записи приемов;
  чтобы задавать те действия, которые должны быть выполнены
  приемом в уже "опознанной" \ им ситуа\-ции, оказалось достаточно
  присоединить к логической части языка сравнитель\-но небольшое
  количество кодирующих типовые преобразо\-вания конструкций.

  После того, как на логическом языке сформулирована ситуация,
  в которой приме\-нение приема возможно и целесообразно, необходимо
  обеспечить некоторый алго\-ритм, реализующий в задаче поиск этой
  ситуации. В описании ситуации должны фигури\-ровать объекты,
  идентифицированные еще до начала поиска - сама задача;
  выделенное в ней при ска\-ниро\-вании вхождение понятия; текущий
  уровень ска\-ниро\-ва\-ния, и т.п. Описание представляет собой
  последовательность утверждений \-$P_1,\ldots,P_n$. Некоторые $P_i$
  определяют условия на ранее идентифицированные объекты. Так
  как все эти объекты относятся к текущим структурам данных
  решателя, истинность условий проверяется непосредственно
  и не требует какого-либо логического вывода. Для проверки
  этой истинности в интерпретаторе языка имеются специальные
  под\-программы. Другие $P_i$ вводят в рассмотрение новые
  объекты, связанные заданным образом с уже введенными до
  этого объектами. Если такие объекты определяются неоднозначно,
  то при поиске ситуации необходимо перечислять все возможные
  ва\-ри\-ан\-ты. При программировании на обычном алгоритмическом
  языке "процедур\-ного" \ ти\-па здесь нужно было бы использовать
  операторы цикла, причем вложенность циклов была бы равна числу
  неоднозначно определенных переходов к "новым" \ об\-ъек\-там в цепочке
  $P_1,\ldots,P_n$. Чтобы избежать таких громоздких конструкций,
  в языке выделен ряд специальных отношений между объектами,
  для которых перечисление реализуется автоматически. При
  обработке "перечисляющего" \ утверждения $P_i$ сна\-ча\-ла
  рассматривается первая версия выбора новых объектов, и
  предпринимается попытка для выбранных объектов продвинуться
  вправо по цепочке $P_1,\ldots,P_n$. Если в некоторый
  момент дальнейшее продвижение, ввиду ложности условия,
  становится невозможным, то происходит откат к последнему
  "перечисляющему" \ утверждению и определение очередной версии
  выбора объектов. Этот принцип "перечисления по умолчанию" \
  позволяет в качестве исполняемого текста программы ЛОСа
  исполь\-зо\-вать само логическое описание искомой ситуации
  и таким образом существенно повысить степень "читабельности" \
  программы.

  Заметим, что из совсем других соображений принцип реализации
  операторов с перечислением значений их выходных переменных
  возник в известном алгорит\-ми\-ческом языке ПРОЛОГ. В отличие от
  ЛОСа, ПРОЛОГ изначально ориентирован на работу с объектами
  предметного, а не структурного уровня. Поэтому центральное
  место в ПРОЛОГе занимает логический вывод, основанный на
  процедуре уни\-фи\-ка\-ции. Этот логический вывод становится
  совершенно излишним при работе с эле\-мен\-тами структуры данных,
  допускающими непосредственную проверку условий, и ка\-кого-либо
  аналога его в ЛОСе не предусмотрено. С другой строны, в ПРОЛОГе
  отсутствует целый ряд важных возможностей, предусмотренных
  в ЛОСе для эф\-фек\-тивной работы со сложными логическими описаниями
  образов "структурного" \ уро\-вня и для использования режима
  сканирования задачи. ЛОС ориентирован на создание автоматики,
  управляющей логическими процессами, в то время как при
  разработке ПРОЛОГа эта автоматика осталась почти "за кадром".

  Впрочем, оба языка - и ЛОС, и ПРОЛОГ, в общем, относятся
  примерно к одному уровню, и оба обладают настолько существенными
  недостатками, что работу над созданием языка для записи приемов
  пришлось продолжить уже после того, как на ЛОСе был создан
  весьма эффективный решатель задач по элементатной алгебре.
  Как правило, значительную часть программы приема на ЛОСе
  составляет описание вида тех утверждений или выражений, которые
  могут быть идентифицированы с фрагментами заданной теоремы
  предметной области. На практике редко бывает так, чтобы
  идентифицируемые логические конструкции в точности совпадали
  с теми, которые имеются в теореме. Например, при идентификации
  квадратного трехчлена $ax^2 + bx + c$ коэффициент $a$ может
  оказаться равным единице, и тогда в задаче вместо произведения
  $ax^2$ будет записана степень; сама эта степень может не иметь
  в точности вида квадрата, а лишь иметь четный коэффициент
  показателя степени, и т.д. Чтобы, несмотря на эти различия,
  идентифицировать теорему, приходится фактически в программе
  приема описывать не ее вид, а вид некоторого класса теорем,
  получающихся из нее различными вариациями. Текст программы
  ока\-зы\-ва\-ет\-ся, во-первых, весьма громоздким,
  и, во-вторых, достаточно удален\-ным от исход\-ной записи теоремы.
  Еще большую громоздкось этому тексту придают различные
  вставки, связанные с решающими правилами приема.
  Поэтому, несмотря на все пре\-доставляемые ЛОСом и интерфейсом
  его редактора возможности для быстрого чте\-ния и понимания
  логических описаний ситуаций, все же в сколь-нибудь
  невы\-рож\-денных случаях описания приемов оказываются
  трудночитаемыми. Заметим, что хотя ПРОЛОГ, казалось бы, и
  ориентирован на запись программы в виде совокуп\-ности теорем
  предметной области, однако он тоже не позволяет преодолеть
  ука\-зан\-ной трудности. Если теоремы идентифицируются без учета
  возможных вариаций, то программа оказывается заведомо слабой;
  если начинается их учет, то и на ПРОЛОГе, для задания общего
  вида некоторого класса теорем, придется от предметного
  уровня перейти к структурному (к которому ЛОС более приспособлен),
  и таким образом полностью утратить наглядность исходного текста
  теоремы.

  Чтобы восстановить утерянную при погоне за эффективностью работы
  приема наглядность и компактность записи, был создан новый
  язык, уровень которого су\-щест\-венно выше, чем у ЛОСа или ПРОЛОГа.
  Прием на этом языке задается как теорема предметной области,
  снабженная некоторой "алгоритмизирующей" \ раз\-мет\-кой. На основе
  разметки компилятор осуществляет необходимое обобщение ви\-да
  теоремы, формулирует описание на ЛОСе ситуаций, в которых
  она должна быть применена, и добавляет к нему операторы
  ЛОСа, реализующие применение. Факти\-чески этот язык имеет два
  независимых логических уровня: предметный уровень, на котором
  представлена теорема, и структурный уровень, на котором
  формулиру\-ют\-ся условия целесообразности применения теоремы.
  Оба эти уровня предполагают ис\-поль\-зование полноценного
  логического языка, однако логические записи струк\-тур\-но\-го уровня,
  в отличие от записей уровня предметного, не участвуют в
  каком-либо ло\-ги\-ческом выводе - они используются только для
  проверки условий при принятии реше\-ния. Роль
  "алгоритмизирующей" \  разметки приема весьма разнообразна - это
  и указа\-ние способа применения теоремы, и определение
  необходимых правил ее обобщения, и указание условий
  целесообразности применения, и уточнение алгоритмических средств,
  используемых для обработки посылок теоремы, и указание на
  "техничес\-кие" \ сообщения, передаваемые при срабатывании данного
  приема другим приемам, и указатели переключения внимания, и многое
  другое. Эта разметка представ\-ля\-ет собой что-то вроде генотипа
  приема, элементы которого допускают независимое варь\-ирование
  в достаточно широких пределах и по которому компилятор создает
  факти\-чески реализуемую программу приема на ЛОСе. Такая
  аналогия позволила назвать новый язык ГЕНОЛ\'ОГом
  (ГЕНетический язык ЛОГического программирования).

  Описание приема на ГЕНОЛ\'ОГе оказалось значительно более
  компактным и понятным, чем на ЛОСе. На экране изображается
  в стандартной математической записи теорема приема, под которой
  размещается в нескольких окнах сопровожда\-ющая теорему информация.
  Во многих случаях эта информация занимает всего несколько
  строчек, в то время как текст создаваемой компилятором программы
  на ЛОСе составляет несколько полных экранов. Трудоемкость
  чтения приема и его коррекции, по сравнению с ЛОСом, уменьшилась
  на порядок.

  В отличие от обычных языков программирования, ГЕНОЛ\'ОГ не
  представляет собой сколь-нибудь завершенного явления.
  По существу, он является коллекцией типовых алгоритмических
  конструкций, используемых при переходе от теоремы к программе.
  Эта коллекция, достаточно богатая на текущий момент, продолжает
  (хотя все реже и реже) пополняться при рассмотрении новых
  предметных областей. Соответственно, при переходе к новой
  предметной области обычно приходится затра\-чивать некоторые
  усилия на развитие компилятора ГЕНОЛ\'ОГа. Как пока\-зы\-ва\-ет
  опыт, эти затраты несопоставимо малы в сравнении с той
  последующей экономией, которую дает применение ГЕНОЛ\'ОГа
  при обучении решателя в данной области.

  Главным доводом в пользу применения и развития ГЕНОЛ\'ОГа
  является, впро\-чем, даже не наглядность представления приема
  и проистекающие из нее пре\-и\-му\-щест\-ва для ручной "дрессировки" \
  решателя на тысячах задач из различных раз\-де\-лов, а возможность
  приблизиться вплотную к тому источнику, из которого приемы
  возни\-кают - к логическому языку предметной области.
  Накопленное в решателе много\-обра\-зие приемов можно рассматривать
  как задачник на извлечение приемов из тео\-рем. Оно допускает
  некоторую предварительную классификацию приемов по типам,
  опре\-деляющим в общих чертах, какая именно цель достигается
  при ис\-поль\-зо\-ва\-нии теоремы. Ряд элементов описания приема
  на ГЕНОЛ\'ОГе удается авто\-ма\-ти\-чес\-ки синтезировать по теореме
  и типу приема. Это используется при ручном обуче\-нии решателя,
  как средство пополнения текста приема различными стандарт\-ны\-ми
  эле\-ментами, и существенно облегчает процесс ввода приема.
  Однако, значитель\-ная часть элементов описания приема не может
  быть непосредственно извлечена из теоремы и общей установки
  на синтез приема. Эти элементы возникают для регулировки
  поведения приема в контексте всей базы приемов, и для их
  создания нужно развивать аппарат анализа взаимодействий между
  приемами, а также аппа\-рат анализа решений, осуществляющий
  тестирование приема на серии задач.

  При переходе от теоремы к приему, прежде всего, требуется
  определить класс возможных типов приемов, создание которых по
  данной теореме имеет смысл. Во многих случаях такая целевая
  характеризация теоремы может быть выполнена "из общих
  соображений" \ и реализована сравнительно несложной процедурой.
  Однако, чаще всего сама теорема возникает для вполне определенной
  целевой нагруз\-ки, и истоки приема расположены гораздо глубже - уже в
  самом процессе логического вывода, пополняющего запасы теорем.

  Математическая логика не позволила сколь-нибудь существенно
  продвинуться в понимании динамики реальных математических теорий.
  Теория в ней обычно пред\-став\-ляется как множество всех вообще
  утверждений, которые можно получить из аксиом с помощью правил
  вывода, или как множество всех утверждений, истинных в
  допустимых интерпретациях. За исключением вырожденных случаев,
  такое множест\-во является бесконечным и раз навсегда заданным.
  С другой стороны, реальная математическая теория не просто
  конечная - заносимые в нее истинные утверждения подвергаются
  тщательному отбору. По-видимому, объяснение принципов этого
  отбора должно было бы основываться на целевой ориентации
  развития теории - то есть на анализе того алгоритмического
  аппарата решения задач, который она предлагает. Попытки обучения
  решателей показывают, что этот аппарат чрезвычайно сложен и
  эвристичен по своей сути. По существу, его можно уподобить
  "дрессирован\-но\-му хаосу". Включение такого аппарата в рамки
  теоретических построений математи\-ческой логики весьма
  проблематично, а замена его простыми суррогатами не ре\-ша\-ет
  проблемы. С другой стороны, наличие эффективного решателя
  позволяет начать хотя бы экспериментальные исследования
  динамики теорий.

  Новые утверждения в математической теории возникают в процессе
  логического вывода. Этот процесс основан на применении некоторых
  правил вывода к ранее полученным утверждениям либо к аксиомам.
  Простейший принцип отбора в состав теории получаемых таким
  образом утверждений состоит в удалении тех утвержде\-ний,
  применение которых при решении задач (после синтеза их приемов)
  сводились бы к последовательному применению уже имеющихся приемов.
  Эту проверку "на избыточность" \ легко организовать, если
  использовать решатель для упрощения но\-вых утверждений -
  сохраняться будут только те, которые после упрощения не
  вы\-ро\-ди\-лись в логическую константу "истина". Разумеется,
  целевая установка ис\-поль\-зу\-емой здесь задачи на упрощение
  должна быть весьма аккуратно согласована с целевой установ\-кой
  процесса поиска новых теорем. Такого рода проверка новых фактов
  на нетриви\-альность - в общем, обычное явление в практике
  математических исследований. Заме\-тим, что последовательное
  применение правила вывода и решения задачи на упроще\-ние
  приводит нас к более сложной процедуре вывода, использу\-ю\-щей
  всю силу аппа\-рата решателя - к своего рода "приему вывода".
  В общем, применение процедуры упрощения на выходе обычных
  правил вывода уже позво\-ля\-ет существенно уменьшить
  поток получаемых следствий, сохраняя только наибо\-лее ценные
  из них. Следует заметить, что эксперименты с процессами
  логичес\-ко\-го вывода, использу\-ющими неко\-торую несложную процедуру
  упрощения ("ре\-ду\-ци\-ро\-вания"), и попытки теоретичес\-кого изучения
  этих процессов предпринимаются в математической логике уже
  дос\-та\-точно давно (см. работы по "rewriting theory"). Однако,
  логический вывод с упроще\-нием не устраняет экспоненциального
  роста чис\-ла получаемых следствий с ростом глубины вывода и
  годится лишь для получения серии первых, простейших следствий из
  исходных аксиом теории.

  В нормальной практике математических исследований получению
  новых резуль\-татов обычно предшествует постановка задачи либо
  формулировка гипотезы. Лишь в простейших случаях новые
  утверждения получаются путем непосредственного выво\-да из
  ранее известных. Поэтому естественно предположить, что
  главным механиз\-мом для развития теории служат не правила
  вывода, а более сложные проце\-дуры, включа\-ющие в
  себя средства для постановки задач и выработки гипотез на основе
  анализа имеющихся теорем, и использующие решатель для работы
  с постав\-ленными ими задачами. Такие процедуры будем далее
  называть приемами вывода теорем. Приве\-денная выше конструкция
  с последовательным применением правила выво\-да и зада\-чи на
  упрощение является лишь частным примером такого рода
  приемов. Чтобы полу\-чать другие типы приемов вывода теорем, можно
  использовать в качестве обуча\-юще\-го материала различные уже
  известные утверждения из предметной области, предлагая
  возможно более простые объяснения логики "открытия" \ этих
  утвержде\-ний путем постановки вспомогательных задач
  и формулировки гипотез. Эта работа была про\-делана
  для некоторых простейших разделов (алгебра логики, алгебра
  мно\-жеств, свойства ариф\-метических операций), в результате
  чего возникло около сотни раз\-личных приемов вывода. Даже
  для такой сравнительно сложной теоремы, как фор\-мула Кардано,
  удалось найти весьма простую и, по существу, общелогическую
  проце\-дуру, из\-вле\-кающую ее (разумеется, с помощью решателя),
  непосредственно из тож\-дества для куба суммы. Продолжение этой
  работы могло бы привести к созданию значительной по своим
  размерам базе приемов вывода теорем, необходимой для процедур
  автоматического развития теории и синтеза приемов. Способность
  извле\-кать из исходных утверждений неожиданные и сильные
  следствия - за счет длин\-ных цепочек логических вычислений,
  реализуемых решателем - позволила бы взять такой базе приемов
  на себя роль "генератора идей".

  В последующих разделах книги мы дадим более подробное
  описание того ком\-плекса, который был разработан для моделирования
  логических процессов. Он вклю\-чает в себя технические средства
  для программирования на языках ЛОС и ГЕНО\-Л\'ОГ, созданный с
  помощью этих языков реша\-тель задач, а также ряд
  экспе\-ри\-мен\-таль\-ных средств для автоматизации синтеза приемов и
  автоматического разви\-тия базы теорем. Так как этот комплекс явно
  выходит за рамки понятия "реша\-тель задач", и вместе с тем,
  безусловно, охватывает лишь небольшую часть тех возможностей,
  которые могли бы составить понятие "интеллектуальная система" \
  (на сегодняшний день вообще представленное лишь естественным
  интеллектом), для названия его более уместно использовать
  термин "логическая система". К книге прилагается диск, на
  котором записана текущая версия этой системы, включающая в себя
  и те компоненты, работа над которыми лишь начата. В данной
  книге речь пойдет в основном о языках для программирования
  логических процессов; фактическому описанию решателей и средств
  автоматизации их развития будут посвящены вторая и третья книги.
  Тем не менее, из имеющихся в системе справочников и программ можно
  извлечь достаточно подробную информацию о текущем устройстве
  всех разделов системы и предполагаемых направлениях ее развития.

    Излагаемые в книге принципы компьютерного моделирования
  логических про\-цес\-сов являются новыми и имеют своим источником анализ
  примеров. По этой причине, какие-либо библиографические ссылки
  в последующих разделах отсутствуют. Тем не менее, в конце
  приведен список литературы, ознакомление с которой позволит
  начинающему читателю получить необходимые представления об элементах
  мате\-ма\-ти\-чес\-кой логики и истории развития исследований по
  искусственному интеллекту. Чтение данной монографии предполагает
  наличие таких представлений. Клас\-си\-чес\-кими учеб\-ни\-ка\-ми по математической
  логике являются книги [1], [2]. Хорошее изложение основ
  математической логики содержится также в [5].
  Для знакомства с языком Пролог можно рекомендовать книгу [7],
  содержащую большое число простых примеров. Монографий по
  искусственному интеллекту в списке литературы при\-ве\-де\-но всего
  три, хотя фактическое их число очень велико. Однако, описание
  логи\-чес\-ких подходов в таких монографиях обычно сводится лишь к
  изложению принци\-пов ав\-то\-ма\-ти\-чес\-кого доказательства теорем в
  логике предикатов и применению этих принципов в языке Пролог.
  Иногда добавляются разделы, посвященные не\-мо\-но\-тон\-ным и модальным
  логикам. Прогресс в этой области по сравнению с первыми учебниками по
  искусственному интеллекту не очень велик, в чем нетрудно
  убедиться, сравнив хотя бы [9] и [11]. Рассматриваемые в данных
  книгах примеры моделиро\-ва\-ния процессов решения задач обычно
  крайне примитивны и создают впечатление явной недостаточности
  предлагаемой техники для систематического моделиро\-ва\-ния ло\-ги\-чес\-ких
  процессов в развитых предметных областях.
  Особняком в приводимом списке литературы стоят книги Д.Пойа
  [12], [13]. Они представляют собой пионер\-ские работы по анализу
  логических процессов в математике и дают великолеп\-ную ил\-люс\-трацию
  того, как нужно разбивать процесс решения на отдельные шаги локального
  планирования действий. Впрочем, компьютерный решатель играет роль
  микроскопа для логических процессов, позволяя гораздо точнее оценить
  реальные возможности приемов, и проработка тех же примеров с его
  помощью вносит определенные кор\-рек\-тивы в объяснения, полученные методом
  "самонаблюдения".

  Кроме учебной литературы, приведен список основных задачников,
  исполь\-зо\-ван\-ных при обучении решателя. Конечно, в большинстве
  случаев эти задач\-ни\-ки проработаны лишь частично. Задачи
  теоретического или нестандартного харак\-те\-ра, которые тре\-бо\-вали
  применения "одноразовых" \ приемов, малополезных в прочих ситуациях,
  при обучении обычно пропускались. В действительности такие зада\-чи
  представляют со\-бой хороший обучающий материал для развития
  системы авто\-ма\-ти\-ческого синтеза приемов по теоремам и будут с
  этой целью использованы впос\-лед\-ствии.


  \chapter{Логический язык решателя задач}

  В системе используется логический язык открытого типа, пополняемый
  в процессе обучения. Для каждого нового понятия вводятся свои
  правила образования с его помощью корректных синтаксических
  конструкций и свои соглашения о их смысло\-вой интерпретации,
  учитываемые при создании приемов, использующих данное поня\-тие.
  При этом соблюдаются некоторые простейшие общие требования,
  которые будут изложены в данном разделе. Мы дадим достаточно
  подробное (хотя и не полное) перечисление исполь\-зуемых в языке способов записи
  понятий из различных разделов математики, так как представление
  о них необходимо для правильной постановки задач решателю.
  Кроме того, оно понадобится далее при разборе примеров.
  Напом\-ним, что ниже речь идет лишь о внутреннем представлении
  утверждений в решателе; для диалога с пользователем применяется
  внешняя запись, приближенная к стандарт\-ной математи\-ческой, которая
  автоматически транслируется во внутреннее представ\-ление.
  Впрочем, для получения необходимой логической однозначности
  иногда прихо\-дится вводить коррективы и в эту стандартную
  запись. Хотя в целом материал данной главы имеет справочный
  характер - перечисляются понятия из различных областей, отобранные
  для использования в решателе, - в отдельных случаях выбор
  формализа\-ции все же требует определенных пояснений.

  Алфавит языка состоит из элементов двух типов - логических
  симво\-лов и симво\-лов переменных. Логические символы обозначают
  конкретные понятия (отношения между объектами, операции над
  ними, имена объектов, логические связки, кванто\-ры и т.д.);
  переменные служат для обозначаения варьируемых объектов.
  Символы каждого типа пронумерованы последовательными натуральными
  числами. В компью\-терной реализации для этих номеров зарезервированы
  диапазоны от 1 до $2^{16} - 1$. Логические символы, по существу,
  отождествлены со своими номерами, и в этом смысле все они
  изначально имеются в алфавите логического языка. Однако,
  использу\-емыми на текущий момент считаются только те из них,
  для которых введено название - слово либо словосочетание,
  имеющее не более 24 букв либо цифр. Такие названия хранятся
  в специальном файле и легко могут быть изменены. Внутренние
  алгоритмы системы этих названий не используют - они нужны
  только для отображения логичес\-ких символов на экране в различных
  диалогах.

  В языке рассматриваются конструкции двух типов - утверждения
  и выражения. Выражения используются для обозначения объектов;
  утверждения - для форму\-лировки свойств объектов и отношений
  между ними. Как выражения, так и утверж\-дения представляют
  собой записи со скобками (термы), определяемые следующим
  индуктивным образом:

  1) Каждое однобуквенное слово, состоящее из логического символа
  либо символа переменной, является термом.

  2) Если $t_1, \ldots , t_n$ - термы; $n \ge 1$; $f$ - логический
  символ, то слово $f(t_1 \ldots t_n)$ есть терм.

  Помимо этого общего правила образования новых термов, с каждым
  используе\-мым логическим символом $f$ будут связываться свои
  дополнительные ограничения на элементы $t_1, \ldots , t_n$,
  при которых новый терм представляет собой осмысленное
  утверж\-дение или выражение.

  Еще одно предварительное соглашение общего характера относится
  к понятиям свободной и связанной переменных терма. Среди
  логических символов выделены несколько особых символов,
  называемых связывающими (к ним относятся кванторы общности
  и существования, а также символы для определения классов и
  функций). Вхождение переменной $x$ в терм $\theta$ называется
  связанным, если оно расположено внутри подтерма $\theta '$
  терма $\theta$, имеющего вид $f(x_1 \ldots x_k x t_1 \ldots t_p)$,
  где $f$ - связывающий символ; $x_1, \ldots , x_k$ - переменные,
  $t_1, \ldots , t_p$ - термы; $k \ge 0$; $p \ge 0$. Вхождения
  перемен\-ных в терм, не являющиеся связанными, называются
  свободными. Переменная, име\-ющая хотя бы одно свободное вхождение
  в терм, называется его свободной перемен\-ной, или параметром.

  \section{Общелогические поня\-тия}

  Начнем с перечисления наиболее общих логических символов языка,
  сохраняя для них те же названия, которые используются в системе.
  Все эти названия будем выделять в тексте кавычками.

  Прежде всего, выделим логические константы "истина", "ложь",
  а также логи\-ческие связки "и", "или", "не", "эквивалентно",
  позволяющие строить новые утвер\-ждения "и($A_1 \ldots A_n$)";
  "или($A_1 \ldots A_n$)"; "не($A_1$)"; "эквивалентно($A_1 A_2$)"
  из ранее по\-строен\-ных утверждений $A_1, \ldots , A_n$.

  Логическая связка "если-то" используется только в сочетании с
  квантором общ\-ности: "длялюбого($x_1 \ldots x_n$ если
   $A_1 \ldots A_m$ то $A_0$)", где $x_1, \ldots , x_n$ -
  попарно различные переменные, $A_0, A_1, \ldots, A_m$ -
  некоторые утверждения. Это обусловлено тем, что в
  бескванторных ситуациях предпочтительнее использовать связки
  "или", "и", "не", к которым она легко сводится. В случае
  $m=0$ запись приобретает вид "длялюбого( \\ $x_1 \ldots x_n A_0$)".
  Аналогичным образом записывается утверждение сущест\-вования
  значе\-ний $x_1, \ldots, x_n$, при которых истинно $A_0$:
  "существует($x_1 \ldots x_n A_0$)". Чтобы обеспечить возможность
  компактной записи утверждения о существовании и единственности
  этих значений, введена модификация квантора существования
  "Существует($x_1 \ldots x_n$ $A_0$)" \quad (логический символ
  "Существует"\  - с большой буквы). Символы "длялюбого",
  "существует" и "Существует"\  - связывающие; переменные
  $x_1, \ldots , x_n$ образуют в приве\-денных выше утверждениях
  связывающую приставку.

  Простейшими выражениями языка являются однобуквенные слова,
  образованные переменными либо логическими символами. Во втором
  случае считается, что выра\-жение имеет своим значением тот
  символ, из которого оно состоит. Такое соглашение упрощает
  использование логического языка для описания вида его собственных
  кон\-струкций. Хотя из него и вытекает, что константы "истина"
  и "ложь" одновременно должны считаться и утверждениями, и
  выражениями, особых неудобств в дальней\-шем это не создает.

  Для задания значения путем разбора случаев используется
  условное выражение "вариант($A t_1 t_2$)". Если утверждение
  $A$ является истинным, то значение этого выра\-жения равно
  значению выражения $t_1$, иначе оно равно значению выражения
  $t_2$. Аналогичным образом, рассматриваются условные утверждения
  "альтернатива($A B_1$ $B_2$)". Если утверждение $A$ истинно, то
  истинность условного утверждения совпадает с истинностью
  утверждения $B_1$, иначе - с истинностью утверждения $B_2$.
  Условные утверждения оказались практически неиспользуемыми
  в формулировках и решениях задач, однако они весьма часто
  применяются в логических описаниях структур\-но\-го уровня -
  внутри программ приемов решателя.

  Используются всего две конструкции, вводящие связанные
  переменные при пост\-роении новых выражений. Первая из них -
  "класс($x_1 \ldots x_n \ \ A$)"\ - определяет класс всех наборов
  $(x_1 \ldots x_n)$, на которых утверждение $A$ является
  истинным. Вторая - "отобра\-жение($x_1 \ldots x_n \ \ A \ t$)"\ -
  задает функцию, определенную на множестве всех таких наборов
  $(x_1 \ldots x_n)$, для которых утверждение $A$ является
  истинным, и прини\-мающую на этом множестве значения,
  определяемые выражением $t$. Для задания интеграла, производной,
  предела, суммы по множеству значений параметра, и т.п.,
  используются обычные операции над функциями, не вносящие сами
  по себе каких-либо связанных переменных.

  К списку используемых в языке общелогических конструкций добавим
  также равенство "равно($t_1 \ t_2$)"\ и выражение "значение($f \ t$)",
  определяющее значение функ\-ции $f$ в точке $t$ (в обычной
  записи - $f(t)$).

  \section{Алгебра множеств}

  Утверждения "множество($A$)" \ ; "принадлежит($t \ A$)" \ ;
  "содержится($A B$)" означа\-ют, соответственно, что $A$ есть
  множество; $t$ - элемент этого множества; множество $A$ является
  подмножеством множества $B$. Для условия непересечения двух
  множеств $A$,$B$ введено обозначение "непересек($A \ B$)".

  Пустое множество обозначается посредством логического символа
  "пусто". Выра\-жения "объединение($A_1 \ldots A_n$)",
  "пересечение($A_1 \ldots A_n$)", "разность($A \ B$)",
  "прямое\-произведение($A_1 \ldots A_n$)" используются для
  обозначения простейших операций над множествами.

  Иногда приходится ссылаться на некоторый произвольный
  элемент непустого множества, не конкретизируя этот элемент.
  Для обозначения такого элемента введено выражение "элемент($A$)".
  Аналогично, выражение "внешнийэлемент($A$)" обозначает
  некоторый абстрактный элемент, не принадлежащий множеству $A$.

  Для задания конечной последовательности элементов $A_1, \ldots ,
  A_n$ используется выражение "набор($A_1 \ldots A_n$)".
  Всюду далее, говоря о наборах, мы отождествляем это понятие с
  понятием конечной последовательности. В тех случаях, когда
  приходится вводить операции либо отношения с переменным
  числом операндов (за исключением двуместных ассоциативных
  операций), обычно они представляются как одноместные
  операция либо отношение над набором. В частности,
  конечное множество, состоя\-щее из элементов $A_1, \ldots , A_n$,
  обозначается посредством выражения
  "перечень(набор($A_1$ $\ldots A_n$))".
  Для пустого набора (последовательности длины 0) введено
  обозначение "пустоеслово".

  Для результата последовательной записи наборов $A_1, \ldots ,
  A_n$ используется выра\-жение "конкатенация($A_1 \ldots A_n$)".
  Результаты добавления к началу либо концу набо\-ра $A$ элемента
  $t$ обозначаются, соответственно, "префикс($t \ A$)" и
  "суффикс($A \ t$)". Чтобы выделить из набора ($A_1 \ldots A_n$)
  поднабор ($A_i \ldots A_j$), используется обозначение
  "поднабор($A \ i \ j$)". Для обозначения результата вставки
  в указанный набор элемента $B$ перед $i$-м элементом служит
  выражение "Вставка($A \ i \ B$)".

  Утверждение "семейст\-вомно\-жеств($A$)" означает, что $A$
  есть функция, принима\-ющая в качестве своих значе\-ний множеств.
  Выражения "объедине\-ниевсех($A$)", "пере\-сече\-ниевсех($A$)" \
  обозначают объединение и пересечение множеств для всевозможных
  значений аргумента функ\-ции $A$, принадлежащих ее области
  определения.

  Обычным образом используются выражение "мощность($A$)",
  утверждение "конеч\-ное($A$)" и константы "счетное",
  "континуум".

  Перечислим обозначения, введенные для работы с числовыми
  множествами. Чис\-ловой промежуток с концами $a,b$ и указателями
  $c,d$ отнесения этих концов к проме\-жутку (0 - конец не
  включается в промежуток, 1 - включается) обозначается
  "проме\-жуток($a \ b \ c \ d \ $)" . В частности, таким
  образом могут задаваться и бесконечные проме\-жутки; для
  обозначения их концов (и в других аналогичных случаях)
  используются логические символы "минусбеск" и "плюсбеск".
  Напомним, что в данном разделе описывается только внутреннее
  логическое представление, используемое решателем; при
  отображении на экране процесса решения задач числовые
  промежутки изобра\-жаются традиционным образом, с использованием
  круглой скобки для указания невключения конца в промежуток
  и квадратной - если конец относится к промежутку.
  Множество вещественных чисел во внутреннем представлении
  обозначается посред\-ством "промежуток(минусбеск плюсбеск 0 0)",
  хотя на экране оно прорисовывается как $R$. Утверждение
  "числовойотрезок($A$)" означает, что $A$ есть отрезок на
  числовой прямой (включая концы).

  Множества целых, целых неотрицательных, натуральных и
  рациональных чисел обозначаются, соответственно, "целые" \ ,
  "целыенеотрицательные", "натуральные" и "рациональные" \ .

  Множество целых чисел, состоящее из элементов $i, i+1, \ldots ,
  j$, обозначается "номе\-ра(i \ j)" \ . Набор тех же самых элементов
  обозначается "наборномеров($i \ j$)" \ . Множест\-во всех членов
  арифметической прогрессии с первым элементом $a$ и знаменателем
  $p$ обозначается "арифмпрогрессия($a \ p$)".

  Утверждения "нижняягрань($x \ A$)" \ , "Нижняягрань($x \ A$)" \ ,
  "верхняягрань($x \ A$)" \ , "Верхняягрань($x \ A$)" означают,
  соответственно, что $x$ есть нижняя либо верхняя грань числового
  множества $A$, причем большая заглавная буква указывает на
  стро\-гую верхнюю грань, а ее отсутствие - на нестрогую.
  Утверждения "огрснизу($A$)" и "огрсверху($A$)" означают,
  что множество ограничено снизу либо, соответственно, свер\-ху.
  Точная нижняя и точная верхняя грани обозначаются "инф($A$)"
  и "суп($A$)". Утвер\-ждения "наибольший($x \ A$)" и
  "наименьший($x \ A$)" указывают наибольший либо наи\-меньший
  элемент $x$ множества $A$.

  Обычным образом используются выражения "граница($A$)" \ ,
  "внутренность($A$)" \ , "замыкание($A$)".

  Для работы с функциями используются обозначения "функция($f$)"
  (утверждение о том, что $f$ есть функция); "область($f$)"
  (область определения функции $f$); "значе\-ния($f$)" (множество
  значений функции $f$); "Отображение($f \ A \ B$)" (утверждение
  о том, что $f$ есть функция, определенная на множестве $A$ и
  принимающая значения в множестве $B$); "взаимнооднозначно($f$)"
  (утверждение о том, что функция в различ\-ных точках своей области
  определения принимает различные значения).

  Образ множества $M$ для функции $f$ обозначается "образ($f \ M$)" \ ;
  прообраз мно\-жества $M$ - "прообраз($f \ M$)" \ ; прообраз элемента
  $t$ - "слой($f \ t$)".

  Для задания конкретных функций используются следующие выражения.
  \\ "конст($M \ b$)" обозначает константную функцию, принимающую во
  всех точках своей области определения $M$ значение $b$. "См($a \
  b$)" обозначает функцию, определенную на одноэлементном
  множестве $\{ a \}$ и принимающую на нем значение $b$.
  "тождфунк($a$)" \ обо\-значает тождественную функцию, определенную
  на множестве $a$. "таблица($f_1 \ldots$ $f_n$)" обозначает
  результат "объединения" \ функций $f_1, \ldots , f_n$,
  принимающих на пересе\-чении своих областей определения
  одинаковые значения. "доопределе\-ние($f$ $M \ b$)" \
  обо\-значает результат доопределения функции $f$ в тех
  точках множества $M$, где она еще не определена, значением $b$.
  "сужение($f \ M$)" \ обозначает сужение функции $f$ на множество
  $M$. Утверждение "перестановка($f \ A$)" означает, что функция
  $f$ представ\-ляет собой взаимно-однозначное отображение начального
  отрезка натурального ряда на конечное множество $A$.

  Число переменных многоместной функции $f$ обозначается
  "числопеременных($f$)" \ ; функция, получающаяся из $f$
  подстановкой констант набора $b$ вместо переменных, номера
  которых (начиная с 1) перечислены в наборе $a$, обозначается
  "подфункция($f$ \ $a \ b$)" \ . Утверждение "существперем($i \
  f$)" \ означает, что $i$ - я переменная функции $f$ является
  существенной.

  \section{Элементарная алгеб\-ра}

  Все рассматриваемые в этом разделе операции и отношения
  являются веществен\-нозначными; для работы с комплексными числами
  предусмотрены альтернативные обозначения.

  Для представления десятичного числа $a_1 \ldots a_n$ ($a_1,
   \ldots , a_n$ - цифры) в виде терма используется запись
  "величина($a_1 \ldots a_n$)" \ . Если число дробное, то одно из
  $a_i$ в этой записи является символом запятой (запятая введена
  в число логических символов только для данной цели; при
  изображении на экране термов в стандартной математи\-ческой
  записи вместо запятой используется точка). Заметим, что в случае
  $n=1$ символ "величина" не используется, а число представляется
  цифрой. Для простейших операций применяются обозначения
  "плюс($a_1 \ldots a_n$)" \ (здесь и далее $n \ge 2$); "минус($a$)" \ ;
  "умножение($a_1 \ldots a_n$)" \ ; "дробь($a_1 \ a_2$)" \ ;
  "степень($a_1 \ a_2$)" \ ; "максимум($a_1 \ldots a_n$)" \ ;
  "минимум($a_1 \ldots a_n$)" \ . Операция вычитания не введена,
  так как все равно при решении задач ее приходится выражать
  через "плюс" и "минус", а прорисовка вычи\-тания в стандартной
  математической записи неотличима от выражения с плюсом и
  минусом.

  Сумма и произведение конечного семейства значений обозначаются
  "суммавсех \\ ($F$)" и "произведениевсех($F$)". Здесь $F$ - функция,
  определенная на некотором конеч\-ном множестве и принимающая в
  качестве своих значений суммируемые либо пере\-мно\-жа\-емые величины.
  При прорисовке в стандартной математической записи эти выра\-жения
  изображаются обычным образом, с помощью знаков $\sum $ и $\prod $ .

  Неравенства записываются в виде "меньше($a \ b$)" \ ; "больше($a
  \ b$)" \ ; "меньше\-илирав\-но($a \ b$)" \ ; "большеилиравно($a \
  b$)". Утверждение "число($a$)" означает, что $a$ есть
  вещест\-венное число. Логические символы "е" и "пи" обозначают
  соответствующие числовые константы.

  Логарифм числа $b$ по основанию $a$ обозначается "логарифм($a \
  b$)" \ . Для про\-чих элементарных функций используются обозначения:
  "синус($a$)" \ ; "косинус($a$)" \ ; "тан\-генс($a$)" \ ;
  "котангенс($a$)" \ ; "секанс($a$)" \ ; "косеканс($a$)" \ ;
  "арксинус($a$)" \ ; "арккоси\-нус($a$)" \ ; "арктангенс($a$)" \ ;
  "арккотангенс($a$)" \ ; "модуль($a$)" \ . Выражение
  "сигнум($a$)" \  счи\-та\-ется равным минус единице для отрицательных
  чисел, не определенным в нуле, и равным единице для положительных
  чисел. "Сигнум($a$)" \ доопределяется в нуле единицей.
  Для гиперболических функций используются обозначения
  "гипсинус($a$)" \ ; "гипкосинус($a$)" \ ; "гиптангенс($a$)" \ ;
  "гипкотангенс($a$)" \ .

  Утверждения "целое($a$)" \ , "натуральное($a$)" \ , "четное($a$)" \ ,
  "рациональное($a$)" \ , "простое($a$)" \ уточняют тип вещественного
  числа $a$. Выражения "числитель($a$)" \ и "зна\-мена\-тель($a$)"
  \ определяют, соответственно, целочисленный числитель и нату\-ральный
  знаме\-натель рационального числа $a$ (после сокращения
  соответствующей дроби). Утверждение "делит($m \ n$)" \ означает,
  что целое число $m$ делит целое число $n$. Выраже\-ния "нод($n_1
  \ldots n_k$)" \ и "нок($n_1 \ldots n_k$)" \ означают,
  соответственно, наибольший общий делитель и наименьшее общее
  кратное целых чисел $n_1, \ldots , n_k$. Утверждение
  "взаим\-нопросты($m \ n$)" \ означает взаимную простоту целых
  чисел $m$ и $n$. Выражение "целая\-часть($a$)" \ обозначает
  целую часть числа $a$. Для обозначения вычета целого числа $m$
  по натуральному модулю $n$ служит выра\-жение "вычет($m \ n$)" \ .

  Выражение "числосочетаний($m \ n$)" \ обозначает число сочетаний
  из $m$ по $n$; выра\-жение "факториал($n$)" \ - факториал
  целого неотрицательного числа $n$.

  Формальные многочлены требуют в логическом языке специального
  представле\-ния - они, разумеется, не являются функциями, но не
  являются также и формулами. Последние суть слова в конечном
  алфавите и множество их всего лишь счетно, в то время как
  множество формальных многочленов над полем вещественных
  чисел континуально. Поэтому многочлены рассматриваются как
  абстрактные объекты, за\-даваемые тройкой ($X, F, K$). Здесь
  $X = (x_1, \ldots , x_n) $ - упорядоченный набор символов
  переменных; $F$ - поле; $K$ - функция, определенная на некотором
  конечном подмножес\-тве $M$ множества $n$-ок целых неотрицательных
  чисел и принимающая значения из поля $F$. Эта функция
  сопоставляет набору степеней переменных $x_1, \ldots , x_n$
  коэффи\-циент соответствующего одночлена, входящего в многочлен.
  Для обозначения мно\-гочлена используется выражение
  "многочлен($X \ F \ K$)". Разумеется, для отображения формального
  многочлена на экране предусмотрено более удобное обозначение: \\
  $\mu_{x_1 \ldots x_n} (S)$, где $S$ - обычным образом записанная
  сумма одночленов. Переход от одного представления многочлена к
  другому выполняется автоматически. Утверждения \\
  "Многочлен($A$)" \ и "веществмногочлен($A$)" \ используются
  для указания на то, что $A$ есть многочлен (в первом случае
   - общего вида, во втором - над полем вещественных чисел).

  \section{Математический анализ}

  Предел функции вещественного переменного $f$ в точке $a$
  обозначается "предел($f \ p \ a$)" \ ; здесь $p$ - указатель
  типа предела: $p = 0$ означает двусторонний предел; $p = 1$ -
  левый предел и $p = 2$ - правый предел. Предел числовой
  последовательности обозначается таким же образом, но в этом
  случае функция $f$ определена на множестве натуральных чисел.
  Аналогичным образом используются обозначения "верхнийпредел($f \
  p \ a$)" и "нижнийпредел($f \ p \ a$)" \ . Используемые в
  асимптотических оценках обозначения $f(x)= O(g(x))$ и
   $f(x) = o(g(x))$ представляют собой хороший пример
  контекстной семантики. Они имеют смысл только в сочетании
  с указанными в контексте допуще\-ниями о "стремлении" \ $x$ к
  некоторому значению. Разумеется, можно было бы исклю\-чить из
  языка такую контекстную зависимость и сгруппировать указанное
  выше равенство с указателем на предельное поведение аргумента
  в одну синтаксическую конструкцию, однако это привело бы к
  неоправданно громоздким записям, так как обычно одни и те же
  указатели предельного поведения обслуживают множество
  различных равенств с $O$ и $o$. Поэтому в языке решателя
  сохранено обычное примене\-ние таких равенств. Небольшое изменение
  здесь затрагивает лишь $o$: вместо указан\-ного выше равенства,
  во "внутреннем" представлении используется запись \\
  "$o(f(x),g(x))$" \ .

  Значение производной функции $f$ одного вещественного переменного
  в точке $a$ обозначается "производная($f \ a$)". Значение
  в точке $a$ частной производной функции $f$, зависящей от
  $n$ переменных, обозначается "частнпроизв($f \ K \ a$)".
  Здесь $K = (k_1 \ldots k_n)$ - набор кратностей
  дифференцирования по отдельным переменным; если $k_i = 0$,
  то по $i$ - му аргументу дифференцирование не выполняется.
  Значение повтор\-ной производной функции $f$ одного вещественного
  переменного также обозначается посред\-ством "частнпроизв($f \ K \
  a$)" \ ,однако здесь уже $K$ - не набор, а величина кратности
  дифференцирования. Утверждение "Производная($f \ g$)" означает,
  что зна\-чения функции $g$ в области ее определения суть значения
  производной функции $f$. Аналогично, утверждение "Частнпроизв($f
  \ i \ g$)" означает, что значения функции $g$ в области ее
  определения суть значения частной производной функции нескольких
  переменных $f$ по ее $i$ - му аргументу. Значение полного
  дифференциала порядка $n$ функции $f$ нескольких переменных
  в точке $x$ при наборе $a$ приращений значений ее аргументов
  обозначается "дифференциал($f \ n \ x \ a$)".

  Для обозначения неопределенного интеграла функции $f$ одного
  вещественного переменного используется чисто техническая
  запись "Интеграл($f$)". Предполагается, что ее значением
  является какая - то одна из множества возможных первообразных
  функций для $f$. В процессе решения задачи эта первообразная
  находится, и тогда указанная запись устраняется. Разумеется,
  для использования в базе теорем следова\-ло бы взять не
  одноместную операцию над $f$ типа указанной выше, а двуместное
  отношение между функцией и ее первообразной, либо (как это
  обычно и делается) в качестве значения для неопределенного
  интеграла брать все множество первообраз\-ных. Однако, первый
  способ приводит при формальном интегрировании к обозначе\-ниям,
  сильно отличающимся от общепринятых, а второй заставляет
  неоправданно усложнять язык, вводя в него операции над
  множествами функций. Поэтому для вычислений была выбрана указанная выше
  запись, как технически наиболее удобная, хотя и требующая
  достаточно жестких ограничений на контекст, при которых
  ее использование не приводит к противоречиям. Определенный
  интеграл функции $f$ одной вещественной переменной по ее
  области определения обозначается "интег\-рал($f$)". При
  прорисовке на экране этого интеграла в обычной записи
  происходит "извлечение" из описания области определения $f$
  пределов интегри\-рования и явное их указание. Для двойного
  и тройного интегралов введены обозначения "двойнойин\-теграл($f$)"
  и "тройнойинтеграл($f$)", где $f$ - числовая функция, зависящая,
  соответ\-ственно, от двух либо от трех переменных. Интегралы
  берутся по всей области определения $f$.

  Утверждение "сходится($f$)" означает сходимость
  последовательности (функции натурального аргумента) $f$.
  Числовой ряд рассматривается как функция натураль\-ного аргумента.
  Утверждение о сходимости ряда с общим членом $A_i$
  формулируется в терминах последовательности его частичных
  сумм как "сходится(отображение($n$ \ натуральное($n$) \
  суммавсех($i$ \ целое($i$) \& $1 \le i$ \& $i \le n$ \
  $A_i$)))". Сумма ряда с общим членом $A_i$ обозначается
  как "суммавсех(отображение($n$ \ целое($n$) \& $k \le n$ \
  $A_n$))".

  Вспомогательное утверждение "стремится($x \ a \ p$)" означает
  то же самое, что $x \to a$, причем $p$ - указатель двусторонней
  ($p=0$) либо односторонней ($p=1$ - левая, $p=2$ - правая)
  окрестности. Оно не имеет самостоятельной семантики, а служит
  для определения семантики других утверждений, встречающихся
  с ним в общем контексте (например, $f(x) = O(g(x))$).
  Для указания локальных свойств числовой функции $f$ введены
  обозначения "переменазнака($f \ a$)" \ (функция меняет знак в
  ок\-рестности точки $a$); "убываетвточке($f \ a$)" и
  "возрастаетвточке($f \ a$)". Убывание и возрас\-тание здесь
  понимаются в строгом смысле. Утверждение "огрвточке($f \ a$)"
  оз\-начает ограниченность функции $f$ в окрестности точки $a$.

  Для указания на то, что некоторое выражение $A$ ограничено
  в том контексте, в котором оно встречается (модуль его
  не превосходит некоторой константы, фиксиро\-ванной для всей
  области допустимых в контексте значений параметров),
  используется вспомогательное утверждение "ограничено($A$)".
  По существу, здесь подразумевается функция, значения которой
  определяются выражением $A$, а область определения задается
  утверждениями из текущего контекста, однако ради технических
  удобств явно эта функция не вводится. Разумеется, это
  накладывает существенные ограниче\-ния на использование данного
  обозначения - оно встречается лишь во вспомогатель\-ной
  процедуре проверки ограниченности выражения в заданном
  контексте и в тех приемах, которые к ней обращаются.

  Утверждение "Максимум($f \ A \ B \ c$)" \ означает, что $B$ есть
  множество всех точек максимума функции $f$ на множестве $A$,
  причем $c$ - значение ее в этих точках. В случае минимума
  используется запись "Минимум($f \ A \ B \ c$)" \ . Утверждение
  "экстремум($f \ a \ b$ \ $c$)" \ означает, что функция $f$ имеет
  экстремум в точке $a$; \ $b$ - значение ее в этой точке, $c$ -
  тип экстремума - логический символ "минимум" либо "максимум".
  Множество всех точек из внутренности области определения
  многоместной числовой функции $f$, в которых все ее частные
  производные первого порядка определены и равны 0, обозначается
  "стационарныеточки($f$)". Множество всех точек из этой
  внутренности, в которых хотя бы одна частная производная первого
  порядка не определена, обозна\-чается "особыеточки($f$)".

  Утверждения "убывает($f \ A$)" \ , "возрастает($f \ A$)" \ ,
  "неубывает($f \ A$)" \ , "невоз\-растает($f \ A$)" обозначают
  строгую и нестрогую монотонность функции $f$ на множест\-ве $A$.
  Для указания выпуклости либо вогнутости служат обозначения
  "Выпуклавверх \ ($f \ A$)" и "Выпуклавниз($f \ A$)".

  Для обозначения непрерывности и равномерной непрерывности числовой
  функции $f$ на множестве $A$ используются записи
  "непрерывна($f \ A$)" \ , "равномернонепрерыв\-на($f \ A$)".
  Утверждение "периодична($f \ A$)" \ означает, что функция
  $f$ периодична на всей числой оси и число $A$ является ее
  периодом (не обязательно наименьшим). Утверждения
  "четнаяфункция($f$)" и "нечетнаяфункция($f$)" указывают четную
  либо нечетную функцию.

  Для переупорядочения элементов набора $A$ по убыванию либо
  возрастанию значе\-ний числовой функции $f$ на элементах этого
  набора служат обозначения "упоряд\-убыв($A \ f$)" и
  "упорядвозр($A \ f$)".

  Для операций сложения, умножения, и т.п. , применяемых к числовым
  функциям, а не к числам, в логическом языке должны быть введены
  независимые обозначения - двойники аналогичных обозначений для
  числовых операций. Так, для сложения числовых функций с
  одинаковой областью определения введено обозначение "плюс\-функ" \ ;
  для умножения - "умножфунк" \ ; для изменения знака -
  "минусфунк" \ . Как и в случае чисел, первые две операции
  могут применяться к произвольному (большему единицы) числу
  операндов. На экране операции над функциями прорисовываются
  так же, как и соответствующие числовые операции. Ввод их
  формульным редактором тоже ничем не отличается от случая числовых
  операций; после такого ввода предпри\-нимается анализ контекста,
  и при необходимости числовые операции автоматически заменяются
  на своих функциональных двойников. В особых случаях такую коррек\-цию
  можно выполнять вручную.

  \section{Элементарная геометрия}

  Почти все вводимые в элементарной геометрии понятия относятся
  одновременно и к двумерному, и к трехмерному случаям.
  Использование в задаче понятия, имеющего смысл только для
  двумерного случая, автоматически означает, что эта задача
  цели\-ком планиметрическая. Чтобы ускорить работу решателя
  при рассмотрении плани\-метри\-ческих задач, в список посылок
  таких задач обычно вводится (как правило, автоматически
  самим решателем) техническая пометка "планиметрия". Эту
  пометку можно рассматривать как вспомогательное фиктивное
  утверждение, указывающее на существование некоторой общей
  плоскости, к которой относятся все рассматри\-ваемые в задаче
  точки.

  Утверждение "точка($A$)" означает, что $A$ есть точка
  трехмерного пространства (в планиметрическом случае эта точка
  относится к некоторой не уточняемой плоскости данного
  пространства). Выражение "прямая($A \ B$)" обозначает
  прямую, проходящую через точки $A,B$. В случае совпадения
  этих точек уславливаемся считать, что данное выражение
  обозначает какую-то произвольную прямую, проходящую через
  рассмат\-риваемую точку. Аналогично, выражение "плоскость($A \ B \
  C$)" обозначает плоскость, проходящую через точки $A,B,C$.
  Обучение решателя выполнялось таким образом, что он может
  работать только с прямыми и плоскостями, заданными явным
  образом через пару (тройку) точек с помощью указанных
  выражений. Поэтому в условиях задач не рекомендуется
  обозначать прямые и плоскости вспомогательными перемен\-ными.
  Тем не менее, в языке предусмотрены используемые в некоторых
  специальных случаях утверждения "Прямая($A$)" и "Плоскость($A$)",
  указывающие, что $A$ является, соответственно, прямой либо
  плоскостью.

  Выражения "отрезок($A \ B$)" и "интервал($A \ B$)" обозначают,
  соответственно, отре\-зок и интервал с концами в точках $A,B$.
  Выражения "луч($A \ B$)" и "обратныйлуч \ ($A \ B$)" обозначают,
  соответственно, луч с началом в точке $A$, проходящий через
  точку $B$ и луч, обратный данному лучу.

  Расстояние межу точками $A$ и $B$ обозначается "расстояние($A \
  B$)". Расстояние от точки $A$ до прямой либо плоскости $B$
  обозначается, соответственно, "расстдопрямой \ ($A \ B$)" и
  "расстдоплоскости($A \ B$)". Расстояние между двумя замкнутыми
  множест\-вами точек $A$ и $B$ обозначается "расстмежду($A \ B$)".

  Величина угла с вершиной в точке $B$, стороны которого проходят
  через точки $A$ и $C$, обозначается "угол($A \ B \ C$)". Эта
  величина измеряется от $0$ до $\pi$. Угол как фигура в этом
  случае обозначается "Угол($A \ B \ C$)". Утверждение о том,
  что луч $AD$ является биссектрисой угла $ABC$, записывается
  в виде "биссектриса($A \ B \ C \ D$)". Прямая, на которой
  лежит данная биссектриса, обозначается "Биссектриса($A \ B \
  C$)".

  Утверждения "параллельны($A \ B$)" и "перпендикулярно($A \ B$)"
  используются для указания на параллельность либо
  перпендикулярность прямых либо плоскостей $A,B$ (допускаются
  любые сочетания: прямая - прямая; прямая - плоскость; плоскость
  - плоскость).

  Для указания на то, что две точки $A$ и $B$ лежат по одну
  сторону от прямой либо плоскости $C$, используется утверждение
  "однасторона($A \ B \ C$)". Утверждение "разныестороны($A \ B \
  C$)" указывает, что они лежат по разные стороны. Если $C$ -
  прямая, то в обоих случаях утверждение указывает также и на
  принадлежность точек $A,B$ общей плоскости с этой прямой.
  Если одна из точек попадает на прямую (плоскость), то
  считается, что точки одновременно лежат и по одну, и по
  разные стороны от прямой (плоскости). Утверждение
  "симметричны($A \ B \ C$)" означает, что точки $A$ и $B$
  расположены симметрично относительно точки, прямой либо
  плоскости $C$. Утверждение "осьсимметрии($A \ B$)" означае,
  что прямая $A$ является осью симмет\-рии плоской фигуры либо тела
  $B$. Утверждение "плоскостьсимметрии($A \ B$)" означает,
  что плоскость $A$ является плоскостью симметрии тела $B$.

  Выражение "полоса($A \ B$)" обозначает полосу между двумя
  параллельными пря\-мы\-ми $A$ и $B$. Выражения "полуплоскость($A \
  B$)" и "обрполуплоскость($A \ B$)" обозна\-чают полуплоскости,
  лежащие по одну сторону от прямой $A$; первая из них содержит
  точку $B$, а вторая - не содержит этой точки (хотя плоскость
  этой полуплоскости содержит $B$).

  Утверждение "треугольник($ABC$)" означает, что точки
  $A,B,C$ суть вершины тре\-угольника (различны и не лежат на одной
  прямой). Аналогично, утверждения "пара\-ллелограмм($ABCD$)" \ ,
  "ромб($ABCD$)" \ , "прямоугольник($ABCD$)" \ , "квадрат($AB$ $CD$)",
  "трапеция($ABCD$)" означают, что четверка точек $A,B,C,D$
  составляет набор вершин четырехугольника соответствующего типа.
  В первых четы\-рех случаях допус\-каются произвольные циклические
  перестановки; в последнем слу\-чае вершины $A,D$ должны лежать
  на большем (нижнем) основании трапеции. Заме\-тим, что в решателе
  предусмотрены два обозначения для трапеции: указанное выше
  предполагает, что оба угла при нижнем основании не больше 90
  градусов; в обозначе\-нии "Трапеция($AB$ $CD$)" \ это предположение
  отсутствует. Утверждение "четырехугольник($ABCD$)" озна\-чает, что
  четверка точек $A,B,C,D$ образует вершины выпуклого
  четырехугольника. Если $a$ - набор точек, то утверждения
  "многоугольник($a$)" \ ; "правмногоугольник($a$)" \ означают, что
  данные точки образуют последовательно проходимые вершины
  неко\-торого многоугольника (во втором случае - правильного).
  Выражение "фигура($a$)" \\ обозначает множество всех точек
  многоугольника, ограниченного ломаной, проходя\-щей через точки
  набора $a$. Утверждение "центр($P \ a$)" означает, что точка
  $P$ является центром области $a$.

  Утверждения "Медиана($ABCD$)"\ и "Высота($ABCD$)" \ означают, что
 точка $D$ является основанием, соответственно, медианы либо высоты
 треугольника $ABC$, проведенной из вершины $A$. Утверждение
"Биссектреуг($ABCD$)" означает, что точка $D$ является основанием
биссектрисы этого же треугольника, проведенной из вершины $B$.


  Выражения "площадь($a$)" и "периметр($a$)" обозначают площадь
  и периметр облас\-ти $a$ (во втором случае - только имеющей вид
  многоугольника). Выражение "длина($a$)" \\ обозначает длину линии
  $a$.

  В двумерном случае окружность с центром в точке $A$ обозначается
  либо как "окружность($AB$)" \ , где $B$ - некоторая точка на
  этой окружности, либо как "окр($A \ r$)", где $r$ - радиус.
  Аналогичные обозначения "круг($AB$)" и "круградиуса($A \ r$)"
  использу\-ются для круга. В трехмерном случае задание окружности
  либо круга дополняется указанием третьей точки, лежащей в ее
  (его) плоскости. Здесь используются обозна\-чения
  "Окружность($ABC$)" и "Круг($ABC$)"; $C$ - дополнительная точка,
  фиксирую\-щая плоскость.

  Дуга окружности с центром $A$, имеющая концевые точки $B,C$,
  обозначается либо "дуга($ABC$)" \ (меньшая из двух дуг), либо
  "большаядуга($ABC$)" \ (большая из двух дуг). В случае
  диаметрально противоположных точек $B,C$ большая и меньшая
  (условно) дуги выбираются некоторым неуточняемым образом, причем
  различны. Выражение "дугаугла($ABC$)" обозначает дугу, на
  которую опирается вписанный угол $ABC$.

  Чтобы задавать область со сложной границей, образованной
  множеством фрагмен\-тов стандартного вида (отрезки прямых, дуги
  окружностей и т.п.), используется запись
  "Фигура(перечень(набор($A_1 \ldots A_n$)))" \ , где $A_1,
  \ldots , A_n$ - обозначения данных фрагментов.

  Выражения "сектор($A \ B \ C$)" и "сегмент($A \ B \ C$)"
  обозначают, соответственно, сек\-тор и сегмент круга, имеющего
  центр в точке $A$ и определяемые крайними точка\-ми $B,C$,
  лежащими на окружности. Выбирается меньшая из дуг между
  данными точками (в случае равенства дуг берется неуточняемым
  образом одна из них). Выра\-жение "кольцо($A \ B \ C$)" обозначает
  кольцо с центром в точке $A$, внутренняя граница которого
  проходит через точку $B$, а внешняя - через точку $C$.

  Утверждение "касательная($A \ B$)" означает, что прямая $A$
  является касательной к окружности $B$. Утверждения
  "внешкасательная($A \ B \ C$)" и "внутркасательная($A \ B$ $C$)"
  означают, что прямая $A$ является, соответственно, внешней
  либо внутренней общей касательной окружностей $B$ и $C$.
  Утверждения "внешкасаются($A \ B$)" и "внутр\-касаются($A \ B$)"
  означают, что окружности $A$ и $B$ касаются друг друга,
  соответствен\-но, внешним либо внутренним образом.

  Утверждение "вписана($A \ B$)" означает, что окружность $A$
  вписана в многоуголь\-ник $B$ (последний обычно задается
  выражением вида "фигура($ \ldots$)"). Аналогично, утверждение
  "описана($A \ B$)" означает, что окружность $A$ описана около
  многоуголь\-ника $B$.

  Утверждение "подобны($A \ B$)" означает, что многоугольники,
  наборы вершин кото\-рых суть $A$ и $B$, подобны. Заметим, что
  здесь вместо обозначающего многоуольник выражения "фигура($A$)"
  используется выражение $A$, определяющее набор его вершин.
  Утверждение "подобны($A \ B$)" дополнительно фиксирует
  соответствие между верши\-нами, при котором имеет место подобие:
  вершине $A_i$ соответствует вершина $B_i$.

  Утверждение "выпукло($A$)" указывает на выпуклость множества
  $A$.

  \

  В отличие от планиметрии, в стереометрии не введены обозначения
  тел и поверх\-ностей через их "опорные" точки. В задачах они
  должны обозначаться переменными. Утверждения "куб($a$)" \ ;
  "призма($a$)" \ ; "параллелепипед($a$)" \ ; "пирамида($a$)" \ ;
  "усеч\-пирамида($a$)" \ ; "конус($a$)" \ ; "шар($a$)" \ ;
  "сфера($a$)" \ ; "цилиндр($a$)" \ указывают тип те\-ла либо
  поверхности $a$. Дополнительно к этим утверждениям, можно
  применять также утверждения "прямой($a$)" \ (случаи прямой
  призмы и прямого параллелепипеда), "пра\-вильный($a$)" \ (случаи
  правильных призмы, пирамиды либо усеченной пирамиды) и
  "прямоугольный($a$)" \ (применительно к параллелепипеду).

  Выражения "объем($a$)" \ , "площповерхности($a$)" \ ,
  "боковаяповерхность($a$)" обозна\-чают, соответственно, объем,
  полную площадь поверхности и площадь боковой повер\-хности
  тела $a$. Для обозначения площади поверхности $a$, как и
  в плоском случае, используется выражение "площадь($a$)".
  Высота тела $a$ (пирамида, конус, цилиндр и т.п.) обозначается
  "высота($a$)" \ . Выражение "радиус($a$)" обозначает радиус шара
  либо сферы $a$.

  Утверждение "грань($a \ b$)" \ означает, что многоугольник $a$
  является гранью мно\-гогранника $b$. Утверждение "основание($a \
  b$)" означает, что плоская фигура $a$ служит основанием тела
  $b$. Утверждения "вершина($a \ b$)" \ ; "ребро($a \ b$)" \ означают,
  что точка либо, соответственно, отрезок $a$ являются вершиной
  либо ребром многогранника $b$. Для указания на то, что точка
  $a$ является вершиной пирамиды либо конуса $b$, служит запись
  "Вершина($a \ b$)" \ . Запись "диагональ($a \ b$)" \ означает, что
  отрезок $a$ является главной диагональю параллелепипеда $b$.
  Утверждение "центр($a \ b$)" \ указывает точку $a$ - центр тела
  $b$. Осевое сечение $a$ цилиндра либо конуса $b$ вводится при
  помощи утверждения "осевоесечение($a \ b$)" \ . Выражение
  "плоскостьфигуры($a$)" обозначает пло\-скость двумерной фигуры
  $a$, расположенной в пространстве.

  Выражения "полупространство($a \ b$)" и "обрполупространство($a
  \ b$)" обозначают по\-лупространство, ограниченное плоскостью $a$
  и, соответственно, содержащее либо не содержащее точки $b$.
  Выражение "Полоса($a \ b$)" обозначает полосу между двумя
  параллельными плоскостями $a$ и $b$.

  Для обозначения двугранного угла используются две различных
  записи. Первая из них имеет вид "двугрУгол($A \ B \ C \ d$)",
  где $A$, $B$ - плоскости, ограничивающие угол; $C$ - точка,
  не лежащая на этих плоскостях; $d$ - указатель отнесения этой
  точки. Если $d=0$, то точка лежит внутри двугранного угла;
  если $d=1$, то она находится в смежном с ним относительно
  плоскости $A$ двугранном угле; если $d=2$, то она находится
  в смежном с ним относительно плоскости $B$ двугранном угле;
  если $d=3$, то она находится в двугранном угле, вертикальном
  с данным. Вторая запись имеет вид "двугранУгол($A \ B \ C$)" \ .
  Здесь $B$ - прямая, лежащая в вершине двугранного угла; $B$
  и $C$ - точки, лежащие на полуплоскостях, являющихся его
  сторонами. В первом случае величина двугранного угла
  обозначается "двугругол($A \ B \ C \ d$)" \ ; во втором -
  "двугранугол($A \ B \ C$)".

  Трехгранный угол с вершиной в точке $A$ и направляющими
  векторами ребер $AB$, $AC$, $AD$ обозначается
  "трехгранугол($A \ B \ C \ D$)".

  Величина острого угла между прямыми либо плоскостями $a$ и $b$
  обозначается "уголмежду($a \ b$)". Величина того угла между
  двумя прямыми $a,b$, в котором проходит прямая $c$ (все три
  прямые проходят через вершину угла), обозначается "Уголмежду($a$
  $b \ c$)".

  Условие принадлежности точки $D$ биссекторной плоскости
  двугранного угла, в вершине которого расположена прямая $B$,
  а точки $A,C$ лежат на полуплоскостях - сторонах этого угла,
  записывается в виде "биссектрплоск($A \ B \ C \ D$)".

  \

  В дополнение к указанным выше, введен ряд специальных
  планиметрических обозначений для операций, позволяющих
  при решении задач на построение выражать новые элементы чертежа
  через уже известные. Выра\-жение "тчк($A \ B \ r$)" обозначает точку,
  отложенную на ориентированной прямой $AB$ от точки $A$ на
  величину $r$ (при неотрицательном значении - на луче $AB$,
  иначе - на продолжении этого луча). Выра\-жение
  "доляотрезка($A \ B \ a$)" обозначает точку $C$ ориентированной
  прямой $AB$, для которой отношение ориентированных длин
  отрезков $AC$ и $AB$ равно $a$.

  Выражение "перпендикуляр($A \ B$)" обозначает прямую,
  проведенную через точку $B$ перпендикулярно прямой $A$, а
  выражение "параллелпрямая($A \ B$)" \ - прямую, прове\-денную
  через указанную точку параллельно прямой $A$. Выражение
  "параллель($A \ b$ $B$)" обозначает прямую, параллельную прямой
  $A$, находящуюся от нее на расстоянии $b$ и расположенную в той
  же полуплоскости, что и точка $B$. Наконец, выражение
  "поворотпрямой($A \ B \ C \ a$)" обозначает прямую, получаемую при
  поворотое луча $AB$ на угол $a$ в направлении полуплоскости,
  содержащей точку $C$.

 \section{Аналитическая геометрия}

 Аффинная система координат на плоскости либо в пространстве
 отождествляется, соответственно, с тройкой ($A,B,C$) либо с
 четверкой ($A,B,C,D$) точек. Здесь $A$ - начало координат;
 $B,C,D$ - концы координатных векторов, начинающихся в $A$.
 Какого-либо специального символа одноместного отношения,
 выделяющего наборы, являющиеся аффинными системами координат,
 не предусмотрено. Для выделения прямоугольной системы координат
 $K$ используется утверждение "прямкоорд($K$)", означающее, как
 и обычно, что координатные векторы попарно ортогональны и
 имеют длину 1.

 Выражение "коорд($A \ K$)" используется для обозначения координат
 точки, вектора либо множества точек $A$ в аффин\-ной системе
 координат $K$. В первых двух случаях его значением служит
 координатный набор (пара либо тройка); во втором случае -
 множество координатных наборов. Выражение "тчкоорд($K \ A$)"
 обозначает точку, имеющую координатный набор $A$ в аффинной
 системе координат $K$; выражение "точки($A \ K$)" обозначает
 множество точек, координатные наборы которых в аффин\-ной системе
 координат $K$ образуют множество $A$.

 Выражение "полкоорд($A \ K$)" обозначает координаты точки $A$ в
 полярной системе координат $K$. Сама полярная система координат
 при этом отождествляется с тройкой ($P,Q,R$), где точка $P$ -
 начало системы координат, причем полярный угол отсчиты\-вается от
 луча $PQ$ в направлении луча $PR$. Аналогично, выражения
 "сферкоорд($A \\ $$K$)" \ и "цилкоорд($A \ K$)" обозначают координаты
 точки $A$ в сферической и цилиндри\-ческой системах координат $K$.
 Под сферической системой координат понимается четверка ($P,Q,R,S$),
 где $P$ - начало координат; широта отсчитывается от луча $PQ$ в
 направлении луча $PR$; долгота - от луча $PS$ в направлении
 плоскости $PQR$. Лучи $PQ$,$PR$,$PS$ предполагаются взаимно
 перпендикулярными. Цилиндрическая система координат
 отождествляется с аналогичной четверкой точек, причем $PS$ -
 ось ординат.

 Вектор с началом в точке $A$ и концом в точке $B$ обозначается
 "вектор($AB$)". Утверждение "Вектор($a$)" означает, что $a$
 есть вектор (в плоскости либо пространстве). Нулевой вектор
 обозначается "вектор0". Операции сложения векторов, изменения
 знака вектора и умножения вектора на число обозначаются,
 соответственно, "плюс\-вект", "минусвект" и "умножвект". Первая
 из них применяется к произвольному, большему или равному 2, числу
 слагаемых; последняя - к двум операндам, первый из которых
 является числовым множителем, а второй есть вектор. На экране
 эти операции прорисовываются точно так же, как аналогичные
 операции над числами. Формульным редактором они вводятся как
 числовые операции, причем выполняется автоматическая их
 коррекция, основанная на анализе контекста. Длина вектора $a$
 обозначается "длина($a$)"; угол между векторами $a,b$ -
 "уголмежду($a \ b$)" (этот угол измеряется от 0 до $\pi$).

 Ортогональность, коллинеарность и компланарность векторов
 обозначаются, соот\-ветственно, "перпендикулярно($a \ b$)",
 "коллинеарны($a \ b$)" и "компланарны($a \ b \ c$)". Конец
 вектора $b$, отложенного от точки $a$, обозначается
 "конецвектора($a \ b$)". Скаляр\-ное и векторное произведения
 обозначаются "скалумнож($a \ b$)" и "вектумнож($a \ b$)".
 Выражение "проекция($a \ b$)" обозначает ортогональную проекцию
 точки, вектора либо прямой $a$ на прямую либо плоскость $b$.
 Утверждение "делениеотрезка($A \ B \ C \ a \ b$)" озна\-чает, что
 точки $A,B,C$ лежат на одной прямой, причем отношение вектора
 $AB$ к вектору $BC$ равно отношению числовых параметров $a$ и
 $b$.

 Указатель ориентации упорядоченного набора векторов $B$ в
 системе координат $A$, равный 1, если ориентация положительная,
 и равный $-1$ в случае отрицательной ориентации, обозначается
 "ориентация($A \ B$)". Ориентированные площадь и объем
 обозначаются "орплощадь($A \ B \ C$)" и "оробъем($A \ B \ C \
 D$)". Здесь $A$ - система коорди\-нат, определяющая ориентацию
 плоскости либо пространства; в первом случае рас\-сматривается
 площадь параллелограмма, порожденного векторами $B,C$, а во
 втором случае - объем параллелепипеда, порожденного векторами
 $B,C,D$. Ориентированный угол между векторами $A,B$ при
 ориентации плоскости, задаваемой системой коор\-динат $C$,
 обозначается "оруголмежду($A \ B \ C$)". Утверждение
 "направление($A \ B \ C $ \ $D$)"  означает, что вектор $D$
 трехмерного пространства направлен по отношению к плоскости,
 определяемой векторами $A,B$, в ту же сторону, что и вектор $C$.

 Утверждение "Прямая($A$)" означает, что $A$ есть прямая на
 плоскости либо в прост\-ранстве. Выражение "углкоэффициент($A \
 K$)" обозначает угловой коэффициент пря\-мой $A$ в двумерной
 системе координат $K$.

 Уравнение линии либо поверхности используется только внутри
 выражения \\ "класс($ \ldots$)", определяющего множество
 координатных наборов точек этой линии либо поверхности относительно
 некоторой системы координат. Так, координаты прямой на плоскости
 задаются выражением "класс($xy \ \ ax+by+c=0$ \&  число($x$) \&
 число($y$))". Координаты плоскости в пространстве аналогичным
 образом выражаются в виде "класс($xyz \ \ ax+by+cz+d=0$ \&
 число($x$) \& число($y$) \& число($z$))". Для задания координат
 прямой в пространстве обычно используется выражение "класс($xyz
 $ \ \  про\-порцнаборы($(x-a,y-b,z-c),(d,e,f)$) \& число($x$) \&
 число($y$) \& число($z$))". Здесь используется запись
 "пропорцнаборы($A \ B$)", означающая линейную зависимость двух
 числовых наборов $A,B$ одинаковой длины. ($a,b,c$) - координаты
 некоторой точки прямой; ($d,e,f$) - координаты ее направляющего
 вектора. Реже используется задание уравнения прямой как пересечения
 двух плоскостей - "класс($xyz \ \ ax+by+cz+d=0 \ \&
  \ px+qy+rz+s=0$ \& число($x$) \& число($y$) \& число($z$))".

 Утверждение "направлпрямой($A \ B \ C$)" означает, что $C$ есть
 координатный набор направ\-ляющего вектора прямой $A$ в системе координат
 $B$. Утверждение "плоскбазис \\ ($A \ B \ a \ b$)" означает, что
 $a,b$ суть два координатных набора для ортогональных единич\-ных
 векторов, лежащих на плоскости $A$, относительно прямоугольной
 системы коор\-динат $B$ трехмерного пространства.

 Утверждения "линвторпорядка($a$)" \ , "эллипс($a$)" \ ,
 "гипербола($a$)" \ , "парабола($a$)" \\ означают, стответственно, что
 $a$ есть невырожденная линия второго порядка на плоскости,
 эллипс, гипербола либо парабола. Чтобы указать на равностороннюю
 гиперболу, используется запись "равнгипербола($a$)" \ .
 Утверждение "направлпарабо\-лы($a \ b$)" означает, что $b$ есть
 вектор, определяюющий направление оси параболы $a$. Утверждения
 "действось($a \ b$)" и "мнимаяось($a \ b$)" означают, что прямая
 $a$ является, соответственно, действительной либо мнимой осью
 гиперболы $b$ (кроме того, для указания произвольной оси
 симметрии $a$ кривой $b$ можно использовать уже введенное выше
 обозначение "осьсимметрии($a \ b$)" \ ). Утверждение "фокус($a \
 b$)" означает, что точка $a$ является фокусом кривой второго
 порядка $b$; утверждение "директриса($a \ b \ c$)" \ - что прямая
 $a$ является директрисой кривой второго порядка $c$,
 соответствующей фокусу $b$. Утверждение "диаметр($a \ b$)"
 означает, что прямая $a$ является диаметром кривой второго порядка
 $b$; утверждение "сопряжнаправления($a \ b \ c$)"  \ - что
 направле\-ния прямых $a$ и $b$ являются сопряженными относительно
 кривой второго порядка $c$. Утверждение "асимптота($a \ b$)"
 означает, что прямая $a$ является асимптотой для кривой $b$.

 Выражение "ветвькривой($a \ b$)" обозначает ветвь кривой $b$,
 содержащую точку $a$. Фокальный параметр кривой $a$ обозначается
 "фокпараметр($a$)" \ ; длина хорды, проходящей через фокус кривой
 $a$ и перпендикулярной фокальной оси, обозначается
 "фокхорда($a$)" \ (удвоенный фокальный параметр). Длина полуоси
 эллипса $b$ по напра\-влению его оси $a$ обозначается "полуось($a \
 b$)" \ ; длины большой и малой осей эллипса - "большаяось($a$)" и
 "малаяось($a$)" \ . Длины действительной и мнимой полуосей гипер\-болы
 $a$ обозначаются "действполуось($a$)" и "мнимаяполуось($a$)" \ .
 Выражение "эксцен\-триситет($a$)" обозначает эксцен\-триситет кривой
 $a$.

 Утверждение "каноничкоорд($a \ b$)" означает, что $a$ есть
 каноническая система коор\-динат для кривой либо поверхности
 второго порядка $b$. Утверждение "фоксистема($a$ \ $b$)" означает,
 что $a$ есть прямоугольная система координат с центром в фокусе
 кривой второго порядка $b$, положительное направление оси абсцисс
 которой в случае парабо\-лы совпадает с направлением оси параболы,
 в случае эллипса - с направлением на другой фокус, а в случае
 гиперболы - противоположно этому направлению.

 Утверждения "поввторпорядка($a$)" \ ; "Цилиндр($a$)" \ ; "Конус($a$)" \ ;
 "эллипсоид($a$)" \ ; "гиперболоид($a$)" \ ; "параболоид($a$)" означают,
 соответственно, что $a$ есть невырожден\-ная поверхность второго
 порядка; цилиндрическая поверх\-ность; коническая поверх\-ность;
 эллипсоид; гиперболоид и параболоид. Для уточнения типа
 поверхности ис\-поль\-зуются (в сочетании с указанными выше) также
 утверждения "круглый($a$)" (ци\-линдр либо конус);
 "эллиптический($a$)" \ ; "гиперболический($a$)" \ ;
 "параболический \\ ($a$)" \ ; "однополостный($a$)" и
 "двуполостный($a$)".

 Утверждения "осьцилиндра($a \ b$)"; "образующая($a \ b$)" означают,
 что прямая $a$ яв\-ляется, соответственно, осью либо образующей цилиндра
 $b$. Утверждение "направля\-ющая($a \ b$)" означает, что кривая $a$
 служит направляющей цилиндра $b$. Утверждение "оськонуса($a \
 b$)" означает, что прямая $a$ является осью конуса $b$;
 утверждение "осьвра\-щения($a \ b$)" - что прямая $a$ есть ось
 вращения поверхности $b$. Утверждение "направлпа\-раболоида($a \ b
 \ c$)" означает, что координатный набор $c$ определяет
 направление оси параболоида $a$ в системе координат $b$.

 В случае эллипсоида вращения $a$ длина той оси, относительно
 которой происходит вращение эллипса, обозначается "высота($a$)";
 длина другой полуоси эллипса - "ради\-ус($a$)". В общем случае,
 длина полуоси эллипсоида по направлению его оси $a$ (т.е.
 $a$ - соответствующая прямая) обозначается "полуось($a \ b$)".

 Утверждение "диаметрплоскость($a \ b$)" означает, что $a$ есть
 диаметральная плос\-кость поверхности второго порядка $b$.
 Утверждение "сопряжнаправления($a \ b \ c$)" озна\-чает, что
 направления плоскости $a$ и прямой $b$ являются сопряженными
 относительно поверхности второго порядка $c$.

 Утверждение "собствкоорд($a \ b$)" означает, что $a$ есть
 прямоугольная система коор\-динат, единичные векторы которой
 задают направления главных осей поверхности второго порядка $b$.

 \section{Элементы линейной ал\-геб\-ры}

 Матрицы рассматриваются как функции от двух натуральных
 переменных, пробе\-гающих номера строк и столбцов. Если размерность
 матрицы нефиксирована, то она задается явно через описатель
 "отображение": "отображение($ij$ \ и(принадлежит($i$
 \ номера($1 \ldots n$))принадлежит($j$ номера($1 \ldots m$)))
  $A(i,j)$)", где $A(i,j)$ - выражение, определяющее общий вид
 элемента. Для матрицы фиксированной размерности мож\-но применять
 также задание ее по строкам: "строки(набор($a_{11} \ldots
 a_{1n}$) \ldots набор($a_{m1}$ $\ldots a_{mn}$))" либо по столбцам:
 "столбцы(набор($a_{11} \ldots a_{m1}$) \ldots набор($a_{1n}
 \ldots a_{mn}$))".

 Определитель и ранг матрицы $a$ обозначаются "определитель($a$)"
 и "ранг($a$)".

 Для сложения и изменения знака матриц, как и произвольных
 числовых функций, используются выражения "плюсфунк($a_1 \ldots
 a_k$)" и "минусфунк($a$)". Результат умно\-жения матрицы $a$
 на число $k$ обозначается "матркоэфф($k \ a$)"; результат
 перемно\-жения матриц - "умножматр($a_1 \ldots \ a_k$)".
 Результат возведения квадратной матрицы $a$ в целую степень $k$
 обозначается "степеньматр($a \ k$)". Выражение
 "линкомбинации($a$)" \\  обозначает множество линейных комбинаций
 матриц одинаковой размерности, при\-на\-длежащих множеству $a$.

 Утверждение "собствзначение($a \ b \ k$)" означает, что $b$ есть
 собственное значение матрицы $a$, имеющее кратность $k$.
 Утверждение "собствектор($a \ b \ c$)" означает, что $c$ есть
 собственный вектор-столбец матрицы $a$, отвечающий собственному
 значению $b$.

 Утверждение "каноничматрица($a \ x \ b$)" означает, что матрица
 $b$ является канони\-ческой формой полиномиальной матрицы $a$,
 элементы которой рассматриваются как многочлены от переменной
 $x$. Здесь снова используется контекстная семантика - элементы
 матриц $a,b$ записываются не в виде функций или формальных
 многочленов, а непосредственно в виде выражений, определяющих
 значения этих функций или многочленов.

 Утверждение "жордформа($a \ b \ c$)" означает, что матрица $b$
 является жордановой нормальной формой матрицы $a$, причем $c$ -
 матрица, трансформирующая $a$ в $b$.

 \section{Комплексные числа}

 Для работы с комплексными числами пришлось продублировать
 обозначения, ис\-поль\-зуемые в вещественном случае, сохранив способ их
 прорисовки на экране. При\-ме\-нение одних и тех же обозначений оказалось
 технически нецелесообразным хотя бы из-за того, что многие приемы
 вещественного случая в комплексном случае выглядят совершенно
 иначе. Параллелизм в обозначениях привел к необходимости создания
 параллельных приемов. Однако, имеющиеся в системе средства
 программирования позволили легко решить эту проблему.
 Проработка комплексного анализа в решателе продолжается, и приводимый
 ниже список обозначений будет расширяться.

 Утверждение "комплексное($a$)" означает, что $a$ есть комплексное
 число. Мнимая еди\-ница обозначается "мнимаяединица" \ ; вещественная
 и мнимая части комплекс\-но\-го числа $a$ - "вещественнаячасть($a$)"
 и "мнимаячасть($a$)" \ . Главное значение аргумента комплексного
 числа обозначается "аргумент($a$)"; множество всех значений аргумента
 - "Аргумент($a$)".  Посредством "сопряженное($a$)" обозначено число, комплексно
 со\-пря\-женное с $a$. Для арифметических операций и элементарных функций
 над ком\-плек\-сными числами введены обозначения
 "Плюс($a_1$ $ \ldots a_n$)" \ ; "Минус($a$)" \ ;
 "Умно\-же\-ние($a_1 \ldots a_n$)" \ ; "Дробь($a \ b$)" \ ; Степень($a \
 b$)" \ ; "Лога\-рифм($a \ b$)" \ ; "Синус($a$)" \ ; "Косинус($a$)" \ ;
 "Тангенс($a$)"; "Котангенс($a$)"; "Гипсинус($a$)"; "Гипкосинус($a$)";
 "Гип\-тангенс($a$)"; "Гипкотангенс($a$)"; "Модуль($a$)"; "Арксинус($a$)";
 "Арккосинус($a$)"; "Арк\-тангенс($a$)"; "Арккотангенс($a$)";
 "Аркгипсинус($a$)", "Аркгипкосинус($a$)"; "Арк\-гип\-тангенс($a$)";
 "Аркгипкотангенс($a$)", дублирующие аналогичные обозначения для
 ве\-щест\-венных чисел. При использовании стандартной математичес\-кой
 записи эти обо\-зна\-чения вводятся и прорисовываются так же, как и в
 веществен\-ном случае, од\-на\-ко при переводе во внутреннее представление
 они автоматически коррек\-тируются на основе контекста. Для степени
 и логарифма указанным выше образом обозначены главные значения
 соответствующих многозначных функций. Выражение "Ко\-рень($a \\ n \ k$)" \
 обозначает $k$ - й корень $n$ - й степени из комплексного числа $a$; здесь
 $k$ изменяется от 1 до $n$.

 Чтобы можно было работать не только с главными значениями, но с
 про\-из\-воль\-ными ветвями элементарных функций, добавлены обозначения
 "ветвьстепени($a$ $b$ $n$)" \ ($n$-я ветвь для $a^b$; при $n=0$
 имеем главное значение); "ветвьарксину\-са($a$ $n$)";
 "ветвьарккосинуса($a$ $n$)"; "ветвьарктангенса($a$ $n$)";
 "ветвьарккотангенса($a$ $n$)"; "ветвьаркгипсинуса($a$ $n$)";
 "ветвьаркгипкосинуса($a$ $n$)"; "ветвьаргкгиптанген\-са($a$ $n$)";
 "ветвьаркгипкотангенса($a$ $n$)". Здесь $n$ - номер ветви для
 соответствующего значе\-ния. Четные и нечетные номера в случаях
 арксинуса и арккосинуса, обычного либо гиперболического, соответствуют
 знакам "плюс" \ либо "минус" \ для радикала под логарифмом.
 $n$-я ветвь натурального логарифма обозначается "Натурлог($a$
 $n$)".

 Для перехода от рассмотрения комплексных чисел к
 изобра\-жа\-ю\-щим их точкам плоскости и обратно используются выражения
 "комплформа($A$)", "вещформа($A$)". Первое из них обозначает
 множество комплексных чисел $a+bi$, у которых пары ($a$,$b$)
 принадлежат множеству $A$. Оно же может обозначать комплекс\-ное
 число $a+bi$, определяемое парой $A = (a,b)$. Второе обеспечивает
 обратный переход - дает множество пар ($a$,$b$) вещественных
 чисел, для которых комплекс\-ное число $a+bi$ принадлежит множеству
 $A$, либо единственную пару ($a$,$b$), определяе\-мую комплек\-с\-ным
 числом $A = a+bi$.

 Множество всех комплексных чисел обозначается символом
 "комплексные", ко\-то\-рый прорисовывается на экране стандартным
 образом, в виде несколько видо\-из\-ме\-ненной буквы $C$.
 Для удобства работы с аргументами комплексных чисел введен
 вспомогательный оператор "нормарг($a$)", выполняющий приведение
 веществен\-но\-го числа $a$ по модулю $2\pi$ к промежутку от $-\pi$
 (не включая это значение) до $\pi$.

 Выражения "комплотрезок($a$ $b$)" \ и "комплинтервал($a$ $b$)" \
 обозначают, соответ\-ст\-вен\-но, комплексный отрезок и комплексный
 интервал с концами в точках $a$,$b$. Ориентированный комплексный
 отрезок с началом в точке $a$ и концом в точке $b$ обозначен
 "Комплотрезок($a$ $b$)". Односвязность подмножества $A$ точек
 комплекс\-ной плоскости обозначается "комплодносвязно($A$)".
 Граничные точки множества $A$ обозначаются выражением
 "комплграница($A$)".

 Для суммирования и перемножения конечных семейств $A$ комплексных
 чисел введены обозначения "Суммавсех($A$)",
 "Произведениевсех($A$)", которые прори\-со\-вы\-ва\-ются на экране
 стандартным образом, как $\sum$ и $\prod$.

 Выражение "Предел($f$ $t$ $a$)" \ обозначает предел функции
 комплексного пере\-мен\-но\-го $f$ в точке $a$. $t$ - тип предела; если
 он равен 0, то берется полная окрестность точки $a$. Прорисовка
 комплекснозначного предела на экране такая же, как для
 веществен\-но\-знач\-ного. Иначе $t$ - подмножество окрестности, по
 которому находится предел. Утверждение "Бескмалая($f$ $g$ $a$
 $t$)" \ означает, что отношение функций комплекс\-но\-го переменного
 $f$ и $g$ стремится к 0 при стремлении аргумента к точке $a$. $t$
 - указатель типа предела. Сходимость последовательности $p$
 комплексных чисел обозначается "Сходится($p$)". Непрерывность функции
 комплексного переменного $f$ на множестве $M$ обозначается
 "Непрерывно($f$ $M$)". Утверждение "локНепрерывно($f$ $a$)" \ означает,
 что функция $f$ непрерывна в какой-либо окрестности точки $a$. Чтобы
 указать, что $a$ есть точка ветвления функции $f$, используется запись
 "точкаветвления($a$)".

 Производная функции комплексного переменного $f$ в точке $a$
 обозначается "ком\-пл\-производная($f$ $a$)". Прорисовывается она так
 же, как обычная производная. Если производная не определена, то
 указанное выражение имеет своим значением символ "неопред". Для
 обозначения производных высших порядков служит запись
 "компл\-Производная($f$ $a$ $n$)", в которой $n$ указывает порядок.
 Прорисовка на экране этого выражения также стандартная.
 Условие дифференцируемости функции $f$ в точке $a$ записывается как
 "Дифференцируема($f$ $a$)".

 Если функция $f(x+iy)$ комплексного переменного записана в виде
 $u(x,y)+iv(x,y)$, то возникают две вещественнозначные функции
 $u,v$. Утверждения "вещ\-частьфунк($f$ $u$)" \ и "мнимчастьфунк($f$ $v$)"
 \ связывают эти функции с функцией $f$. Если аргумент функции
 комплексного переменного $f$ задан в полярных координатах
 ($r$, $\varphi$), и эта функция записана в виде $U(r,\varphi)+iV(r,
 \varphi)$, то аналогичным образом используются утверждения
 "вещчастьфункпол($f$,$U$)" \ и "мнимчастьфункпол($f$,$V$)".

 Аналитичность функции $f$ на множестве $M$ записывается в виде
 "аналитичес\-кая($f$ $M$)". Утверждение "дроблинфунк($f$)" \
 выделяет дробно-линейные функ\-ции комплексного переменного.

 Интеграл функции комплексного переменного $f$ вдоль
 ориентированной ком\-плек\-сной кривой $K$ обозначается
 "комплинтеграл($f$ $K$)". Вычет функции $f$ в точке $a$
 записывается как "вычет($f$ $a$)".

 Радиус сходимости степенного ряда с комплексными коэффициентами,
 обра\-зу\-ю\-щи\-ми последовательность $p$, обозначен
 "радиуссходимости($p$)".

 Для указания типа особой точки $a$ функции $f$ служат утверждения
 "устраним\-осо\-бая($f$ $a$)", "существособая($f$ $a$)", "Полюс($f$
 $a$ $n$)", где $n$ - порядок полюса.

 \section{Теория вероятности}

 Приведем список логических конструкций, возникших при обучении
 решателя тео\-рии вероятностей. Как и в предыдущем случае, он неполон
 из-за того, что обучение пока далеко не завершено. Утверждение
 "верпространство($A$)" \ означает, что $A$ есть вероятностное
 пространство. Выражение "равновер($A$)" \ обозначает
 вероятност\-ное пространство, определяемое на конечном множестве $A$
 соглашением о равноверо\-ят\-нос\-ти его элементов, либо вероятностное
 пространство, определяемое на множест\-ве $A$ бесконечных
 последовательностей элементов конечного множества соглашением о
 равновероятности для каждого натурального $n$ событий,
 получающихся при фик\-са\-ции первых $n$ элементов последовательности.
 Утверждение "событие($S$ $A$)" \ озна\-ча\-ет, что $S$ есть событие в
 вероятностном пространстве $A$. Множество элементар\-ных событий
 пространства $A$ обозначается "элемсобытия($A$)".

 Вероятность события $S$ в вероятностном пространстве $A$
 обозначается "вероят\-ность($S$ $A$)". Условная вероятность события
 $S$ в вероятностном пространстве $A$ при наличии события $D$
 обозначается "услвероятн($S$ $D$ $A$)".

 Независимость событий семейства $S$ в вероятностном пространстве
 $A$ обознача\-ет\-ся "незавсобытия($S$ $A$)". Утверждение
 "услнезавис($S$ $D$ $A$)" \ означает, что каждое из событий
 семейства $S$ является подсобытием события $D$, причем события
 этого семейства в сужении вероятностного пространства $A$ на
 событие $D$ являются не\-за\-ви\-си\-мыми. Утверждение "незавсерия($S$
 $A$)" \ означает, что $S$ есть семейство семейств $S(i)$ событий
 вероятностного пространства $A$, имеющих одну и ту же область
 оп\-ре\-де\-ления $D$. Для каждого $d \in D$ это семейство определяет
 группу событий $S(i)(d)$, причем независимы любые события $Q_j$,
 построенные каждое при помощи теоре\-ти\-ко-множественных операций из
 событий одной и той же группы и соответст\-ву\-ю\-щие различным группам.
 Аналогично, утверждение "услнезавсерия($S$ $D$ $A$)" \ выража\-ет
 условную независимость указанных событий $Q_j$ относительно
 события $D$. Утверж\-де\-ние "незавгруппы($S$ $A$)" \ означает, что
 $S$ есть семейство семейств событий вероят\-нос\-т\-ного пространства
 $A$, причем события, полученные из событий различных семейств
 теоретико-множественными операциями, независимы. Еще одно условие
 неза\-ви\-си\-мости, связанное с семействами событий -
 "относит\-не\-за\-вис($S$ $P$ $A$)". Оно означа\-ет, что $S$, $P$ суть два
 семейства событий вероятностного пространст\-ва $A$, причем любые
 два события семейства $S$ независимы в сужении вероятностного
 пространства $A$ на любую теоретико-множественную комбинацию
 событий семейства $P$.

 Утверждение "несовместны($S$ $A$)" \ означает, что любые два различных
 собы\-тия семейства $S$ являются несовместными в пространстве $A$.

 Прямое произведение вероятностных пространств $A_1, \ldots, A_n$
 обозначается "вер\-про\-изв($A_1 \ldots A_n$)".

 В ряде задач оказалось полезным выражение "версочетания($d$ $p$ $n$)",
 обозна\-ча\-ющее вероятность одновременного выполнения ровно $n$ независимых
 событий из списка, длина которого равна длине набора целых
 неотрицательных чисел $d$, а ве\-ро\-ят\-ность события, соответствующего числу
 $m$ данного списка - вероятности объе\-ди\-не\-ния $m$ независимых событий,
 каждое из которых происходит с вероятностью $p$.

 Утверждение "случвеличина($f$ $A$)" \ означает, что $f$ есть
 числовая функция, оп\-ре\-де\-ленная на множестве элементарных событий
 вероятностного пространства $A$. Утверждения "непрвеличина($f$
 $A$)", "дискрвеличина($f$ $A$)" \ означают, соответст\-вен\-но, что
 $f$ есть непрерывная либо дискретная случайная величина. Функция
 рас\-пре\-де\-ле\-ния случайной величины $f$, заданной на пространстве $A$,
 обозначается "функ\-рас\-пред($f$ $A$)". Плотность распределения непрерывной
 случайной величины $f$ обоз\-на\-ча\-ет\-ся "плотнраспред($f$ $A$)".
 Ряд распределения дискретной случайной величины $f$ (функция,
 сопоставляющая каждму допустимому значению его вероятность)
 обоз\-на\-чен "рядраспред($f$ $A$)". Независимость семейства $f$
 случайных величин над ве\-ро\-ят\-нос\-тным пространством $A$
 обозначается "незавслучвел($f$ $A$)".

 Выражения "матожидание($f$ $A$)", "дисперсия($f$ $A$)",
 "средквадроткл($f$ $A$)" \ обо\-зна\-чают, соответственно,
 математическое ожидание, дисперсию и среднее квад\-ра\-тичное
 отклонение случайной величины $f$. Начальный и центральный
 моменты этой случайной величины, имеющие порядок $n$,
 обозначаются "начмомент($f$ $n$ $A$)", "цен\-тр\-момент($f$ $n$
 $A$)". Результат центрирования случайной величины $f$ обозначен
 "цен\-трирование($f$ $A$)". Мода случайной величины $f$
 обозначается "мода($f$ $A$)".

 Условие распределенности случайной величины $f$ по закону
 Пуассона с па\-ра\-мет\-ром $p$ обозначается "Пуассон($f$ $A$ $p$)".
 Условие распределенности случайной величины $f$ по показательному
 закону с параметром $p$ записывается в виде "показатзакон($f$ $A$
 $p$)". Утверждение "нормраспред($f$ $A$ $m$ $s$)" \ означает, что
 случайная величина $f$ распределена по нормальному закону с
 математическом ожиданием $m$ и средним квадратическим отклонением
 $s$. Значение функции распределения нормальной слу\-чайной величины с
 математическим ожиданием 0 и средним квадратическим от\-кло\-нением 1
 в точке $x$ обозначается "Нормраспред($x$)". Значение в точке $x$
 функ\-ции, обратной к данной, обозначено "обрнормраспред($x$)".


 Утверждение "случпоток($f$ $A$)" \ означает, что $f$ есть
 случайный поток. Он рас\-смат\-ри\-вается как семейство событий в
 вероятностном пространстве $A$, состоящих в том, что в заданный
 момент наступает событие потока (временная интерпретация), либо
 как семейство событий, состоящих в том, что в заданном месте числовой
 пря\-мой расположена точка некоторого случайного множества точек
 (пространст\-вен\-ная интерпретация). Случайная величина, равная
 числу событий случайного потока $f$, произошедших на множестве
 моментов времени $M$, обозначается "числособытий($f$ $M$)".
 Простейший случайный поток $f$, характеризуемый параметром $p$,
 зада\-ет\-ся утверждением "простейшийпоток($f$ $p$)".

 Утверждение "случполе($f$ $n$ $A$)" \ означает, что $f$ есть
 случайное поле размер\-нос\-ти $n$. Оно рассматривается как семейство
 событий в вероятностном пространстве $A$, состоящих в том, что в
 заданной геометрической точке располагается точка поля. Случайная
 величина, равная числу точек случайного поля $f$, попадающих в
 под\-мно\-жество $M$, обозначается "числоточек($f$ $M$)". Посредством
 "равномерноеполе($f$ $p$)" \ обозначается равномерное случайное
 поле с плотностью $p$. Утверждение "незав\-со\-бы\-тие($f$ $S$)" \
 выражает независимость события $S$ от любого события, состоящего
 в том, что число точек случайного потока либо поля $f$,
 попадающих на какой-то промежуток, равно данной величине.
 Случайная величина, равная длине паузы между двумя
 последовательными событиями в случайном потоке $A$ либо
 рассто\-я\-нию от точки до ближайшей к ней в случайном поле
 обозначается "длинапаузы($A$)".

 \section{Элементарная физика}

 Как и в других разделах, логический язык решателя для физики
 пополняется по мере надобности при рассмотрении
 последовательности обучающих задач. Фи\-зи\-чес\-кие задачи, даже
 относящиеся к одному и тому же разделу, часто бывают связаны с
 совершенно различными сценариями, и пополнение списка понятий,
 необходи\-мых для описания этих сценариев, происходит до некоторой
 степени бессистемно. Каждый раз вводятся минимально необходимые для
 задачи средства. Видимо, впо\-след\-ст\-вии понадобится повторная
 итерация для упорядочения системы физичес\-ких понятий. Они
 воспринимаются в контексте ряда умолчаний и не обладают той степенью
 са\-мо\-до\-статочности, как математические понятия. Впрочем, это никак не
 сказывается на возможности развития решателей, работающих с такими
 понятиями. Просто в приемах больший акцент делается на
 фильтры, контролирующие корректность кон\-текс\-та. Приведем ту
 систему понятий, которая сложилась к текущему моменту про\-ра\-ботки
 задачника.

 \subsubsection{Общие свойства процессов}

 Длительность процесса $A$; его начальный и последний моменты
 обозначаются, соот\-вет\-ственно, "длительность($A$)",
 "исхмомент($A$)", "послмомент($A$)". Временной от\-ре\-зок, на
 протяжении которого протекает этот процесс, обозначается
 "Период($A$)". Условие "внутрмомент($A$ $t$)" \ означает, что
 момент $t$ относится к периоду про\-цес\-са $A$. Если $A$, $B$ - два
 процесса, то для указания на то, что временной промежу\-ток первого
 расположен внутри временного промежутка второго, используется
 запись "внешпроцесс($A$ $B$)". В частном случае, когда $A$ есть
 просто ограничение процес\-са $B$ на меньший временной промежуток,
 применяется обозначение "подпроцесс($A$ $B$)". Утверждение
 "циклпроцессов($A$ $B$)" \ означает, что процесс $A$ образован
 после\-до\-ва\-тель\-но происходящими процессами набора $B$.

 \subsubsection{Общие свойства веществ}

 Плотность вещества $A$ (масса на единицу объема) обозначается
 "плотность($A$)". Утверждение "вещество($P$ $A$)" \ означает, что
 тело $P$ состоит из вещества $A$. Для указания на то, что $A$
 есть химическое вещество, используется запись "Вещество($A$)".
 Утверждение "типвещества($A$)" \ означает, что $A$ есть тип химического
 вещества. В задачах встречались такие типы, как "руда", "сталь",
 и т.п. Процентное содер\-жа\-ние вещества $A$ в веществе $B$ (по
 массе) обозначается "содержание($A$ $B$)". То же са\-мое, но по
 объему обозначается как "Содержание($A$ $B$)". Утверждение
 "извлечение($P$ $A$ $R$)" означает, что $R$ есть результат извлечения
 из тела $P$ вещества $A$. Наконец, утверждение "твердоетело($P$)"
 \ означает, что $P$ есть твердое тело.

 \subsubsection{Общие свойства объектов}

 Масса объекта $A$ обозначается "масса($A$)". Для указания
 множества $B$ состав\-ных частей объекта $A$ используется
 утверждение "состоит($A$ $B$)". Утверждение "гла\-д\-кповерхн($A$)" \
 означает, что твердое тело $A$ имеет гладкую поверхность.
 Выделе\-ны несколько простейших геометрических типов тел.
 Утверждение "стержень($A$ $B$)" \ означает, что $A$ есть
 стержень, концы которого (материальные точки) составляют
 множество $B$. Утверждение "брусок($A$ $B$ $C$)" \ означает, что
 $A$ есть твердое тело, имеющее форму прямоугольного
 параллелепипеда. $B$ - одна из вершин этого па\-рал\-ле\-ле\-пи\-педа
 (материальная точка); $C$ - тройка (множество) других его вершин,
 соединенных с $B$ ребрами. Утверждение "клин($A$ $B$ $C$ $D$)" \
 означает, что $A$ есть твердое тело, имеющее форму прямоугольной
 призмы, в основании которой ле\-жит треугольник. $B$ - одна из
 вершин призмы; $C$ - пара (множество) вершин, лежащих в одном
 основании с $B$; $D$ - вершина, смежная с $B$ и лежащая в
 противополож\-ном основании.

 \subsubsection{Единицы измерения}

 Формально единицы измерения не являются числовыми величинами.
 Однако, они встречаются в формулах, при работе с которыми
 решатель иногда уточняет тип значений подвыражений, например,
 сомножителей. Если такой сомножитель пред\-ставляет собой единицу
 измерения и решатель не распознает в ней числовое вы\-ра\-же\-ние, то
 могут оказаться заблокированы те или иные необходимые приемы.
 Поэ\-то\-му, чтобы избежать перерегулировки уже имеющихся
 математических приемов, в решателе принято считать единицы
 измерения числами. Это всего лишь техничес\-кий трюк. Никакой
 дополнительной информации о том, как соотносятся между собой значения
 разнородных физических величин, решатель не имеет, и
 нежелатель\-ных коллизий указанное соглашение не вызывает. Можно
 было бы работать с единицами измерения отдельно от числовых
 выражений, однако такой способ более сложен и не соответствует
 общепринятой практике.

 Для обозначения единиц измерения применяются одноименные
 логические сим\-волы: "км", "м", "дм", "см", "сек", "мин", "час", "г",
 "кг". "т", "кГ", "Н", "Дж", "Вт", "кВт". В некоторых задачх
 встречалась единица измерения "день", обозна\-чен\-ная посредством
 символа "дн.".

 \subsubsection{Имена и физические константы}

 Для ускорения свободного падения и гравитационной постоянной
 используются ло\-ги\-чес\-кие символы "же" \ (прорисовывается как несколько
 модифицированная буква $g$) и "грав". Единственное встречавшееся
 в задачах имя собственное - "Земля" \ (как планета) обозначается
 одноименным логическим символом.

 \subsubsection{Траектории}

 Траектории перемещения материальных точек суть произвольные
 ориентирован\-ные кривые. Кроме физики, ориентированные кривые
 рассматривались также при обучении решателя математическому
 анализу, в подразделе, посвященном криво\-ли\-ней\-ным интегралам.
 Поэтому приводимые ниже обозначения обслуживают сразу оба раздела.
 Чтобы получить ориентированную кривую, возникающую при
 по\-сле\-до\-ва\-тельном прохождении ориентированных кривых набора $K$,
 используется выра\-же\-ние "путь($K$)". Ориентированная кривая,
 обратная к ориентирован\-ной кри\-вой $A$, обозначается
 "обратныйпуть($A$)". Начальная и конечная точки
 ориентирован\-ной кривой $A$ обозначаются, соответственно,
 "началопути($A$)" \ и "конецпути($A$)". Утверждение
 "отрезокпути($A$ $B$)" \ означает, что ориентированная кривая $A$
 явля\-ет\-ся частью ориентированной кривой $B$. Точка ориентированной
 кривой $A$, отстоящая от начала на расстоянии $p$, обозначается
 "точкапути($A$ $p$)". Множество точек ориенти\-ро\-ван\-ной кривой $A$
 обозначается "точкипути($A$)". Утверждение "простойпуть($A$)" \
 означает, что $A$ есть ориентированная кривая без
 самопересечений.

 Утверждение "закругление($A$ $B$ $C$ $D$)" \ означает, что
 траектория $D$ имеет в точ\-ке $A$ закругление, причем центр кривизны
 расположен в точке $B$, а точка $C$ доопре\-де\-ля\-ет соприкасающуюся
 плоскость.


 Ориентированная кривая, соответствующая прохождению отрезка от
 точки $A$ до точки $B$, обозначается "Отрезок($A$ $B$)".
 Ориентированная кривая, соответствующая движению по дуге
 окружности с центром в точке $A$, начинающемуся с точки $B$ и
 продолжающемуся на величину ориентированного угла $p$
 (положительным счита\-ет\-ся движение против часовой стрелки),
 обозначается "Дуга($A$ $B$ $p$)". Утверждение "общнаправл($A$
 $B$)" \ означает, что ориентированные кривые $A$ и $B$ составлены
 из отрезков прямых, параллельных заданному направлению.
 Утверждение "прям\-лин\-путь($A$)" \ означает, что $A$ есть
 ориентированная кривая, соответствующая про\-хож\-де\-нию некоторого
 отрезка от одного его конца к другому. Направляющий вектор
 ориентированной кривой $A$, представляющей собой отрезок,
 обозначается "напрпу\-ти($A$)".

 Чтобы получать ориентированную кривую из обычной кривой $A$,
 служит запись "ориенткривой($A$ $r$)", где $r$ - указатель
 ориентации. Рассматриваются следующие типы указателей ориентации:

 \begin{enumerate}

 \item "убывает($K$ $i$)" \ - в системе координат $K$ положение
 точки кривой одно\-знач\-но определяется ее $i$-й координатой, и
 кривая проходится в направлении убыва\-ния значения этой
 координаты;

 \item "возрастает($K$ $i$)" \ - аналогично предыдущему, но кривая
 проходится в на\-прав\-ле\-нии возрастания значения;

 \item "убывает($K$ 0)" \ - в системе координат $K$ кривая
 проходится по часовой стрелке;

 \item "возрастает($K$ 0)" \ - в системе координат $K$ кривая
 проходится против часо\-вой стрелки.

 \end{enumerate}

 Для параметрического задания ориентированной кривой с помощью
 числовой вектор-функции $f$ от числового аргумента (параметра) в
 системе координат $K$ слу\-жит запись "оркривая($f$ $K$)".
 Выражение "отрезоклинии($P$ $A$ $B$)", где $P$ - неори\-ен\-ти\-рованная
 кривая; $A,B$ - ее точки, - задает ориентированную кривую, прохо\-ди\-мую
 вдоль $P$ от $A$ к $B$.

 \subsubsection{Координаты}

 В физических выкладках часто встречаются проекции векторных
 величин на оси координат. Они обычно обозначаются с помощью
 индекса, указывающего нужную ось: $A_x$,$F_y$,$v_z$, и т.п.
 В решателе для аналогичной цели использована запись "крд($A$ $K$ $i$)".
 Здесь $A$ - рассматриваемый трехмерный вектор; $K$ - обозначение
 системы координат; $i$ - номер выделяемой координаты (1 - $OX$,
 2 - $OY$, 3 - $OZ$). Заметим, что в аналитической геометрии было
 введено обозначение "коорд($A$ $K$)", дающее весь координатный
 набор. Обозначение для отдельного разряда такого набора оказалось
 востребовано лишь в задачах по физике.

 Утверждение "вверх($A$ $K$)" \ означает, что вектор $A$
 в трехмерной системе коор\-ди\-нат $K$ направлен вертикально вверх.
 Используется также аналогичное утверж\-де\-ние "вниз($A$ $K$)".

 В физических задачах часто предполагается по умолчанию, что
 процессы про\-ис\-хо\-дят вблизи поверхности земли или какой-либо иной
 планеты. Чтобы явно обоз\-на\-чить это обстоятельство в посылках
 задачи, применяется утверждение "поверхн\-зем\-ли($K$)". Одновременно
 оно фиксирует какую-то прямоугольную систему коорди\-нат $K$,
 плоскость $OXY$ которой совпадает с плоскостью поверхности
 планеты. Можно было бы сказать точнее - касается этой
 поверхности, однако обычно в указанных задачах локально
 поверхность допустимо считать плоской. Ось $OZ$ системы $K$
 ведет вертикально вверх, т.е. от центра планеты. Если отсутствует
 дополнительная по\-сыл\-ка "поверхнпланеты($K$ $P$)", уточняющая, какая
 планета $P$ имеется в виду, то решатель будет считать, что
 рассматривается Земля, и брать соответствующее зна\-че\-ние ускорения
 свободного падения.

 Чтобы выделить в траектории движения верхнюю точку, служит
 запись "Верх\-няя\-точка($a$ $K$ $t$)". Она означает, что в момент
 $t$ тело, участвующее в процессе дви\-же\-ния $a$, оказывается в
 точке с наибольшей высотой относительно системы коор\-ди\-нат $K$,
 причем этот момент - строго внутренний для процесса $a$. Если
 послед\-нее требование отбрасывается, то используется запись
 "верхняяточка($A$ $K$ $t$)". Ана\-ло\-гич\-ным образом применяется
 запись "нижняяточка($A$ $K$ $t$)".

 Введены обозначения для характеризации направленности траекторий.
 Ут\-вер\-жд\-е\-ние "вертикаль($A$ $K$)" \ означает, что траектория (т.е.
 ориентированная кривая) $A$ состоит из отрезков, расположенных
 вертикально в прямоугольной системе коорди\-нат $K$. Утверждение
 "одномерное($A$ $K$)" \ означает, что $A$ есть процесс движения,
 траектория которого расположена на оси абсцисс прямоугольной
 трехмерной сис\-те\-мы координат $K$. Утверждение "вертплоск($A$
 $K$)" \ означает, что траектория про\-цес\-са движения $A$ состоит из
 частей, расположенных в плоскости $OXZ$ системы $K$. Утверждение
 "горизонталь($A$ $K$)" \ означает, что траектория $A$ состоит из
 отрез\-ков, расположенных в плоскости $OXY$. Утверждение
 "горизплоск($A$ $K$)" \ относится к процессу движения $A$,
 траектория которого удовлетворяет аналогичному условию.

 Чтобы работать не с материальной точкой, а с телом, имеющим
 невырожден\-ные размеры, используется выражение "Крд($A$ $K$ $i$)".
 Его значением служит множество $i$ - х координат в системе $K$
 геометрических точек либо векторов, принадлежащих множеству $A$.
 Утверждение "вертикположение($A$ $t$ $K$)" \ означает, что тело,
 совер\-ша\-ю\-щее процесс движения $A$, занимает в момент времени $t$
 вертикальное положе\-ние относительно системы координат $K$.
 Аналогичным образом вводится утвержде\-ние "горизположение($A$ $t$
 $K$)". Смысл каждого из приведенных утверждений уточняет\-ся согласно
 контексту задачи. Утверждение "горизповерхн($A$ $K$)" \ означает,
 что $A$ есть процесс движения тела, верхняя сторона которого в
 системе координат $K$ представ\-ля\-ет собой горизонтальную
 поверхность. Высота в момент $t$ горизонтальной поверх\-нос\-ти тела,
 совершающего процесс движения $A$, относительно системы координат
 $K$, обозначается "высотаповерхн($A$ $t$ $K$)". Утверждение
 "уклонвверх($P$ $K$ $t$)" \ относит\-ся к процессу $P$ движения клина
 $ABCD$. В момент $t$ этот клин расположен так, что его
 треугольное основание $ABC$ лежит в плоскости $XOZ$, причем
 вектор $AB$ однонаправлен с координатным вектором $OX$, вектор
 $AC$ образует с ним острый угол, а точка $C$ лежит выше точки
 $B$.

 \subsubsection{Кинематика}

 Перейдем к логическим обозначениям, относящимся к кинематической
 составляю\-щей описания сценария. Напомним, что приводимые далее
 понятия не дают сколь-нибудь полной и систематической картины, а просто
 перечисляют те предвари\-тель\-ные версии формализации, которые были
 извлечены из проработанных задач.

 Утверждение "движение($A$ $B$ $C$)" \ означает, что $A$ есть
 процесс движения ма\-те\-ри\-аль\-ной точки $B$ по траектории $C$.
 Для указания фиктивного процесса движе\-ния $A$ неподвижной в
 рассматриваемой системе отсчета материальной точки либо
 не\-под\-виж\-ного тела $B$ служит запись "неподв($A$ $B$)".
 Утверждение "движется($A$ $B$)" \ означает, что $A$,$B$ суть
 процессы движения материальных точек, причем относи\-тель\-ная
 скорость их не равна нулю в моменты, отличные от исходного и
 послед\-не\-го. Утверждение "мточка($A$)" \ означает, что $A$ есть
 материальная точка.

 Для обозначения скалярной скорости используется запись
 "скорость($A$ $D$)". Здесь $A$ - процесс движения; $D$ - либо
 момент времени, либо участок траектории про\-цес\-са $A$ (обычно вся
 траектория). В первом случае берется величина мгновенной скорос\-ти
 тела; во втором - средняя скалярная скорость на участке $D$.
 Заметим, что скаляр\-ная скорость всегда неотрицательна. Обычно она
 используется в задачах, где по умол\-ча\-нию фиксирован неподвижный
 фон, относительно которого и определяется величина скорости.
 Можно считать, что роль такого фона играет неподвижная траектория
 процесса движения. Векторная скорость обозначается "Скорость($A$ $B$
 $D$)". Здесь $A$ - процесс движения; $B$ - другой процесс
 движения либо система координат, относи\-тель\-но которых
 рассматривается вектор скорости первого процесса. Если $D$ -
 момент времени, то берется мгновенная скорость; если $D$ -
 временной промежуток, то берет\-ся средняя скорость на данном
 промежутке. Для случая скалярных скоростей также предусмотрено
 понятие относительной скорости. Именно, посредством
 "относит\-ско\-рость($D$ $A$ $B$)" \ обозначается скорость объекта,
 находящегося в процессе движения $A$, относительно объекта,
 находящегося в процессе движения $B$. При этом пред\-по\-ла\-га\-ет\-ся,
 что траектории процессов $A$,$B$ совпадают либо противоположны.
 Относитель\-ная скорость отсчитывается вдоль траектории и может
 быть любого знака. При этом положительное направление отсчета
 соответствует движению вдоль траектории $B$. $D$ - либо момент
 времени, либо траектория процесса движения $B$. В последнем слу\-чае
 имеется в виду средняя скорость.

 Расстояние, пройденноое в процессе движения $A$ к моменту времени $t$,
 обоз\-на\-чается "Путь($A$ $t$)". Так же обозначается расстояние,
 пройденное за времен\-ной отрезок $t$. Утвержде\-ние "встреча($A$
 $B$ $t$ $P$)" \ означает, что $A,B$ суть два процесса движения,
 для которых в момент $t$ в точке $P$ происходит встреча.
 Утверждение "прохождение($A$ $B$ $C$)" \ означает, что $A$ есть
 процесс прохождения одного длинно\-мер\-но\-го объекта вдоль другого
 при движении обоих объектов по общей траек\-то\-рии $C$. $B$ -
 неупорядоченная пара данных объектов. Утверждение
 "отрезокдвижения($A$ $B$ $C$)" \ означает, что $A$ есть
 подпроцесс процесса движения $B$, начинающийся с того момента,
 когда пройден начальный участок $C$ траектории процесса $B$.
 Подпроцесс $A$ может заканчиваться раньше, чем процесс $B$.
 Условие "невстр($A$ $B$)" \ означает, что объекты, участвующие в
 процессах движения $A,B$, не встречаются между собой.

 Геометрическая точка, в которой располагается в момент времени $t$
 материаль\-ная точка, совершающая процесс движения $A$,
 обозначается "Место($A$ $t$)". Множество точек пространства, в
 которых находятся в момент времени $t$ материальные точки тела,
 совершающего процесс движения $A$, обозначается "место($A$ $t$)".

 Утверждение "равномерное($A$)" \ означает, что $A$ есть процесс
 движения, ска\-ляр\-ная скорость которого неизменна. В частности, к
 этой категории относятся процес\-сы равномерного вращения. Если
 движение происходит с постоянной векторной ско\-рос\-тью, то
 используется условие "Равномерное($A$)".

 Скалярное ускорение, т.е. производная по времени скалярной
 скорости, обозна\-ча\-ет\-ся "ускорение($A$ $t$)". Здесь $A$ - процесс
 движения; $t$ - либо момент времени, к которому относится ускорение,
 либо участок траектории, на котором берется сред\-нее значение ускорения.
 Векторное ускорение обозначается "Ускорение($A$ $B$ $t$)". Здесь
 $A$ - процесс движения, для которого определяется ускорение; $B$
 - другой процесс движения либо система координат, относительно
 которых рассматривается $A$. $t$ - момент времени, либо временной
 промежуток, на котором выполняется осреднение ускорения. Утверждение
 "равноускоренное($A$)" \ означает, что процесс движения $A$ имеет
 постоянное скалярное ускорение; утверждение "Равноускоренное($A$
 $K$)" \ - что он имеет постоянное векторное ускорение в системе
 координат $K$.

 Утверждение "бросок($A$)" \ означает, что $A$ есть движение тела,
 на которое дейст\-ву\-ет единственная сила - сила тяжести.
 Иногда используется утверждение "около($A$ $K$)", означающее, что
 процесс движения $A$ происходит в непосредственной близос\-ти от
 начала системы координат $K$. Чтобы обозначить ускорение
 свободного падения у поверхности планеты $A$, явно указанной в
 задаче, используется запись "ускор\-своб\-пад($A$)".

 Утверждение "плавныйпереход($A$ $B$)" \ означает, что $A$, $B$
 суть два последо\-ва\-тель\-ных процесса движения некоторого тела, у
 которых скорости в момент пере\-хо\-да одинаковы. Утверждение
 "отражение($A$ $B$ $C$)" \ означает, что процесс движе\-ния $B$
 продолжает процесс $A$ после упругого отражения относительно
 поверхности (в двумерной модели - линии) $C$.

 Утверждение "напрдвижение($A$ $B$)" \ означает, что векторная
 скорость про\-цес\-са движения $A$ постоянно направлена вдоль прямой,
 соединяющей текущие точки процессов $A,B$. Утверждение
 "подвеска($A$ $B$)" \ означает, что $A$ есть процесс движе\-ния
 тела, подвешенного на нерастяжимой нити к телу, находящемуся в
 процес\-се движения $B$. Утверждение "гибкаясвязь($A$ $B$ $C$)" \
 означает, что тела, находящи\-е\-ся в процессах движения $A$ и $B$,
 связаны тонкой нерастяжимой нитью $C$. Аналогич\-ное утверждение
 "твердаясвязь($A$ $B$ $C$)" \ относится к тонкому твердому
 стержню $C$. В утверждении "упругсвязь($A$ $B$ $C$)", означающем
 наличие упругой связи (например, пружины) между телами,
 совершающими процессы движения $A,B$, в качестве $C$ берется уже
 не само упругое соединение, а процесс его движения. Это вызвано
 необходимостью учитывать изменение внутренней энергии упругой
 связи. Утверж\-де\-ние "упругподвеска($A$ $B$ $C$)" \ отличается от
 предыдущего лишь дополнитель\-ной информацией о том, что $A$
 подвешено к $B$ на упругом соединении. Утвержде\-ние "блок($A$ $B$
 $C$)" \ означает, что $A$ - процесс движения блока; $B$,$C$ -
 процессы движения двух тел, соединенных перекинутой через блок
 тонкой нерастяжимой нитью. Ут\-верж\-де\-ние "Подвеска($A$ $B$)" \
 используется для указания на то, что $A$ - процесс дви\-же\-ния
 материальной точки, подвешенной с помощью системы нерастяжимых
 ни\-тей к системе материальных точек, процессы движения которых
 образуют множество $B$.

 Для движения тела по наклонной плоскости введена запись
 "движнаклплоск($A$ $B$ $K$ $p$)". Здесь $A$ - процесс движения
 тела; $B$ - процесс движения наклонной плос\-кос\-ти, по которой
 движется тело. $K$ - прямоугольная система координат в
 простран\-ст\-ве, размещенная так, что наклонная плоскость
 параллельна оси $OY$ и накло\-не\-на под углом $p$ к направлению оси
 абсцисс. Этот угол может изменяться от 0 до $\pi/2$. Данная
 запись может показаться неоправданно громоздкой - вместо нее мож\-но
 было бы использовать более простые утверждения. Одно из
 них определяло бы параметры наклонной плоскости как
 геометрического тела; другое - указывало бы, что тело движется по
 поверхности наклонной плоскости. Однако, тогда было бы необходимо
 еще и третье утверждение, уточняющее, что тело перемещается по
 ли\-нии наибольшего уклона. Все это вместе взятое, все же,
 оказалось бы менее удоб\-ным, чем указанная выше запись.

 Чтобы можно было рассматривать движение тела по наклонной
 плоскости, на\-к\-лон которой изменяется с течением времени, введена
 запись "наклон($A$ $B$ $K$ $p$ $t$)". Она аналогична записи
 "движнаклплоск($\ldots$)", однако дополнительно указыва\-ет\-ся
 момент времени $t$, для которого угол наклона равен $p$. Этот
 угол может изме\-нять\-ся от 0 до двух пи.

 Утверждение "движениетела($A$ $B$)" \ означает, что $A$ есть
 процесс движения те\-ла $B$. Для обозначения фиктивного процесса
 $A$ движения неподвижного в рас\-смат\-ри\-ва\-емой системе отсчета тела
 $B$ служит запись "неподвтело($A$ $B$)". Утверж\-де\-ние
 "лежитна($A$ $B$ $C$)" \ означает, что $A$ есть процесс движения
 материальной точки, лежащей на материальной точке, совершающей
 процесс движения $B$ и относящейся к телу, совершающему процесс
 движения $C$. Утверж\-де\-ние "Лежитна($A$ $B$ $t$)" \ означает, что
 в момент $t$ тело, совершающее процесс движения $A$, лежит на
 верхней сторо\-не тела, совершающего процесс движения $B$.
 Утверждение "движениепо($A$ $B$)" \ озна\-ча\-ет, что $A$ есть процесс
 движения материальной точки по поверхности тела, совер\-ша\-ю\-ще\-го
 процесс движения $B$. Утверждения "внутрповерхн($A$ $B$)",
 "внешпо\-верхн($A$ $B$)" \ означают, что $A$ есть процесс движения
 материальной точки, соответственно, по внутренней либо внешней
 поверхности тела, совершающего процесс движения $B$. Смысл
 понятий "внутренняя" \ и "внешняя" \ уточняется контекстом.
 Утверждение "моментотрыва($A$ $B$ $t$)" \ означает, что $t$ есть
 момент отрыва тела, совершающего процесс движения $A$ по
 поверхности тела, совершающего процесс движения $B$, от
 последнего.

 Утверждение "попадание($A$ $B$)" \ означает, что $A,B$ суть такие
 два процесса дви\-же\-ния тел, имеющие общий период, что в конце этого
 периода тело $A$ попадает на тело $B$, а скорости тел становятся равны.
 Утверждение "распадение($A$ $B$)" \ озна\-ча\-ет, что $B$ есть множество
 процессов движения составных частей тела, находившегося до этого в
 процессе движения $A$. Начальные моменты всех процессов из $B$ совпадают
 с конечным моментом процесса $A$. Множество геометрических точек,
 являющихся в момент $t$ точками соприкосновения тел, совершающих
 процессы движения $A$ и $B$, обозначается "общиеточки($A$ $B$ $t$)".

 Для указания на то, что $A$ есть процесс движения материальной
 точки, отно\-ся\-щей\-ся к телу, совершающему процесс движения $B$,
 служит утверждение "дви\-же\-ни\-е\-точки($A$ $B$)".

 Чтобы указать на то, что процесс $A$ движения тела $B$ является
 поступа\-тель\-ным, используется запись "поступатдвижение($A$ $B$)".
 Утверждение "наклплоск($A$ $K$ $p$)" \ означает, что $A$ есть
 процесс поступательного движения поверхности, образующей в каждый
 момент наклонную плоскость, расположенную относительно
 прямоуголь\-ной системы координат $K$ так, что она параллельна оси
 $OY$ и наклонена под углом $p$ к направлению оси абсцисс.
 Параметр $p$ изменяется от 0 до $\pi/2$.

 Утверждение "вращение($A$ $B$)" \ означает, что $A$ есть процесс
 вращательного дви\-же\-ния тела $B$. Расстояние, пройденное в
 процессе вращения $A$ материальной точ\-кой $B$ вращающегося тела,
 либо расстояние, пройденное точкой на внешней окруж\-нос\-ти вращающегося
 круглого тела $B$, обозначается "путьвращения($A$ $B$)".
 Угол, на который поворачивается тело, находящееся в процессе
 вращения $A$, к моменту $t$, обозначается "уголвращения($A$
 $t$)". Утвержде\-ние "центрвращения($A$ $B$)" \ озна\-ча\-ет, что $A$ есть
 процесс движения точки - цен\-тра вращательного движения $B$.
 Утверждение "точкавращения($A$ $B$)" \ означает, что $A,B$ суть
 процессы движе\-ния двух материальных точек, относящихся к
 различным те\-лам, скрепленным в этих точках между собой так, что
 они могут свободно вращаться относительно точ\-ки соединения.
 Расстояние от центра процесса вращения $A$ до точ\-ки $B$
 вращающе\-го\-ся тела обозначается "радиусвращения($A$ $B$)".

 Утверждение "полныйоборот($A$)" \ означает, что процесс движения
 $A$ представ\-ля\-ет собой однократное прохождение материальной
 точкой некоторой окружности.

 Условная внешняя окружность круглого тела $A$ (колесо и т.п.),
 рассмат\-ри\-ва\-е\-мая как множество материальных точек этого тела,
 обозначается "внешокружность($A$)".

 Утверждение "качение($A$ $B$ $C$)" \ означает, что $A$ есть
 процесс качения тела $B$; $C$ - траектория, описываемая точкой
 качения. Геометрическая точка, в которой тело, совершающее
 процесс качения $A$, соприкасается в момент $t$ с поверхностью
 каче\-ния, обозначается "точкакачения($A$ $t$)".

 Среднее число оборотов в единицу времени для процесса $A$
 вращательного дви\-же\-ния тела $B$, либо мгновенная скорость
 вращения (обороты в единицу времени) для процесса $A$ в момент
 $B$ обозначается "скоростьвращения($A$ $B$)". Выраже\-ние
 "углскорость($A$ $B$)" \ обозначает либо угловую скорость в
 момент $B$ тела, находяще\-го\-ся в процессе движения $A$, либо
 среднюю угловую скорость на участке траек\-то\-рии $B$ указанного
 тела, либо угловую скорость тела $B$, находящегося в процессе
 враще\-ния $A$. Выражение "Углскорость($A$ $B$ $T$)" \ обозначает
 угловую скорость враще\-ния вектора, направленного от точки,
 совершающей процесс движения $A$, к точ\-ке, совершающей процесс
 движения $B$. $T$ - момент либо период, в который измеря\-ет\-ся
 скорость. Число оборотов, сделанных телом в течение процесса
 вращения $A$, обозначается "числооборотов($A$)". Выражение
 "периодобращения($A$)" \ обозначает пе\-риод обращения процесса
 вращательного движения $A$.

 Утверждение "ременнаяпередача($A$ $B$)" \ означает, что тела,
 находящиеся в про\-цес\-сах $A$ и $B$ вращательного движения,
 соединены ременной передачей. Утвержде\-ние "вращблока($A$ $B$ $C$
 $D$)" \ означает, что $A$ есть процесс вращения шкива,
 обес\-пе\-чи\-ва\-ю\-ще\-го связь через тонкую нерастяжимую нить процессов
 движения $B$,$C$,$D$. Центр шкива отождествляется с материальной
 точкой $B$.

 Приведем несколько понятий, встречающихся в задачах на вращение
 спут\-ни\-ков. Утвержде\-ние "планета($A$)" \ означает, что тело $A$
 является планетой. Утверждение "спутник($A$ $B$ $h$)" \ означает,
 что $A$ есть процесс движения некоторого тела относи\-тель\-но
 другого шарообразного тела, находящегося в процессе движения $B$,
 по кру\-го\-вой орбите под действием только силы взаимного
 притяжения. $h$ - высота ор\-би\-ты относительно поверхности второго
 тела. Утверждение "полюс($A$ $B$)" \ означает, что материальная
 точка $A$ является полюсом планеты $B$. Утверждение "экватор($A$
 $B$)" \ означает, что материальная точка $A$ лежит на экваторе
 планеты $B$.

 Утверждение "течение($A$ $B$)" \ означает, что $A$ есть процесс
 протекания некото\-ро\-го потока по руслу $B$. Предполагается, что
 русло имеет направляющую - линию, в каждой точке которой задано
 поперечное сечение русла. Как и траектория, русло ориентировано -
 выделены его начало и конец. Начальная и конечная точки на\-прав\-ля\-ющей
 линии русла $A$ обозначаются "исток($A$)". "сток($A$)". Поперечное
 сече\-ние русла $A$ в точке $B$ его направляющей линии обозначается
 "сечениерусла($A$ $B$)". Утверждение "про\-сто\-е\-рус\-ло($A$)" \
 означает, что русло $A$ имеет постоянную пло\-щадь сечения. Для
 указа\-ния на то, что траектория $A$ движения материальной точки
 на\-прав\-ле\-на вдоль русла $B$, начинаясь в начале этого русла и заканчиваясь
 в его кон\-це, используется за\-пись "вдольрусла($A$ $B$)".
 Утверждение "стекает($A$ $B$)" \ означает, что $A$ есть процесс
 течения вдоль поверхности твердого тела, совершающего про\-цесс
 движения $B$.

 Содержимое русла процесса течения $A$ в момент $t$ обозначается
 "струя($A$ $t$)". Плотность вещества процесса течения $A$ в точке
 $B$ направляющей его русла в мо\-мент $t$ обозначается
 "плотностьтечения($A$ $B$ $t$)". Если $B$ - не точка, а ссылка на
 все русло, то берется средняя плотность вещества, находящегося в
 струе в момент $t$. Если $t$ - не момент времени, а ссылка на
 русло, то берется средняя плотность вещества (в точке $B$ либо по
 всему руслу - в зависимости от $B$) на протяжении всего процесса
 $A$.

 Утверждение "истечение($A$ $B$)" \ означает, что $A$ есть процесс
 истечения из ис\-точ\-ни\-ка $B$ либо вытекания через сток $B$
 некоторой субстанции. Величина потока (мас\-са в единицу времени)
 для процесса истечения $A$ в момент времени $t$ обозна\-ча\-ет\-ся
 "поток($A$ $t$)". Если $t$ - не момент, а источник (сток)
 процесса $A$, то берется средняя величина потока за период
 процесса $A$. Для обозначения величины пото\-ка как объема в
 единицу времени аналогичным образом используется запись
 "Поток($A$ $t$)". Выражение "вкладисточника($A$ $t$)" \
 обозначает суммарную массу вещества, до\-бав\-лен\-ную в процессе
 источения $A$ на момент времени $t$. Если источник являет\-ся
 стоком, то эта величина отрицательна. Вместо момента времени
 можно брать в качестве $t$ источник (сток); тогда получается
 обозначение для суммарной мас\-сы вещества за весь период процесса
 $A$. Выражение "Вкладисточника($A$ $t$)" \ анало\-гич\-ным образом
 используется для указания суммарного объема вещества.

 \subsubsection{Динамика}

 Для указания процесса $A$ силового воздействия объекта,
 совершающего процесс дви\-же\-ния $C$, на объект, находящийся в
 процессе движения $B$, используется запись "воздействие($A$ $B$
 $C$)". Вектор силы, характеризующий процесс силового воздейст\-вия
 $A$ в момент времени $t$, обозначается "сила($A$ $t$)". Если $t$
 - временной проме\-жу\-ток, то берется среднее значение вектора силы.
 Вектор равнодействующей всех сил, действующих в момент либо
 промежуток времени $t$ на материальную точку, совершающую процесс
 движения $A$, обозначается "Сила($A$ $t$)". Утверждение
 "Си\-лы($A$ $B$)" \ означает, что $B$ есть множество всех процессов
 силового воздействия на материальную точку, находящуюся в процессе
 движения $A$.

 Утверждение "констсила($A$)" \ означает, что процесс силового
 воздействия $A$ ха\-рак\-те\-ризуется не изменяющимся в течение его
 периода вектором силы. Анало\-гич\-но, утверждение "констсилы($A$)" \
 выделяет множество $A$ процессов силового воздейст\-вия с не
 изменяющимся вектором силы.

 Если на тело могут действовать не указанные в задаче явно внешние
 силы, то добавляется посылка "внештело($A$)", где $A$ - процесс
 движения данного тела.

 Утверждение "притяжение($A$)" \ означает, что процесс $A$
 силового воздейст\-вия есть процесс притяжения. Утверждение
 "торможение($A$)" \ означает, что $A$ есть про\-цесс движения, для
 которого вектор силы постоянно направлен противопо\-лож\-но вектору
 скорости. Утверждение "тянет($A$ $B$ $C$)" \ означает, что $A$
 есть процесс сило\-во\-го воздействия объекта, совершающего процесс
 движения $B$, на объект, совершаю\-щий процесс движения $C$, при
 котором вектор силы направлен вдоль траекто\-рии движения $C$ по
 направлению к объекту $B$.

 Вектор силы трения, характеризующий процесс $A$ силового
 воздействия в мо\-мент времени $t$ либо на промежутке $t$,
 обозначается "силатрения($A$ $t$)". Вектор силы нормальной
 реакции при этом обозначается "нормреакция($A$ $t$)". Коэффициент
 тре\-ния (в тех же предположениях) обозначается "коэффтрения($A$
 $t$)". Если $A$,$B$ суть процессы движения тел, первое из которых
 перемещается по поверхности вто\-ро\-го, причем коэффициент трения
 равен 0, то используется запись "гладкое($A$ $B$)". Утверждение
 "граньскольжения($A$ $B$ $t$)" \ означает, что $A$ и $B$ суть
 процессы дви\-же\-ния двух тел, одно из которых в момент либо период
 $t$ лежит на поверх\-нос\-ти другого и находится на грани скольжения.
 Утверждение "безпроскальзывания($A$ $B$ $t$)" \ означает, что $A$
 есть процесс движения материальной точки по поверхности те\-ла,
 совершающего процесс движения $B$, причем в момент $t$ это
 движение происходит без проскальзывания относительно кривой,
 получающейся при пересечении поверх\-нос\-ти тела $B$ с нормальной
 плоскостью к траектории $A$. Иными словами, проек\-ция на
 касательную к этой кривой суммарного вектора сил, действующих на
 точку $A$, рассматриваемого в системе координат, связанной с
 телом $B$, равна 0. Утверж\-де\-ние "граньпроскальз($A$ $B$)" \
 означает, что $A$,$B$ суть процессы движения двух тел, пер\-вое из
 которых перемещается по поверхности второго, находясь на грани
 проскаль\-зы\-ва\-ния в направлении, обратном направлению к центру
 кривизны.

 Утверждение "воздействия($A$ $t$ $B$)" \ означает, что $B$ есть
 множество всех си\-ло\-вых воздействий на точки совершающего процесс
 движения $A$ тела в момент либо промежуток времени $t$.
 Утверждение "центртяжести($A$ $B$)" \ означает, что услов\-ная
 материальная точка $A$ является центром тяжести тела $B$. Чтобы
 выделить центр $A$ притяжения планеты, рассматриваемой в задаче,
 используется также утвержде\-ние "центрземли($A$)". Величина первой
 космической скорости для планеты $A$ обозна\-че\-на
 "первкосмскор($A$)".

 Коэффициент жесткости упругого соединения $A$ обозначается
 "жесткость($A$)". Величина удлинения либо сжатия в момент либо
 период $t$ упругого сое\-ди\-не\-ния, совершающего процесс движения $A$
 обозначается "удлинсвязи($A$ $t$)". Длина упру\-гой связи $A$ в
 отсутствии внешних сил обозначена "исхдлина($A$)".

 Утверждение "давление($A$ $B$ $C$)" \ означает, что $A$ есть
 процесс силового воздей\-ст\-вия объекта, находящегося в процессе
 движения $B$, на субстанцию, находящуюся в процессе течения $C$.
 Предполагается, что воздействие имеет место в начальной точ\-ке
 русла процесса $C$.

 \subsubsection{Закон сохранения импульса}

 Вектор импульса тела, находящегося в процессе движения $A$,
 который берется от\-но\-си\-тель\-но системы координат $K$ в момент либо
 временной промежуток $t$, обозна\-чен "импульс($A$ $K$ $t$)".

 Утверждение "отскок($A$ $B$ $C$ $D$)" \ означает, что $A$ есть
 процесс отскока тела, совершающего процесс движения $C$, от тела,
 совершающего процесс движения $B$. $D$ - процесс движения тела
 $C$ после отскока. Считаем, что при отскоке движение $B$ не
 изменяется. Утверждение "соударение($A$ $B$ $C$ $D$ $E$)" \
 означает, что $A$ есть про\-цесс соударения тел, совершающих
 процессы движения $B$,$C$. $D$,$E$ - процессы движе\-ния этих же
 тел после соударения. Утверждения "упругий($A$)".
 "неупругий($A$)" \ озна\-ча\-ют, что процесс $A$ отскока или
 соударения является абсолютно упругим либо абсолютно неупругим.
 Утверждение "центральнудар($A$)" \ означает, что процесс
 со\-уда\-ре\-ния $A$ является центральным, т.е. скорости направлены
 вдоль линии, сое\-ди\-ня\-ю\-щей центры тяжести соударяющихся тел.
 Утверждение "гладкийудар($A$)" \ озна\-ча\-ет, что в процессе
 соударения $A$ участвуют тела с гладкими поверхностями, т.е.
 ско\-ро\-сти этих тел в направлении, перпендикулярном оси удара,
 сохраняются.

 Утверждение "падение($A$ $B$ $C$ $D$)" \ означает, что $A$ есть
 процесс падения тела, совершающего процесс движения $C$, на тело,
 совершающее процесс движения $B$. $D$ - процесс движения тела $C$
 после падения. Движение $B$ после падения оста\-ет\-ся неизменным.

 Утверждение "толчок($A$ $B$)" \ означает, что $A$ есть процесс
 движения тела, про\-ис\-хо\-дя\-щий при силовом воздействии $B$ и
 отсутствии других силовых воздействий.

 Утверждение "выброс($A$ $B$)" \ означает, что $A$ есть процесс
 движения тела, от которого в течение периода $A$ отделяются тела,
 множество процессов движе\-ния которых есть $B$, причем силовыми
 воздействиями на тела $B$, отличными от воз\-дей\-ст\-вия на них
 тела $A$, можно пренебречь. Считается, что $A$ и любой из процес\-сов
 $B$ относятся к непересекающимся телам, которые на начальный момент
 их об\-ще\-го периода составляли одно тело.

 Утверждение "наезд($A$ $B$ $C$ $D$ $E$ $F$ $G$)" \ означает, что
 $A$ есть процесс наезда те\-ла, совершающего процесс движения $B$,
 на поверхность тела, совершающего про\-цесс движения $C$. Оба тела
 до наезда движутся по поверхности тела, совершаю\-ще\-го процесс
 движения $F$. $D$,$E$,$G$ - процессы движения тел $B$,$C$,$F$
 после наез\-да. Предполагается, что скорость процесса $G$ после
 наезда совпадает со скоростью про\-цес\-са $F$ до наезда. Утверждение
 "плавныйнаезд($A$)" \ означает, что процесс наезда $A$ протекает
 без удара.

 Утверждение "ударструи($A$ $B$ $C$ $D$)" \ означает, что $A$ есть
 процесс удара струи, процесс течения которой есть $C$, о твердое
 тело, процесс движения которого есть $B$. $D$ - процесс течения
 струи после удара.

 Утверждение "замкнсистема($A$ $M$ $K$)" \ означает, что $A$ есть
 множество процес\-сов движения тел, имеющих общий период, причем в
 течение этого периода сумма $i$-х координат сил, действующих на
 тела системы, для каждого $i=1,2,3$, кроме, быть может, значений
 $i$, принадлежащих множеству $M$, равна 0. $K$ - система
 коор\-ди\-нат. Утверждение "замкнапр($A$ $B$)" \ означает, что $A$
 есть множество процессов движе\-ния тел, имеющих общий период,
 причем в течение этого периода сумма проекций на направление
 вектора $B$ сил, действующих на тела системы, равна 0.

 \subsubsection{Работа и энергия}

 Работа, совершаемая силовым воздействием $A$ за период времени
 $t$, обознача\-ет\-ся "работасилы($A$ $t$)". Мощность, потребляемая
 процессом $A$ в момент $t$, либо сред\-няя мощность, потребляемая
 им за период $t$, обозначается "потреблмощность($A$ $t$)".
 Мощность, затрачиваемая процессом $A$ на процесс $B$ в момент
 либо период $t$, обо\-зна\-ча\-ется "полезнмощность($A$ $B$ $t$)".
 Коэффициент полезного действия для мощ\-нос\-ти, затрачиваемой
 процессом $A$ на процесс $B$ в момент либо период $t$,
 обо\-зна\-ча\-ет\-ся "кпд($A$ $B$ $t$)".

 Кинетическая энергия тела, совершающего процесс движения $A$, в
 момент $t$, обозначается "кинетичэнергия($A$ $t$)". Потенциальная
 энергия, при тех же пред\-по\-ло\-же\-ни\-ях, обозначается
 "потенцэнергия($A$ $t$)". Потенциальная энергия тяготе\-ния тела,
 совершающего процесс движения $A$, обозначается
 "потенцэнергтягот($A$ $t$)"; потенциальная энергия деформации
 того же тела (пружины, и т.п.) обозначается
 "потенцэнергдеформ($A$ $t$)". Полная механическая энергия
 обозначается "мехэнер\-гия($A$ $t$)". Энергия, выделившаяся в виде
 тепла в течение процесса $A$, обознача\-ет\-ся "теплэнергия($A$)".

 Чтобы указать на то, что $B$ есть процесс движения,
 непосредственно про\-дол\-жа\-ю\-щий процесс движения $A$, причем
 механическая энергия тела на стыке процес\-сов не изменяется,
 используется утверждение "продолжбезудара($A$ $B$)".


 \chapter{Представление задач в решателе}

 \section {Структуры данных, используемые для пред\-став\-ле\-ния
 за\-да\-чи}
 Как уже говорилось в главе 1, в решателе рассматриваются задачи
 четырех типов - на доказательство, на описание, на преобразование
 и на исследование. Начнем с описания используемых для их
 представления структур данных. Задача $Z$ любого типа представлена
 набором $(p_1, \ldots , p_n)$, первый элемент $p_1$ которого есть
 логический символ - название типа задачи. Эти названия суть
 логические символы "доказать", "описать", "преобразовать" и
 "исследовать". $p_2$ есть набор $(f_1, \ldots , f_m)$
 утверждений, называемых посылками задачи. Посылки перечисляют
 априори известные ограниче\-ния на фигурирующие в задаче объекты -
 то, что считается в задаче "данным". Список посылок обязательно
 непуст; если никаких исходных допущений не делается, то он
 предполагается состоящим из логической константы "истина".
 $p_3$ есть набор $(a_1, \ldots , a_m)$ целых неотрицательных
 чисел, называемых весами посылок ($a_i$ - вес посылки $f_i$)
 и используемых для переключения внимания при поиске очередного
 приема; в исходной ситуации веса посылок равны 0. $p_4$ -
 набор $(K_1, \ldots, K_m, K_0)$, элементы $K_i$ которого при
 $i \ne 0$ суть наборы комментариев к $i$ -й посылке, а $K_0$
 есть набор комментариев ко всему списку посылок. Комментарии
 суть технические пометки, делаемые решателем в процессе работы
 для сохранения различной инфор\-мации, направляющей ход решения.
 В исходной ситуации все $K_i$ пусты. Компоненты $p_1$ - $p_4$
 являются общими для задач всех перечисленных выше типов. Прочие
 компо\-ненты определяются в зависимости от типа задачи следующим
 образом:

 1. Задачи на доказательство. В этом случае $n=7$. Элемент $p_5$
 представляет собой утверждение, называемое условием задачи. Его
 истинность и требуется доказать, предполагая истинность посылок.
 $p_6$ - целое неотрицательное число, называемое весом условия
 задачи; как и веса посылок, оно используется для переключения
 внимания в процессе решения задачи. $p_7$ - последний элемент
 задачи на доказатель\-ство - набор комментариев к задаче в целом.
 Они, как и комментарии к посылкам, представляют собой технические
 пометки, вводимые решателем в процессе работы. Решая задачу на
 доказательство, решатель может выдать в качестве ответа либо
 логический символ "истина" - если он убедится, что условие
 действительно является логическим следствием посылок, либо
 логический символ "отказ" - если его попытки останутся
 безуспешными. Заметим, что решатель при рассмотрении задачи
 на дока\-зательство не выдает сообщений о ложности условия
 либо о том, что оно не является следствием посылок (хотя для
 ускоренной выдачи отказа он и может попытаться установить эти
 обстоятельства). Задача на доказательство служит только для
 "одно\-сторонней" попытки установления истинности утверждения -
 именно в такого рода вспомогательных попытках обычно и
 возникает надобность при решении других задач. Если же нужно
 провести "двустороннюю" проверку - выяснить, является ли
 некоторое утверждение истинным либо ложным, то для этого
 используется зада\-ча на описание с пустым списком неизвестных
 (подробнее об этом см. ниже).

 2. Задачи на описание. Здесь $n = 9$. В виде задачи на
 описание оформляются различные задачи, у которых требуется
 преобразовать заданным образом некоторый список утверждений
 - "условий" \ задачи. Преобразования этого списка условий
 осу\-ществляются в предположении истинности списка посылок.
 Как правило, условия содержат неизвестные, и в задаче
 требуется получить явное описание (полное либо неполное -
 в зависимости от целевой установки задачи) допустимых
 значений таких неизвестных. Элемент $p_5$ задачи на описание
 представляет собой список $(g_1, \ldots, g_k)$ ее условий.
 Элемент $p_6$ - набор $(b_1. \ldots, b_k)$ весов условий; элемент
 $p_7$ - набор $(Q_1, \ldots, Q_k$, $Q_0)$ списков комментариев.
 Здесь $Q_i$ $(i=1, \ldots, k)$ представляет собой список
 коммен\-тариев к условию $g_i$; $Q_0$ - список коммен\-тариев ко
 всей задаче в целом. Элементы $p_5,p_6,p_7$ совершенно аналогичны
 элементам $p_2,p_3,p_4$, характеризующим посылки за\-дачи.
 Элемент $p_8$ представляет собой набор технических пометок,
 называемых целя\-ми задачи. Ответ, получаемый в процессе
 решения задачи на описание, постепенно складывается в списке ее
 условий, так что при успешном завершении преобразований в конце
 решения выдается группа соединенных логической связкой "и" \
 заключитель\-ных условий. При неудаче в качестве ответа выдается
 логический символ "отказ". Класс утверждений, являющихся ответами
 на задачу, определяется в зависимос\-ти от набора ее целей. При
 этом некоторые из целей могут не накладывать каких-либо явных
 ограничений на ответ, а лишь указывать те или иные установки
 на оптимизацию, влияющие на принятие решений в процессе
 преобразований. Факти\-чески, список целей задачи представляет
 собой установку на управление базой прие\-мов решателя,
 осуществляющей рассмотрение задачи. За исключением особых слу\-чаев,
 принимается ряд соглашений о связи ответа задачи на описание
 с ее исходными условиями и посылками. Обычно задача на
 описание имеет цель, указывающую множество ее неизвестных,
 причем вхождение этих неизвестных в посылки задачи не
 допускается. Условия задачи должны являться следствиями ответа
 и посылок задачи; при этом ответ можно рассматривать как
 частичное либо полное описание множества наборов значений
 неизвестных, удовлетворяющих условиям задачи.

 Достаточно часто при решении задачи на описание может
 оказаться полезным и даже необходимым рассмотрение совместных
 следствий условий и посылок. Так как ответ задачи извлекается
 из списка ее условий, то регистрация таких вспомогатель\-ных
 следствий в списке условий нежелательна - она приведет к
 чрезмерному его увеличению и потребует сложной процедуры
 "расчистки" \ условий после определения значений неизвестных.
 Поэтому в структуре задачи на описание пришлось ввести
 специальный накопитель совместных следствий условий и посылок.
 Роль этого нако\-пителя (элемент $p_9$) играет вспомогательная
 задача на исследование, называемая блоком анализа задачи
 на описание. Изначально блок анализа отсутствует и вводится
 решателем в процессе рассмотрения задачи. В исходной ситуации
 элемент $p_9$ может быть равен либо логическому символу "пустоеслово"
 (общий случай), либо, в особых случаях, логическому символу "0" \
  - последнее означает запрет на ввод блока анализа при решении.

 3. Задачи на преобразование. В этом случае $n = 8$. $p_5$ -
 выражение, называемое условием задачи. Это выражение нужно
 преобразовать к некоторому виду, определя\-емому целевой установкой
 задачи. Как правило, требуется, чтобы исходное и резуль\-тирующее
 выражения были равны, в предположении истинности списка посылок.
 Иногда это требование может нарушаться; самый простой пример
 такого рода - использование задачи на преобразование для
 получения асимптотической оценки, когда результирующее выражение
 лишь асимптотически равно исходному. Более того, из-за
 технических причин в некоторых случаях удобно применять
 вспомога\-тельные задачи на преобразование, условиями которых
 являются не выражения, а утверждения. $p_6$ - целое
 неотрицательное число, называемое весом условия; $p_7$ -
 набор комментариев к задаче. $p_8$ - набор целей задачи.
 Некоторые из целей накладывают ограничения на вид ответа;
 другие - определяют установки на оптимизацию ответа. Ответом
 задачи на преобразование служит либо результирующее ее условие
  - если оно удовлетворяет определяемым целями ограничениям,
 либо логический символ "отказ".

4. Задачи на исследование. В этом случае $n=5$. $p_5$ - набор
целей задачи. Эти цели управляют процессом вывода представляющих
интерес следствий из посылок задачи, упрощения посылок и удаления
избыточных посылок. В результате таких действий исходная задача на
исследование $Z$ преобразуется в некоторую новую задачу $Z'$, и
при исчерпании средств, отведенных для решения задачи $Z$, в
качестве ответа на нее выдается задача $Z'$. По существу, такая
выдача ответа является фикцией - в действительности внешняя
процедура, обратившаяся к решению задачи на исследо\-вание, обычно
имеет непосредственную ссылку на нее, и по этой ссылке способна
получать всю необходимую информацию о произошедших изменениях.

\medskip

В исходной ситуации веса посылок и условий задачи, предъявляемой
решателю, равны 0; блок анализа и комментарии к задаче (ее
посылкам, условиям) отсутствуют. Вспомогательные задачи, вводимые
решателем, могут иметь ненулевые исходные веса посылок и непустые
списки комментариев. Это обеспечивает необходимую
преем\-ственность - сохраняет ранее накопленную информацию,
которая может понадобить\-ся при решении вспомогательной задачи.
Изменение весов, формирование коммен\-тариев и блока анализа
осуществляются системой в процессе решения задачи.

\section{Целевые установки задач}

Целевая установка задачи определяется ее списком целей. Она
имеется у всех типов задач, за исключением задач на
доказательство. С технической точки зрения, целевая установка
обеспечивает управление поведением многих тысяч независимо
функциони\-рующих приемов, решающих задачу. Так как каждый прием
рассматривает в своих решающих правилах лишь сравнительно
небольшой фрагмент целевой установки, и достижение ответа
происходит в результате интегрального действия многих различ\-ных
приемов, то варьирование списка целей задачи предоставляет
достаточно боль\-шие степени свободы для управления коллективным
поведением приемов. Пополне\-ние списка возможных типов целей
задач осуществляется, как правило, в связи с рассмотрением
конкретной предметной области и не приводит к какой-либо
моди\-фикации приемов, относящихся к другим предметным областям.

Перечислим некоторые наиболее часто встречающиеся типы целей, а в
следующем подразделе данной главы на большом количестве примеров
проиллюстрируем спо\-собы формального представления задач в
конкретных областях.

Заметим, что цель задачи обычно представляется либо логическим
символом, либо набором $(\phi,$ $A_1, \ldots, A_m)$, где $\phi$ -
логический символ, называемый заголовком цели; $A_1, \ldots, A_m$
- некоторые объекты. В последнем случае указанный набор будем
записывать далее как "$\phi A_1 \ldots A_m$" \ .

Пусть сначала $Z$ - задача на описание. Если $Z$ имеет цель
"неизвестные $x_1 \ldots x_k$" \ , где $x_1, \ldots, x_k$ -
попарно различные переменные, то $x_1, \ldots, x_k$ называются
неизвест\-ными задачи $Z$. Прочие свободные переменные посылок и
условий называются пара\-метрами задачи. Задача на описание может
и не иметь неизвестных, причем в зави\-симости от прочих целей в
этом случае необходимо либо установить эквивалентность условий
одной из логических констант "истина" \ , "ложь" \ , либо
осуществить опреде\-ленную переформулировку условий. Истинность
или ложность посылок задачи $Z$ должна однозначно определяться при
указании значений всех их свободных пере\-менных, отличных от
неизвестных (как правило, неизвестные задачи $Z$ вообще не
встречаются в посылках, хотя допускается фиктивное в указанном
смысле появление их в качестве свободных переменных посылок). Если
$Z$ имеет цель "параметры $y_1 \ldots y_k$" \ , где $y_1, \ldots,
y_k$ - некоторые из неизвестных задачи, то переменные $y_1,
\ldots, y_k$ называются несущественными неизвестными задачи $Z$.
Несущественные неизвестные задачи представляют собой те из
неизвестных, для которых требуется установить лишь сам факт
существования удовлетворяющих условиям их значений, не находя эти
значения явным образом. Более точно, произвольный ответ на задачу
$Z$ пред\-ставляет собой такое утверждение $f$, что для любых
значений свободных переменных посылок задачи $Z$, при которых эти
посылки истинны, из истинности $f$ вытекает существование таких
значений не входящих в $f$ несущественных неизвестных задачи, что
все условия задачи $Z$ истинны. Несущественные неизвестные задачи
являются "исключаемыми" неизвестными и обычно не входят в ответ.
Если задача имеет цель "прямойответ", то ответ $f$ не может
содержать вспомогательных переменных, вво\-димых для обозначения
объектов, существование которых вытекает из истинности посылок
задачи. В этом случае описание допустимых значений неизвестных
осущест\-вляется только в терминах объектов, упоминавшихся в
посылках и условиях задачи.

Если задача $Z$ имеет цель "пример", то ответ $f$ представляет
собой утверждение, построенное при помощи логических символов "и"
\ , "или" \ из утверждений вида "равно($x \ t$)" \ , где $x$ -
неизвестная задачи $Z$; \  $t$ - выражение, не зависящее от
неизвест\-ных, а также из некоторых утверждений, не зависящих от
неизвестных задачи $Z$. При преобразовании $f$ к виду
дизъюнктивной нормальной формы ни в одну из элементарных
конъюнкций не входят два различных утверждения вида "равно($x \
t$)" \ ,соответствующих одной и той же неизвестной $x$. Данная
цель используется в тех случаях, когда требуется указать
конкретный набор значений неизвестных задачи, при которых истинны
ее условия, быть может, с дополнительными ограничениями на
объекты, упоминаемые в посылках задачи. Если такие ограничения
недопустимы, то вводится дополнительная цель "полный". Более
подробно, если задача $Z$ имеет цели "полный" \ , "пример" \ , то
при замене всех входящих в ответ $f$ утверждений вида "равно($x \
t$)" \ , где $x$ - неизвестная задачи, на логический символ
"истина", должно получаться такое утверждение $f'$, являющееся
следствием посылок задачи. Если же задача $Z$, имеющая цель
"полный" \ , не имеет цели "пример" \ , то из истинности посылок
этой задачи вытекает эквивалентность истинности ответа $f$
существованию значений несущественных неизвестных, не являющихся
свободными переменными $f$, при которых истинны все условия задачи
$Z$.

Если задача $Z$ имеет цель "явное" \ , то ее ответ $f$
представляет собой утверждение, относящееся к классу так
называемых явных описаний значений неизвестных этой задачи. Для
определения класса явных описаний в каждой из рассматриваемых
предметных областей выделяются семейства конечных множеств
 $\{ f_1, \ldots , f_s \} $ утвер\-ждений, называемых атомарными
описаниями переменной $x$; эта переменная являет\-ся параметром
каждого из утверждений $f_1 , \ldots , f_s$. Так, атомарными
описания\-ми переменной $x$ считаются, например, множества $\{ x =
t_1 \} $, $\{ x \in t_1 \} $ , $\{ t_1 < x , x < t_2 \} $, $\{
\exists k (k - \mbox{целое} \ \& \ x = \pi k) \}$, $ \{ x -
\mbox{целое} \}$ и т.п. Здесь $t_1, t_2$ - произвольные выражения,
не имеющие параметра $x$. Явными описаниями значений неизвестных
задачи $Z$ счита\-ются утверждения, построенные при помощи
логических символов "и", "или" из эле\-ментов атомарных описаний
неизвестных этой задачи и не зависящих от неизвестных утверждений,
причем такие, что в результате преобразования к виду дизъюнктивной
нормальной формы каждая их элементарная конъюнкция, при подходящей
группи\-ровке членов, приобретает вид "и( $A_1(x_1)A_2(x_2) \ldots
A_s(x_s)B$)", где для любого $i=1, \ldots, s$ $A_i(x_i)$ -
конъюнкция утверждений атомарного описания неизвестной $x_i$
задачи $Z$; $x_i$ не является параметром утверждений
$A_{i+1}(x_{i+1}), \ldots, A_s(x_s)$ ; $B$ - утверждение, не
зависящее от неизвестных.

В некоторых случаях бывает полезной цель "и" \ , при наличии
которой ответ $f$ на задачу $Z$ имеет вид "и(равно($x_{j_1} t_1$)
$ \ldots $ равно($x_{j_m} \ t_m$) \ $g_1 \ldots \ g_s$)" \ , где
$m+s-1 \ge 1$; $x_{j_1}, \ldots , x_{j_m}$ - различные неизвестные
задачи $Z$; $t_1, \ldots , t_m, g_1, \ldots, g_s$ не зависят от
неизвестных задачи. Указанный вид ответа определяет подстановку
выражений $t_1, \ldots, t_m$ вместо переменных $x_{j_1}, \ldots,
x_{j_m}$; такая подстановка может использоваться, например, при
решении системы уравнений путем выражения части ее неизвестных
$x_{j_1}, \ldots, x_{j_m}$ через остальные неизвестные.

Для ограничения зависимости ответа от использованных при
формулировке зада\-чи переменных применяется цель "известно $y_1
\ldots y_k$" \ , где $y_1, \ldots, y_k$ - переменные, не
являющиеся неизвестными задачи; $k \ge 0$. При наличии такой цели
каждая свободная переменная ответа $f$ представляет собой либо
неизвестную задачи $Z$, либо некоторую переменную $y_i; i=1,
\ldots, k$. Переменные $y_1, \ldots, y_k$, выделенные целью
указанного вида, называются исходными данными задачи.

В качестве примера цели, определяющей установку на оптимизацию,
приведем цель "упростить" \ , активизирующую попытки
редактирования найденного ответа путем разрешения условий на
параметры относительно этих параметров, упрощения входящих в ответ
выражений и упрощения логической структуры ответа.

При формулировке исходной задачи может быть использована цель
"одз" \ , указы\-вающая на необходимость решения задачи в области
допустимых значений неизвест\-ных и параметров. Эта цель, по сути
дела, является лишь относящимся к интерфейсу системы техническим
приемом, позволяющим в неявной форме задавать часть усло\-вий либо
посылок задачи. Она инициирует расширение списков условий и
посылок задачи рядом утверждений, характеризующих область
допустимых значений пере\-менных задачи, после чего удаляется.

Приведем несколько примеров часто встречающихся комбинаций целей
задач на описание. Список \{ "неизвестные $x_1 \ldots x_k$" \ ,
"полный" \ , "пример" \ \} встречается у задач $Z$, введенных при
решении задачи на доказательство существования значений переменных
$x_1, \ldots, x_k$ , удовлетворяющих некоторому утверждению $f$.
При этом в задаче $Z$ требуется найти конкретные значения $x_1,
\ldots, x_k$ , быть может, выразив их через вспомогательные
обозначения для объектов, существование которых вытекает из
посылок. Последнее объясняет отсутствие цели "прямойответ",
блокирующей при\-емы, вводящие такие вспомогательные обозначения.

Список \{ "неизвестные $x_1 \ldots x_k$" \ , "полный" \ , "явное"
\ , "прямойответ" \  \}, как правило, вместе с целью "упростить",
 встречается у задач, в которых требуется описать в явной форме
 все значения неизвестных, удовлетворяющие условиям (на\-пример,
 задачи на решение систем уравнений или неравенств; задачи на
 определение геометрического места точек в геометрии, и т.п.).
 Если некоторые из условий такой задачи представляли собой
 утверждения о существовании некоторых объектов $y_1$, $\ldots,
 y_m$, то при ее решении возможно появление вспомогательных задач,
 неизвестны\-ми которых, помимо $x_1, \ldots, x_k$, становятся
 также $y_1$, $\ldots, y_m$. В этом случае вспомога\-тельная задача
 имеет, наряду с перечисленными выше, цель "параметры $y_1 \ldots
 y_m$".

 Список "неизвестные $x_1 \ldots x_k$" \ ,"полный" \ , "явное" \ ,
 "прямойответ" \ , "известно $y_1 \ldots y_k$" возникает в тех
 случаях, когда значения неизвестных требуется выразить через
 исходные данные $y_1, \ldots, y_k$, представляющие собой, вообще
 говоря, лишь часть параметров задачи. Как правило, в этом случае
 список условий задачи имеет вид "равно($x_1 \ t_1$)" \ , \ldots ,
 "равно($x_k \ t_k$)" \ , где $t_1, \ldots , t_k$ - выражения, не
 зависящие от неизвестных, но зависящие от некоторых параметров
 задачи, не являющихся исход\-ными данными $y_1, \ldots, y_k$.
 Примером такого рода являются геомет\-рические
 задачи на вычисление, посылки которых описывают некоторый
 геометри\-ческий чертеж; выделяются известные величины $y_1, \ldots
 , y_k$ (переменные), характери\-зующие этот чер\-теж, и требуется
 определить ряд связанных с ним неизвестных величин $t_1, \ldots,
 t_k$. Встречающиеся в описании чертежа переменные,
 обозначающие точки, хотя фор\-мально и являются известными, не
 должны входить в ответ задачи.

 Если требуется проверить истинность утверждений при заданных
 посылках, то используется задача на описание, единственным
 условием которой служит данное утверждение, а цели суть "полный",
 "явное", "прямойответ" (обычно добавляется цель "одз").
 Неизвестные задачи отсутствуют, и при решении ее будут
 предприни\-маться попытки заменить проверяемое утверждение на
 логическую константу "ис\-тина" либо "ложь". Эта константа и
 будет выдана в качестве ответа.

 Цели задач на преобразование оказываются тесно связаны с
 конкретными пред\-метными областями (например, разложение на
 множители либо преобразование к виду суммы одночленов в
 элементарной алгебре; приведение входящих в преобразу\-емое
 выражение тригонометрических функций к общему аргументу в
 тригонометрии; нахождение асимптотики выражения при отыскании
 пределов и т.п.). В одной задаче, как правило, сочетаются
 несколько таких целей (например, цель "разложитьнамно\-жители"
 и цель "неизвестные $x_1 \ldots x_k$", указывающая, что
 разложение на множители выражения $t$ необходимо для решения
 уравнения $t=0$ относительно $x_1, \ldots, x_k$). Единственной
 целью сравнительно общего характера для задач на преобразование
 является цель "упростить", выражающая тенденции к определенной
 стандартизации выражения. Впрочем, понятие "упростить" трактуется
 приемами решателя эвристи\-чески - в контексте прочих обстоятельств,
 сопровождающих задачу, так что в различ\-ных случаях упрощение
 одного и того же выражения может дать различные резуль\-таты.
 С другой стороны, цель "упростить" заменяет собой большое число
 целей част\-ного характера: задачи на нахождение численного
 значения выражения, на вычис\-ление производной, предела, интеграла
 и т.п. могут формулироваться как задачи на преобразование,
 имеющие единственную цель "упростить". Как и в случае задачи
 на описание, допускается формулировка исходной задачи на
 преобразование с целью "одз", определяющей присоединение к списку
 посылок совокупности утверждений, описывающей область допустимых
 значений параметров.

 Целевая установка задачи на исследование, возникающей в
 большинстве случаев как блок анализа задачи на описание,
 определяется спецификой этой внешней задачи. В такой целевой
 установке присутствует цель "неизвестные $x_1 \ldots x_k$,
 перенесенная из задачи на описание и направляющая вывод следствий
 таким образом, чтобы увеличить "степень разрешенности"
 утверждений относительно переменных $x_1, \ldots, x_k$.
 В случае задач на исследование, возникших при доказательстве
 утверждений "от противного", используется цель "противоречие",
 активизирующая попытки устано\-вить противоречивость посылок.

 \section{Примеры формулировки задач для ре\-ша\-те\-ля}

 Чтобы сделать более понятной приведенную выше общую схему
 формализации задач для решателя, приведем примеры постановки задач
 из различных разделов. Хотя в данном параграфе будет часто
 использоваться "скобочная" форма записи, соответ\-ствующая
 внутреннему логическому языку решателя, в действительности при
 поста\-новке зада\-чи и просмотре процесса ее решения применяется
 приближенная к стан\-дартной матема\-тическая запись. Минимальные
 необходимые для ввода новых задач сведения об интерфейсе,
 позволяющем работать с решателем и использующем стан\-дартную
 запись, будут приведены в следующем параграфе этой главы.

 \subsection{Алгебра множеств}

 Начнем с простейшего раздела - алгебры множеств. Если требуется
 доказать, напри\-мер, истинность тождества $c \cup (b \setminus a)
 = (b \cup c) \setminus a$, предполагая истинными утверждения
 $a \subseteq b$ и $(b \cap c)=\emptyset$, то мы приходим к
 задаче на доказательство, имеющей посылки "множество($a$)" \ ,
 "множество($b$)" \ , "множество($c$)" \ ,"содержится($a \
 b$)" , "рав\-но(пере\-сечение($b \ c$)пусто)" \ и единственное усло\-вие
 "равно(объединение($c$ раз\-ность($b$ \ $a$)) разность(объединение($b
 \ c$)$a$))". Заметим, что первые три посылки, указывающие тип
 значений переменных (множество), обычно формируются
 автоматически, и вруч\-ную их вводить не нужно. В последующих
 примерах будем для краткости опускать такие посылки.

 Следующий пример - задача на упрощение выражения $(c \cap b) \cup
 (c \cap a) \setminus d$ в предположении, что выполняется $a
 \subseteq b$. Она оформляется как задача на преобра\-зование,
 имеющая посылку "содержится($a \ b$)" и условие
 "объединение(пересечение($c$ \ $b$) разность(пересечение($c \
 a$)$d$))". Эта задача имеет цели "упростить" и "одз". Ответом на
 нее служит выражение "пересечение($b \ c$)".

 Простейшим примером задачи на описание может служить задача на
 решение уравнений $a \cap x = b, a \cup x =c$ в множествах,
 если для известных множеств $a,b,c$ выполнены соотношения
 $b \subseteq a, a \subseteq c$. Посылками такой задачи служат
 утверждения "содержится($b \ a$)", "содержится($a \ c$)",
 дополненные утверждениями о том, что $a,b,c$ - множества.
 Условиями являются утверждения "равно(пересечение($a \ x$)$b$)" \
 , "равно (объединение($a \ x$)$c$)" и "множество($x$)".
 Как и в случае посылок, обычно добавление условий, указывающих
 тип значения неизвестных (например, "множество($x$)"), вы\-полняется
 автоматически; в последующих примерах такие условия опускаем.
 Задача имеет цели "полный" \ , "явное" \ , "прямойответ" \ ,
 "одз" \ , "неизвестные $x$" и "упрос\-тить". Ответом задачи
 служит утверждение "равно($x$ объединение($b$ разность($c \
 a$)))".

 Другая ситуация в задачах на описание - когда требуется найти
 не полное описа\-ние всех допустимых значений неизвестных, а
 привести хотя бы один пример таких значений. Так, если нужно
 найти пример множества $x$, удовлетворяющего соотноше\-нию $a \cup
 x = b$ в предположении, что для известных множеств $a,b$
 выполняется $a \subseteq b$, то рассматривается задача на
 описание, имеющая посылку "содержится($a \ b$)" и условие
 "равно(объединение($a \ x$)$b$)". Эта задача имеет цели "полный",
 "пример", "неизвестные $x$" \ , "прямойответ" и "одз".
 Ответом на нее может служить, например, утверждение "равно($x \
 b$)".

 \subsection{Элементарная алгебра}

 Примеры формулировки задач по элементарной алгебре начнем с
 вычисления значе\-ний константных выражений. В простейших случаях
 здесь применяется обыч\-ная задача на преобразование с целью
 "упростить". Она имеет единственную вырож\-ден\-ную посылку -
 логическую константу "истина". Условием служит упрощаемое
 выра\-жение. Представление о том, что является упрощением - по
 существу, эврис\-тическое. Оно возникло в процессе рассмотрения
 многих конкретных примеров на упрощение и соответствующих этим
 примерам коррекций действий решателя. Так, при упрощении
 выражения $\frac{(5+ \sqrt{3})}{4 - \sqrt{3}}$, решатель
 избавляется от иррациональности в знаменателе и выдает ответ
 $\frac{9 \sqrt{3} + 23}{13}$; при упрощении выражения
 $\arctan(\frac{1}{3})+ \arctan(\frac{1}{5})+ \arctan(\frac{1}{7})
 + \arctan(\frac{1}{8})$ выдается ответ $\frac {\pi}{4}$, и т.п.
 В зависимости от задачи, исходное выражение может остаться
 неизмененным либо (что дает обучающий материал для продолжения
 оптимизации приемов) быть преобразованным к худшему виду.
 Впро\-чем, в стандартных задачах с "хорошим" ответом такое
 явление уже сейчас наблю\-дается достаточно редко.

 Если требуется найти точное целочисленное значение выражения,
 в котором встре\-чаются степени с большим показателем, факториалы
 и т.п., то рекомендуется цель "упростить" сопровождать целью
 "число" (в интерфейсе решателя для ввода такой целевой комбинации
 предусмотрен специальный пункт меню). В этом случае снима\-ются
 блокировки на действия, приводящие к длинным десятичным записям,
 имею\-щие место в случае обычной задачи на упрощение. Интерпретатор
 языка ЛОС позво\-ляет выполнять точные арифметические действия с
 десятичными записями чисел, имеющими до 3000 знаков.

 Если требуется получить приближенное значение константного
 выражения, содер\-жащего арифметические операции, степени,
 логарифмы, прямые и обратные триго\-нометрические функции,
 причем в этом приближенном значении нужно иметь задан\-ное число
 точных знаков после запятой, то применяется задача на
 преобразование, имеющая цели "упростить" и "числоценка $N$",
 где $N$ - число точных знаков после запятой. Производя
 вычисления, решатель получает гарантированные верхнюю и
 нижнюю оценки рассматриваемого выражения, увеличивая число
 цифр до тех пор, пока после округления "к ближайшему" в
 них не совпадут требуемые $N$ цифр после запятой.

 Наконец, для получения приближенной оценки константного
 выражения воз\-можно использование встроенного в компьютер
 математического сопроцессора (14 значащих цифр). Здесь
 используется комбинация целей "числзначение" и "выч".

 В случае задач на упрощение неконстантных алгебраических
 выражений, как и для константных, используется сочетание целей
 "упростить" и "одз". Например, для упрощения в области допустимых
 значений выражения $\frac{a}{a^2 + b^2} - \frac{b(a-b)^2}{a^4 -
 b^4}$ создается задача на преобразование, имеющая своим условием
 это выражение, посылками - утверждения "число($a$)" и "число($b$)"
 и указанные две цели. На нее выдается ответ $\frac{1}{a+b}$.
 Необходимые условия на о.д.з. (отличие знаменателей от 0)
 вводятся решателем в список посылок самостоятельно и в процессе
 решения изменяются так, чтобы не нарушалось соответствие между
 ними и "обслуживаемыми" ими подвыражениями условия задачи.
 Собственно в ответ результирующие условия на о.д.з. для
 парамет\-ров не включаются, но они легко могут быть считаны при
 пошаговом просмотре решения.

 Задачи разложения на множители имеют целевую установку
 "упростить", "разло\-житьнамножители", "одз". Так, для разложения
 на множители выражения $a^2 - b^2 - c^2 - 2bc$ создается задача
 на преобразование с этими целями, условием которой служит данное
 выражение, а посылки указывают тип значения переменных $a,b,c$.
 Заметим, что задачи на преобразование тригонометрических
 выражений к виду, удобному для логарифмирования, формулируются
 с теми же целями, что и обычные "алгебраические" задачи
 разложения на множители. Если требуется разложить на множители
 выражение, разрешая использование комплексных чисел, то кроме
 ука\-занных выше трех целей добавляется четвертая - "видУмножение".

 Чтобы разложить алгебраическую дробь в сумму простейших дробей,
 использу\-ется задача на преобразование, имеющая цели
 "простейшиедроби", "упростить", "одз". Например, решая задачу
 на преобразование с указанными целями и условием
 $\frac{1}{(a^2-a+1)(a^2+2a+3)}$, решатель выдает ответ
 $\frac{3a+4}{19(a^2+2a+3)}+\frac{5-3a}{19(a^2-a+1)}$.

 Наконец, для упрощения алгебраических выражений с "раскрыванием
 скобок" \\ предусмотрена целевая установка "упростить",
 "раскрытьскобки", "одз". Так, решая задачу на преобразование
 с данными целями и условием $a(b-c)+c(a-d)+d(c-b)$, решатель
 выдает ответ $ab - bd$. Хотя в этом ответе и можно было бы
 вынести за скобку общий множитель $b$, но цель "раскрытьскобки"
 блокирует такое действие.

 Если требуется упростить некоторое выражение, вместо параметров
 которого должны быть подставлены другие выражения, то такую
 подстановку не обязательно делать непосредственно - достаточно указать
 в посылках задачи равенства, опреде\-ляющие подставляемые выражения.
 Например, если имеется задача на преобра\-зование с условием
 $-4a^2x^{\frac{1}{m}+ \frac{1}{n}}+(x^{\frac{1}{m}} + x^{\frac{1}{n}})^2$
 и посылкой $x = (\sqrt{a^2 - 1}+a)^{\frac{2mn}{m-n}}$
 (не считая автоматически добавляемых посылок, указывающих тип
 значений переменных), то фактически будет упрощаться результат
 подстановки в условие выражения для $x$, определяемого посылкой.

 При решении задачи на упрощение алгебраического выражения может
 возникнуть разбор подслучаев, в результате чего ответ будет иметь
 вид "условного" выражения. Так, при упрощении выражения
 $\sqrt{a+2\sqrt{2a-4}} + \sqrt{a-2\sqrt{2a-4}}$ решатель выдает
 ответ "$2\sqrt{2}$ при $a<4$, иначе $2\sqrt{a-2}$" (для большей
 наглядности вместо скобочной конструкции "вариант($\ldots$)"
 мы использовали здесь стандартную запись, прорисовы\-ваемую
 формульным редактором решателя).

 Задачи на суммирование также оформляются как стандартные задачи
 на упро\-щение. Например, задача на преобразование с целями
 "упростить", "одз" , условием $\sum_{m=1}^n (2m-1)^3$ и
 посылкой "натуральное($n$)" приводится к ответу $(2n^2-1)n^2$.
 Заметим, что в этих задачах важно указывать в посылках, что
 значениями параметров, опре\-деляющих границы суммирования,
 служат целые числа, и сопровождать такие пара\-метры всеми
 необходимыми неравенствами.

 Задачи на решение уравнений, неравенств, систем уравнений и
 неравенств прак\-тически всегда имеют целевую установку
 "полный", "явное", "прямойответ", "одз", "упростить",
 "неизвестные $x_1 \ldots x_n$". Например, чтобы решить уравнение
 $\frac{\sqrt{1+a^2x^2} - ax}{\sqrt{1+a^2x^2}+ax}$ \ $= \frac{1}{b^2}$
 относительно неизвестной $x$, создается задача на описание с
 указанной выше целевой установкой, условиями которой служат
 данное уравнение и утверждение "число($x$)" (последнее создается
 автоматически процедурами интерфейса решателя). Эта задача
 имеет посылку "число($a$)". Решая задачи с параметрами, решатель
 ак\-куратно анализирует все возможные случаи, объединяя полученные
 для них резуль\-таты в общем ответе. Так, в указанном уравнении
 ответ будет объединять два под\-случая: $a \neq 0, b \neq 0,
 x = \frac{b^2-1}{2a|b|}$ и $(b = -1 \vee b = 1), a=0 $ с
 "вынесенной за скобку" общей частью "число($x$)".

 Если в задаче требуется найти все значения параметров, при
 которых система уравнений либо неравенств имеет хотя бы одно
 решение, то условие записывается с помощью квантора
 существования. Например, для нахождения всех значений па\-раметра
 $a$, при которых имеет решение система уравнений
 $y(ax-1)=2|x+1|+2xy, xy+1 = x-y$, вводится задача на описание
 с условием $\exists xy (y(ax-1)=2|x+1|+2xy \& xy+1 = x-y)$.
 Целевая установка у нее - такая же, как и выше (но роль
 неизвестной играет $a$). Аналогично, если нужно найти все
 значения параметров, при которых система уравнений либо неравенств
 имеет заданное число решений, то используется описатель "класс",
 с помощью которого обозначается множество решений рассматриваемой
 системы. Так, для отыскания значений параметра $a$, при которых
 система $\log_{2}y + 2 = \log_{2}(x+3y), \ y=2(x-a)^2+x+2a-4$
 имеет ровно два решения, создается задача на описание с условием
 "мощность(класс($x y$ \ ($\log_{2}y + 2 = \log_{2}(x+3y) \ \& \
  y=2(x-a)^2+x+2a-4$)))" $ = 2$. Если требуется найти значения
  параметров, при которых две системы (два уравнения, и т.п.)
 имеют одинаковые множества решений, то условие записывается в
 виде эквивалентности под квантором общности. Например, чтобы
 найти значения параметра $a$, при которых множество решений
 уравнения $4 (\cos x)^2 = a^2-6 $ совпадает со множеством
 решений уравнения $1-\cos (2x) = \frac{a}{6}$, используется
 задача на описание с условием $\forall x (4(\cos x)^2 = a^2-6
 \Leftrightarrow 1-\cos (2x) = \frac{a}{6})$. Заметим, что в
 перечисленных примерах под кванторами и описателем "класс"
 автоматически вводятся дополнительные утверждения
 "число($\ldots$)", уточня\-ющие тип значений связанных переменных.

 Если требуется определить число решений уравнения (системы)
 в зависимости от значений параметров, то возникает уже не задача
 на описание, а задача на преобра\-зование. Условием такой задачи
 служит выражение, задающее мощность множества корней, а цели -
 стандартные: "упростить" и "одз". Решатель пытается получить
 явное представление для множества корней, решая рассматриваемое
 уравнение (сис\-тему) либо иными средствами определяет мощность
 этого множества (например, анализируя с помощью производных и
 пределов интервалы монотонности). Так, если нужно определить
 число решений уравнения $\sqrt{\sqrt{x+\frac{1}{4}}+x+\frac{1}{2}}=a$,
 то условием задачи на преобразование будет выра\-жение
 "мощность(класс($x \ \sqrt{\sqrt{x+\frac{1}{4}}+x+\frac{1}{2}}=a$))".
 Ответ, получаемый здесь реша\-телем, имеет вид
 "1, если $\frac{1}{4} \le a$, иначе 0".

 При доказательстве тождества либо неравенства создается задача
 на доказа\-тельство, условием которой является это тождество либо
 неравенство, а посылки перечисляют ограничения на параметры. Так
 как задача на доказательство не имеет списка целей, то указание
 на пополнение списка посылок ограничениями на область допустимых
 значений передается ей не в виде цели "одз", а в виде комментария
 "одз". Это делается автоматически интерфейсом решателя. В качестве
 примера приведем задачу на доказательство с условием $64ab(a+b)^2 \le
 (\sqrt{a}+\sqrt{b})^8$ и посылками "число($a$)", "число($b$)".
 Неотрицательность параметров $a,b$ регистрируется в списке посылок уже
 при решении задачи, когда обрабатывается комментарий "одз".

 \subsection{Комбинаторика}

 Задача по комбинаторике обычно формализуется как задача на
 преобразование вы\-ра\-же\-ния "мощность($A$)". Целевая установка -
 стандартная, т.е. "Упростить в о.д.з.". Извлечение выражения
 "мощность($A$)" \ из текста задачи выполняется вручную. На\-при\-мер,
 рассмотрим следующий текст: "Экскурсанты разделились на две
 рав\-ные группы для розыска заблудившегося товарища. Среди них есть
 только 4 челове\-ка, знакомые с местностью. Каким числом способов они
 могут разделиться так, чтобы в каждую группу вошло 2 человека,
 знающих местность, если всего их 16 чело\-век?". Множество всех
 экскурсантов обозначаем через $A$; подмножество экскурсантов,
 зна\-комых с местностью - $D$. Тогда вводим следующие три посылки
 задачи: $\mbox{card}(A) = 16$, $\mbox{card}(D) = 4$, $D \subseteq
 A$. Если подсчитывается количество упорядоченных пар групп, то
 преобразуемое условие имеет вид $\mbox{card}(\mbox{set}_{BC}(B
 - \mbox{set} \ \& \ C - \mbox{set} \ \& \ A = B \cup C \ \& \
 B \cap C = \emptyset \ \& \ \mbox{card}(B) = \mbox{card}(C) \ \& \
 \mbox{card}(B \cap D) = 2 \ \& \ \mbox{card}(C \cap D) = 2))$.
 Если же подсчиты\-вать количество неупорядоченных пар групп (что, собственно,
 и требуется в задаче), то условие несколько усложняется:
 $\mbox{card}(\mbox{set}_x(\exists_{BC}(x =
 \{B,C\} \ \& \ B - \mbox{set} \ \& \ C - \mbox{set} \ \& \ A =
 B \cup C \ \& \ B \cap C = \emptyset \ \& \ \mbox{card}(B) =
 \mbox{card}(C) \ \& \ \mbox{card}(B \cap D) = 2 \ \& \
 \mbox{card}(C \cap D) = 2)))$. Обе версии без труда доводятся
 решателем до ответа.

 Приведем еще один пример, иллюстрирующий часто встречающиеся в
 задачах по комбинаторике конструкции с отображениями: "Из цифр
 1,2,3,4,5,6,7,8,9 состав\-ля\-ют\-ся всевозможные пятизначные числа, не
 содержащие одинаковых цифр. Опреде\-лить количество чисел, в
 которых есть цифры 2,4 и 5 одновременно.". Пятизнач\- ное число
 можно рассматривать как отображение множества номеров цифр $\{1,
 \ldots, 5\}$ в множество цифр $\{1, \ldots , 9 \}$. Условие
 наличия в числе $x$ цифры $m$ тогда запишется как
 $\neg(\mbox{слой}(x,m)= \emptyset)$; условие различия цифр числа -
 "взаимнооднозначно($x$)". Таким образом, условие задачи на
 преобразование имеет вид \ $\mbox{card}(\mbox{set}_f(\mbox{Отображение}
 (f, \{1, \\ \ldots , 5\}, \{1, \ldots , 9 \}) \ \& \ \mbox{взаимнооднозначно}(f) \ \&
 \ \neg(\mbox{слой}(f,2)= \emptyset) \ \& \ \neg(\mbox{слой}(f,4)=
 \emptyset) \ \& \ \neg(\mbox{слой}(f,5)= \emptyset)))$.

 \subsection{Элементарная геометрия}

 Вычислительные задачи по планиметрии внешне напоминают задачи на
 решение уравнений и неравенств - в обоих случаях требуется определить
 значения "неизвест\-ных" величин. Однако, здесь имеются существенные
 различия, приводящие к необхо\-димости особой логической
 формализации. Прежде всего, параметры посылок гео\-метрической
 задачи бывают двух типов - числовые, про которые обычно предполага\-ется,
 что они "известны", и параметры - обозначения точек чертежа. Последние,
 хотя и содержатся в посылках, "известными" никоим образом не
 считаются и в ответ входить не должны. Более того, те величины,
 которые требуется определить в геомет\-рической задаче, обычно
 изначально явно выражены через ее "точечные" параметры, так что с
 точки зрения обычной "алгебраического типа" задачи на описание,
 ситуация вырожденная. Эти обстоятельства потребовали ввести
 для геометрических задач на вычисление специальную цель
 "известно $a_1 \ldots a_n$", которая указывает все параметры
 $a_1, \ldots, a_n$, которые могут встречаться в ответе
 (возможен случай $n=0$, и тогда цель сводится к логическому символу
 "известно"). Изначально имеющаяся информация о чертеже перечисляется
 в списке посылок задачи; условиями служат равенства, явно выражающие
 неизвестные величины через обозначения точек чертежа.

 В качестве простейшего примера рассмотрим следующую задачу.
 В треугольнике $ABC$ длина стороны $AC$ равна $a$; угол $BAC$
 равен $b$, а угол $BCA$ равен $c$. Требуется вычислить площадь
 данного треугольника. Эта ситуация формализуется в виде зада\-чи на
 описание, посылками которой служат следующие утверждения:
 "треугольник \ ($ABC$)"; "расстояние($AC$)$=a$"; "угол($BAC$)$=b$";
 "угол($BCA$)$=c$". Они дополняются вводимыми автоматически
 утверждениями о типе значения: "точка($A$)", "точка($B$)",
 "точка($C$)", "число($a$)", "число($b$)", "число($c$)".
 Задача имеет условия "$x =$площадь \ (фигура($ABC$))" и
 "число($x$)". Целевая установка ее состоит из целей "неизвестные
 $x$"; "известно $abc$"; "полный"; "прямойответ"; "явное";
 "упростить"; "одз".

 При формулировке утверждений, описывающих чертеж геометрической
 задачи, следует учитывать некоторую ограниченность созданного на
 текущий момент запаса понятий. Так, например, отсутствует в явном
 виде понятие "медиана треугольника". Если в условии задачи
 говорится про медиану, то нужно вводить в рассмотрение новую точку -
 основание медианы, и указывать в посылках, что расстояния ее до
 концов стороны треугольника равны, а сама эта точка лежит на данной
 стороне (т.е. на отрезке с соответствующими концами). Впрочем,
 последнее условие можно ослабить - задать принадлежность точки не
 стороне, а прямой, на которой лежит эта сторона. Приведем
 несколько примеров простых задач, в которых встречаются такого рода
 "стандартные" для решателя формулировки геометрических условий.

 Пусть имеется треугольник $ABC$, у которого длина стороны $AB$
 равна 6, длина стороны $BC$ равна 8; медианы, проведенные из
 вершин $A$ и $C$, взаимно перпендику\-лярны, причем требуется найти
 площадь треугольника. Посылки соответствующей задачи на описание
 таковы: "треугольник($ABC$)"; "расстояние($AB$)$=6$";
 "расстоя\-ние($BC$)$=8$"; "$D \in$ отрезок($BC$)";
 "расстояние($BD$) = расстояние($CD$)"; "$E \in$ отрезок($AB$)";
 "расстояние($AE$) = расстояние($BE$)";
 "перпендикулярно(прямая($CE$)\ прямая($AD$))". Условием служит
 равенство "$x =$ площадь(фигура($ABC$))". Задача имеет цели
 "неизвестные $x$", "известно", "полный", "прямойответ", "явное",
 "упрос\-тить", "одз".

 Аналогичные примеры приведем для биссектрисы и высоты
 треугольника. В первом из них даны длины $a,b,c$ сторон $BC$,
 $AC$, $AB$ треугольника $ABC$. Биссектрисы треугольника,
 проведенные из вершин $B$ и $C$, пересекаются в точке $D$.
 Требуется найти, в каком отношении точка $D$ делит биссектрису,
 проведенную из вершины $B$. Посылками задачи для этого примера
 служат утверждения "треугольник($ABC$)"; "расстояние($BC$)$=a$";
 "расстояние($AC$)$=b$"; "расстояние($AB$)$=c$";
 "биссектриса \ ($ABCR$)" (введена точка $R$ - основание биссектрисы
 угла $B$); "$R \in$отрезок($AC$)" (точка $R$ лежит на стороне
 $AC$); "биссектриса($ACBP$)"; "$P \in$отрезок($AB$)";
 (аналогично, для биссектрисы угла $C$ введено основание $P$);
 "$D \in $отрезок($BR$)"; "$D \in $отрезок($CP$)" \ (введена в
 рассмотрение точка $D$ пересечения биссектрис). Условие задачи
 имеет вид "$x =$расстояние($BD$) / расстояние($DR$)". Цели задачи
 суть: "неизвестные$x$"; "известно $abc$"; "полный"; "явное";
 "прямойответ"; "одз"; "упростить".

 В другом примере известно, что длина стороны $BC$ треугольника
 $ABC$ равна 8; длины высот треугольника, проведенных из вершин
 $A$ и $B$, равны, соответственно, 4 и $6.4$. Требуется найти
 длины сторон $AB$ и $AC$. Посылки задачи суть:
 "треугольник \ ($ABC$)"; "расстояние($BC$)=8"; "$D \in$
 прямая($BC$)" (введено основание $D$ высоты, проведенной из $A$);
 "перпендикулярно(прямая($AD$) прямая($BC$))" (высота перпенди\-кулярна
 основанию); "$E \in$ прямая($AC$)" (основание второй высоты);
 "перпенди\-ку\-лярно(прямая($BE$)прямая($AC$))";
 "расстояние($AD$)$=4$"; "расстояние($BE$)$=6.4$". \\ Условия этой
 задачи имеют вид: "$x =$ расстояние($AB$)"; "$y
 =$расстояние($AC$)".

 Заметим, что в планиметрических задачах обычно имеется фиктивная
 посылка "планиметрия". Как правило, она вводится автоматически
 после набора задачи, однако иногда ее приходится вводить вручную
 (последовательным нажатием клавиш "п","и"). Эта посылка необходима
 для ускорения проверок принадлежности рассмат\-риваемых прямых и
 точек общей плоскости. В особых случаях ее отсутствие может также
 привести к выдаче отказа на задачу.

 Для указания на то, что точка принадлежит внутренности фигуры,
 ограниченной системой лучей и отрезков, используются утверждения
 "однасторона($ \ldots$)"; "раз\-ныестороны($ \ldots$)". Так,
 рассмотрим следующую задачу. Внутри угла $BAC$, величина которого
 равна $a$, взята точка $M$. Из нее опущены перпендикуляры на
 стороны угла, причем известно, что основания перпендикуляров
 отстоят от вершины угла на расстояния $p$ и $q$. Нужно найти
 длины перпендикуляров. Данная ситуация описывает\-ся следующей
 системой посылок: "угол($BAC$)$=a$";
 "однасторона($C,M,$прямая($A$ \ $B$))";
 "однасторона($B,M,$прямая($AC$))" (условие принадлежности
 точки $M$ углу сфо\-рмули\-ровано как пара условий: эта точка лежит
 по ту же сторону от одной стороны угла, что и направляющая точка
 другой стороны); "перпендикулярно(прямая($PM$)\\ прямая($AB$))";
 "$P \in$ прямая($AB$)" ($P$ - основание первого перпендикуляра);
 "перпен\-дикулярно(прямая($QM$)прямая($AC$))"; "$Q \in
 $прямая($AC$)" ($Q$ - основание второго пер\-пендикуляра);
 "расстояние($AP$)$=p$"; "расстояние($AQ$)$=q$"; $0<a$;
 $a < \pi$ (невырож\-денность угла); $0<p$; $0<q$
 (эти два неравенства уточняют, что точка $M$ находится во
 внутренности угла). Условия задачи суть: "$x=$расстояние($PM$)";
 "$y=$расстояние \ ($QM$)". Заметим, что условие принадлежности
 точки углу могло быть сформулиро\-вано и непосредственным
 образом, как "$M \in$Угол($BAC$)". Приведенная выше более
 громоздкая формулировка нужна здесь лишь как иллюстрация
 возможного приме\-нения предикатов "однасторона" и "разныестороны".

 Геометрические задачи на доказательство формулируются почти
 так же, как и задачи на вычисление: в посылках задается чертеж;
 условием служит утверждение, которое требуется доказать.
 Например, задача на доказательство того, что каждый выпуклый
 четырехугольник, диагонали которого суть биссектрисы его
 внутренних углов, является ромбом, имеет следующие посылки:
 "четырехугольник($ABCD$)"; "биссектриса($BADC$)";
 "биссектриса($BCDA$)"; "биссектриса($ABCD$)";
 "биссектри\-са($ADCB$)". Условие этой задачи - "ромб($ABCD$)".

 Геометрические задачи на построение и на определение
 геометрического места точек хорошо формализуются в виде
 обычных задач на описание, имеющих стандарт\-ную целевую установку
 "неизвестные $x_1 \ldots x_n$", "полный", "явное", "прямойответ",
 "упростить", "одз". В качестве примера рассмотрим задачу
 нахождения геометри\-ческого места всех таких точек $C$ на данной
 прямой $AB$, сумма расстояний которых до точек $A,B$ - наименьшая.
 Предполагается известным, что расстояние от $A$ до $B$ равно 50.
 Она формализуется как задача на описание, имеющая посылку
 "расстояние \\ ($AB$)$=50$", и условие "Минимум(отображение($C$ \
 точка($C$) \ расстояние($AC$)+расстоя\-ние($BC$)) \ прямая($AB$) \
 $x$ \ $y$)". Неизвестные этой задачи суть $x,y$; значение первой
 из них равно наименьшей сумме рассматриваемых расстояний;
 значение второй - множеству точек, в которых достигается эта
 наименьшая сумма. Решатель выдает на задачу ответ "$y=$
 отрезок($AB$); $x=50$".

 Другой пример - задача на построение треугольника $ABC$ по
 известным длинам $a,b,c$ его сторон $AB, AC,BC$. Она
 формализуется в виде задачи на описание с услови\-ями
 "треугольник($ABC$)"; "расстояние($AB$)$=a$";
 "расстояние($AC$)$=b$"; "расстояние \\ ($BC$)$=c$". Неизвестными
 этой задачи служат $A,B,C$. Решатель выдает на данную задачу
 ответ "$0<a+b-c$, $0<a+c-b$, $0<b+c-a$, точка($C$), $A \in$окр($C\ b$),
 $B \in$ окр($A \ a$)$\cap$ окр($C \ c$)".
 Напомним, что "окр($A\ b$)" обозначает окружность с центром в
 точке $A$, имеющую радиус $b$. Разумеется, в задачах на
 построение вместо цирку\-ля и линейки используется ряд
 вспомогательных элементарных операций и отношений, позволяющих
 последовательно определять новые точки по ранее найденным.

 \subsection{Математический анализ}

 Вычисление производных и пределов происходит при помощи задач
 на преобразо\-вание, имеющих цели "упростить" и "одз". Стандартный
 вид условия задачи на вычис\-ление производной -
 "производная(отображение($y$ \ число($y$) \ $f(y)$)$x$)". Здесь
 $f(y)$ - выражение, определяющее значение дифференцируемой функции
 в точке $y$. Заметим, что переменная $y$ - связанная и
 используется только внутри конструкции "отобра\-жение($ \ldots $)",
 задающей исходную функцию. Условие задачи здесь имеет своим
 значе\-нием не функцию - производную исходной функции, а лишь
 значение этой производ\-ной в точке $x$. В качестве $x$ может
 фигурировать либо переменная, и тогда на экране условие будет
 прорисовано в виде $\frac{df(x)}{dx}$, либо некоторое другое
 выражение (например, константа), и тогда на экране условие
 будет прорисовано в виде $\frac{df(y)}{d(y=x)}$. Важным является
 то обстоятельство, что решатель не только выполняет формальное
 дифференцирование, но и осуществляет последующие упрощения
 полученного выра\-жения в его области допустимых значений. Это
 занимает, как правило, значительно больше времени, чем само
 нахождение производной, но зато позволяет получать результаты
 удовлетворительного качества - по крайней мере для примеров
 из стан\-дартных задачников.

 При вычислении частных производных и производных высших порядков
 исполь\-зуется другой вид условия задачи на преобразование.
 Например, для функции двух переменных оно таково:
 "частнпроизв(отображение($u \ v$ \ и(число($u$)число($v$)) \
 $f(u,v)$)\\ набор($k \ m$)набор($x y$))". Здесь $k,m$ - кратности
 дифференцирования по первой и второй переменным (одна из них
 может равняться 0); $f(u,v)$ - выражение, определя\-ющее значение
 дифференцируемого выражения. На экране указанное условие
 прори\-совывается как $\frac{d^{k+m}f(x,y)}{dx^kdy^m}$
 Как и в случае одной переменной, если, например, $x$ не является
 переменной, то запись преобразуется к виду
 $\frac{d^{k+m}f(u,y)}{d(u=x)^kdy^m)}$.

 Если нужно продифференцировать функцию, заданную параметрически,
 то при\-ходится выбирать одну из двух возможностей логической
 формализации. Либо нужно вводить специальное обозначение для
 параметрического "определения" новой функ\-ции $y(x)$ по двум
 функциям $x = f(t)$ и $y = g(t)$, либо работать только с одной
 функцией $y(x)$, для которой задано соотношение $y(f(t))=g(t)$.
 В решателе выбрана вторая возможность, как технически более
 простая. При такой записи, для нахожде\-ния производной функции,
 заданной параметрическими соотношениями
 $y(t)= b \ sh(t)$, \ $x(t)= a \ ch(t)$, вводится задача на
 преобразование, имеющая посылку "$\forall t$(одз($t$)
 $\Rightarrow$ $y(a \ ch(t))= b \ sh(t)$)".
 Здесь запись "одз($t$)" имеет технический характер; она заменяется
 решателем на группу условий, определяющих принадлежность $t$
 области допустимых значений для выражений, расположенных справа
 от импликации. Усло\-вие задачи записывается как
 $\frac{dy(x)}{d(x=a \ ch(t))}$. Решатель выдает ответ
 $\frac{b \ cth(t)}{a}$.

 В случае нахождения производной неявной функции применяется
 аналогичная запись. Так, чтобы продифференцировать функцию
 $y(x)$, заданную неявным соотно\-шением
 $\sqrt{y(x)}+\sqrt{x}=\sqrt{a}$, вводится задача на
 преобразование, имеющая посылку $\forall x$ (одз($x$)
 $\Rightarrow$ $\sqrt{y(x)}+\sqrt{x}=\sqrt{a}$)). Условие
 имеет вид $\frac{dy(x)}{dx}$. Ответ выдается в виде
 $-\sqrt{\frac{y(x)}{x}}$.

 При вычислении пределов условие задачи на преобразование
 имеет вид "предел \ (отображение($x$ \ число($x$) \ $f(x)$)$m \
 a$)", где $a$ - точка, в которой определяется предел; $m$ -
 указатель типа окрестности этой точки (0 - двусторонняя
 окрестность; 1 - левая; 2 - правая). Это условие прорисовывается,
 соответственно, как $\lim_{x \to a} f(x)$ либо $\lim_{x \to a-0}
 f(x)$ либо $\lim_{x \to a+0} f(x)$. Заметим, что в случае
 выражения с параметрами решатель может выдать ответ с
 перечислением подслучаев. Так, при решении задачи с посылками
 $0<a$, $0<b$ и условием $\lim_{x \to \infty} \left( \frac{ax+c}{bx+d}
 \right)^x$, получается ответ, состоящий из трех подслучаев:
 1) если $0< - \frac{a}{b} +1$, то 0; 2) если $0< \frac{a}{b}-1$,
 то $\infty$; 3) в остальных случаях $ \exp (\frac{c-d}{b})$.

 При нахождении пределов последовательностей вид условия
 отличается от ука\-занного выше только тем, что внутри конструкции
 "отображение($ \ldots $)", определяю\-щей рассматриваемую функцию,
 вместо утверждения "число($x$)" берется утвержде\-ние
 "на\-туральное($x$)". В этом случае можно формулировать также
 задачи на нахож\-дение верхнего и нижнего пределов (логические
 символы "верхнийпредел", "ниж\-нийпредел" \ вместо символа "предел").
 Чтобы при стандартной прорисовке на экране можно было отличать
 пределы функций вещественного переменного от пределов
 последователь\-ностей, в последних выражение под знаком
 предела заключает\-ся в фигурные скобки (это эквивалент
 использования во внутреннем представлении утвер\-ждения
 "натуральное($x$)" вместо "число($x$)").

 Для нахождения точных верхних и нижних граней функций одного
 вещественного переменного на заданных множествах также
 применяются задачи на преобразование с целями "упростить", "одз".
 Например, для точной верхней грани условие задачи имеет
 вид "суп(образ(отображение($x$ \ число($x$) \ $f(x)$)$M$))",
 где $M$ - множество, на котором ищется точная верхняя грань.
 На экране оно прорисовывается как "$ \sup$(об\-раз($\lambda_{x}$(
 $f(x)$, \ число($x$)),$M$))".

 Если нужно найти наибольшее либо наименьшее значение функции
 на некотором множестве, а также определить точки, в которых
 достигается такое значение, то применяются уже не задачи на
 преобразование, а задачи на описание. Целевая уста\-новка их
 стандартная - "неизвестные $x y$", "полный", "явное",
 "прямойответ", "упрос\-тить", "одз". Здесь $x$ - множество, на
 котором достигается искомое наибольшее либо наименьшее значение,
 $y$ - это значение. Условие задачи на описание (например, в
 случае наибольшего значения) имеет вид "Максимум(отображение($x$
  число($x$) \ $f(x)$)\ $M \ x \ y$)". Здесь $M$ - множество,
 на котором ищется наибольшее значение. На экране такое условие
 прорисовывается как "Max$(\lambda_{x}(f(x)$,число($x$)),$M, \ x, \
 y$)".

 При поиске экстремумов тоже используется задача на описание.
 Условие ее имеет вид "экстремум(отображение($x$ \ число($x$) \
 $f(x)$)$y \ z \ v$)", где значением неизвестной $y$ служит точка,
 в которой достигается экстремум функции; значением неизвестной
 $z$ - значение функции в точке экстремума; значением неизвестной
 $v$ - указатель типа экстремума - логический символ "минимум"
 либо "максимум". Область, в которой ищутся экстремумы, можно
 сужать, добавляя к списку условий необходимые ограни\-чения на
 $y$. Решатель пытается найти все экстремумы. Так, например,
 в задаче с условием "Extr($\lambda_{x}(\frac{\cos x}{\cos(2x)}$,
 число($x$)),$y,\ z, \ v$)" \ выдается ответ, состоящий из двух
 подслучаев: 1) $\exists k (y = 2 \pi k \ \& \ \mbox{целое}(k)),
 z = 1, v = \min$; 2) $\exists k (y = \pi (2k+1) \ \&
 \ \mbox{целое}(k)),$ $z= -1, v = \max$. При постановке задачи
 с экстремумами не обязательно требовать, чтобы указанные выше
 $y,z,v$ были переменными. Вместо них могут быть подставлены
 любые выражения. Неизвестными, кроме входящих в $y,z,v$
 переменных, могут также быть какие-либо параметры, использованные
 при задании функции. Так, если вместо $y$ подставить выражение
 без неизвестных, а неизвестными считать входящие в опре\-деление
 функции параметры, то смысл задачи будет состоять в отыскании
 таких значений параметров, для которых функция имеет в заданной
 точке $y$ экстремум.

 Чтобы получить качественное описание графика функции с помощью
 пределов и производных, применяются задачи на описание со списком
 целей "исследовать", "полный", "явное", "прямойответ", "функция",
 "неизвестные $x$". Условием такой задачи на описание является
 единственное равенство "$x =$ отображение($y$ \ число($y$) \
 $f(y)$)" , определяющее исследуемую функцию. При решении задачи
 сразу же вводится ее блок анализа, в котором происходит логический
 вывод с постепенным накоплением информации о поведении
 функции $x$. В процессе вывода усматриваются те утверж\-дения, которые
 целесообразно включать в итоговое описание свойств функции, и они
 переносятся из блока анализа в список условий задачи на описание.
 По исчерпании возможностей вывода выдается ответ - конъюнкция
 утверждений списка условий (в нем сохраняется и исходное равенство
 для $x$). В качестве примера приведем задачу с условием
 $x= \lambda_{y}(-y^3+3y, \mbox{число}(y))$. Решатель выдает на
 нее следующий ответ (без учета повторения исходного условия):
 "функция($x$)"; "Extr($x,1,2,\max$)"; "убывает \ ($x, (1,\infty)$)";
 "Extr($x,-1,-2,\min$)"; "убывает($x, (-\infty , -1)$)";
 "возрастает($x, (-1,1)$)"; "область($x$)= $\Re$ ";
 "мощность(корни($x, (1, \infty)$))=1"; "мощность(корни($x,
 (-1,1)$))=1"; "мощность(корни($x, (-\infty,-1)$))=1".


 Если в качественное описание графика нужно включить также
 указание на интер\-валы выпуклости-вогнутости, то к указанной
 выше целевой установке добавляется цель "выпуклавверх".
 Например, при наличии этой цели, на задачу с условием
 $x = \lambda_{y}(-y^3+3y^2, \mbox{число}(y))$ решатель находит
 ответ: "функция($x$)"; "Extr($x,2,4,\max$)"; "убывает($x, (2,
 \infty)$)"; "Extr($x,0,0,\min$)"; "убывает($x, (-\infty , 0)$)";
 "возрастает($x, (0,2)$)"; "область($x$) = $\Re$";
 "выпуклавниз($x, (-\infty,1)$)"; "выпуклавверх($x, (1,\infty)$)";
 "мощность \ (корни($x, (2, \infty)$)) = 1"; "корни($x,
 (0,2)$)=$\emptyset$"; "корни($x, (-\infty,0)$)= $\emptyset$".

 Кроме задач на общее качественное исследование функций,
 рассматриваются также некоторые дополнительные типы задач,
 сязанных с исследованием функций одного вещественного
 переменного. Все они имеют в составе своей целевой установки
 цели "исследовать", "полный", "явное", "прямойответ", "функция",
 "неизвестные $x$". К ним добавляется цель, уточняющая тип
 проводимого исследования, причем такая цель блокирует проведение
 общего качественного исследования (исключение здесь составляет
 указанный выше случай цели "выпуклавверх"). Решение этих задач
 осуществляется по указанной выше схеме - путем вывода следствий
 в блоке анализа и перенесении представляющих ценность результатов
 вывода в список условий внешней задачи на описание. При
 исследовании функции на четность-нечетность и периодич\-ность
 добавляется цель "четнаяфункция"; при исследовании на
 непрерывность - добавляется цель "непрерывно"; при исследовании
 на равномерную непрерывность добавляются цели "непрерывно" и
 "равномернонепрерывно". В случае исследования на непрерывность
 решатель анализирует типы точек разрыва, причем в случае
 иссле\-дования на равномерную непрерывность анализ точек разрыва
 блокируется. Приве\-дем несколько простых примеров задач указанных
 типов. Так, при наличии цели "четнаяфункция" на задачу с условием
  $$y = \lambda_ {x}(\frac{\sin(2x)}{2}+\frac{\sin(3x)}{3}+\sin x,
 \mbox{число}(x))$$
 реша\-тель выдает ответ "область($y$)= $\Re$";
 "периодична($y,2\pi$)"; "нечетнаяфункция($y$)". При наличии
 цели "непрерывно" на задачу с условием $$y = \lambda_{x}
 (\left[\frac{1}{x}\right], \mbox{число} (x))$$ выдается ответ:
 "область($y$)=$(-\infty,0)\cup (0, \infty)$";
 "$\forall n (\mbox{целое}(n) \ \& \ \neg (n =0) \Rightarrow
 \\ \mbox{разрывпервогорода}(y,\frac{1}{n}))$";
 "разрыввторогорода($y,0$)"; "непрерывно($y, ((-\infty,0) \cup \\
 (0, \infty)) \setminus \mbox{класс}(x \ \exists n(\mbox{целое}(n)
 \ \& \ \neg (n = 0)\ \& \ x = \frac{1}{n})))$".
 \\ При наличии целей "непрерывно" \ и "равномернонепрерывно" на задачу
 с условием $$y = \lambda_{x}(\ln(x), \mbox{число}(x) \ \& \
 0 < x \ \& \ x < 1)$$
 выдается ответ: "область($y$) = $(0,1)$";
 "$\neg$(равномернонепрерывно($y, (0,1)$))"; "непре\-рывно($y,
 (0,1)$)".

 Для определения числа корней функции на заданном множестве
 создается зада\-ча на преобразование с целями "упростить",
 "одз" \ и условием "мощность(корни(ото\-бра\-жение($x$ \ $A(x)$) \
 $f(x)$)))", где $A(x)$ - условие принадлежности аргумента
 $x$ рассмат\-ри\-ваемому множеству; $f(x)$ - выражение, опреде\-ляющее
 значение функции. Если усло\-вие содержит параметры, то ответ
 задачи может иметь вид условного выражения, опреде\-ляющего
 искомое число корней путем разбора случаев.

 В случае функций нескольких переменных задачи на отыскание
 экстремумов и наибольших (наименьших) значений формулируются
 аналогично случаю одной переменной. Это задачи на описание
 с целями "полный", "явное", "упростить", "одз", "прямойответ",
 "неизвестные $z_1 \ldots z_k$". В случае безусловного экстремума
 условие задачи имеет вид "экстремум(отображение($x_1 \ldots x_n$ и(чис\-ло($x_1$) $\ldots$ число($x_n$)) \\ $f(x_1 \ldots x_n)$)
 $z_1 \ z_2 \ z_3$)"; в случае условного - к списку утверждений
 "число($x_1$)", $\ldots$, "число($x_n$)" \ внутри описателя
 "отображение" \ добавляются необходимые равенства и неравенства для
 варьируемых переменных $x_1, \ldots, x_n$. Значением неизвестной
 $z_1$ служит набор значений указанных переменных, определяющий
 точку экстремума; $z_2$ - значение функции в этой точке;
 $z_3$ - тип экстремума (логический символ "минимум" \ либо
 "максимум"). В качестве примера приведем задачу на описание,
 имеющую единственную посылку $0 < a$ и условие
 "экстремум(отображение($x y z$ \ и(число($x$)чис\-ло($y$)число($z$)
 $xy+xz+yz=a^2 \ \ \ 0<x \ \ \ 0<y \ \ \ 0<z$)\ $xyz$)\ $u \ v \ w$)".
 Решатель выдает на нее ответ:
 $u=(\frac{a}{\sqrt{3}},\frac{a}{\sqrt{3}},\frac{a}{\sqrt{3}}),
 v=\frac{a^3}{3\sqrt{3}},w = \max$.
 Другой пример - задача с условием "Максимум(отображение($xy$ \ и(число($x$)
 число($y$)) $-\sin(xy)+\sin(x)+\sin(y)$)\ \ класс($xy$ и(число($x$)
 число($y$) \ $0 \leq x \ \ \ 0 \leq y \ \ \ x+y \leq 2\pi$))\ $u \ v$)",
 в которой неизвестными являются $u,v$ (соответственно, множество
 точек, где достигается наибольшее значе\-ние, и само это
 значение). Решатель получает ответ $u = \left\{
 \left(\frac{2\pi}{3},\frac{2\pi}{3}\right)\right\},
 v = \frac{3\sqrt{3}}{2}$.

 Задачи на вычисление интегралов любых типов (определенных,
 неопределенных, кратных) оформляются как задачи на преобразование
 со стандартными целями "уп\-ростить", "одз". В случае
 неопределенного интеграла условие имеет вид
 "Интеграл(\\ отображение($x$ \ число($x$) \ $f(x)$))".
 В качестве ответа выдается какая-либо одна из перво\-образных,
 записанная в виде "отображение($x$ \ число($x$) \ $g(x)$)".
 Разумеется, прорисов\-ка интеграла выполняется формульным
 редактором в стандартном виде (после знака интеграла
 набирается подынтегральное выражение, и далее - как
 допол\-нительные множители - $d$,$x$; если подынтегральное
 выражение имеет вид дроби, то перенесение в ее числитель
 этих множителей не допускается). Так, на задачу с условием
 $$\int \frac{1}{x\sqrt{x^4+2x^2-1}}\ dx$$ выдается ответ
 $$\lambda_{x}\left(\frac{\arcsin(-\frac{1}{\sqrt{2}x^2}+\frac{1}{\sqrt{2}})}{2}
 , \mbox{число}(x)\right)$$.

 При вычислении определенного интеграла пределы интегрирования
 $a,b$ извлека\-ются из списка утверждений, описывающих область определения
 интегрируемой функции. Условие задачи на преобразование при
 этом имеет вид "интеграл(отобра\-жение($x$ \ и(число($x$) \ $a \le
 x$ \ $x \le b$) \ $f(x)$))". На экране оно прорисовывается
 в обычном виде: $$ \int\limits_a^bf(x) dx$$.

 Задача на вычисление двойного интеграла включает в себя описание
 области интегрирования, которое часто оказывается достаточно
 громоздким. Поэтому при формулировке таких задач для обозначения
 области интегрирования обычно вводится вспомогательная переменная,
 и в посылках задачи указывается определяющее ее равенство.
 Условие задачи имеет тогда вид "двойнойинтеграл(отображение($x y
  \ (x,y)\in P \ f(x,y)$))", где $P$ - обозначение области
 интегрирования. Формульный редактор прорисовывает это условие
 в виде $$\int\!\!\!\int_P f(x,y)dxdy $$ ($P$ располагается
 непосредственно под \ знаком двойного интеграла). Разумеется,
 можно и не выносить задание области интегрирования в список
 посылок, но тогда при изображении на экране получится громоздкая
 многоэтажная запись. В качестве примера приведем задачу с
 посылкой $P = \mbox{класс}(xy \ \mbox{число}(x) \ \& \
 \mbox{число}(y) \ \& \ 0 \le x \ \& \ 0 \le y \ \& \ 4x^2-3y^2
 \le 4 \ \& \ 4y^2-3x^2 \le 4)$ и условием $$ \int\!\!\!\int_P
 (x^3y+xy^3)dxdy \mbox{.}$$ Решатель выдает для нее ответ 3.

 Типичной при вычислении двойного интеграла является ситуация,
 когда область интегрирования задана не непосредственно с помощью
 неравенств, как в приведенном выше примере, а косвенно - через
 ограничивающие ее кривые. В этом случае она может быть задана
 с помощью выражения "областьграницы($G$)", где $G$ - выражение,
 определяющее объединение множеств точек указанных кривых.
 Здесь значением выражения "областьграницы($G$)", как и значением
 выражения $G$, является не мно\-жество самих точек плоскости,
 а лишь множество их координат. Предполагается, что рассматриваемые
 кривые разбивают плоскость на некоторые компоненты связности, и в
 область интегрирования включаются все конечные компоненты
 (таким образом, она может оказаться и несвязной). В качестве примера
 приведем задачу с посылкой
  \\ $P = \mbox{областьграницы}(set_{xy}(y=x \ \& \ \mbox{число}(x)
 \ \& \ \mbox{число}(y)) \cup set_{xy}(y=x+a \ \& \
 \mbox{число}(x) \ \& \\ \mbox{число}(y)) \cup set_{xy}(y=a \
 \& \ \mbox{число}(x) \ \& \ \mbox{число}(y)) \cup set_{xy}(y=3a
 \ \& \ \mbox{число}(x) \ \& \ \mbox{число}(y)))$ и условием
 $$\int\!\!\!\int_P (x^2+y^2)dxdy \mbox{.}$$ Решатель выдает на
 нее ответ $14a^4$. Заметим, что использованное выше обозначение
 $set_{xy}F(x,y)$ - результат прорисовки формульным редактором
 выражения "класс($xy \\ F(x,y)$)".

 При вычислении площадей плоских множеств, объемов и площадей
 поверхностей соответствующее множество уже является не множеством
 числовых пар либо троек, а множеством точек плоскости либо
 трехмерного пространства, имеющих своими координатами эти
 пары либо тройки. Поэтому вместо выражения вида
 "областьгра\-ницы($\ldots$)" для задания множества используется
 выражение вида "точки(областьгра\-ницы($\ldots$)$K$))", где
 $K$ - прямоугольная система координат. В качестве примера
 вычис\-ления площади плоского множества приведем задачу с посылками
 \\ "$P=\mbox{точки}(\mbox{областьграницы}(set_{xy}((x^2+y^2)^3=a^2(x^4+y^4)
 \ \& \ \mbox{число}(x) \ \& \ \mbox{число}(y))),K)$,
 "прямко\-орд($K$)", "$0<a$" \ и условием "площадь($P$)". Решатель
 выдает на нее ответ $3\pi \left(\frac{a}{2}\right)^2$.

 Пример на вычисление объема - задача на преобразование с посылками
 \\ "$P = \mbox{точки}(set_{xyz}(x^2+y^2 \le a^2 \ \& \ 0 \le az \ \&
 \ az \le a^2 - 2y^2 \ \& \ \mbox{число}(x) \ \& \ \mbox{число}(y)
 \ \& \\ \mbox{число}(z)),K)$", "прямкоорд($K$)", $0 < a$ \  и
 условием "объем($P$)". На нее выдается ответ
 $\frac{(\pi+4)a^3}{4}$.

 Наконец, пример вычисления площади поверхности - задача с
 посылками \\ "$P = \mbox{точки}(set_{xyz}(2az=x^2+y^2 \ \& \
 x^2+y^2 \le a^2 \ \& \ 0 \le y \ \& \ 0 \le x \ \& \ y \le x
 \ \& \ \mbox{число}(x)\ \& \\ \mbox{число}(y)\ \& \
 \mbox{число}(z)),K)$", "прямкоорд($K$)" и условием "площадь($P$)".
 На нее выдает\-ся ответ $\frac{(2\sqrt{2}-1)\pi a^2}{12}$.
 Заметим, что при вычислении площади поверхности допустимо ее
 параметрическое задание. Пример такого задания - задача
 с посылками \\ "$P = \mbox{точки}(set_{xyz}(\exists uv(x = u \cos v
 \ \& \ y = u\sin v \ \& \ z = 4v \ \& \ x^2+y^2 \le 9
 \ \& \ \mbox{число}(u)\ \& \\ \mbox{число}(v) \ \& \ 0 \le z
 \ \& \ z \le 8\pi)),K)$", "прямкоорд($K$)" и условием
 "площадь($P$)".

 В задачах на исследование сходимости рядов используется
 запись ряда как после\-довательности своих частичных сумм:
 "отображение($n$ \ натуральное($n$) \ суммавсех \ (отображение($i$ \
 и(целое($i$) \ $1 \le i$ \ $i \le n$) $a(i)$)))". На экране
 такая запись прорисовы\-вается в виде: $$\lambda_n
 \left(\sum_{i=1}^n a(i), \mbox{натуральное}(n) \right).$$

 В качестве примеров задач, связанных с исследованием сходимости
 рядов, приве\-дем задачу на доказательство с посылкой $|a|<1$ и
 условием $$\mbox{сходится}(\lambda_n \left(\sum_{i=1}^n (a^m\sin(bn)),
 \mbox{натуральное}(n)\right)),$$ а также задачу на описание с
 условием $$\mbox{сходится}(\lambda_n \left(\sum_{i=2}^n
 (\sqrt{i+1}-\sqrt{i})^p \ln\frac{i-1}{i+1},
 \mbox{натуральное}(n)\right)).$$ Эта задача имеет стандартный
 список целей "полный", "явное", "прямойот\-вет", "упростить",
 "одз", "неизвестные $p$". Решатель выдает на нее ответ
 $0<p, \mbox{число}(p)$.

 Для получения разложения в ряд Тейлора служит задача на
 преобразование с целями "рядтейлора \ $x$ \ $a$",
 "упростить", "одз". Здесь $x$ - переменная, по которой
 выполняется разложение; $a$ - выражение, определяющее точку,
 в окрестности которой происходит разложение. Пример -
 задача с условием $\sin x + \cos x$, на которую выдается ответ
 $$\sum_{n=0}^\infty
 \frac{x^n(-1)^{\left[\frac{n}{2}\right]}}{n!} \ .$$ Заметим, что
 бесконечная сумма во внутреннем представлении имеет вид
 "суммавсех\ (отображение($n$ и(целое($n$) \ $k \le n$) \ $a(n)$))",
 где $k$ - значение, с которого начинается суммирование величин
 $a(n)$.

 Если нужно получить лишь конечное число членов разложения в ряд
 Тейлора, то вместо цели "рядтейлора $\ldots$" \ используется цель
 "формулатейлора \ $x$ \ $a$ \ $n$". Здесь $x,a$ - те же, что и
 выше; $n$ - степень, до которой (включительно) выписываются члены
 разложения. Пример - задача с условием $\frac{x}{\exp x - 1}$ и
 целью "формулатейлора $x$ $0$ $4$", на которую выдается ответ
 $1 - \frac{x}{2} + \frac{x^2}{12} - \frac{x^4}{144}$.

 Решатель может обращаться к задаче на получение конечного числа
 членов разло\-жения в ряд Тейлора при решении других задач,
 например, при подборе таких значений параметров выражения $f(x)$,
 что оно приобретает заданный "порядок ма\-лости" в окрестности
 заданной точки. Пример - задача на описание с посылкой
 "стре\-мится($x$\ $0$ \ $0$)" (прорисовывается как $x\rightarrow
 0$), условием $-a\sin x - b\tan x +x = O(x^5)$ и целями
 "полный", "явное", "прямойответ", "упростить", "одз",
 "неизвестные $ab$". На нее выдается ответ $a = \frac{2}{3},
  b = \frac{1}{3}$.

 При разложении в ряд Фурье используется целевая установка
 "рядфурье \ $x$ \ $a$ \ $b$", "упростить", "одз". Здесь
 $x$ - переменная, по которой ведется разложение; $a,b$ -
 концы отрезка, на котором происходит разложение. Пример -
 задача с условием $x^3$ и целью "рядфурье \ $x$ \ $-\pi$ \
 $\pi$". На нее выдается ответ
 $$ 2\sum_{n=1}^\infty \frac{(-\pi ^2n^2+6)(-1)^n\sin(nx)}{n^3} \ .$$

 Заметим, что для выбора целевой установки задачи создан специальный
 интерфейс, так что вводить указанные выше цели "рядтейлора
 $\ldots$", "формулатейлора $\ldots$" (или какие-либо другие
 стандартные комбинации целей) в явном виде вручную нет необходимости.

 Наконец, отметим задачи на суммирование рядов. Они оформляются
 как обычные задачи на упрощение (цели "упростить", "одз"). Пример
 - задача с условием $$\sum_{i=0}^\infty \frac{x^{4i+1}}{4i+1}\ ,$$
 на которую решатель дает ответ $$\frac{\ln \left|\frac{x+1}{-x+1}\right|}{4}+
 \frac{\arctan x}{2}\ .$$

 \subsection{Дифференциальные уравнения}

 В случае дифференциального уравнения в качестве неизвестной
 выступает функция. Уравнение связывает значение этой функции $y$
 в некоторой точке $x$, значения ее производных различных
 порядков в этой же точке, и само значение $x$, причем данная
 связь имеет место для всех точек некоторой области $G$.
 Формальная запись такой связи должна была бы иметь вид
 $\forall x(x \in G \Rightarrow F(x, y(x),
 \frac{dy(x)}{dx}, \ldots ))$. Однако, исполь\-зуемые при
 решении дифференциальных уравнений преобразования никак не
 затра\-гивают часть этой записи, находящуюся слева от импликации,
 а также сам квантор общнос\-ти - они должны бы были просто переписываться
 "вхолостую". Поэтому в решателе дифференциальное уравнение
 записывается без внешнего квантора общнос\-ти, а условия на
 область, в которой изменяется варьируемая переменная $x$,
 вынесены в список посылок. Фактически, это еще одно проявление
 "контекстной семантики" \ - для адекватной логической формализации
 нужно на каждом шаге выполнять обрат\-ный переход, преобразуя
 текущие записи уравнений к указанному выше виду с кван\-тором
 общности. Чтобы явно указать на наличие такой модифицированной
 записи, задача на описание, в которой нужно решить
 дифференциальное уравнение относи\-тельно $y$, снабжается, кроме
 стандартных целей "неизвестные $y$", "полный", "явное",
 "прямойответ", "упростить", "одз", также целью "связка $x$".
 Эта цель указывает, что неизвестная $y$ не должна зависеть
 от параметра $x$, входящего в посылки. Фактически она
 несет несколько большую нагрузку, встречаясь только в задачах
 на решение дифференциальных уравнений и корректируя действия
 приемов в соответствии с обычными соглашениями, принимаемыми
 при их решении. Важным таким соглаше\-нием является
 представление ответа не в виде явного равенства для функции $y$,
 а лишь в виде равенства для значения $y(x)$; более того,
 последнее равенство может даже не быть явно разрешенным
 относительно $y(x)$. Обычно ответ (для дифферен\-циального
 уравнения первого порядка) представляется в виде параметрического
 опи\-сания $\exists C (F(x, y(x), C))$ либо дизъюнкции нескольких
 таких описаний. Как и усло\-вие задачи, этот ответ для получения
 адекватной в логическом отношении записи должен преобразовываться
 к виду $\exists C(\forall x(x \in G \Rightarrow F(x , y(x),
 C)))$, причем сама область $G$ (возможно, суженная в процессе
 решения по сравнению с исходными ограничениями на $x$, имевшимися
 в списке посылок)обычно в ответах явно не указывается.
 В качестве примера приведем задачу на описание с посылкой
 "число($x$)", условиями "функ\-ция($y$)" и "$x^2
 \frac{dy(x)}{dx}+y(x)^2=xy(x)\frac{dy(x)}{dx}$. Эта задача имеет
 указанный выше список целей. Реша\-тель выдает на нее ответ
 $\exists C (x\ln(Cy(x))-y(x)=0 \ \& \ \mbox{число}(C)) \vee y(x)
 = 0$.

 Если нужно решить дифференциальное уравнение с заданными
 дополнительными условиями, позволяющими идентифицировать
 произвольные постоянные, то допол\-нительные условия просто
 присоединяются к списку условий задачи на описание. Например,
 если требуется найти решение дифференциального уравнения
 $y(x)\frac{d^2y(x)}{dx^2} = 2x\left(\frac{dy(x)}{dx}\right)^2$,
 принимающее в точке 2 значение 2 и имеющее в этой точке
 производную $0.5$, то дополнительно вводятся условия
 $y(2)=2$ и $\frac{dy(x)}{d(x=2)}=0.5$. Решатель выдает на эту
 задачу ответ $y(x) =
 -2^{\frac{4}{5}}\sqrt[5]{\frac{x+2}{2(x-3)}}$.

 Если для уравнения, не разрешенного относительно производной,
 ответ получается в параметрической форме: $y = f(t,C); x =
 g(t,C)$, то такое параметрическое задание записывается решателем
 в виде $y(g(t,C))=f(t,C)$. Эта запись позволяет экономить на
 вводе обозначений для вспомогательных функций $y(t)$,$x(t)$
 (ведь $y(t)$ - попросту новая функция, связанная с искомой
 функцией $y$ лишь косвенным образом). Пример: решая задачу с
 условием $\left(\frac{dy(x)}{dx}\right)^3 + y(x)^2 =
 xy(x)\frac{dy(x)}{dx}$, система выдает ответ: \\ $\exists C
 \left(y(-\frac{C+3t}{\sqrt{C+2t}}) = - \frac{t^2}{\sqrt{C+2t}}
\ \& \ \mbox{число}(C)\right) \vee \exists
C\left(y(\frac{C+3t}{\sqrt{C+2t}}) = \frac{t^2}{\sqrt{C+2t}} \ \&
\ \mbox{число}(C)\right)\vee  \\ \vee y(x)=0$.

 Для обозначения производной $k$ - го порядка ($k > 1$) в
 дифференциальных уравнениях используется уже встречавшаяся
 выше запись "частнпроизв(отображение($y$ \ число($y$) \ $f(y)$)
  $k$ $x$)", прорисовываемая на экране как $\frac{d^k
 f(x)}{dx^k}$. Ответ дифференциальных урав\-нений $k$ - го
 порядка представляестя в виде параметрического описания
 $\exists c_1 \ldots c_k( \ldots )$ либо дизъюнкции таких
 описаний (в вырожденных подслучаях длина связывающей приставки
 может быть меньше $k$ или вообще отсутствовать квантор существования).
 Так, на уравнение $x^3 \frac{d^2y(x)}{dx^2} =
 \left(-x\frac{dy(x)}{dx}+y(x)
 \right)\left(-x\frac{dy(x)}{dx}+y(x)-x \right)$ выдается ответ
 $\exists cd (y(x) = -x\ln(c \ln x + d) \ \& \ \mbox{число}(c) \
 \& \ \mbox{число}(d)) \vee \exists c (y(x) = cx \ \& \
 \mbox{число}(c))$.

 В случае системы дифференциальных уравнений применяется целевая
 установка того же типа, что и в случае одного уравнения -
 просто в списке неизвестных указы\-вается несколько переменных.

 \subsection{Аналитическая геометрия и линейная алгебра}

 Геометрические задачи на вычисление, использующие векторную
 алгебру либо непо\-средственно связанные с отысканием неизвестных
 векторов, формализуются анало\-гично рассмотренным выше вычислительным
 задачам по геометрии. Небольшое иск\-лючение здесь составляют
 задачи на решение уравнений в векторных операциях, формализуемые
 так же, как задачи на решение уравнений в элементарной алгебре.
 При использовании в задаче аффинной либо прямоугольной
 системы координат $K$ в список ее посылок может быть занесено
 равенство $K=(A,B,C)$ либо $K=(A,B,C,\\ D)$, вводящее обозначения
 $A,B,C,D$ для начала координат и концов координатных векторов.
 Этого можно не делать, если каких-либо иных условий на точки
 $A,B,C,D$ в задаче не накладывается. Во всяком случае, для
 прямоугольной системы координат требуется вводить посылку
 "прямкоорд($K$)". Приведем два простых примера задач на
 координаты точек. В первой из них известны координаты (-4,2)
 точки окружности и координаты (2,0) точки ее касания с осью
 абсцисс прямоугольной системы коорди\-нат; найти требуется
 координаты центра окружности. Эта задача формализуется как
 задача на описание с целями "полный","явное","прямойответ",
 "упростить","одз",\ "неизвестные $x$", "известно". Она имеет
 посылки "прямкоорд($K$)", "$K=(A,B,C)$", "касательная(прямая($AB$)
 окружность($DE$))", "коорд($E,K$) = (-4,2)", "$F \in
 \mbox{прямая}\\(AB)$", "$F \in \mbox{окружность}(DE)$",
 "коорд($F,K$) = (2,0)", "планиметрия" и условие "$x =
 \mbox{коорд}(D,K)$". Во второй задаче нужно найти координаты центра
 вписанной в треугольник окружности, если известны координаты его
 вершин. Здесь уже не нужно явно вводить обозначения для тройки
 точек, определяющих систему координат. По\-сылки задачи имеют вид:
 "треугольник($ABC$)",
 "вписана(окружность($MN$)фигура(\\ набор($ABC$)))",
 "прямкоорд($K$)", "коорд($A,K$) = (9,2)", "коорд($B,K$) =
 (0,20)", "коорд($C,K$) = (-15,-10)", "планиметрия".

 Задачи на определение геометрического места точек формализуются
 в виде задач на преобразование. Условием такой задачи служит
 выражение "класс($X$ \ $P(X)$)", где $P(X)$ - условие на
 принадлежность точки рассматриваемому множеству (прорисо\-вывается
 оно как $set_{X} P(X)$). Задача имеет цели "упростить",
 "одз", "класс", причем последняя цель указывает на необходимость
 преобразовать условие к виду, не исполь\-зующему описателей "класс"
 и "отображение". В качестве примера рассмотрим зада\-чу на
 нахождение геометрического места точек, сумма квадратов расстояний
 кото\-рых до двух заданных точек $A,B$ равна $2a^2$; при этом
 предполагается известным расстояние $2c$ между точками $A,B$, и
 $c < a$. Посылки данной задачи суть: "$\neg(A = B)$";
 "расстояние($AB$) = $2c$"; "$c < a$". Условие имеет вид
 "$set_{X}(\mbox{точка}(X)\ \& \ l(AX)^2 + l(BX)^2 = 2a^2)$".
 Решатель выдает ответ "окр(доляотрезка($B,A,1/2$),$\sqrt{a^2-c^2}$)",
 то есть окружность с центром в середине отрезка $AB$ и радиусом
 $\sqrt{a^2-c^2}$ (см. подраздел "элементарная геометрия" главы
 2).

 В задачах на уравнения кривых и поверхностей для обозначения
 уравнения кри\-вой либо поверхности $M$ используется запись
 вида "коорд($M \ K$) = $set_{xy}(F(x,y)=0 \ \& \ \mbox{число}(x)
 \ \& \ \mbox{число}(y))$" \ либо
 "коорд($M \ K$) = $set_{xyz}(F(x,y,z)=0 \ \& \ \mbox{число}(x)
 \ \& \\ \mbox{число}(y) \ \& \ \mbox{число}(z))$". В случае
 кривой в трехмерном пространстве вместо одного равенства
 $F(x,y,z)=0$ используются два - $F_1(x,y,z)=0 \ \& \
 F_2(x,y,z)=0$. В качестве простого примера такой задачи приведем
 задачу на нахождение уравнения стороны $BC$ треу\-гольника $ABC$,
 у которого известны уравнения сторон $AB$, $AC$ и координаты
 точки пересечения высот $F$. Посылки здесь имеют вид:
 "треугольник($ABC$)"; "прям\-коорд($K$)"; "коорд(прямая($AB$)$K$) =
  $set_{xy}(x+3y-1=0 \ \& \ \mbox{число}(x) \ \& \
  \mbox{число}(y))$"; "коорд(прямая($AC$)$K$) =
  $set_{xy}(3x+5y-6=0 \ \& \ \mbox{число}(x) \ \& \
  \mbox{число}(y))$"; "перпендику\-лярно(прямая($BE$)прямая($AC$))";
  "перпендикулярно(прямая($AD$)прямая($BC$))"; \\ "$F \in
  \mbox{прямая}(BC)$"; "$F \in \mbox{прямая}(AD)$";
  "коорд($F \ K$) = $(0,0)$". Условие задачи - "$z$ =
  коорд(прямая($BC$)$K$)"; цели - "полный", "явное",
  "прямойответ", "одз", "упростить", "неизвестные $z$".
  Решатель выдает ответ "$z = set_{xy}(39x-9y-4=0 \ \& \
  \mbox{число}(x) \ \& \\ \mbox{число}(y))$".

  Ряд задач по аналитической геометрии связан с определением
  взаимного распо\-ложения прямых, точек и плоскостей. Для описания
  способа такого расположения в логический язык введены несколько
  специальных предикатных символов и символов констант. Так, при
  описании взаимного размещения двух прямых $A,B$ используется запись
  "двепрямые($A \ B \ s$)", где $s$ - константа для конкретного
  типа размещения - "пересекаются", "параллельно", "равны". Если в
  задаче требуется определить, при каких условиях на параметры
  уравнений имеет место заданный тип взаимного расположения,
  то она формализуется как задача на описание, имеющая своим
  усло\-вием обозначение типа расположения и цели "полный",
  "прямойответ", "редакция". Например, для определения условия
  пересечения двух прямых, одна из которых задана каноническим
  уравнением, а другая - параметрическим, создается задача на
  описание с посылками "Прямая($P$)", "коорд($P,K$) = $set_{xy}(
  Ax+By+C=0 \ \& \ \mbox{число}(x) \\ \& \ \mbox{число}(y))$",
  "Прямая($Q$)", "коорд($Q,K$)= $set_{xy}(\exists t(x=at+p \ \& \
  y=bt+q \ \& \ \mbox{число}\\ (t)))$" \ и условием "двепрямые($P,Q,
  \mbox{пересекаются}$)". На нее выдается ответ "$\neg(aA+bB=0)$".

  Задачи на определение вида кривой либо поверхности второго
  порядка, заданной своим уравнением, формализуются аналогично
  задачам на качественное исследова\-ние вида графика функции
  вещественного переменного. Они представляются как задачи на
  описание с целями "полный", "явное", "прямойответ", "одз",
  "упростить", "неизвестные $E$", "исследовать", к которым в
  случае кривых второго порядка добав\-ляется цель "линия", а в
  случае поверхностей - цель "эллипсоид". Условием служит
  уравнение исследуемой кривой $E$. Решение такой задачи
  происходит путем вывода следствий в ее блоке анализа, с
  отбором и перенесением в список условий элементов стандартной
  характеризации кривой. В качестве примера приведем задачу с
  условием "коорд($E,\ K$) = $set_{xy}(4x^2-y^2-16x-6y+3=0 \ \&
  \ \mbox{число}(x) \ \& \ \mbox{число}(y))$" и посылкой
  "прямкоорд($K$)". Решатель выдает на нее ответ (за вычетом
  повторного переписы\-вания уравнения кривой): "гипербола($E$)",
  "каноничкоорд($Q,E$)", "$Q = (A,B,C)$", "коорд($A,K$) =
  (2,-3)", "коорд($B,K$) = (3,-3)", "коорд($C,K$) = (2,-2)",
  "мнимаяполу\-ось($E$) = 2", "действполуось($E$) = 1",
  "коорд($E,Q$) = $set_{xy}(4x^2-y^2-4=0 \ \& \ \mbox{число}(x)
  \\ \& \ \mbox{число}(y))$".

  Для матриц в задачах используется два типа обозначений. Если
  матрица имеет фиксированный порядок $n$, то она задается явным
  перечислением своих элементов, при помощи выражения "строки(набор(
  $A_1 \ldots A_n$))", где $A_i$ - выражение вида "набор
  ($a_{i1} \ldots a_{in}$)", задающее $i$-ю строку. Фактически
  при этом матрица вводится и прорисо\-вывается на экране в обычной
  записи. Если же порядок матрицы - переменная величина, то она
  задается выражением вида "отображение($ij$ \ и(принадлежит($i$
  номе\-ра($1 \ n$))принадлежит($j$ номера($1 \ n$))) $a(i,j)$)".
  В обоих случаях решатель рассматри\-вает матрицу как функцию от
  двух переменных, определенных на начальном отрезке натурального
  ряда, и применяет при работе с ней все приемы, которые связаны
  с такими функциями (например, при расшифровке записи "значение
  ($M \ (i,j)$)", где $M$ - явно заданная матрица). Обычно при
  задании матриц "общего вида" приходится использовать
  многоэтажные условные выражения, определяющие для различных
  частей матрицы различные аналитические зависимости элементов
  от их номеров. В качестве примера приведем задачу на вычисление
  определителя матрицы $n$- го порядка, у которой над главной
  диагональю расположены элементы, равные номеру столбца; под
  этой диагональю - равные номеру столбца, взятому с минусом;
  левый верхний элемент равен 1, а прочие элементы равны 0.
  Условие этой задачи на преобра\-зование имеет вид "определитель(
  отображение($ij$ \ и(принадлежит($i$ номера($1 \ n$))при\-надлежит
  ($j$ номера($1 \ n$))) \ вариант($i<j \ \ j$ \ \ вариант($j<i \ \ -j$
  \ вариант($i=1 \ \ 1 \ \ 0$)))))". Единственная посылка задачи -
  "натуральное($n$)"; цели - "упростить", "одз". Решатель выдает
  ответ $n!$.

  В задачах на нахождение собственных значений и собственных
  векторов условия имеют вид "собствзначение($A,x,y$)",
  "собствектор($A,x,z$)". Здесь матрица $A$ задает\-ся равенством,
  помещаемым в посылки задачи; $x,y,z$ - неизвестные задачи.
  Напомним (см. главу 2), что $x$ - собственное значение;
  $y$ - его кратность; $z$ - собственный вектор, отвечающий
  данному собственному значению. В ответе собственный вектор
  $z$ описывается как элемент множества линейных комбинаций
  некоторого списка векто\-ров. Пример - задача с посылкой
  $$ A = \left(\begin{array}{cccc} 1 & 1 & 1 & 1 \\ 1 & 1 & -1 & -1 \\
  1 & -1 & 1 & -1 \\ 1 & -1 & -1 & 1 \end{array} \right) $$
  и указанными выше двумя условиями. На нее выдается ответ,
  состоящий из двух подслучаев:
  $$ x=-2,y=1,z \in
  \mbox{линкомбинации}\left\{ \left( \begin{array}{c} -1 \\ 1 \\
  1 \\ 1 \end{array} \right) \right\}; $$
  $$ x=2,y=3, z\in
  \mbox{линкомбинации}\left\{ \left(\begin{array}{c} 1 \\ 0 \\ 0 \\
  1 \end{array} \right), \left( \begin{array}{c} 1 \\ 0 \\ 1 \\ 0
  \end{array} \right), \left( \begin{array}{c} 1 \\ 1 \\ 0 \\ 0
  \end{array} \right) \right \}.$$

  Задачи на преобразование полиномиальной матрицы к нормальной
  диагональной форме и на приведение матрицы к жордановой
  нормальной форме суть задачи на описание с условиями
  "каноничматрица($A,k,x$)" и "жордформа($A,x,y$)" соответствен\-но.
  Здесь $A$ - явно задаваемая в условии задачи матрица; $k$ -
  переменная, относитель\-но которой рассматриваются многочлены -
  элементы матрицы $A$. $x$ - неизвестная, значением которой
  служит результат приведения матрицы к соответствующему виду;
  $y$ - неизвестная, определяющая матрицу, приводящую исходную
  к жордановой форме. Цели задачи суть "полный", "явное",
  "прямойответ", "одз", упростить", "неизвестные $x$" (либо
  "неизвестные $xy$").

 \subsection{Комплексные числа}

 Начиная с данного раздела, следует помнить, что коллекция
 приемов, зане\-сен\-ных в решатель, была составлена на сравнительно
 небольшом обучающем мате\-ри\-а\-ле. Поэтому для многих, даже не очень
 сложных, задач может быть получен "отказ". С другой стороны,
 качественное разнообразие рассмотренных задач достаточно ве\-ли\-ко,
 чтобы можно было, по аналогии с ними, продолжить начатое
 обучение. Зада\-чи, на которые получен "отказ", в особенности если
 они не очень сложны, сущест\-вен\-но интереснее и полезнее задач, решаемых
 данной системой, так как они позво\-ля\-ют научиться создавать свои
 собственные приемы.

 Комплекснозначные операции и элементарные функции вводятся
 формульным редактором так же, как их вещественнозначные аналоги.
 При создании внутрен\-не\-го логического представления решатель
 пытается из контекста определить, какая именно версия
 рассматривается в задаче. Однако, автоматический выбор версии
 пока не очень развит, и в сомнительных случаях лучше
 контролировать его, переходя к скобочному (текстовому) режиму
 отображения задачи.

 Задачи на упрощение комплекснозначных выражений формулируются
 ана\-ло\-гич\-но вещественнозначным. Целевая установка - "Упростить в
 о.д.з.". Вводя для такой установки условие $\mbox{arg}(7i+1/3-4i)$,
 получаем после запуска решения ответ $3\pi/4$. Задачи на решение
 уравнений в комплексных неизвестных требуют лишь добав\-ле\-ния
 условий вида "$x$ - комплексное".

 Рассматривались задачи на геометрическую характеризацию множеств
 точек ком\-плексной плоскости, заданных аналитически. Для
 формулировки такой задачи вво\-дит\-ся посылка "прямкоорд($K$)",
 выделяющая какую-то прямоугольную систему ко\-ординат $K$ на
 плоскости. Тип задачи - "описать"; целевая установка состоит из
 элементов "полный", "явное", "прямойответ", "одз", "упростить",
 "исследовать", "точки", "неизвестные $A$". Условия ее имеют вид
 "множество($A$)" \ и $A$ = точки(вещ\-фор\-ма($\mbox{set}_z P(z)),K)$.
 Здесь $P(z)$ - аналитическое соотношение, задающее множест\-во
 комплексных чисел $z$. Смысл последнего условия состоит в том,
 что определя\-ет\-ся множество пар координат точек, соответствующих
 допустимым комплекс\-ным числам, и вводится множество $A$ точек с
 данными координатами. Целевая уста\-нов\-ка задачи предопределяет
 вывод следствий в ее блоке анализа для полу\-че\-ния качественной
 характеризации множества $A$. Совокупность найденных
 характе\-рис\-тик составляет ответ.

 Рассматривалась также обратная задача - получение аналитического
 соот\-но\-ше\-ния, задающего множество комплексных чисел с заданными
 геометрическими ха\-рак\-те\-рис\-тиками. В этом случае задача на
 описание имеет цели "полный", "явное", "прямойответ", "одз",
 "упростить", "неизвестные $x$", "известно". Напомним, что такую
 же целевую установку имели геометрические задачи на вычисление.
 Усло\-вие задачи имеет вид $x =
 \mbox{комплформа}(\mbox{коорд}(Q,K))$. В список посылок зано\-сят\-ся
 утверждение "прямкоорд($K$)" \ и необходимые для уточнения вида
 множества то\-чек $Q$ дополнительные данные.

 Задачи на нахождение пределов числовых последовательностей и на
 иссле\-до\-ва\-ние сходимости числовых рядов формулируются так же, как
 в вещественном слу\-чае. Чтобы определить образ множества
 комплексных чисел при заданном ком\-плекс\-но\-значном отображении,
 создается задача на преобразование выражения ви\-да
 "образ($\lambda_z(f(z),z-\mbox{комплексное}),\mbox{set}_z(P(z),
 z-\mbox{комплексное}))$". Целевая установка - "Упростить в
 о.д.з.".

 Задачи на комплексное дифференцирование создаются аналогично
 вещест\-вен\-ным. Рассматривались задачи на определение области
 дифференцируемости функ\-ции. Условие такой задачи имеет вид
 "Дифференцируема($\lambda_z(f(z),z-\mbox{комплексное})$, $x$)",
 где $x$ - неизвестная.

 Для восстановления аналитической функции по ее вещественной или
 мни\-мой компоненте используется задача на описание, имеющая целевую
 установку "явное", "прямойответ", "упростить", "неизвестные $f$
 $A$". Ее условия суть: "функция($f$)", "аналитическая($f$,$A$)",
 "вещчастьфунк($f$, $\lambda_{xy}(P(x,y), x-\mbox{число} \ \& \ y
 - \mbox{число}$))". В случае восстановления по мнимой части
 берется запись "мнимчастьфунк".

 Задачи на построение конформного отображения представляются как
 задачи на описание, имеющие целевую установку "полный", "пример",
 "прямойответ", "одз", "упростить", "неизвестные $f A$". Условия ее
 состоят из утверждений "функция($f$)", "аналитическая($f$ $A$)",
 "образ($f$,$\mbox{set}_z P(z)$) = $\mbox{set}_z Q(z)$.

 В случае интегрирования приходится сначала определять в посылках
 задачи на преобразование ориентированную комплекснозначную кривую
 $C$, и лишь затем записывать в условии задачи интеграл вдоль данной
 кривой. Целевая установка, как и для вещественнозначного случая, -
  "Упростить в о.д.з.".

 Задачи на определение области сходимости функционального ряда
 фор\-му\-ли\-ру\-ют\-ся так же, как для вещественного случая; вместо
 символа "сходится" \ здесь ис\-поль\-зу\-ется символ "Сходится". Для
 определения радиуса сходимости степенного ряда, коэффициент при
 $n$-й степени которого есть $a(n)$, создается задача на
 преобразо\-ва\-ние с условием
 "радиуссходимости($\lambda_n(a(n),n-\mbox{натуральное})$)".

 Для суммирования комплекснозначного ряда формулируется задача
 на преобра\-зо\-ва\-ние, в посылки которой заносится утверждение
 $z\rightarrow a$, указывающее, что сум\-ма вычисляется в
 окрестности заданной точки $a$. Это утверждение обеспечи\-ва\-ет
 проверку применимости приемов, используемых при суммировании.

 Задачи на разложение функции в ряды Тейлора и Лорана
 формулируются оди\-на\-ко\-во. Их целевая установка состоит из целей
 "упростить", "рядтейлора($z$ $a$)", "одз". Отличие от
 вещественнозначного случая состоит лишь в том, что добав\-ля\-ет\-ся
 посылка "комплексное($z$)".  Если нужно получить лишь первые
 $n$ членов ряда, целевая установка приобретает вид "упростить",
 "формулатейлора($z$ $a$ $n$)", "одз".

 Чтобы найти особые точки функции $f$ и определить их тип,
 вводится задача на описание, имеющая цели "полный", "явное",
 "прямойответ", "одз", "исследовать", "особыеточки", "функция",
 "неизвестные($f$)". Ее условия суть утверждения "функ\-ция($f$)" \
 и $f = \lambda_z(A(z),z-\mbox{комплексное})$.

 \subsection{Теория вероятностей}

 При вводе в решатель задачи по теории вероятностей приходится
 вручную осу\-щест\-влять переход от исходного ее текста к логической
 формализации. Этот переход не всегда однозначен, и если формализация
 проведена каким-либо способом, доста\-точ\-но сильно отличающимся от
 способов, на которые было ориентировано обуче\-ние решателя, то задача
 будет не решена. Приведенные в задачнике решателя при\-ме\-ры по
 теории вероятностей сопровождаются исходным их текстом. Чтобы
 вывес\-ти этот текст на экран, достаточно при просмотре задачи
 нажать клавишу "н". После просмотра нажатие клавиши "курсор
 влево" \ или "Esc" \ возвращает к формаль\-но\-му описанию задачи.
 Такой же способ используется и для задач по комбинато\-ри\-ке или
 элементарной физике, где исходное текстовое условие требует
 сущест\-вен\-ной переработки для ввода в решатель. Обычно полная
 формализация задачи в перечисленных разделах бывает достаточно
 громоздкой, причем пропуск хотя бы одного элемента приведет к
 тому, что задача решена не будет. Чтобы научиться вводить в
 решатель такие задачи, рекомендуется ознакомиться с примерами,
 со\-бран\-ны\-ми в его задачнике. Здесь даже правильно введенное
 условие задачи далеко не гарантирует получение ответа - его можно
 рассматривать лишь как отправную точ\-ку работы по синтезу новых
 приемов и регулировке решающих правил уже имею\-щих\-ся приемов.
 Впрочем, можно все-таки констатировать, что в процессе про\-ра\-бот\-ки
 обучающего материала для перечисленных областей с "текстовыми" \
 форму\-ли\-ров\-ка\-ми задач нередкими были и случаи, когда решатель
 находил ответ на вновь введенную задачу самостоятельно.

 В этом разделе ограничимся несколькими типичными ситуациями.
 Прежде все\-го, рассмотрим задачи на непосредственный
 подсчет вероятностей. Они характери\-зу\-ют\-ся заданием некоторого
 конечного множества $A$, все элементы которого полага\-ют\-ся
 равновероятными, а также конечного подмножества $B$, вероятность
 кото\-ро\-го требуется вычислить. Создается задача на описание,
 имеющая цели "пол\-ный", "явное", "прямойответ", "одз",
 "упростить", "неизвестные $p$", "известно $a_1 \ldots a_n$", где
 $a_1, \ldots a_n$ - данные параметры; $p$ - искомая вероятность.
 Условия задачи суть утверждения "число($p$)" \ и "$p$ =
 вероятность($B$,\ равновер($A$))". Такая формули\-ров\-ка задачи
 совершенно аналогична формулировке геометрических задач на
 вычис\-ле\-ние. Впрочем, в отличие от геометрии, где основные
 действия по решению предпри\-ни\-ма\-лись в блоке анализа задачи,
 у задач по теории вероятностей преоблада\-ют эквивалентные
 преобразования условий.

 Рассмотрим следующий текстовый пример: "Два стрелка, независимо
 один от другого, делают по два выстрела (каждый по своей мишени).
 Вероятность попада\-ния в мишень при одном выстреле для первого
 стрелка равна $p_1$, для второго $p_2$. Выигравшим соревнование
 считается тот стрелок, в мишени которого будет боль\-ше пробоин.
 Найти вероятность того, что выиграет первый стрелок".

 Обозначим через $E$ вероятностное пространство; $A,B$ - события,
 состоящие в том, что первый стрелок попал в мишень при первом и
 втором выстрелах; $C,D$ - аналогичные события для второго
 стрелка. Из текста сразу извлекаются следую\-щие посылки:
 "вероятность($A$,$E$) = $p_1$", "вероятность($B$,$E$) = $p_1$",
 "вероятность($С$,$E$) = $p_2$", "вероятность($D$,$E$) = $p_2$",
 "незавсобытия(набор($A$,$B$,$C$,$D$),$E$)". Обознача\-ем далее
 через $F$ событие, состоящее в том, что выиграет первый стрелок.
 Для него вводим посылку: $F =
 \mbox{set}_x(\mbox{card}(\mbox{set}_y(y \in
 \{A,B\} \ \& \ x \in y)) > \mbox{card}(\mbox{set}_y(y \in
 \{A,B\} \ \& \ x \in y)))$. Целевая установка задачи прежняя;
 условие - "$x$ = вероятность($F$,$E$)". По этой схеме
 формулируются различные задачи из разде\-лов "Теоремы сложения и
 умножения вероятностей", "Формула полной вероятности",
 "Повторение опытов".

 Еще один текстовый пример, относящийся к случайным величинам:
 "При рабо\-те некоторого прибора в случайные моменты времени возникают
 неисправности. Вре\-мя $T$ работы прибора от его включения до
 возникновения неисправности распреде\-ле\-но по показательному закону
 с параметром $m$. При возникновении неисправ\-нос\-ти она мгновенно
 обнаруживается, и прибор поступает в ремонт. Ремонт продолжа\-ет\-ся
 время $p$, после чего прибор снова включается в работу. Найти
 плотность распре\-де\-ле\-ния и функцию распределения промежутка
 времени $T^*$ между двумя сосед\-ни\-ми неисправностями. Найти его
 математическое ожидание и дисперсию. Най\-ти вероятность того,
 что время $T^*$ будет больше $2p$".

 Обозначаем вероятностное пространство через $B$; случайную
 величину, рав\-ную времени работы прибора от его включения до
 возникновения неисправности - $A$; случайную величину, равную времени
 между двумя соседними неисправностями - $C$. Из текста извлекаются
 следующие посылки: "случвеличина($A$,$B$)";
 "плотнрас\-пред($A$,$B$) = $\lambda_t((0 \ \mbox{при} \ t<0,
 \mbox{иначе}\  m\exp(-mt)),t - \mbox{число})$";
 $C = A + \lambda_x(p, x\in$ элем\-со\-бы\-тия($B$)); $0<m$; $0<p$.
 Условия задачи суть: "$x$ = плотнраспред($C$,$B$)", "$y$ =
 функраспред($C$,$B$)", "$z$ =
 вероятность(прообраз($C$,$(2p,\infty)$),$B$)", "$M$ =
 мат\-ожи\-да\-ние($C$,$B$)", "$D$ = дисперсия($C$,$B$)".

 \subsection{Элементарная физика}

 Ввод в решатель новой задачи по элементарной физике обычно требует
 расшире\-ния логического языка и базы приемов. Даже в случаях,
 где языковых возможнос\-тей достаточно и решатель мог бы решить
 задачу самостоятельно, легко упустить из виду необходимую для
 решения подробность или воспользоваться таким, внеш\-не корректным,
 способом записи, для которого приемы еще не создавались. Поэтому
 рекомендуется ознакомиться с тем, как формализованы условия
 задач, имеющихся в задачнике, и вводить новые условия "по
 аналогии". Отступления от данного пра\-ви\-ла, конечно, возможны, и
 даже желательны, но лишь в контексте продолже\-ния обуче\-ния
 решателя. В физике, как, впрочем, и в других разделах, при
 обучении работал принцип наименьших обобщений,
 позволявший в какой-то мере бороть\-ся с ненужными действиями,
 однако существенно ослаблявший возможности реша\-те\-ля
 на момент проработки недостаточного объема обучающего материала.
 Этот прин\-цип, в конечном счете, приводит к получению некоего
 пограничного между отказами и перебором состояния базы приемов.
 Несмотря на не очень высокое качество, по\-лу\-ча\-емая база приемов
 позволяет почувствовать специфику управления логи\-чес\-ки\-ми
 процессами в предметной области и представляет собой ценный
 материал для последующего анализа и создания более совершенных
 версий.

 Кроме проблем развития языка и базы приемов, физические задачи
 застав\-ля\-ют искать и новые решения по интерфейсу их ввода. Ясно,
 что для "обычного" \ пользователя режим детальной логической
 формализации условий совершенно не\-при\-го\-ден. Вероятно, здесь
 понадобится развивать какие-либо средства для на\-гляд\-но\-го
 отображения сценариев в виде схем, диаграмм и т.п. Однако, с
 точки зре\-ния изучения логических процессов, это второстепенные
 обстоятельства, и мы их пока затрагивать не будем. Другая возможность -
 ввод условий физических задач на естественном языке. Пока она
 рассматривается лишь как обучающий материал для процедур
 семантического анализа. Масштабы работы, которую здесь придет\-ся
 проделать, весьма велики, и для создания практически пригодной
 версии пона\-до\-бит\-ся время.

 Разберем несколько типичных примеров формализации физических задач.
 Нач\-нем с простейшего примера - по существу, текстовой арифметической
 задачи "на движение": "Два лица выезжают одновременно из городов А и В
 навстречу друг другу. Первый проезжает в час на 2 км больше второго и
 приезжает в В часом раньше, чем второй в А. Расстояние между А и В
 равно 24 км. Сколько километ\-ров проезжает каждый в час?".

 Задача оформляется как задача на описание; целевая установка ее -
 того же ти\-па, как у геометрических задач на вычисление.
 Посылка "движение($a,b,c$)" \ указы\-ва\-ет на то, что $a$ есть
 процесс движения первого лица, обозначенного $b$, по траектории
 $c$. Движению второго лица $q$ соответствует посылка
 "движение($p,q,r$)". Так как траек\-тории этих двух процессов
 движения являются взаимно обратными, вводится по\-сыл\-ка
 "$r =$обратныйпуть($c$)". Посылка "исхмомент($a$)=исхмомент($p$)" \
 выража\-ет тот факт, что движение началось одновременно. Связь между
 скоростями движе\-ния вдоль траекторий дается посылкой
 "скорость($a,c$) = скорость($p,r$)+ 2 км/час". Связь между моментами
 завершения движения дается посылкой
 "послмомент($a$)= послмо\-мент($p$) - 1 час". Длина
 траектории определяется равенством "длина($c$) = 24 км".
 Условия задачи суть "$x$ = скорость($a,c$)" и "$y$ = скорость($p,r$)".
 Неиз\-вест\-ные задачи - $x,y$. Решатель выдает ответ
 "$x = 8$км/час, $y=6$км/час".

 Следующий пример - задача по динамике: "На длинной нити,
 перекинутой через блок, подвешены на одном уровне одинаковые
 грузы. От одного из грузов отделя\-ет\-ся часть, масса которой равна
 1/5 массы груза, и через 1 сек. падает на землю. Через какое
 время после этого достигнет земли другой груз? ".

 Составляем список посылок, задающих данный сценарий. Прежде
 всего, вво\-дим посылку "блок($a$,$b$,$c$)". Здесь $a$ - процесс
 движения блока; $b$, $c$ - процессы движе\-ния грузов. Считаем, что эти
 процессы начинаются в тот момент, как нача\-лось падение отделившейся
 части. Поэтому один из движущихся грузов уже непол\-ный. Судя по
 условию задачи, блок закреплен, так что добавляем посылку
 "неподв($a$, $P$)", где $P$ - обозначение блока как физического
 тела. Чтобы можно было сослать\-ся на сами грузы, вводим посылки
 "движение($b$,$d$,$e$)" \ и "движение($c$,$f$,$g$)", где эти
 грузы обозначены через $d$,$f$. Одновременно получаем обозначения
 $e$,$g$ для траекто\-рий движения грузов. Чтобы указать на то, что
 события развертываются в поле дейст\-вия земного тяготения,
 добавляем посылку "прямкоорд($K$)". Далее можно использо\-вать
 прямоугольную систему координат $K$, ориентированную стандартным
 обра\-зом относительно поверхности Земли. Так как грузы подвешены,
 вводим посыл\-ки "подвеска($b$,$a$)", "подвеска($c$,$a$)".
 Записываем условие на массы грузов, считая, что часть отделилась
 от первого из них: "масса($d$) = 4масса($f$)/5".
 Условие нахожде\-ния грузов на одном уровне формулируем с
 использованием системы координат $K$: "крд(Место($b$,
 исхмомент($b$)),K,3) = крд(Место($c$, исхмомент($c$)),K,3)".
 В исход\-ный момент грузы неподвижны. Косвенная информация об этом
 извлекается из слова "подвешены", однако заметим, что такую подробность
 при беглом чтении текста задачи легко и пропустить. Формулируем
 соответствующие посылки: "Скорость($b$, $K$, исхмомент($b$)) =
 вектор0"; "Скорость($c$,$K$,исхмомент($c$)) = вектор0". Еще од\-на
 важная деталь - равенство исходных моментов процессов движения
 грузов: "исх\-мо\-мент($b$) = исхмомент($c$)".

 Далее переходим к движению отделившейся части. Вводим посылку,
 опреде\-ля\-ю\-щую процесс ее движения: "движение($p$,$q$,$r$)". Эта часть
 движется только под дейст\-ви\-ем силы тяжести, поэтому добавляем посылку
 "бросок($p$)". Можно было ука\-зать на отсутствие горизонтальной
 составляющей скорости и добавить также посыл\-ку "вертикаль($r$,$K$)",
 однако в данной задаче эта информация не нужна, и на пове\-де\-нии решателя
 она практически никак не сказывается. В начальный момент высоты и
 скорости груза и отделившейся части совпадали: "крд(Место($p$,
 исхмомент($p$)),K,3) = крд(Место($b$, исхмомент($b$)),K,3)";
 "Скорость($p$,$K$,исхмомент($p$)) = вектор0".
 Дли\-тель\-ность процесса падения $p$ равна секунде, и в последний
 момент высота па\-да\-ю\-щей части равна 0: "длительность($p$) = 1сек",
 "крд(Место($p$,послмомент($p$)),$K$,3) = 0". Так как нам нужно
 найти время достижения земли грузом $f$, то считаем, что в
 последний момент его движения высота равна 0: "крд(Место($c$
 послмомент($c$)), $K$, 3)=0".

 После ввода посылок остается лишь ввести целевую установку (аналогично
 пре\-ды\-ду\-щей задаче) и добавить условие "$x$ =
 длительность($c$)".

 На этом примере уже хорошо видно, насколько более громоздкой, по
 сравнению с текстом, оказывается логическая запись задачи. Вместе
 с тем, ничего лишнего мы не добавили - все утверждения необходимы
 для адекватной характеризации сце\-на\-рия. Как уже говорилось,
 предпринимаются попытки обучения решателя самостоя\-тель\-но\-му чтению
 текста и переводу его на логический язык. Логика восстанов\-ле\-ния
 элементов задачи "по умолчанию", в общем, реализуется в виде
 прие\-мов без особых трудностей. Однако, приемов понадобится
 очень много - эта работа равно\-знач\-на созданию в решателе достаточно
 полной системы представлений о ми\-ре. Безусловно, выполнить ее все
 равно придется, и тогда откроются новые перспек\-ти\-вы сразу во
 многих важных направлениях. До этого же упрощение ввода в
 реша\-тель задач "текстового" \ характера придется обеспечивать какими-то
 другими средст\-ва\-ми.

 В заключение приведем пример на закон сохранения энергии: "С горки
 высо\-той 2 м и длиной основания 5 м съезжают санки, которые
 останавливаются, прой\-дя горизонтально некоторый путь от основания
 горы. Чему равен этот путь, если коэффициент трения на всем пути
 0.05?".

 Движение санок с горки выражаем посылкой
 "движнаклплоск($a$,$b$,$K$,$p$)". Здесь $a$ - процесс движения
 санок; $b$ - процесс движения наклонной плоскости; $K$ -
 прямоу\-голь\-ная система координат, связанная с поверхностью Земли;
 $p$ - угол наклона плос\-кос\-ти. Для уточнения положения $K$
 добавляем посылку "поверхнземли($K$)"; для указа\-ния на то, что
 горка неподвижна - посылку "неподв($b$,$B$)". В исходный момент
 санки неподвижны: "Скорость($a$,$K$,исхмомент($a$)) = вектор0".
 Условия на высоту горки и длину ее основания выразим через
 координаты санок в начале и конце первой части пути:
 "крд(Место($a$, исхмомент($a$)),K,3) - крд(Место($a$,
 послмомент($a$)),K,3) = 2м"; "крд(Место($a$,
 исхмомент($a$)),$K$,1) - крд(Место($a$, послмомент($a$)),K,1)=5м".

 Чтобы задать коэффициент трения, вводим в рассмотрение процесс $f$
 сило\-во\-го воздействия горки на санки: "воздействие($f$,$a$,$b$)";
 "коэффтрения($f$, Период($a$)) = 0.05".

 Вводим процесс движения санок по горизонтальному пути.
 Представляем его как процесс движения по наклонной плоскости с
 уклоном 0: "движнаклплоск($c$,$d$,$K$,0)"; "неподв($d$,$D$)".
 Чтобы связать процессы движения $a$ и $c$, заносим посылку
 "продолж\-без\-у\-да\-ра($a$,$c$)", которая означает отсутствие потерь
 энергии на стыке двух про\-цес\-сов, а также обеспечивает привязку по
 координатам и скорости.

 Для указания коэффициента трения на горизонтальном участке вводим
 соответ\-ст\-ву\-ю\-щее силовое воздействие: "воздействие($h$,$c$,$d$)",
 "коэффтрения($h$, Период($c$)) = 0.05".

 Чтобы указать, что на всей горизонтальной траектории санки
 двигались, а ос\-та\-но\-ви\-лись лишь в ее конце, вводим посылки
 "движется($c$,$K$)", "Скорость($c$,$K$, посл\-мо\-мент($c$)) =
 вектор0". Наконец, для ссылки на горизонтальную траекторию
 добав\-ля\-ем посылку "движение($c$,$m$,$r$)". Условием задачи
 служит равенство "$x$ = длина($r$)".

 Иногда решение задачи можно ускорить или обеспечить получение
 ответа за счет ввода какого-либо дополнительного утверждения, легко
 усматриваемого из текста задачи. В последнем примере можно было
 бы указать, что направление движе\-ния санок в начале
 горизонтальной траектории продолжает направление их движения с
 горки: "крд(Скорость($c$,$K$,исхмомент($c$)),K,1) < 0". Это
 немного ускорило бы по\-яв\-ле\-ние ответа. Такого рода "усиление" \
 решателя особенно эффективно для плани\-мет\-ри\-чес\-ких задач. Обычно
 подсказка, помогающая решателю, указывает на тот или иной пробел
 в его базе приемов, и при ее обнаружении следует данный пробел
 устранить.

 \subsection{Вычислительные задачи}

 Начато обучение решателя задачам "на программирование" \ -
 составлению про\-грамм для вычислений с традиционными нелогическими
 структурами данных (числами, матрицами, и т.п.). В процессе решения
 задачи создается логическое представле\-ние вычислительного
 алгоритма, которое затем преобразуется компилятором ГЕНО\-ЛО\-Га в
 программу на ЛОСе. Если задача не имела варьируемых параметров,
 то составленная программа сразу же запускается и выдается
 найденный ответ (на\-бор чисел, график функции и т.п.). В противном
 случае после создания про\-грам\-мы открывается специальный интерфейс
 для ввода значений параметров. Он поз\-во\-ля\-ет многократно
 обращаться к программе для варьируемых значений. Синтезиро\-ван\-ная
 программа сохраняется, и ее можно запускать без повторного
 решения задачи.

 Способность решателя создавать собственные программы можно
 будет исполь\-зо\-вать для различных целей. Во-первых, для ускоренного
 развития в рамках логи\-чес\-кой системы больших вычислительных комплексов,
 отдельные блоки которых бу\-дут определяться на математическом языке
 формулировок соответствующих задач. Во-вторых, для освоения
 смешанных логико-вычислительных режимов работы ре\-ша\-те\-ля.
 Вычисления, проводимые в процессе аналитического исследования,
 мо\-гут подсказать какие-либо гипотезы, позволить вывести
 приближенные зависимости и с их помощью довести задачу до конца,
 и т.п. В-третьих, компиляция вычисле\-ний непосредственно с уровня
 теорем логической системы позволит ускорить накопле\-ние библиотек
 вычислительных процедур. Она же необходима для исследо\-ва\-ний по
 логическому выводу в теории, ориентированному на вычислительные
 зада\-чи. Последнее является естественным дополнением исследований по
 логическому вы\-во\-ду в теории, ориентированному на создание новых приемов.

 Хотя число вычислительных задач, на которых выполнялось обучение
 реша\-те\-ля, совсем невелико (около 30), однако они и не требовали
 слишком боль\-шо\-го разнообразия приемов. Поэтому обычно решатель начинал
 работать после одного - двух освоенных примеров задач заданного
 типа. Пока создаются лишь простей\-шие схемы вычислений, работающие
 в более-менее регулярных ситуациях; для получе\-ния более
 изощренных процедур обучение решателя должно быть продолжено.

 Прежде всего, рассматривались задачи на построение графика
 функции. Заме\-тим, что для этого существует альтернативная
 возможность, указанная ниже при описании интерфейса ввода задач.
 В нашем случае, для построения графика функ\-ции $f(x)$ создается
 задача на описание с единственным условием $y = \lambda_x(f(x),
 x\in [a,b])$. Здесь $a,b$ - либо конкретные числа, либо
 параметры. Задача имеет цели "пол\-ный", "явное", "прямойответ",
 "одз", "упростить", "вычисление", "неизвестные $y$", "известно".
 Данный комплект целей является стандартным для вычисли\-тель\-ных
 задач; на экране он отображается в виде фразы "Вычислить $\ldots$
 при заданных $\ldots$".

 Задача на вычисление определенного интеграла $I$, быть может,
 содержащего па\-ра\-мет\-ры, задается аналогично предыдущему; ее
 единственное условие имеет вид $y = I$.

 Был рассмотрен пример, когда зависимость, для которой нужно
 написать про\-грам\-му, определяется после решения задачи по физике.
 В посылках задачи перечис\-ля\-ют\-ся, как это было продемонстрировано в
 предыдущем разделе, утвержде\-ния, описывающие физический сценарий.
 Затем вводится условие вида $y = \lambda_x(F(x),x \in [a,b])$.
 Решатель находит ответ физической задачи, после чего определяется
 выра\-же\-ние $F(x)$. Затем он составляет логическую схему вычислений
 - цикл вычисления значения $F(x)$ с тем шагом, который требуется
 для построения графика. Наконец, компилятор создает программу
 вычислений, с помощью которой и строится гра\-фик. Хотя
 приведенная в задачнике ситуация очень проста (бросок под углом
 к горизонту), пример демонстрирует интересную принципиальную
 возможность сис\-те\-мы. Аналогичные задачи можно было бы создать и
 для других рассмотрен\-ных при обучении решателя сценариев.

 Если нужно на одном графике отобразить несколько различных
 зависимос\-тей, вводится несколько соответствующих условий задачи.

 Чтобы составить программу численного решения обыкновенного
 дифференци\-аль\-но\-го уравнения первого порядка методом Рунге-Кутта,
 вводятся следующие условия задачи: $$y(a)=b; \frac{dy(x)}{dx} =
 f(x,y(x)).$$ Иногда к ним добавляются дополнительные ограничения
 на параметры, которые могут понадобиться на этапе предварительных
 преобразований формул. Анало\-гич\-ным образом создается задача для
 решения системы обыкновенных диффе\-рен\-ци\-аль\-ных уравнений. Здесь
 применяется метод Эйлера.

 Если нужно найти множество всех корней уравнения в некоторой
 подоб\-лас\-ти, вводятся условия: $y = \mbox{set}_x(f(x) = g(x)\ \& \ P(x))$,
 "точность($y$, $a$)". Здесь $P(x)$ - условие, определяющее
 область, в которой ищутся корни; $a$ - параметр, задаю\-щий
 точность вычислений - как только в итеративной схеме уточнения
 корней значения $y$ начинают отличаться меньше, чем на $a$, цикл
 обрывается. В случае системы уравне\-ний первое условие приобретает
 вид $y = \mbox{set}_z(F_1 \ \& \ \ldots \ \& \ F_n \ \& \ P(z))$, где
 $z$ - спи\-сок неизвестных; $F_1, \ldots , F_n$ - уравнения;
 $P(z)$ - условие на рассматриваемую подоб\-ласть. Заметим, что для
 случая системы уравнений программа составляется лишь тогда, когда
 решателю удается выразить аналитически все неизвестные через одну
 оставшуюся. Здесь обычно получается полный список корней системы
 в указан\-ной области. Если же таким способом система не решается,
 можно поставить зада\-чу на создание программы уточнений исходного
 значения по методу Ньютона. Здесь система уравнений заносится в
 посылки и вводятся условия $y = (x_1, \ldots, x_n)$,
 "точ\-ность($y$, $a$)", "уточнение($y$, $y_0$)", где $x_1, \ldots,
 x_n$ - все неизвестные; $y_0$ - начальная точ\-ка.


 \section{Интерфейс ввода задач}

 \subsection{Оглавление задачника}

  В решателе имеется сборник задач, в котором сохраняются
  (для нужд тестирования и регулировки) рассматривавшиеся при
  обучении задачи либо вводятся новые задачи. Этот сборник снабжен
  древовидным оглавлением, разбивающим его на разделы, подразделы,
  и т.п. Вход в оглавление задачника осуществляется из главного
  меню при нажатии клавиши "з" (здесь и далее, если не оговорено
  особо, все буквенные названия клавиш - русские) либо нажатии
  левой кнопки мыши на пункте меню "Оглавление задачника". После этого
  происходит переход к тому пункту оглавления, с которым велась
  работа при предыдущем пребывании в задачнике. Переход между
  пунктами оглавления выполняется с помощью клавиш курсора:
  нажатие клавиши "курсор влево" приводит к переходу в надраздел
  текущего раздела; клавиши "курсор вверх" и "курсор вниз"
  позволяют выбирать текущий пункт в текущем разделе; кла\-виша
  "курсор вправо" приводит к просмотру содержимого текущего
  пункта. Для ускоренного выбора пункта можно использовать курсор
  мыши: нажатие левой кла\-виши на выбранном пункте приводит к
  переходу внутрь этого пункта; нажатие (в любом месте) правой
  клавиши мыши - к возвращению в надраздел. Пункты каждого
  раздела пронумерованы, причем если пункт соответствует входу
  в подраздел, то после его номера стоит закрывающая скобка,
  если же пункт соответствует отдельной задаче задачника,
  то после его номера стоит точка. Из любого пункта оглавления
  можно вернуться к главному меню, нажав клавишу "End". Пункты
  корневого раздела имеют названия "Дискретная математика",
  "Алгебра множеств", "Элементарная алгебра", "Элементарная
  геометрия", "Математический анализ", "Диффе\-рен\-ци\-аль\-ные уравнения",
  "Аналитическая геометрия", и др.

  Оглавление задачника организовано таким образом, что все его
  концевые пункты (соответствующие отдельным задачам) собраны
  в специальные концевые разделы. Все пункты такого концевого
  раздела - только концевые. Обычно в концевом разделе
  перечисляются только номера задач, после которых стоят три
  тире. Прочие (некон\-цевые) пункты оглавления имеют текстовые
  подзаголовки. В принципе, с любым пунктом оглавления (концевым
  либо неконцевым) можно связать произвольные тек\-стовые
  примечания. Для этого достаточно выбрать нужный пункт и нажать
  клавишу "р" \ (рус.) - возникает курсор текстового редак\-то\-ра
  (особенности текстового ре\-дак\-то\-ра решателя - см. в последующих
  разделах, посвященных его интерфейсу). После завер\-шения
  редактирования (оно происходит по нажатии "Enter") сохраняется
  из\-ме\-нен\-ный текст пункта.

  После выбора текущего концевого пункта и нажатия клавиши "курсор
  вправо" \ про\-исходит переход к просмотру задачи этого пункта. Все
  задачи одного и того же концевого раздела соединены при таком
  просмотре в одну "ленту", которую можно прокручивать вверх и вниз при
  помощи клавиш "курсор вверх - вниз" \ и "Page Up - Down", не
  выходя обратно в оглавление задачника. Одна задача отделяется
  на этой "ленте" \ от другой сплошной горизонтальной линией. Кроме
  указанных выше, при просмотре задач одного концевого раздела
  удобно использовать клавиши "Ctr-Page Up" \ и "Сtr-Page Down".
  Первая из них позволяет переходить к просмотру начала предыдущей
  задачи, вторая - к просмотру начала следующей задачи.

 \subsection{Просмотр задач и основные операции над задачами}

  Область между горизонтальными линиями, ограничивающими
  описание задачи (для последней задачи нижняя линия отсутствует),
  называется полем задачи. Эле\-менты задачи размещаются в ее поле
  следующим образом. Вначале идут посылки задачи. Затем располагается
  текст-формульный элемент, задающий целевую уста\-новку зада\-чи.
  Далее (кроме задач на исследование) идут условия задачи
  (в случае задач на доказательство либо преобразование -
  единственное условие). Если задача ранее была решена системой,
  то в конце располагается найденный на нее ответ. Задача по
  геометрии может быть сопровождена чертежом, который размещается
  до ее посылок. Если задача не имеет невырожденных посылок
  (отличных от константы "истина" \ и простейших указателей на
  типы значений переменных), то целевая уста\-новка разме\-щается
  непосредственно в начале поля.

  В некоторых разделах (теория вероятностей, элементарная физика,
  комби\-на\-то\-ри\-ка) логическая формализация текста задачи выглядит
  громоздко и трудна для восприятия. Поэтому в решателе
  предусмотрена возможность сохранять также ис\-ход\-ный текст задачи.
  Если этот текст был сохранен, и при просмотре задачи на\-жи\-ма\-ет\-ся
  клавиша "н", то текст появляется на экране. Данная операция
  адресуется той задаче, к которой относится верхняя из имеющихся на
  экране отделяющих гори\-зон\-таль\-ных линий. Чтобы вернуться к
  просмотру формальной версии условия, на\-жи\-ма\-ет\-ся "End" \ или
  "Esc". При нажатии клавиши "н" \ формальная запись задачи
  пропадает с экрана. Поэтому более удобным для ее сопоставления с
  исходным текстом задачи является другой режим, включаемый при
  нажатии на клавишу "+" \ или выборе в верхнем меню пункта "+".
  Тогда в нижней части экрана возникает выделенный голубым цветом текст
  задачи. Как и выше, он относится к задаче, определяемой по верхней
  горизонтальной линии на экране. Далее можно выполнять произвольную
  прокрутку - этот текст будет сохраняться до нажатия клавиши пробела.

  Чтобы удобнее было анализировать логическую формализацию задачи,
  можно использовать специальный режим просмотра, при котором на
  экран будут выводиться пояснения к встречающимся в формулах
  понятиям. Для перехода в этот режим достаточно нажать клавишу
  "?" \ либо выбрать в верхнем меню пункт "?". Чтобы получить
  пояснения к какому-либо понятию, нужно поместить на него курсор
  мыши и нажать левую кнопку. Пояснения прорисовываются голубым
  цветом в нижней части экрана и исчезают при нажатии любой
  клавиши. Чтобы выполнять описываемые далее операции над задачами,
  связанные с выделением их элементов, следут сначала выйти из
  режим просмотра пояснений, для чего нажать клавишу пробела.

  Независимо от режима просмотра пояснений к задаче, можно входить
  в оглавление логического языка системы из произвольного
  оглавления либо из общего просмотра списка задач. Для этого
  достаточно нажать клавишу F2.

  Существуют различные режимы прорисовки задачи. По умолчанию,
  задачи про\-рисовываются с помощью стандартной математической
  записи и с пропуском ряда простейших посылок и условий. Чтобы
  перейти к режиму, в котором используется внутренний логический
  язык (далее называемому скобочной записью), нажимается клавиша
  "Ctr-с"; она же возвращает обратно в режим стандартной
  математической записи. Для перехода в режим полного просмотра
  посылок и условий и выхода из этого режима служит клавиша "ы".

  Для выполнения различных операций с задачей и ее элементами
  выполняется выбор задачи либо ее элементов с помощью мыши.
  Курсор мыши подводится к выбираемому элементу либо помещается в
  поле выбираемой задачи. При выборе элемента задачи нажимается
  левая клавиша мыши, при выборе всей задачи - правая. Чтобы
  произошел выбор задачи, на экране обязательно должна быть
  прорисована ее верхняя отделяющая линия. Выбранный элемент
  перекрашивается в голубой цвет. Чтобы отменить выбор
  эле\-мента, выполняется повторно такое же нажатие клавиши мыши.
  Если нужно отме\-нить выбор сразу всех выбранных на текущий момент
  эле\-ментов и задач, нажимается клавиша пробела. Можно выделять не
  только отдельную посылку либо условие задачи, но и ее фрагмент.
  Для этого, сразу после выделения посылки либо условия $F$,
  следует нажать клавишу "курсор вправо". Тогда будет выделен
  (перекрашен в голубой цвет) первый операнд $F$. Далее клавишами
  "курсор вправо - курсор влево" \ можно переходить от операнда к
  операнду на одном уровне; клавишей "курсор вниз" \ - переходить
  к подоперандам текущего операнда; клавишей "курсор вверх" \ -
  возвра\-щаться к надоперанду. Нажатие любой клавиши, отличной
  от клавиш курсора, за\-вершает данный режим выделения фрагмента.

  Перечислим некоторые операции, которые можно совершать
  после выделения терма задачи. Прежде всего, нажатие клавиши
  "с" \ позволяет переходить от стандарт\-ной математической записи
  этого терма к скобочной и обратно. При нажатии клави\-ши "Enter",
  включается режим вставки формульным редактором нового терма
  зада\-чи непосредственно перед выделенным термом (если он
  располагается до целевой уста\-новки, то становится посылкой
  задачи, если после - условием). Ниже будут приведены основные
  правила использования формульного редактора при вводе эле\-ментов
  задачи. Если нужно вставить новый терм перед выделенным термом
  с по\-мощью текстового редактора (то есть в скобочной записи),
  то нажимается клавиша "Т" \ (русск.). Для изменения ранее
  набранного терма имеется три возможности. Пер\-вая из них
   - использование текстового редактора для работы с текстом
  скобочной записи этого терма. Для входа в этот режим
  нажимается "Ctr - т" \ (т - русск.). Вторая - использование
  формульного редактора для повторного набора новой
  версии терма. Новая версия набирается непосредственно под
  старой, которая во время набора со\-храняется, а затем удаляется.
  Для входа в этот режим используется "Сtr-ф". Наконец, можно
  войти в формульный редактор для продолжения набора выделенного терма,
  начиная с его конца. При необходимости (используя Backspace)
  здесь можно сначала исключить часть ранее набранных последних
  символов, а затем добавить новые. Для входа в такой режим
  нажимается "ф". Чаще всего для изменения ранее введенного терма
  применяется первый режим (скобочной записи), так как он
  позволяет вносить изменения в любом месте текста. Чтобы удалить
  выделенный элемент задачи, нажи\-мается клавиша "Ctr-Del". Если
  была выделена вся задача, то нажатие "Ctr-Del" уда\-ляет всю задачу
  целиком. Выделенную задачу можно скопировать нажатием клави\-ши
  "к" (русск.). Если выделена только одна задача, то копия
  располагается в конце текущего списка задач (т.е. текущего концевого
  раздела оглавления задачника). Если нужно разместить эту копию
  перед некоторой ранее введенной задачей списка (теку\-щего либо
  относящегося к другому разделу), то перед нажатием клавиши "к"
  выде\-ляется также последняя задача. Чтобы исключить из задачника
  ранее найденный на выделенную задачу ответ, нажимается клавиша
  "Ctr-F4". Выделенный терм задачи можно скопировать, выделив
  предварительно тот терм, перед которым нужно помес\-тить копию
  (если ее нужно поместить в конец списка посылок либо списка условий,
  то выделяется вся задача) и нажав затем клавишу "Insert".
  Аналогичным образом можно перенести выделенный терм на новое
  место; для этого служит клавиша "Ctr-Insert".

  Если выделить несколько термов либо фрагментов термов задачи,
  то их можно исполь\-зовать при наборе новых термов формульным
  редактором. Следует лишь запомнить порядок, в котором онм
  выделялись. Если в режиме формульного редак\-тора нажать сначала
  "Insert", а затем номер (начиная с 1 и не более 9) выделенного
  указанным образом терма, то произойдет автоматическая вставка
  его в набираемый терм начи\-ная с текущей позиции. Такую вставку
  заданного терма в процессе набора можно выполнять многократно.

  \subsection{Ввод новой задачи}

  Ввод новой задачи инициируется одним из двух способов. Первый
  из них состоит в том, чтобы перейти в конец просматриваемого
  списка задач и нажать клавишу "з" (если нужно ввести новую
  задачу перед ранее введенной, то сначала выделяется последняя задача,
  а затем нажимается "з"). Тогда возникает новая горизонтальная
  линия, которая является первым элементом новой задачи. Второй
  способ начать ввод новой задачи - выйти из просмотра списка
  задач в концевой раздел оглавления задачника, соответствующий
  данному списку, и ввести новый его концевой пункт, который
  автоматически становится заготовкой новой задачи. Если этот
  пункт вво\-дится в конце раздела, то нажимается клавиша "к"
  (русск.); если же его нужно ввести перед некоторым другим
  пунктом, то происходит выбор последнего (клавишами "курсор вверх-
  вниз") и нажимается "К". При входе в список задач через новый
  концевой пункт оглавления попадаем на начало новой задачи,
  которое состоит из единственного ее элемента - верхней горизонтальной
  отделяющей линии. Если новая задача вводится перед ранее
  введенной нажатием клавиши "з", то она автоматически при этом
  выделяется (ее верхняя линия окрашена в голубой цвет).

  После того, как введена верхняя отделяющая линия задачи, можно
  переходить к вводу посылок, условий и целевой установки задачи.
  В принципе, их допустимо набирать в произвольной
  последовательности. Рекомендуемым является следующий порядок,
  при котором уменьшается число операций с клавиатурой:
  сначала вводятся посылки задачи, затем целевая установка, и в
  конце - условие (условия). Чертеж геометрической задачи обычно
  вводится в последнюю очередь либо формируется автоматически
  (путем нажатия клавиши "Ч"), хотя можно начинать ввод задачи
  и непосредственно с чертежа. Для ввода очередной посылки
  нажимается "Enter"  - чтобы войти в формульный редактор,- либо
  "Т" (русск.) - чтобы войти в текстовый редактор (последнее
  выполняется лишь в исключительных случаях, если для
  рассматриваемых логических символов еще не обеспечена их
  прорисовка формульным редактором). Вырожденные посылки,
  указывающие тип значений переменных либо необходимые для указания
  области допустимых значений, вводить вообще не нужно - они созда\-ются
  решателем автоматически (кроме случаев, когда тип значения переменной
  не подсказывается выражениями из описания задачи, в которых эта
  переменная встре\-чается). По окончании ввода посылок (если
  посылок нет, то сразу же) начинается формирование целевой
  установки задачи. Здесь имеется два режима - с использова\-нием
  оглавления типов целевых установок и путем непосредственного
  набора перечня целей текстовым редактором. Рекомендуется
  использовать первый режим. Для входа в него нажимается клавиша
  "ц". Эта же клавиша используется для изменения ранее введенной
  целевой установки - предварительно надо выделить задачу либо
  убедиться, что задача является последней в текущем списке задач.
  После нажатия клавиши "ц" на экране появляется раздел оглавления
  типов целевых установок, с которым происходила работа в
  предыдущий раз. Это оглавление (и вообще все оглавления
  решателя) устроено аналогично оглавлению задачника. Корневой
  раздел оглавления типов целевых установок содержит следующие
  пункты:

    1) "Доказать утверждение". Этот пункт выбирается при создании
  задачи на доказательство. После выбора его ("курсор вверх-вниз")
  и нажатия "курсор вправо" \ автоматически выбирается тип задачи
  "доказать" и происходит возвращение в набор текста задачи.

  2) "Проверить истинность утверждения". Здесь создается задача на
  описание, предназначенная для проверки истинности ее
  единственного условия. Цели ее суть "полный", "явное",
  "прямойответ", "одз". Возможные ответы (кроме отказа) - "ис\-тина"
  либо "ложь". Как и выше, для выбора данной целевой установки
  нажимается "курсор вправо".

  3) "Преобразовать выражение". Этот пункт является подразделом
  оглавления, в котором собраны различные целевые установки
  задач на преобразование (см. ниже).

  4) "Найти значения неизвестных". Этот пункт является подразделом
  оглавления, в котором собраны различные целевые установки задач
  на описание (см. ниже), связанных с нахождением неизвестных.

  5) "Исследовать свойства объекта". Этот пункт является
  подразделом оглавления, в котором собраны различные целевые
  установки задач на общую характеризацию свойств объектов
  различных типов. Все они оформляются как задачи на описание,
  причем ответом служит некоторая группа утверждений, полученных
  в процессе ана\-лиза ситуации и дающих типовую характеризацию
  требуемого вида.

  6) "Переформулировать условие". Создается задача на описание,
имеющая цели "полный", "прямойответ", "редакция". Это - эквивалент
словесной формулиров\-ки "найти условия, при которых ...",
означающей необходимость эквивалентного преобразования исходной
системы условий к более простому и явному виду.


  7) "Построить график". Пункт позволяет создавать задачу
  на построение графика. Это - задача на преобразование с целями
  "числзначение", "график". Ее условие - выражение, определяющее
  зависимость, для которой строится график. При решении задачи
  инициируется диалог для определения варьируемой переменной,
  промежутка ее значений и значений фиксированных параметров.
  Для работы с возникающим после этого графиком предус\-мотрен
  специ\-альный интерфейс, позволяющий изменять масштаб, параметры
  и область просмот\-ра (подробнее о нем - в
  нижеследующих разделах). После выбора данного пункта и
  нажатия клави\-ши "курсор вправо" проис\-ходит возвращение в
  набираемую задачу, где прорисовы\-вается строка "Построить
  график:".

  8) "Игровые задачи". Пункт является подразделом оглавления,
  который на те\-ку\-щий момент используется для обучения решателя
  игре в шахматы. Предусмот\-ре\-на инициализация шахматной партии
  либо создание заданной позиции для ее анализа решателем.
  Обучение находится на начальном этапе, и использовать эту
  возможность интерфейса рекомендуется лишь тем, кто захотел бы
  самостоятельно продолжить развитие решателя.

  \medskip

  Подраздел "Преобразовать выражение" оглавления типов целевых
  установок со\-держит следующие пункты:

  1) "Упростить выражение в области допустимых значений". Этот
  пункт позво\-ля\-ет вводить задачу на преобразование с целями
  "упростить","одз". Такой набор целей - стандартный для
  большинства задач на преобразование, включая вычисление
  пре\-делов, производных, интегралов и определителей матриц.

  2) "Вычисление значения константного выраже\-ния". Этот пункт
  является подраз\-делом оглавления, в котором собраны различные
  целевые установки задач на нахож\-дение точного либо приближенного
  численного значения константного выраже\-ния (см.ниже).

  3) "Раскрыть скобки". Создается задача на преобразование,
  ориентиро\-ван\-ная на приведение выражения к виду суммы одночленов.
  Она имеет цели "упростить", "раскрытьскобки", "одз".

  4) "Разложить на вещественные множители". Создается задача на
  преобразова\-ние, в которой нужно разложить выражение на
  вещественные множители. Она имеет цели "упростить",
  "разложитьнамножители", "одз".

  5) "Разложить на комплексные множители". Аналогично предыдущему,
  но допус\-кается переход к выражениям с мнимой единицей. Задача
  имеет те же цели, что и выше, к которым добавляется цель
  "видУмножение". В случае появления комплекс\-ных множителей
  вместо вещественной операции "умножение" возникает комплексная
  операция "Умножение".

  6) "Представить в виде суммы простейших дробей". Вводится задача
  на преобра\-зование, в которой нужно представить выражение в виде
  суммы простейших дробей. Предполагается, что это выражение имеет
  единственную переменную (в действи\-тельности процедуры решателя
  рассчитаны на приведение к виду суммы простейших дробей
  выражения с несколькими переменными, относительно явно указанной
  одной из них, что применяется, например, при интегрировании,
  однако это - "внутренняя" \\ возможность, не вынесенная во
  внешний интерфейс). Цели задачи - "упростить",
  "простейщиедроби", "одз".

  7) "Разложить в ряд степенной ряд". Создается задача на разложение
  за\-дан\-но\-го выра\-жения по заданной переменной $x$ в степенной ряд в
  окрестности заданной точ\-ки $t$. Здесь имеется в виду получение
  бесконечной суммы, содержащей все члены ря\-да. Если в посылках
  задачи содержится утверждение "комплексное($x$)", то
  пред\-при\-ни\-ма\-ется попытка получить разложение в
  комплекснозначный ряд Тейлора либо
  Лорана. После выбора данной целевой установки ("курсор вправо")
  происходит воз\-вра\-щение в текст набираемой задачи, к которому
  добавляется строка "Разложить в степенной ряд по переменной".
  Под этой строкой в левой части экрана размеща\-ет\-ся курсор
  формульного редактора, которым нужно ввести переменную разложения $x$.
  После ввода этой переменной (ввод завершается нажатием "Enter") к
  указанной строке добавляется "$x$ в точке", и снова в левой части
  возникает курсор формуль\-но\-го редактора. Здесь уже нужно ввести
  выражение $t$, определяющее точку разложе\-ния. По окончании ввода
  (нажатие "Enter") $t$ перерисовывается в конце строки, задаю\-щей целевую
  установку, и эта установка завершается двоеточием - далее
  можно вводить выражение, которое следует разложить в ряд.
  Такого рода диалоги используются в различных описываемых далее
  целевых установках. Цели задачи на разложение в степенной ряд -
  "упростить", "рядтейлора $x$ $t$", "одз".

  8) "Получить заданное число членов разложения в ряд Тейлора".
  Аналогично предыдущему, но требуется получить заданное конечное
  число $n$ членов ряда. Диалог ввода целевой установки происходит
  по тому же сценарию, что и в предыдущем пункте. Однако, после
  ввода выражения $t$ для точки разложения, к строке текста
  целевой установки добавляются слова "до членов степени", и далее
  вводится фор\-мульным редактором константа $n$. Цели получаемой
  задачи - "упростить", "форму\-латейлора $x$ $t$ $n$", "одз".

  9) "Разложить в ряд Фурье". Вводится задача на разложение
  заданного выраже\-ния по заданной переменной $x$ в ряд Фурье
  на отрезке $[a,b]$. Вначале диалога ввода целевой установки
  прорисовывается строка "Разложить в ряд Фурье по переменной",
  после чего формульным редактором вводится переменная разложения
  $x$. Далее (после $x$) к строке добавляются слова "на отрезке",
  и формульным редактором вводится выражение $[a,b]$ (для ввода
  числового промежутка используются клавиши "Ctr-квадратная
  скобка"). Цели получаемой задачи - "упростить", "рядфурье $x$
  $a$ $b$", "одз".

  10) "Получить явное описание класса". Это - целевая установка
  задач, в которых множество, изначально заданное с помощью
  описателя "класс", нужно переформу\-лировать в явном виде, не
  использующем описателей "класс" и "отображение". К числу таких задач
  относятся, например, задачи на определение геометрического места
  точек. Возникающая здесь целевая установка состоит из целей
  "упростить", "класс", "одз".

  11) "Получить асимптотическую оценку". Это - целевая установка
  задачи на преобразование, в которой требуется получить
  асимптотическую оценку исходного выражения для предельного поведения
  переменных, заданного посылками "стре\-мит\-ся($\ldots$)".
  Установка состоит из целей "асимптоценка", "упростить", "одз".

  \medskip

  Подраздел "Вычисление значения константного выражения" \ раздела
  "Пре\-об\-ра\-зовать выражение" \ содержит следующие пункты:

  1) "Найти точное целочисленное значение". В этом случае условие
  задачи на преобразование построено при помощи целочисленных
  операций (сложение, вычита\-ние, умножение, степень с натуральным
  показателем, факториал, модуль и т.п.) из целочисленных
  констант, и требуется найти его точное численное значение.
  Число десятичных знаков ограничивается лишь возможностями
  интерпретатора (свыше 600) и ограничителями в приемах, которые
  легко ослабить либо вовсе убрать. Задача имеет цели "упростить"
  и "число".

  2) "Вычислить с заданной точностью". Здесь определяется приближенное
  значе\-ние константного выражения, в котором гарантированы первые
  $n$ знаков после запя\-той. После выбора данной целевой установки
  происходит возвращение в набор текста задачи, где
  прорисовывается строка " Вычислить с точностью до", и под ней -
  курсор формульного редактора. После набора формульным редактором
  числа $n$ нажимается "Enter"; тогда $n$ переносится в конец
  указанной выше строки, и после него добавля\-ется "знаков после
  запятой:". Задача имеет цели "упростить", "числоценка $n$".

  3) "Найти приближенное значение". Здесь определяется
  приближенное значение константного выражения без каких-либо
  гарантий относительно числа точных знаков. Для вычислений
  используется математический сопроцессор; числа представляются в
  формате с плавающей запятой и с двойной точностью. Задача имеет
  цели "числзна\-чение" и "выч".

  \medskip

  Подраздел "Найти значения неизвестных" содержит следующие
  пункты (все они относятся к задачам на описание):

  1) "Получить полное явное описание значений неизвестных".
  Это - целевая уста\-новка для обычных задач "с неизвестными",
  например, для решения систем уравне\-ний и неравенств из
  элементарной алгебры. Для геометрических задач на вычисление
  и задач на решение дифференциальных уравнений используются
  другие целевые установки (см.ниже). В целевую установку
  входят цели "полный", "явное", "прямой\-ответ", "одз",
  "упростить", "неизвестные $x_1 \ldots x_n$". После выбора
  целевой установки на экране прорисовывается строка "Найти",
  под которой формульным редактором вводятся неизвестные задачи -
  переменные, отделенные друг от друга запятыми. Затем нажимается
  "Enter".

  2) "Найти пример значений неизвестных". Это - задачи на
  нахождение конкрет\-ного примера значений неизвестных, при которых
  истинны условия. Они имеют цели "полный", "пример",
  "прямойответ", "одз", "упростить", "неизвестные $x_1 \ldots
  x_n$". После выбора целевой установки на экране прорисовывается
  строка "Найти пример для". Далее формульным редактором
  перечисляются неизвестные и нажимается "Enter".

  3) "Выразить значения неизвестных через заданные параметры".
  Это - задачи на вычисление, в которых требуется выразить
  значения неизвестных (уже явно выра\-женных через некоторые
  вспомогательные переменные посылок) через заданные из\-вестные
  величины. Такие задачи на описание - наиболее часто
  встречающиеся в элементарной и аналитической геометрии,
  в физике и т.п. Они имеют целевую уста\-новку "полный", "явное",
  "прямойответ", "одз". "упростить", "известно $a_1 \ldots a_m$",
  "неизвестные $x_1 \ldots x_n$". Здесь $x_1, \ldots , x_n$ -
  неизвестные, $a_1, \ldots , a_m$ - известные пара\-метры. Возможен
  случай $m=0$ - если искомые значения неизвестных суть константы;
  в этом случае соответствующая цель состоит из логического
  символа "известно". После выбора целевой установки на экране
  прорисовывается строка "Выразить", и под ней формульным
  редактором набираются неизвестные (через запятую). После этого
  неизвестные автоматически переносятся в конец указанной строки,
  к ней доба\-вляется слово "через", и формульным редактором под
  строкой перечисляются извест\-ные параметры. После нажатия "Enter"
  (которое происходит сразу же в случае $m=0$) известные параметры
  перерисовываются в конце строки. Если этих параметров не было,
  то вся строка перерисовывается виде "Найти значения $x_1,
  \ldots, x_n$.

  4) "Выразить значения неизвестных через известные параметры,
  предпочтительно в виде парамерического описания". Это - редко
  встречающаяся разновидность преды\-дущей целевой установки.
  Она возникла в аналитической геометрии, для задач на нахождение
  уравнений линий в параметрическом виде. Диалог по вводу
  установки такой же, как в предыдущем пункте. В конце диалога
  к строке целевой установки добавляются слова "Предпочтительно
  параметрическое описание". К списку целей (по сравнению с
  предыдущим пунктом) добавляется "вспомпараметр".

  5) "Решить функциональные уравнения". Целевая установка
  задач на решение дифференциальных уравнений и других
  задач, в которых используется аналогичная контекстная семантика
  (по умолчанию навешивается квантор общности по значениям
  варьируемых переменных). Здесь варьируемые переменные
  $x_1, \ldots, x_m$, от которых зависят неизвестные
  функции $y_1, \ldots , y_n$, указываются в цели "связка $x_1
  \ldots x_m$". Ос\-тальные цели - "полный", "явное", "прямойответ",
  "одз", "упростить", "неизвестные $y_1 \ldots y_n$". В процессе
  диалога прорисовывается строка "Найти", после которой фор\-мульным
  редактором должны быть набраны выражения $y_1(x_1, \ldots x_m),
  \ldots y_n(x_1, \ldots, \\ x_m)$.

  6) "Найти значения неизвестных, для которых существуют заданные
  объекты". Это - обычные задачи "с неизвестными" (см. пункт 1),
  у которых для части неизвест\-ных не требуется найти их явное
  значение, а достаточно установить существование такого значения.
  Такие "несущественные" неизвестные, как правило, в ответ задачи
  вообще не входят. Цели задачи суть "полный", "явное",
  "прямойответ", "одз", "упро\-стить", "неизвестные $x_1 \ldots
  x_n$", "параметры $y_1 \ldots y_m$". Здесь $y_1, \ldots , y_m$ -
  те из неизве\-стных $x_1, \ldots , x_n$, для которых не требуется
  искать явное значение. При вводе целевой установки используется
  следующий диалог. Сначала прорисовывается строка "Най\-ти"; затем
  формульным редактором вводятся неизвестные $x_1, \ldots , x_n$;
  далее к строке добавляются слова "для которых существуют", и
  формульным редактором вводятся несущественные неизвестные $y_1,
  \ldots , y_m$.

  7) "Вычислить значения неизвестных при заданных значениях
  параметров". Це\-ле\-вая установка используется для задач на
  описание, ответом которых служит про\-грам\-ма вычислений,
  определяющая численные значения неизвестных по за\-дан\-ным
  численным значениям параметров. Такая программа создается в два
  этапа. Сна\-ча\-ла решается обычная задача на описание,
  преобразующая исходную систему ут\-вер\-ж\-де\-ний, связывающих значения
  параметров и неизвестных, в систему утверждений, определяющих
  алгоритм вычислений. Обычно здесь применяются стандартные
  вы\-чис\-лительные формулы (метод трапеций, метод Рунге-Кутта, метод
  Ньютона и т.п.). Могут использоваться возможности решателя, связанные
  с задачами по физике, разумеется, достаточно скромные для
  текущего этапа его обучения. Полу\-чен\-ные утверждения передаются
  компилятору ГЕНОЛОГа, который создает по ним ЛОС-программу для
  вычислений. Если задача не имела параметров, то полученная про\-грам\-ма
  сразу же запускается, и выдается найденный ответ. В противном случае
  появляется интерфейс для задания параметров. В верхней части
  экрана про\-ри\-со\-вы\-ва\-ют\-ся сначала параметры, под ними -
  неизвестные. Для ввода значений пара\-мет\-ров нажимается "в", и
  далее - через запятую перечисляются равенства, фиксирующие
  численные значения параметров. Точка в конце не ставится; по
  окончании ввода нажимается Enter. Этот интерфейс можно
  использовать многократно, не производя повторного синтеза
  программы. Если задача уже была решена ранее, то можно сразу
  входить в интерфейс вычислений по ее программе, нажимая вместо
  "о" \ (кир.) клавишу "Ctr - о".

  Целевая установка состоит в рассматриваемом случае из целей
  "полный", "явное", "прямойответ", "одз", "упростить",
  "вычисление", "неизвестные $\ldots$", "параметры $\ldots$".

  На текущий момент проработано несколько типов вычислительных
  задач, что позволяет использовать решатель, например, для вычисления
  определенных ин\-тег\-ра\-лов и решения систем уравнений - обычных
  или дифференциальных. Однако, в целом работа по вычислительным задачам
  в логической системе находится на самом начальном этапе. Основной ее
  целью является такое развитие компилято\-ра ГЕНОЛОГа, которое
  позволило бы создавать достаточно эффективные вычис\-ли\-тель\-ные программы
  непосредственно с уровня теорем, как это имеет место для логических
  приемов. Данная постановка проблемы представляется совершенно
  ест\-ест\-венной, так как подлинным источником любых вычислительных
  процедур в ма\-те\-ма\-тике служат теоретические знания (в обобщенном
  смысле - теоремы). Под\-клю\-че\-ние к компиляции предварительных логических
  процедур, работающих с таки\-ми знаниями - в виде решения задач либо
  логического вывода теорем - сущест\-вен\-но увеличит возможности системы
  по бытрому созданию вычислительных блоков и объединению их в более
  сложные вычислительные агрегаты. Следует выделить здесь также интересную
  перспективу освоения смешанных логико-вычисли\-тель\-ных режимов при
  автономном исследовании решателем свойств различных мате\-ма\-ти\-чес\-ких
  моделей.

  8) "Получить явное описание значений неизвестных, не обязательно
  полное". Установка применяется в задачах на описание, для
  которых требуется полу\-чить не полный, а лишь возможно более
  полный ответ. Она состоит из целей "явное", "прямойответ",
  "одз", "упростить", "неизвестные $\ldots$". Была использована
  пока в единичных случаях, и лишь совсем немногие приемы ее
  учитывают. По сущест\-ву, представляет собой заготовку для
  последующего развития системы.

  9) "Получить полное явное описание значений неизвестных,
  используя при\-бли\-жен\-ные вычисления". Как и в предыдущем случае,
  это заготовка для последую\-ще\-го развития системы. Пока
  использована лишь для указания на режим использо\-ва\-ния приближенных
  вычислений в машинном формате "с плавающей запятой" \ при
  численном решении систем линейных уравнений. Процедура,
  выполняющая по\-след\-нее, совершенно стандартна, и представляет
  интерес лишь как пример соз\-да\-ния компилятором ГЕНОЛОГа обычной
  вычислительной программы с того же "тео\-рем\-но\-го" \ уровня, с которого
  создаются логические приемы.

  \medskip

  Подраздел "Исследовать свойства объекта" содержит следующие
  пункты:

  1) "Исследовать поведение функции". Это - задачи на качественное
  исследование графика функции одной вещественной переменной
  (область определения, промежут\-ки  монотонности,
  экстремумы, число корней на промежутках). Они имеют
  цели "полный", "явное", "прямойответ", "одз",
  "исследовать", "функция", "неизвестные $x$", где $x$ -
  исследуемая функция. Условие такой задачи сводится к
  равенству $x = \lambda_y(f(y),y- \mbox{число})$, определяющему
  функцию. Диалог ввода целевой установки прост: сначала
  прорисовывается строка "Исследовать поведение функции",
  затем вводится переменная $x$.

  2) "Исследовать поведение функции с учетом выпуклости и
  вогнутости". Этот пункт аналогичен предыдущему; при исследовании
  предпринимается дополнительно попытка найти промежутки
  выпуклости и вогнутости. К списку целей предыдущего пункта
  добавляется цель "выпуклавверх".

  3) "Исследовать функцию на монотонность". Этот пункт аналогичен
  пункту 1, но предпринимается исследование только интервалов
  монотонности. К списку целей пункта 1 добавляется цель
  "монотонно".

  4) "Исследовать функцию на четность и периодичность". Этот пункт
  аналогичен пункту 1, но предпринимается исследование только
  четности и периодичности (в случае 1 такое исследование не
  выполнялось). К списку целей пункта 1 добавляется цель
  "четнаяфункция".

  5) "Исследовать функцию на непрерывность". Этот пункт аналогичен
  пункту 1, но исследуется только непрерывность: находятся интервалы
  непрерывности, точки разрыва, и определяются типы этих точек. К
  списку целей пункта 1 добавляется цель "непрерывно".

  6) "Исследовать функцию на равномерную непрерывность". Этот
  пункт аналоги\-чен пункту 1, но исследуется только равномерная
  непрерывность (без исследования точек разрыва). К списку
  целей пункта 1 добавляются цели "непрерывно" и
  "равно\-мернонепрерывно".

  7) "Исследовать свойства линии, заданной своим уравнением".
  Здесь выполняется определение типа кривой второго порядка,
  заданной своим уравнением, и предпри\-нимается стандартная
  характеризация этой кривой (включая нахождение каноничес\-кой
  системы координта и канонического уравнения). Цели задачи суть:
  "полный", "явное", "прямойответ", "одз", "исследовать", "линия",
  "неизвестные $x$", где $x$ - исследуемая кривая. Условие задачи
  имеет вид "коорд($x,K$) = $set_{xy}(x- \mbox{число} \ \& \ y-
  \mbox{число} \ \& \ f(x,y)=0)$". В действительности элементы
  $x-\mbox{число}$,$y-\mbox{число}$ этого условия можно не
  вводить - они автоматически добавляются решателем, если
  соответствую\-щая переменная явно встречается в $f(x,y)$ под
  какой-либо арифметической операци\-ей. В посылках задачи
  должно иметься утверждение "прямкоорд($K$)". Диалог соз\-дания
  установки аналогичен пункту 1: после прорисовки строки
  "Исследовать кри\-вую" вводится неизвестная $x$, и далее к строке
  добавляются слова "заданную своим уравнением".

  8) "Исследовать свойства поверхности, заданной своим
  уравнением". Аналогично предыдущему пункту, но для поверхности
  второго порядка. Вместо цели "линия" \ бе\-рется цель
  "эллипсоид".

  9) "Определить вид множества точек, заданного условием на
  координаты точек". Целевая установка на преобразование описания
  множества точек к бескоор\-ди\-нат\-ной форме. Состоит из целей
  "полный", "явное", "прямойответ", "одз", "упростить",
  "исследовать", "точки", "неизвестные $\ldots$". Была
  использована в задачах на ка\-чест\-вен\-ную характеризацию вида
  подмножества точек комплексной плоскости, удов\-ле\-тво\-ря\-ю\-щих
  заданным соотношениям.

  10) "Исследовать функцию комплексного переменного на особые
  точки".  Целе\-вая установка на нахождение и характеризацию особых
  точек заданной функ\-ции комплексного переменного. Состоит из
  целей "полный", "явное", "прямойответ", "одз", "исследовать",
  "особыеточки", "функция", "неизвестные $\ldots$". Как данная,
  так и предыдущая установка связаны с разделами, для которых
  обучение реша\-те\-ля лишь начато. Их могут использовать те, кто
  захотел бы научиться создавать свои приемы для новых задач - по
  аналогии с теми, которые уже имеются в решателе и обеспечивают
  решение аналогичных задач его задачника.

  \medskip

  Кроме режима ввода целевой установки с помощью оглавления типов
  целей, можно набирать эту установку непосредственно текстовым
  редактором. Для входа в режи набора установки текстовым
  редактором служит клавиша "Ctr-ц". Сначала набирается тип задачи
  ("преобразовать","описать") и далее перечисляются в скобоч\-ной
  записи цели. Между целями оставляются пробелы; запятые не
  используются. Если цель имела вид набора $(f a_1 \ldots a_n)$,
  то она вводится как $f(a_1 \ldots a_n)$.

  Чтобы изменить ранее введенную целевую установку, используются
  те же клавиши "ц" и "Ctr-ц", что и для ее изначального создания.
  При этом следует помнить, что если задача, для которой
  изменяется целевая установка, не является последней в текущем
  списке задач, то предварительно ее следует выделить.

  Можно просматривать оглавление типов целевых установок независимо
  от процес\-са ввода либо изменения задачи. Для входа в это
  оглавления достаточно нажать (находясь в просмотре списка задач)
  клавишу "Ц". Обычно данная возможность применяется для
  редактирования оглавления типов целевых установок.

  После ввода целевой установки задачи выполняется ввод ее условия
  либо (в случае задачи на описание) нескольких условий. На этом
  процесс создания новой задачи завершается.

  Если нужно сохранить текстовую версию формулировки задачи,
  нажимается кла\-ви\-ша "н", и далее эта версия вводится с помощью
  текст-формульного редак\-то\-ра. Подробнее об интерфейсе
  текст-формульного редактора см. в главе 6.

 \subsection{Формульный редактор}

  Приведем краткое описание формульного редактора, с помощью
  которого происходит ввод условий и посылок задач. При входе в
  формульный редактор появляется прямо\-угольник курсора
  (коричневатого цвета). Этот курсор, в отличие от курсора
  тексто\-вого редактора, нельзя перемещать клавишами перемещений
  курсора - его положение зафиксировано и соответствует текущему
  вводимому символу формулы. Ситуация при использовании
  формульного редактора "линейная" - можно либо ввести очередной
  символ, либо отменить последний введенный символ нажатием
  "Backspace". В про\-цессе ввода формулы происходят автоматические
  масштабирование, "центровка" и перенесение на новую строку элементов
  изображения. Для завершения ввода фор\-мулы нажимается "Enter".
  Эта же клавиша служит для указания на завершение набора
  отдельных фрагментов формулы - дробей, радикалов, интегралов и
  т.п. При\-менение ее в таких случаях должно быть аккуратным, так
  как повторное нажатие приведет к преждевременному обрыву набора
  формулы (впрочем, для возвращения в редактирование терма задачи
  достаточно выделить этот терм и нажать "ф"). Чтобы отменить
  начатое редактирование формулы и выйти из формульного редактора,
  нажимается "Esc". Заметим, что если формула заведомо не набрана до
  конца либо набрана с принципиальными ошибками, то
  формульный редактор игнорирует завер\-шающие нажатия клавиши
  "Enter". В этом случае следует либо довести набор фор\-мулы до
  конца, либо вернуться (Backspace) к ошибке и исправить ее,
  либо вообще повторно набрать всю формулу целиком.

  При входе в формульный редактор автоматически осуществляется
  переход в ла\-тинский режим ввода символов с клавиатуры; при
  выходе - автоматическое возвра\-щение в "кириллицу". Несмотря
  на "латинский" режим, приводимые далее коды клавиш и сочетаний
  клавиш, используемые в формульном редакторе, часто
  даются через "кириллические" обозначения клавиш (никакого
  переключения режима клави\-атуры при их использовании не
  предполагается - они приводятся в таком виде просто для
  удобства запоминания). В тех случаях, когда возможна
  путаница, явно указы\-вается на использование кириллицы
  (в скобках ставится пометка "рус.").

  Заметим, что в любых режимах логической системы для ручного перехода в
  латинский режим клавиатуры достаточно нажать F12, а для
  перехода в режим кириллицы - F11. Однако, использовать эти
  возможности рекомендуется только при работе в текстовом
  редакторе. Следует помнить, что все управляющие клавиши и
  сочетания клавиш в логической системе ориентированы на кириллический
  режим ввода, так что переход к латинскому режиму будет означать
  просто отключение соответствующих управля\-ющих воздействий.

  Переменные в формульном редакторе набираются либо без индексов
  (малые и большие латинские буквы), либо с числовыми индексами.
  Для набора индекса после ввода переменной нажимается клавиша
  "курсор вниз", и далее вводится индекс. По окончании ввода
  индекса нажимается "Enter".

  Некоторые логические символы обозначаются в "стандартной"
  математичес\-кой записи теми же словами и словосочетаниями,
  что и во внутренней скобочной записи. Это относится в первую
  очередь к понятиям, для которых в математике не предусмотрено
  специальной символики. Разумеется, по мере обучения решателя
  доля таких понятий постоянно увеличивается. В особых случаях,
  для наиболее часто встреча\-ющихся понятий, вводятся специальные
  клавиши либо комбинации клавиш (обычно 2 последовательно
  нажимаемые клавиши). В остальных случаях для ввода логического
  символа, изображаемого словом либо словосочетанием, нажимается
  клавиша "Ctr-Enter", переводящая в режим побуквенного набора
  данного символа текстовым редактором. По окончании набора нажимается
  клавиша "Enter", возвращающая в режим формульного редактора.

  Чтобы в процессе набора формулы можно было получить справку
  относительно редко встречающихся понятий, набираемых указанным
  способом, можно пользоваться оглавлением логического языка
  системы. В нем перечислены способы построения термов в скобочной
  записи для всевозможных используемых системой понятий. Переход в
  оглавление из набора формулы обеспечивается нажатием клавиши F2.
  Если найден необходимый концевой пункт и на нем нажата клавиша
  "курсор вправо", то происходит автоматическое возвращение в
  редактирование формулы. При этом название выбранного символа уже
  прорисовано, а под ним размещен текст пояснений. После того, как
  пояснения к символу становятся не нужны, они убираются нажатием
  Ctr-F2.



  Переход на новую строку выполняется формульным редактором
  автоматически. Однако, при использовании указанного выше способа
  ввода логического символа через "Ctr-Enter" \ может оказаться,
  что для набора этого символа текстовым ре\-дак\-то\-ром на текущей
  строке места недостаточно. Тогда перед набором следует
  обеспечить переход к новой строке вручную, нажав клавишу
  "Ctr-курсор вниз".

  Подробное перечисление поддерживаемых формульным редактором
  логических символов и способов их ввода приведено в справочнике
  по логической системе. Этот справочник доступен, например,
  из главного меню (по F1); в процессе набора форму\-лы также можно
  перейти к нему, нажав клавишу F1. После нажатия возникает
  оглавление справочника. В этом оглавлении следует найти корневой
  раздел, и в нем - выбрать пункт "Формульный редактор". Для
  возвращения в набор формулы из просмотра справочника нажимается
  "End" (из оглавления справочника - однократно, из концевого
  текста справочника - "End" нажимается дважды). Здесь мы
  приводим достаточно полное перечисление возможностей
  формульного редактора, опуская то\-лько те, которые
  используются крайне редко.

  1. Общелогические символы. Отрицание $\neg A$ утверждения $A$
  вводится путем по\-следо\-вательного нажатия клавиш n,o (лат.) и
  последующего набора "$A$". Символы "и","или" вводятся,
  соответственно, как \& и Ctr-v. Символ "если-то", встречающийся
  только под квантором общности, изображается стрелкой и вводится
  нажатием кла\-виши "курсор вправо". Символ "эквивалентно"
  обозначается двусторонней стрелкой и вводится нажатием клавиши
  "курсор влево". Для ввода кванторной записи \\ "$\forall x_1 \ldots
  x_k(A_1 \& \ldots \& A_n \rightarrow A_0)$" сначала дважды
  нажимается большая латинская бук\-ва A и появляется знак квантора
  общности. Затем перечисляются (без каких-либо пробелов)
  пере\-менные $x_1, \ldots, x_k$ кванторной приставки; нажимается "Enter"
  (здесь появляется от\-крывающая скобка), после чего вводится
  конъюнкция $A_1 \& \ldots \& A_n$. Далее нажи\-мается "курсор вправо"
  (появляется стрелка для "если-то"), вводится утвержде\-ние $A_0$,
  и в конце ставится закрывающая скобка. Для ввода кванторной
  записи "$\exists x_1 \ldots x_k(A)$" сначала дважды нажимается
  большая латинская буква E и появляется знак квантора
  существования. Затем набирается кванторная приставка $x_1 \ldots
  x_k$; нажимается "Enter" (появляется открывающая скобка);
  вводится утвержде\-ние $A$, и ставится закрывающая скобка.
  Возможно использование квантора "сущест\-вует и единственно".
  После знака квантора существования здесь идет
  вос\-клицатель\-ный знак. Для появления такого обозначения следует
  вместо двукратного нажатия "E" нажать последовательно клавиши
  "E" и "T" (лат.). Равенство вводится обычным образом. Логические
  константы "истина" и "ложь" прорисовываются как "truth" и
  "false". Они вводятся, соответственно, двукратным нажатием
  клавиши t либо f. Ус\-ловное выражение ($A$ при $P$, иначе $B$),
  принимающее значение $A$, если истинно условие $P$, и значение
  $B$ в противном случае, набирается следующим образом. Ста\-вится
  открывающая скобка; вводится выражение $A$; нажимается Ctr-e
  (е-кир., от слова "если"); вводится $P$; нажимается Ctr-и
  (и - от слова "иначе"); вводится $B$, и ставится закрывающая
  скобка.

  2. Арифметические операции и отношения. Числовые константы
  набираются обы\-чным образом; в случае десятичных дробей
  используется точка. Операции "плюс" \ (произвольное
  число слагаемых, большее или равное 2) и "минус"
  вводятся клави\-шами "$+$" и "$-$". Умножение вводится
  нажатием клавиши "звездочка", причем в случае однократного
  нажатия этой клавиши (перед очередным сомножителем) фак\-тической
  прорисовки чего-либо на экране не происходит. Если нужно
  убедиться в том, что нажатие клави\-ши и ввод операции умножения
  состоялись, то клавиша "звездочка" должна быть нажата еще дважды
  - в этом случае для умножения будет прорисована точка.
  Следует особенно аккуратно вводить произведения, часть
  сомно\-жителей которых заключена в скобки. Если пропустить
  нажатие клавиши "звездоч\-ка" после $A$, то произведение
  $A(B+C)$ будет воспринято как значение функции $A$ в точке
  $B+C$.
  Дроб\-ное
  выражение $\frac{A}{B}$ вводится следующим образом. Сначала
  нажимается клавиша "дво\-еточие" \ - после этого прорисовывается
  красным цветом горизонтальная черта дро\-би, над которой
  размещается курсор. Затем вводится чис\-литель $A$. В процессе
  ввода горизонтальная черта дроби удлиняется автоматически;
  если вводится многоэтажное выражение, то для обеспечения необходимого
  места происходит автоматическая кор\-рекция размеров и размещения
  всей ранее введенной части формулы. После ввода числителя
  нажимается клавиша "Enter" \ - тогда курсор перемещается в начало
  зна\-мена\-теля, и предпринимается ввод знаменателя $B$. Нако\-нец,
  после ввода знаменателя нажимается клавиша "Enter", завершающая
  ввод дроби. При этом горизонтальная черта дроби из красной
  становится черной, и происходит автоматическая центровка
  числителя и знаменателя для получения симметричной записи.
  Степенное выражение $A^B$ вводится следующим образом. Сначала
  набирается выражение $A$ (если оно само является результатом
  применения более чем одномест\-ной операции, то обязательно
  заключается в скобки). Затем нажимается клавиша "курсор вверх" \ -
  курсор поднима\-ется вверх для прорисовки показателя степени.
  После ввода выражения $B$ (его не обязательно заключать в
  скобки) нажимается "Enter" \ - курсор опускается обратно, и ввод
  степени считается законченным.

  Отношения "меньше","больше" вводятся с помощью клавиш $<$,\ $>$;
  отношения "мень\-шеилиравно","большеилиравно" \ - с помощью клавиш
  "левая квадратная скоб\-ка"," правая квадратная скобка". Для ввода
  утверждения "$A$ - число" сначала наби\-рается выражение $A$,
  затем нажимаются клавиши "/" и "ч".

  Конечная сумма $$\sum_{i=a}^b f(i)$$ вводится следующим образом.
  Сначала нажимается "Ctr-s" \ - появляется большая буква "сигма"
  малинового цвета, причем курсор находится под этой буквой.
  Здесь набирается $i=a$ и нажимается "Enter". Тогда курсор
  переводится в положение над буквой "сигма", где набирается
  выражение $b$ и снова нажимается "Enter". После этого курсор
  оказывается справа от буквы "сигма", где набирается выражение
  $f(i)$. По окончании набора нажимается "Enter", перекрашивающее
  букву "сигма" в черный цвет - набор суммы на этом закончен.
  Если требуется задать множество допустимых значений индекса
  суммирования косвенным образом, то используется запись
  $$\sum_{i,P(i)} f(i).$$ Ввод \ ее происходит аналогично
  предыдущему, но в положении курсора над "сигмой" \\ сразу
  нажимается "Enter".

  Конечные произведения $$ \prod_{i=a}^b f(i), \ \ \ \ \prod_{i,P(i)}
  f(i)$$ вводятся совершенно так же, как конечные суммы, но вместо
  клавиши "Ctr-s" нажи\-мается клавиша "Ctr-p" (здесь p -
  латинское).

  3. Элементарные функции. Для ввода квадратного корня $\sqrt{A}$
  последовательно нажимаются клавиши "s","r" (появляется радикал
  малинового цвета), вводится выра\-жение $A$ и нажимается "Enter" \ -
  радикал перекрашивается в черный цвет. Если нужно ввести корень
  $\sqrt[n]{A}$, где $n$ - целое от 3 до 9, то последовательно
  нажимаются клавиши "r","t" (появляется малиновый радикал, над
  которым расположен курсор), "$n$" (кур\-сор переводится под
  радикал), и далее - как для квадратного корня. Для ввода
  максимума либо минимума выражений $A_1, \ldots, A_n$  последовательно
  нажима\-ются, соответственно, латинские клавиши "m","a" либо "m","i",
  и далее в скобках перечисляются указанные выражения. Для ввода модуля
  выражения $A$ сначала на\-жимается "Ctr-m", затем вводится $A$,
  затем снова нажимается "Ctr-m".

  Выражение $\log_a b$ набирается следующим образом. Сначала
  последовательно на\-жимаются клавиши "l","o" (лат.). Затем
  набирается основание логарифма $a$. Далее нажимается "Enter" \ -
  курсор переводится в позицию справа от логарифма, и наби\-рается
  выражение под логарифмом $b$. Если оно представляет
  собой мно\-гоместную операцию, то его обязательно следует
  заключить в скобки - иначе под логарифмом окажется лишь первый
  операнд этой операции. Это же замечание о скобках относится и ко
  всем приводимым ниже элементарным функциям. В случае натурального
  лога\-рифма достаточно нажать клавиши "l","n" и ввести выражение
  под логарифмом.

  Экспонента $\exp(A)$ вводится последовательным нажатием клавиш
  "e","x" (лат.).
  Синус $\sin(A)$ вводится последовательным нажатием клавиш
  "s","i". Заметим, что степень синуса вводится не совсем
  стандартным образом: необходимо сначала набрать все выражение
  $\sin(A)$ (для большей наглядности, хотя и необязательно,
  заключенное в скобки), и лишь затем нажать "курсор вверх",
  переходя к вводу показателя степени. Помещать показатель степени
  сразу же после $\sin$ нельзя. Это же замечание относится и к
  другим элементарным функциям.

  Оставшиеся элементарные функции вводятся однотипным с синусом
  образом - последовательным нажатием двух либо трех латинских
  клавиш (в ряде случаев, как указано ниже, требуется вводить
  не малую, а большую букву). Мы просто перечислим для них эти
  пары либо тройки клавиш:

  косинус - "c","o"; тангенс - "t","g"; котангенс - "c","t";
  секанс - "s","e"; косеканс - "c","s"; арксинус - "a","s";
  арккосинус - "a","c","o"; арктангенс - "a","t"; арккотан\-генс -
  "a","c","t"; сигнум (минус единица для отрицательных, не
  определен в нуле, единица для положительных) - "s","g";
  сигнум (0 для отрицательных, 1 для неотри\-цательных) - "S","g";
  гиперболический синус - "s","h"; гиперболический косинус -
  "c","h"; гиперболический тангенс - "t","h"; гиперболический
  котангенс - "c","T".

  4. Символьные константы. Константа "е" \ вводится двойным нажатием
  латинской клавиши "e" \ (важно выполнять эту операцию аккуратно, чтобы не
  получить вместо константы "$e$" \ переменную "$e$"; по внешнему
  виду они несколько отличаются друг от друга). Константа "пи"
  вводится двойным нажатием латинской клавиши "p". Кон\-станта
  "плюс-бесконечность" водится двойным нажатием клавиши "i".
  Для получения минус-бесконечности перед плюс-бесконечностью
  помещается знак "минус" (хотя во внутреннем представлении
  минус-бесконечность представлена отдельным логическим символом).
  Мнимая единица вводится двукратным нажатием клавиши "c".

  5. Операции и отношения для целых чисел. Утверждения "$A$ -
  целое", "$A$ - натуральное", "$A$ - рациональное", "$A$ -
  четное" вводятся следующим образом: снача\-ла набирается выражение
  $A$, затем нажимается "/" \ , и далее, соответственно, клави\-ша
  "ц" (целое) либо "н" (натуральное), либо "q" (рациональное),
  либо "e" (четное;лат.). Выражения "числитель($A$)" и
  "знаменатель($A$)" вводятся последовательным нажа\-ти\-ем клавиш
  "ч","и" либо, соответственно, "з","н" (далее набирается $A$,
  при необходи\-мости - в скобках).

  Утверждение "$A | B$" ($A$ делит $B$) вводится в следующей
  последовательности: сна\-чала набирается $A$, затем нажимается
  "Ctr-д", затем $B$. Выражения "нод($A,B$)" и "нок($A,B$)"
  (наибольший общий делитель и наименьшее общее кратное)
  вводятся, соответственно, последовательным нажатием клавиш
  "н","д" либо "н","к" (кир.) и дальнейшим набором (в скобках
  и через запятую выражений $A$,$B$. Аналогично вво\-дятся
  утверждения "простое($A$)" \ (двойное нажатие "п") \ и
  "взаимнопросты($A,B$)" \ (клавиши "в","п").

  Целая часть $[A]$ выражения $A$ набирается следующим образом:
  сначала нажимает\-ся клавиша "Ctr-e" (e - лат.), что приводит к
  появлению левой квадратной скобки. Затем вводится $A$ и снова
  нажимается "Ctr-e" - для правой квадратной скобки.

  Для вычета $A (mod B)$ сначала набирается выражение $A$, затем
  открывающая скобка, затем нажимаются клавиши "м","д" (кир.),
  затем набирается $B$, и в конце - закрывающая скобка.

  Число сочетаний из $n$ по $k$ вводится следующим образом.
Сначала нажимается "Ctr-c", что приводит к появлению большой буквы
"С" малинового цвета; курсор находится справа в нижней части этой
буквы. Затем набирается $n$ и нажимается "Enter" \ - курсор
перемещается в верхнюю часть справа от буквы "С". Далее набирается
$k$ и снова нажимается "Enter" \ - буква перекрашивается в черный
цвет и ввод числа сочетаний завершается. При необходимости в
процессе ввода вертикальные размеры буквы "C" автоматически
увеличиваются.

 Факториал $n!$ вводится последовательным набором $n$ (при
необходимости - в скобках) и нажатием "Ctr-f".

 6. Многочлены. Многочлен $P$ над полем вещественных чисел (см.
пояснение про многочлены из раздела "Логический язык решателя")
вводится следующим образом. Сначала дважды нажимается клавиша "m"
(лат.) - появляется греческая буква "мю", справа от которой и чуть
ниже располагается курсор. Далее вводятся все переменные, от
которых формально зависит многочлен, и нажимается "Enter" \ -
курсор поднима\-ется вверх до уровня буквы "мю". После этого
набирается сумма одночленов, опре\-деля\-ющая значения многочлена,
и в конце ставится закрывающая скобка.

 7. Алгебра множеств. Утверждение "$A$ - множество" вводится
последовательным набором $A$, нажатием "/" и "s". Символ
$\emptyset$ пустого множества вводится последова\-тельным нажатием
клавиш "e","m" (лат.). Символ $\cup$ объединения множеств вводится
последовательным нажатием клавиш "пробел", "u", "s"; символ $\cap$
пересечения мно\-жеств - нажатием "пробел", "i", "s". Для ввода
символа $\setminus$ разности множеств нажи\-мается клавиша
"$\setminus$". Символ $\in$ принадлежности множеству вводится
последова\-тельным нажатием клавиш "пробел", "b", "e" (лат.);
символ $\subset$ включения множеств - "пробел", "s", "u". Символ
$\times$ прямого произведения множеств вводится нажатием клавиш
"пробел", "p", "s" (лат.).


Конечное множество ${a_1, \ldots, a_n}$, заданное перечислением
своих элементов, вводит\-ся путем последовательного набора этих
элементов (через запятую) внутри фигур\-ных скобок.

  Конечное объединение $$\bigcup_{i=a}^b f(i)$$ вводится следующим образом.
  Сначала нажимается "Ctr-u" \ - появляется большой знак "объединение"
  малинового цвета, причем курсор находится под ним.
  Здесь наби\-рается $i=a$ и нажимается "Enter". Тогда курсор
  переводится в положение над "объединением", где набирается
  выражение $b$ и снова нажимается "Enter". После этого курсор
  оказывается справа от "объединения", где набирается выражение
  $f(i)$. По окончании набора нажимается "Enter", перекрашивающее
  знак "объединение" в черный цвет - его набор закончен.
  Если требуется задать множество допустимых значений индекса
  объединения косвенным образом, то используется запись
  $$\bigcup_{i,P(i)} f(i).$$ Ввод \ ее происходит аналогично
  предыдущему, но в положении курсора над "объ\-единением" сразу
  нажимается "Enter".

  Конечные пересечения $$ \bigcap_{i=a}^b f(i), \ \ \ \ \bigcap_{i,P(i)}
  f(i)$$ вводятся совершенно так же, как конечные объединения, но вместо
  клавиши "Ctr-u" нажи\-мается клавиша "Ctr-x" (здесь x -
  латинское).

  Класс $set_{x}P(x)$ всех объектов (если $x$ - список переменных, то
  наборов) $x$, удовле\-творяющих условию $P(x)$, вводится следующим
 образом. Сначала дважды нажима\-ется клавиша "S" \ - появляется
"$set$". Затем вводится переменная либо список пере\-мен\-ных $x$;
нажимается "Enter" и набирается условие $P(x)$.

Мощность $card(A)$ множества A вводится нажатием клавиш "c","a"
(лат.) и на\-бором выражения $A$. Заголовки утверждений
"конечное($A$)", "непересек($A,B$)", "се\-мействомножеств($A$)",
"разбиение($A,B$)" вводятся, соответственно, последователь\-ны\-ми
нажатиями пар клавиш (везде кириллица): "к","о" ; "н","п";
"С","м"; "р","а". Заголовок выражения "подмножества($A$)" вводится
последовательным нажатием кла\-виш "П","м".

Мощности счетного множества и континуума вводятся, соответственно,
нажати\-ями клавиш "с","ч" и "к","м". Символ пустого слова
вводится нажатием клави\-ши "Ctr-щ".

Утверждения "убывмножества($A$)", "возрастмножества($A$)" о том,
что после\-дова\-тельность множеств $A$ является убывающей либо
возрастающей по включению, вво\-дятся последовательными нажатиями
клавиш "У","М" и "В","М" (кир.).

8. Числовые множества. Для ввода промежутка числовой оси с концами
$A,B$ (они могут являться символами бесконечности) сначала
нажимается "Ctr-(" (если конец $A$ не относится к промежутку)либо
"Ctr-[" (если этот конец относится к промежутку). Затем набираются
отделенные запятой выражения $A,B$. Если конец $B$ не относится к
промежутку, то далее нажимается "Ctr-)", иначе - "Ctr-]".

Все множество веществен\-ных чисел вводится двойным нажатием
клавиши "R". Множество рациональных чисел вводится двойным
нажатием клавиши "Q"; мно\-жес\-тво целых чисел - двойным нажатием
"Z"; множество натуральных чисел - двойным нажатием "N"; множество
целых неотрицательных чисел - последовательным нажа\-тием "Ц","Н"
(кир.).

Конечный отрезок $\{A, \ldots, B\}$ натурального ряда,
начинающийся с $A$ и кончаю\-щийся $B$, набирается следующим
образом: левая фигурная скобка, выражение $A$, запятая,
"Ctr-точка", запятая, выражение $B$, правая фигурная скобка

Точная нижняя грань $\inf A$ множества $A$ вводится с помощью
нажатия клавиш "I","n"; точная верхняя грань $\sup A$ - с помощью
"S","u".

Утверждения "нижняягрань($x,A$)" \ ($x$ - нестрогая нижняя грань
числового множе\-ства $A$), "Нижняягрань($x,A$)" \ (строгая нижняя
грань), "верхняягрань($x,A$)" \ (нестро\-гая верхняя грань),
"Верхняягрань($x,A$)" \ (строгая верхняя грань), "наибольший($x,\\
A$)" \ ($x$ - наибольший элемент числового множества $A$),
"наименьший($x,A$)" вводятся, со\-ответственно, с помощью
последовательных нажатий пар клавиш (везде кирилли\-ца): "н","г";\
"Н","г";\ "в","г";\ "В","г";\ "Н","О";\ "Н","Е". Утверждения
"огрснизу\\ ($A$)", "огрсверху($A$)" об ограниченности числового
множества $A$ снизу либо сверху вводятся с помощью нажатий пар
клавиш "г","н" и "г","в".

Выражения "внутренность($A$)", "граница($A$)", "замыкание($A$)"
вводятся, соответ\-ственно, при помощи нажатий пар клавиш "в","н";
\ "Г","р";\ "З","З" (везде кир.).

9. Простейшие обозначения, связанные с функциями. Утверждение "$A$
- функ\-ция" вводится последовательным набором $A$, нажатием "/" и
"ф". Область определе\-ния $Dom(f)$ функции $f$ вводится с помощью
последовательного нажатия клавиш "d","o" (лат.). Множество
значений $Val(f)$ функции $f$ вводится с помощью
последо\-вательного нажатия клавиш "v","a". Для ввода значения
$f(a)$ функции $f$ в точке $a$ сначала набирается обозначение
функции $f$ (если оно не односимвольное, то заключа\-ется в
скобки), затем левая скобка, $a$ и правая скобка. Выражения
"образ($f, A$)" \ (образ множества $A$), "прообраз($f, A$)" \
(прообраз множества $A$) и "слой($f, a$)" \ (пол\-ный прообраз
элемен\-та $a$) набираются при помощи последовательных нажатий пар
клавиш "о","м"; "п","м"; "с","л" (везде - кириллица). Утверждение
"взаимноодно\-значно($f$)" \ ($f$ инъек\-тивно) вводится при
помощи последовательного нажатия клавиш "в","о" \ (кир.).
Множество корней числовой функции $f$ на множестве $A$
обозначается $roots(f,A)$ и вводится при помощи последовательного
нажатия клавиш "r","o" (лат.).

Функция, значения которой определяются выражением $t$, а условие
на принадлеж\-ность аргумента $x$ (этот аргумент может быть как
единственной переменной, так и набором переменных) области
определения есть $P(x)$, обозначается $\lambda_{x}(t,P(x))$. Для
ввода ее сначала дважды нажимается клавиша "L" \ - прорисовывается
"лямбда", причем курсор располагается справа от нее и чуть ниже.
Затем вводится $x$ (перемен\-ная либо группа переменных, без
запятых), нажимается "Enter" (курсор перемещает\-ся вверх на
уровень "лямбды") и набираются в скобках $t,P(x)$.

Утверждение "Отображение($f,A,B$)" ($f$ есть отображение $A$ в
$B$) вводится при помощи двукратного нажатия клавиши "о" (кир.).

Функция "конст($A,b$)", определенная на множестве $A$ и
принимающая во всех его точках значение $b$, вводится при помощи
двукратного нажатия "к" (кир.). Функция "$a \rightarrow b$",
определенная на одноэлементном множестве, состоящем из элемента
$a$, и принимающая на этом элементе значение $b$, вводится
следующим образом: сначала набирается $a$, затем "Ctr-курсор
вправо", затем $b$. Тождественная функция "тожд\-функ($A$)" \ с
областью определения $A$ вводится при помощи нажатия клавиш
"т","ф".

Посредством "таблица($A_1, \ldots, A_n$)" обозначается функция,
график которой есть объединение графиков функций $A_1, \ldots,
A_n$, принимающих на пересечениях своих областей определения
одинаковые значения. Символ "таблица" вводится последова\-тельным
нажатием клавиш "т","а" (кир.).

Выражения "сужение($f,A$)" \ (сужение функции $f$ на множество
$A$) и "доопределе\-ние($f,A,b$)" \ (доопределение функции $f$ на
тех точках множества $A$, где она еще не определена, значением
$b$) вводятся при помощи последовательных нажатий клавиш "с","у" и
"д","о" (кир.). Выражение "обрфункция($f$)" (функция, обратная к
взаимно-однозначной функции $f$) вводится при помощи
последовательного нажатия "о","ф".

Выражение "числопеременных($f$)" вводится при помощи клавиш
"ч","п"; выра\-жение "подфункиця($f,A,B$)" (функция, полученная из
$f$ подстановкой элемен\-тов набора $B$ вместо переменных, номера
которых образуют набор $A$; нумерация начина\-ется с 1) вводится
при помощи клавиш "п","Ф". Утверждение "существперем($i,f$)" \\
($i$-я переменная функции $f$ является существенной) вводится при
помощи клавиш "С","У".

10. Упорядоченные наборы. Всюду далее понимаем под "набором"
только упоря\-доченный набор (вектор); в справочнике по решателю
используется такое же согла\-ше\-ние. Фактически "набор" \ здесь -
это отображение начального отрезка натурально\-го ряда на
некоторое множество. Набор элементов $a_1, \ldots, a_n$ вводится
простым пере\-чис\-лением через запятую этих элементов. Этот набор
при вводе можно заключать в скобки, а можно и не заключать.
Однако, для ввода одноэлементного набора ($n=1$) необходимо
исполь\-зовать другой способ - сначала нажать "Ctr-н" (кир.) и
затем ввести $a_1$; если $a_1$ неоднобуквенное, то оно должно быть
заключено в скобки.

 При вводе выражений
"префикс($A,B$)" (добавление элемента $A$ в начале набора $B$) и
"суффикс($A,B$)" (доба\-вление элемента $A$ в конце набора $B$)
логические символы "префикс","суффикс" наби\-раются текстовым
редактором (вход в него - через "Ctr-Enter"). Исключение здесь
составляет случай выражений "перечень(префикс($A \ B$))", которые
прорисовываются в виде $\{A; B\}$ и набираются с помощью клавиши
";". Инфиксная операция конкате\-нация (последовательное
соединение наборов) также вводится при помощи фигурных скобок и
клавиши ";". Соответственно, запись $\{A,B,\\ C;D\}$ обозначает
конечное множество, перечисля\-емое конкатенацией наборов $(A,B,\\
C)$ и $D$.

 Всюду далее предполагаем, что нумерация элементов набора
начинается с 1. Выражения "поднабор($A,i,j$)" (поднабор набора
$A$, образованный элементами на\-чиная с $i$-го и кончая $j$ - м)
и "Вставка($A,i,b$)" \ (результат вставки в набор $A$ пе\-ред
$i$-м элементом элемента $b$) вводятся при помощи последовательных
нажатий клавиш "п","н" и "В", "с" (кир.). Выражение
"выборка($A,B$)" обозначает результат исключения всех разрядов
набора $A$, номера которых не принадлежат множеству $B$.
Логический символ "выборка" вводится текстовым редактором.
Выражение "наложе\-ние($A,B,N$)" обозначает такой результат
перемешивания элементов наборов $A$,$B$ (с сохранением
относительного порядка элементов каждого из них), в котором
элементы набора $A$ расположены на местах, номера которых образуют
набор $N$. Логический символ "наложение" вводится текстовым
редактором.

Выражение "наборномеров($i,j$)" (набор, образованный целыми
числами начиная с $i$ и кончая $j$) вводится при помощи
последовательного нажатия клавиш "н","о" (кир.).

Выражения "упорядвозр($A,f$)"\ (результат упорядочения элементов
набора по воз\-растанию значений числовой функции $f$ на этих
элементах) и "упорядубыв($A,f$)" \ вво\-дятся при помощи
последовательных нажатий клавиш "у","в"; \ "у","ы".

11. Математический анализ.  Предел $\lim_{x\to a} f(x)$ вводится
следующим образом. Сначала последовательно нажимаются клавиши "l",
"i" \ - рисуется знак предела, а курсор оказывается справа от него
и чуть ниже. Затем вводится переменная $x$, нажимается клавиша
"курсор вправо" и набирается выражение $a$ (в случае левого либо
правого одностороннего предела набирается $a-0$ либо $a+0$; если
нужно рассмотреть общую ситуацию, не уточняя тип предела, то
вместо $a$ набирается $a \backslash b$, где $b$ - указатель типа
предела: 0 - двусторонний, 1 - левый, 2 - правый). Далее
нажимается "Enter" \ - курсор возвращается на уровень "предела", и
вводится выра\-жение $f(x)$. Если это выражение представляет собой
сумму, произведение и т.п., то его обязательно следует заключить в
скобки - иначе под знаком предела окажется лишь первый операнд.

Предел последовательности обозначается путем заключения выражения
$f(x)$ в фигурные скобки: $\lim_{n \to \infty}\{f(n)\}$.

Верхний предел $\overline{\lim}$ и нижний предел
$\underline{\lim}$ вводятся, соответственно, при помощи
последовательного нажатия клавиш "L","i" и "l","I".

Используемые в асимтотических оценках обозначения $O(x)$,$o(x)$
вводятся, соот\-ветственно, при помощи двукратного нажатия клавиши
"O" либо "o" (лат.).

Производная $\frac{df(x)}{dx}$ вводится как обычная дробь: сначала
нажимается клавиша ":" \ ,затем "d", "звездочка", выражение
$f(x)$, "Enter", "d", "звездочка", "x" и "Enter". Если требуется
задать значение производной в точке $a$, то вместо $dx$ в
знаменателе помещается $d(x=a)$ (после $d$ - обязательно
нажимается звездочка). Заметим, что если $a$ - снова переменная,
то автоматически произойдет изменение обозначений, так что при
повторной прорисовке вместо $\frac{df(x)}{d(x=a)}$ будет
изображено $\frac{df(a)}{da}$. При рассмотре\-нии производных
высших порядков и частных производных используются обычные записи
типа $\frac{d^3f(x)}{dx^3}$,$\frac{d^4f(x,y,z)}{dx^2dydz}$. Они
вводятся аналогично первой производной; символ дифференцирования
$d$ рассматривается при этом как обычный множитель.

Утверждения "Производная($f,g$)" \ (значения функции $g$ в области
ее определения суть значения производной функции $f$) и
"Частнпроизв($f,i,g$)" \ (значения функции $g$ в области ее
определения суть значения частной производной функции $f$ по
$i$-му аргументу) вводятся путем последовательных нажатий клавиш
"П","р" и "Ч","п". Выражение "дифференциал($f,n,x,a$)" \ (значение
полного дифференциала порядка $n$ функции $f$ в точке $x$ при
наборе $a$ значений приращений переменных) вводится путем
последовательного нажатия кла\-виш "Д","и".

Неопределенный интеграл $$\int f(x)dx$$ вводится следующим
образом. Сначала нажимается "Ctr-j" (прорисовывается мали\-новым
цветом знак интеграла), затем вводится подынтегральное выражение
$f(x)$, нажимается "звездочка", "d", вводится переменная
интегрирования $x$ и нажимается "Enter" \ - знак интеграла из
малинового становится черным.

Определенный интеграл $$\int\limits_a^b f(x)dx$$ вводится при
помощи "Ctr-i". После этого курсор оказывается снизу от знака
инте\-грала. Здесь набирается выражение $a$, затем нажимается
"Enter" \ - курсор перемеща\-ется вверх от интеграла; набирается
выражение $b$ и снова нажимается "Enter". Далее - все как при
наборе неопределенного интеграла.

Двойной интеграл $$\int\!\!\int_{P} f(x,y)dxdy$$ вводится при
помощи нажатия клавиши "Ctr-2". Курсор оказывается
непосредствен\-но под знаком двойного интеграла, где набирается
выражение для области интегри\-рования $P$. Обычно здесь просто
помещается вспомогательная переменная, а в посыл\-ках указывается
равенство $P=M$, явно задающее область - иначе изображение
интеграла становится чрезмерно громоздким. После ввода $P$
нажимается "En\-ter" \ - курсор перемещается вправо от знака
интеграла. Здесь набирается подынтегральное выражение $f(x,y)$,
"умноженное" на $dxdy$. В конце нажимается "Enter",
перекраши\-вающее знак интеграла в черный цвет. Аналогичным
образом вводится тройной интеграл - здесь используется клавиша
"Ctr-3".

Ряд с общим членом $f(i)$ вводится как последовательность
частичных сумм - $\lambda_n(\sum_{i=1}^n f(i),
n-\mbox{натуральное})$. Утверждение "сходится($f$)" о сходимости
последова\-тельности (в частности, ряда; $f$ - функция
натурального аргумента, обычно вводимая через $\lambda_n$)
вводится при помощи последовательного нажатия клавиш "с","д"
(кир.). Сумма ряда с общим членом $f(i)$ обозначается обычным
образом - $$\sum_{i=m}^\infty f(i).$$  Правила набора здесь те же,
что и для конечных сумм.

Утверждения "переменазнака($f,a$)" (функция $f$ меняет знак в
окрестности точки $a$), "убываетвточке($f,a$)",
"возрастаетвточке($f,a$)", "огрвточке($f,a$)" \ (функция $f$
ог\-раничена в окрестности точки $a$) вводятся, соответственно,
при помощи последова\-тельных нажатий клавиш "п","з"; \ "У","т"; \
"В","т"; \ "О","Т" (кир.).

Запись $x \to a \backslash b$, уже встречавшаяся в связи с
пределами, может использоваться как независимая посылка, для
указания на то, что задача должна решаться в сколь угодно малой
окрестности точки $a$ \ ($\backslash b$ указывает тип окрестности
и может отсутство\-вать либо быть замененным на $+0$,$-0$).

Утверждение "ограничено($A$)" используется в контексте некоторого
списка посы\-лок и означает, что в области истинности этих посылок
выражение $A$ ограничено по модулю некоторой константой.
Логический символ "ограничено" вводится последова\-тельным
нажатием клавиш "О","Г". Обычно это утверждение не встречается в
фор\-мулировке задачи, а вводится при необходимости решателем в
процессе решения.

Утверждения $Max(f,A,B,c)$ (функция $f$ достигает на множестве $A$
максимума $c$ в точках подмножества $B$), $Min(f,A,B,c)$ вводятся
при помощи последовательных нажатий клавиш "M","a"; \ "M","i" \
(лат.). Утверждение $Extr(f,a,b,c)$ (функция $f$ имеет в точке $a$
экстремум; $b$ - значение ее в этой точке, а $c$ - тип экстремума)
вводится нажатием клавиш "E","x" (лат.).

Выражения "стационарныеточки($f$)" (точки из внутренности области
определения функции, в которых все частные производные равны нулю)
и "особыеточки($f$)" \ (точки из внутренности области определения,
в которых хотя бы одна частная произ\-водная не определена)
вводятся при помощи клавиш "с","ц"; "о","ч".

Утверждения "Выпуклавверх($f,A$)" \ (функция $f$ выпукла вверх на
множестве $A$) и "Выпуклавниз($f,A$)" \ вводятся при помощи
нажатий клавиш "в","в"; "в","з" (кир.). Утверждения
"убывает($f,A$)" (функция $f$ строго убывает на множестве $A$),
"возрас\-тает($f,A$)", "неубывает($f,A$)", "невозрастает($f,A$)"
вводятся при помощи последова\-тельных нажатий клавиш "У","ы"; \
"В","о";\ "Н","у"; \ "Н","в".

Утверждения "четнаяфункция($f$)", "нечетнаяфункция($f$)",
"периодична($f,T$)" \ (функция $f$ периодична на числовой оси и
имеет периодом, не обязательно наимень\-шим, число $T$) вводятся
при помощи нажатий клавиш "ч","ф"; \ "н","ф"; \ "п","Е" \ (кир.).

Утверждения "непрерывно($f,A$)"; \ "равномернонепрерывно($f,A$)" \
вводятся при помощи "н","н"; \ "р","н" (кир.). Утверждения
"устранимыйразрыв($f,a$)" \ (функция $f$ имеет в точке $a$
устранимый разрыв), "разрывпервогорода($f,a$)", \
"разрыввторогоро\-да($f,a$)" \ вводятся с помощью текстового
редактора.

Операции "умножфунк", "плюсфунк", "минусфунк" умножения, сложения
и из\-менения знака числовых функций с общей областью определения
вводятся формуль\-ным редактором так же, как обычные операции
умножения, сложения и изменения знака чисел. Формульный редактор
пытается усмотреть из контекста, что значениями операндов служат
функции, и автоматически заменяет операции над числами на
соответствующие операции над функциями. В тех случаях, когда
усмотрение функци\-онального типа операндов из контекста
сомнительно, следует контролировать резуль\-тат ввода, переходя к
просмотру набранного терма в текстовом редакторе и осущест\-вляя
указанные коррекции вручную.

12. Планиметрия. В планиметрии фигуры и их числовые характеристики
обозна\-чаются только через соответствующие "опорные" точки
("прямая($AB$)", "треуголь\-ник($ABC$)" и т.п.); использование
вспомогательных переменных для обозначения са\-мих фигур ("прямая
$A$"; "треугольник $B$" и т.п.) в приемах решателя не
предусмотре\-но. В стереометрии, наоборот, тела обозначаются не с
помощью их "опорных" точек, а с помощью вспомогательных переменных
("куб($A$)", "пирамида($B$)" и т.п.).

Утверждение "$A$-точка" вводится нажатием, после набора $A$,
клавиш "$\backslash$" \ и "p" \ (лат.). Обычно такие утверждения
вообще не вводятся вручную, а создаются решате\-лем самостоятельно
в начале решения задачи.

Выражения "прямая($AB$)", "отрезок($AB$)", "интервал($AB$)",
"луч($AB$)", "обрат\-ныйлуч($AB$)" \ (луч с началом в точке $A$,
противоположный лучу $AB$) вводятся после\-довательными нажатиями
пар клавиш "п","р"; \ "о","т"; \ "и","н"; \ "л","у"; \ "о","л" \
(везде -кириллица). Заметим, что между $A$ и $B$ здесь не ставится
запятая, в отличие от обычных многоместных операций и отношений
формульного редактора. Такие исключительные случаи перечисления
операндов без запятой используются только в планиметрии, причем
лишь для некоторых (явно указываемых далее) логических символов. В
качестве $A,B$ могут быть использованы либо буквенные переменные,
либо переменные с индексом. Если имеется хотя бы одна переменная с
индексом, то между операндами необходим разделитель - клавиша
"звездочка" (при ее нажатии на экране ничего не меняется, но
становится возможен ввод следующего операнда).

Расстояние $l(AB)$ между точками $A,B$ вводится при помощи
двукратного нажа\-тия клавиши "l". Величина $\angle ABC$ угла
$ABC$ вводится при помощи нажатия клавиш "у","г". В обоих случаях
запятые между операндами не ставятся. Если нужно обоз\-начить не
величину угла, а множество точек плоскости, лежащих внутри него
(вклю\-чая граничные точки), то используется обозначение
"Угол($ABC$)", вводимое клави\-шами "У","г".

Выражения "расстдопрямой($A,B$)" (расстояние от точки $A$ до
прямой $B$), "расст\-между($A,B$)" (расстояние между двумя
множествами точек $A,B$ вводятся при помо\-щи клавиш "Р","П"; \
"Р","Ы". Здесь уже нужна запятая между операндами.

Утверждение "биссектриса($ABCD$)" (луч $BD$ есть биссектриса угла
$ABC$) вво\-дится двойным нажатием клавиши "и". Запятая между
операндами не ставится.

Утверждения "$a \|b$" (прямые либо плоскости $a,b$ параллельны) и
"$a \bot b$" (прямые либо плоскости $a,b$ перпендикулярны)
вводятся, соответственно, при помощи клавиш "Ctr-=" и "Ctr-т" (т -
кир.).

Утверждения "однасторона($A,B,a$)" \ (точки $A,B$ лежат по одну
сторону от пря\-мой либо плоскости $a$, возможно, попадая на $a$),
"разныестороны($A,B,a$)" \ (здесь тоже допускается попадание точек
на $a$), "симметричны($A,B,a$)" \ (точки $A,B$ распо\-ложены
симметрично относительно точки, прямой либо плоскости $a$)
вводятся при помощи клавиш "О","С"; \ "Р","С"; \ "с","и" (кир.).
Выражения "полоса($A,B$)" (полоса между параллельными прямыми
$A,B$), "полуплоскость($A,B$)" \ (полуплоскость, огра\-ниченная
прямой $A$ и содержащая точку $B$, не лежащую на $B$),
"обрполуплоскость\\ ($A,B$)" \ (полуплоскость, ограниченная прямой
$A$ и не содержащая точку $B$, не лежа\-щую на прямой $B$)
вводятся при помощи нажатий клавиш "п","с"; "п","П"; "о","П".

Для уточнения того, что вводимая задача относится к планиметрии -
все рассмат\-риваемые в ней точки лежат в общей плоскости -
используется вспомогательная посылка "планиметрия". Обычно она
вводится решателем автоматически после набо\-ра задачи (перед ее
решением); вручную ее можно ввести последовательным нажати\-ем
клавиш "п","и".

Утверждения "$\triangle(ABC)$" \ (точки $A,B,C$ образуют вершины
треугольника), "пара\-ллелограмм($ABCD$)" \ (точки $A,B,C,D$,
взятые в данной последовательности, обра\-зуют вершины
параллелограмма); \ "ромб($ABCD$)"; "прямоугольник($ABCD$)",
"ква\-драт($ABCD$)", "четырехугольник($ABCD$)" \ (точки $A,B,C,D$
образуют вершины вы\-пуклого четырехугольника) вводятся
последовательными нажатиями пар клавиш "т","р"; \ "п","а"; \
"р","о"; \ "п","р"; \ "к","в"; \ "ч","е" \ (кир.). Запятые между
операн\-дами не ставятся.

Утверждение "трапеция($ABCD$)" \ (точки $A,B,C,D$ образуют вершины
трапеции, углы при большем основании которой - не тупые, причем
точки $A,D$ лежат на большем основании) вводится при помощи клавиш
"т","п". Утверждение "Трапеция\\ ($ABCD$)" \ (то же, но углы при
большем основании - любые, а точки $A,D$ лежат на основании,
которое не обязательно большее) вводится при помощи клавиш
"Т","п".

Утверждения "многоугольник($A$)" ($A$ - набор вершин простой
замкнутой ломаной), "правмногоугольник($A$)" \ ($A$ - набор вершин
правильного многоуольника) вводятся последовательными нажатиями
клавиш "м","н"; "п","й". Множество точек внутри многоугольника
(включая границу), определяемого набором вершин $A$, обозначается
"фигура($A$)". Точки набора $A$ во всех перечисленных случаях
отделяются друг от друга запятыми. Выражение "Фигура$\{A,B,
\ldots, C\}$" \ (множество точек, ограниченное составной границей
с частями $A,B, \ldots, C$) вводится при помощи клавиш "Ф","и".

Уиверждения "Медиана($ABCD$)", "Высота($ABCD$)",
"Биссектреуг($BACD$)" \ (то\-чка $D$ является основанием,
соответственно, медианы, высоты либо биссектрисы треугольника
$ABC$, проведенной из вершины $A$) вводятся при помощи пар клавиш
"М","Е"; \ "В","Ы"; \  "И","Т".

Выражения "окружность($AB$)", "круг($AB$)" (окружность и круг с
центром в точ\-ке $A$ и точкой на окружности $B$) вводятся
нажатием клавиш "о","к"; "к","р". Выра\-жения "дуга($ABC$)"
(меньшая из дуг окружности с центром в точке $A$ и концами $B,C$);
"большаядуга($ABC$)" \ (большая из указанных дуг);
"дугаугла($ABC$)" \ (дуга, на которую опирается вписанный угол
$ABC$); \ "сектор($ABC$)" \ (сектор окружности с центром в точке
$A$ и концами дуги $B,C$; берется меньшая из дуг);\
"сегмент($ABC$)" \ вводятся при помощи нажатий клавиш "д","у";
"д","У"; "д","в"; "С","е"; "с","г". Выражение "кольцо($ABC$)" \
(кольцо с центром в $A$, внутренняя окружность которого проходит
через $B$, а внешняя - через $C$) вводится при помощи "к", "О".

Площадь $S(A)$ плоской фигуры $A$ (например, $A$ может иметь вид
"фигура($B$)", "круг($BC$)", "сектор($BCD$)" и т.п.) вводится при
помощи двукратного нажатия кла\-виши "S". Выражение
"периметр($A$)" ($A$ обычно имеет вид "фигура($B$)") вводится при
помощи последовательного нажатия клавиш "п","е". Выражение
"длина($A$)"\  (длина кривой $A$) вводится при помощи "д","л".

Утверждение "центр($A,B$)" (точка $A$ является центром фигуры $B$)
вводится при помощи "ц","е".

Утверждение "$A$ - касательная к $B$" \ вводится набором $A$,
нажатием "Ctr-q" и набором $B$. Утверждения
"внешкасательная($A,B,C$)" \ (прямая $A$ является внешней
касательной к окружностям $B,C$); "внутркасательная($A,B,C$)" \
вводятся нажатиями "Ш","к" и "У","к" соответственно.

Утверждения "окружность($AB$)вписана в фигура($C_1 \ldots C_n$)";
\ "окружность($AB$)\ описана около фигура($C_1 \ldots C_n$)" \
вводятся нажатием клавиш "Ctr-э" и "Ctr-ф" \ соот\-ветственно
(предварительно вводится "окружность($AB$)").

Утверждения "внешкасаются($A,B$)" \ (внешнее касание окружностей)
и "внутрка\-саются($A,B$)" \ вводятся последовательными нажатиями
клавиш "ш","к"; "у","к".

Утверждения "выпукло($A$)", "осьсимметрии($A,B$)" \ вводятся при
помощи клавиш "в","ы"; "С","и".

Утверждения $A\sim B$ (подобие фигур) и $A \equiv B$
(конгруентность фигур) вводятся при помощи клавиш "Ctr-п" \ и
"Ctr-к" \ (кир.).

13. Стереометрия. Выражение "плоскость($ABC$)" \ (плоскость,
проходящая через точки $A,B,C$) вводится при помощи клавиш
"п","л". Для ввода выражения "плос\-костьфигуры($a$)" \
(плоскость, в которой расположена плоская фигура $a$)
используют\-ся клавиши "п","ф". Выражение "уголмежду($a,b$)" \
(величина острого угла между прямыми либо плоскостями $a,b$)
вводится при помощи "у","м".

В стереометрии для задания окружности мало указания ее центра $A$
и точки $B$ на окружности - нужно задать еще плоскость окружности,
для чего в решателе используется ссылка на некоторую третью точку
$C$, лежащую в данной плоскости. Соответственно, возникают
выражения "Окружность($ABC$)" и "Круг($ABC$)", для ввода которых
используются клавиши "О","к" и "К","р".

Утверждение "биссектрплоск($C$ прямая($AB$) $D$ $E$)"
(биссекторная плоскость дву\-гранного угла, опирающегося на прямую
$AB$ и ограниченного двумя полуплоскостя\-ми, содержащими,
соответственно, точки $C$ и $D$, проходит через точку $E$)
вводится при помощи двукратного нажатия клавиши "И". Утверждение
"плоскостьсимметрии\\ ($A,B$)" \ ($A$ есть плоскость симметрии
поверхности либо тела $B$) вводится клавишами "П","И".

Выражение "объем($a$)"\ вводится двукратным нажатием клавиши "О"
(кир.). Вы\-ра\-жения "площповерх\-ности($a$)",
"боковаяповерхность($a$)"\ (площадь боковой поверх\-нос\-ти тела
$a$), "высота($a$)" (высота тела $a$), "радиус($a$)" (радиус сферы
либо шара $a$) вводятся, соответственно, при помощи пар клавиш
"щ","п"; \ "Щ","п"; \ "В","ы".

Утверждения "грань($a,b$)"\ (фигура $a$ является гранью
многогранника $b$), "основа\-ние($a,b$)"\ (фигура $a$ является
основанием многогранника $b$) вводятся при помощи клавиш "г","р";
\ "О","с" (кир.). Утверждения "ребро($a,b$)"\ (отрезок $a$ есть
ребро многогранника $b$); "вершина($a,b$)"\ (точка $a$ есть
вершина многогранника $b$); "Верши\-на($a,b$)"\ (точка $a$
является вершиной пирамиды либо конуса $b$); "диагональ($a,b$)"\
(отрезок $a$ есть главная диагональ параллелепипеда $b$) вводятся
парами кла\-виш "р","е"; \ "в","ш"; \ "В","ш"; \ "д","и".
Утверждение "осевоесечение($a,b$)" \ (прямоуголь\-ник либо
треугольник $a$ является осевым сечением, соответственно, цилиндра
либо конуса $b$) вводится клавишами "С","Е".

Утверждения "куб($a$)", \ "призма($a$)", "параллелепипед($a$)", \
"пирамида($a$)", \\ "усечпирамида($a$)", \ "конус($a$)", \
"шар($a$)", "сфера($a$)" вводятся, соответственно, при помощи
нажатий пар клавиш "к","у"; \ "з","м"; \ "п","д"; \ "р","м"; \
"к","с"; \ "ш","а"; \ "ф","р".

Утверждения "прямой($a$)" \ (прямая призма, прямой
параллелепипед); "правиль\-ный($a$)" \ (правильная призма,
правильная пирамида, правильная усеченная пирами\-да);
"прямоугольный($a$)" \ (параллелепипед) вводятся при помощи пар
клавиш "п",\ "Я"; \ "п","в"; \ "п","я".

Выражение "трехгранугол($ABCD$)" \ ($A$ - вершина трехгранного
угла; $AB$,$AC$,$AD$ - направляющие векторы сторон) вводится при
помощи "т","у". Выражения "двугр\-Угол($A,B,C,d$)" \ (двугранный
угол между плоскостями $A,B$, выделяемый при помо\-щи точки $C$ и
указателя $d$ ее принадлежности: 0 - внутри угла, 1 - внутри угла,
смежного с данным через $A$, 2 - внутри угла, смежного с данным
через $B$, 3 - внутри угла, вертикального с данным),
"двугругол($A,B,C,d$)" \ (величина указанного выше двугранного
угла), "двугранУгол($A,B,C$)" \ (двугранный угол, в основании
которого лежит прямая $B$, а направления сторон определяются
лежащими на них точками $A,C$), "двугранугол($A,B,C$)" (величина
указанного выше двугранного угла) вводятся при помощи пар клавиш
"Д","У"; \ "Д","у"; \ "Д","Г"; \ "Д","г".

Выражения "полупространство($A,B$)" \ (полупространство,
отделенное плоскос\-тью $A$ и содержащее точку $B$) и
"обрполупространство($A,B$)" (полупространство, отделенное
плоскостью $A$ и не содержащее точки $B$) вводятся при помощи
клавиш "П","В"; \ "О","П". Выражение "Полоса($A,B$)" \ (полоса
между параллельными плос\-костями $A,B$) вводится при помощи
клавиш "П","С".

14. Системы координат. Выражение "коорд($A,K$)" \ (координаты
точки $A$ либо множество координат точек мно\-жества $A$ в
аффинной системе координат $K$) вводится при помощи клавиш
"к","д". Заметим, что аффинная система координат отождест\-вляется
в решателе в двумерном случае с тройкой точек ($P,Q,R$) ($P$ -
начало системы координат; $PQ$, $PR$ - координатные векторы), а в
трехмерном - с четверкой точек ($P,Q,R,S$). При необходимости в
список посылок задачи заносится равенство, зада\-ющее $K$ в виде
такой тройки либо четверки. Утверждение "прямкоорд($K$)" \ ($K$ -
прямоугольная система координат) вводится при помощи клавиш
"п","к".

Выражение "полкоорд($A,K$)" \ (координаты точки $A$ в полярной
системе координат $K$) вводится при помощи клавиш "п","о".
Полярная система координат $K$ отождест\-вляется с тройкой точек
($P,Q,R$), где $P$ - начало системы координат, а полярный угол
отсчитывается в направлении от луча $PQ$ к лучу $PR$.

Выражение "сферкоорд($A,K$)" \ (координаты точки $A$ в сферической
системе коор\-динат $K$) вводится при помощи "ф","к". Сферическая
система координат отождест\-вляется с четверкой точек ($P,Q,R,S$),
где $P$ - начало системы координат, широта отсчитывается от луча
$PQ$ в направлении луча $PR$, а долгота - в направлении от луча
$PS$ к плоскости $PQR$.

Выражение "цилкоорд($A,K$)" (координаты точки $A$ в цилиндрической
системе координат $K$) вводится при помощи "ц","к". Цилиндрическая
система координат отождествляется с четверкой точек ($P,Q,R,S$),
где $P$ - начало координат; полярный угол отсчитывается от луча
$PQ$ в направлении луча $PR$; $PS$ - координатная ось.

Выражение "точки($A,K$)" (множество точек, координаты которых в
аффинной системе координат $K$ образуют множество $A$) вводится
при помощи двукратного нажатия клавиши "т".

15. Векторы. Выражение "вектор($AB$)" \ вводится при помощи
"в","е" (кир.). Опе\-рации "плюсвект", "минусвект", "умножвект" \
сложения векторов, изменения знака вектора и умножения вектора на
число (это число является обязательно первым сомножителем)
вводятся формульным редактором так же, как обычные операции
сложения, изменения знака и умножения. Формульный редактор
самостоятельно преобразует их в указанные выше, усмотрев наличие
векторных операндов; если этого ему сделать не удалось, то
коррекцию обозначений данных операций можно осуществить вручную,
перейдя после набора формулы в режим текстового редактора.
Утверждение "Вектор($A$)" \ ($A$ есть вектор) вводится при помощи
"В","е".

Нулевой вектор "вектор0" вводится тектовым редактором. Величина
"уголмежду\\ ($A,B$)" угла между векторами вводится при помощи
"у","м". Условие ортогональнос\-ти векторов $A\bot B$ вводится так
же, как условие перпендикулярности прямых (Ctr-т; т -
кир.).Утверждения "коллинеарны($A,B$)", \ "компланарны($A,B,C$)" \
вводятся при помощи клавиш "к","л" и "к",п". Длина вектора
"длина($A$)" вводится при помощи "д","л".

Выражения "скалумнож($A,B$)" \ (скалярное произведение векторов) и
"вектумнож\\ ($A,B$)" \ вводятся при помощи клавиш "с","к" и
"в","Е" (кир.).

Выражение "ориентация($A,K$)" \ (ориентация упорядоченного набора
$A$ векторов в аффинной системе координат $K$ - для двумерного
либо трехмерного случаев; эта ориентация принимает значения 1 и
-1) вводится при помощи "О","р" \ (кир.). Выра\-жение
"оруголмежду($A,B,K$)" \ (величина ориентированного угла между
векторами $A,B$ при ориентации плоскости, задаваемой системой
координат $K$) вводится при помощи "О","м". Выражения
"орплощадь($K,A,B$)" \ (ориентированная площадь па\-раллелограмма,
порожденного векторами $A,B$ при положительной ориентации,
зада\-ваемой системой координат $K$), "оробъем($K,A,B,C$)" \
(аналогично для параллеле\-пипеда, порожденного векторами $A,B,C$)
вводятся текстовым редактором. Так же вводится и утверждение
"направление($A,B,C,D$)" \ (вектор $D$ трехмерного простран\-ства
направлен по отношению к плоскости векторов $A,B$ в ту же сторону,
что и вектор $C$).

Утверждение "делениеотрезка($A,B,C,a,b$)" \ (точки $A,B,C$ лежат
на прямой и отношение вектора $AB$ к вектору $BC$ равно отношению
$a$ к $b$) вводится при помощи "д","О". Выражение
"конецвектора($A,B$)" \ (конец вектора $B$, отложенного от точки
$A$) вводится текстовым редактором. Ортогональная проекция
"проекция($A,B$)" \ точ\-ки, прямой либо вектора $A$ на прямую
либо плоскость $B$ вводится при помощи "п","Р".

16. Уравнения линий. \ Утверждение "Прямая($A$)" (множество точек
$A$ есть прямая на плоскости либо в пространстве) вводится при
помощи клавиш "П","Р". Уравнение прямой $AB$ на плоскости обычно
вводится в виде "коорд(прямая($AB$),$K$) = $set_{xy}(ax+by+c=0 \
\& \ x-\mbox{число} \ \& \ y-\mbox{число})$". Если переменная $x$
либо $y$ явно входит в равенство под описателем "$set$", то
указывать численный тип ее значения не обязательно - такое
указание будет сформировано автоматически в начале решения задачи.
Аналогичным образом задаются уравнения других плоских линий.
 В трехмерном случае уравнение прямой, проходящей через
точку с координатами $(a,b,c)$ и имеющей направляющий вектор
$(d,e,f)$, обычно записывается в виде "коорд(пря\-мая($AB$),$K$) =
$set_{xyz}(\\ \mbox{пропорцнаборы}((x-a,y-b,z-c),(d,e,f))\ \& \
x-\mbox{число} \ \& \ y-{число} \ \& \ z-\mbox{число})$". В случае
отличных от нуля $a,b,c$ указатель численного типа значения
соответствующей переменной $x,y,z$ можно опускать. Логический
символ "пропорц\-наборы" (указание на линейную зависимость двух
числовых наборов одинаковой дли\-ны) вводится кла\-вишами "п","Н"
(кир.).

Утверждение "направлпрямой($A,B,C$)" ($C$ - координаты
направляющего вектора прямой $A$ в системе координат $B$) вводится
с помощью клавиш "н","П".

Утверждение "линвторпорядка($A$)" ($A$ - линия второго порядка)
вводится тексто\-вым редактором. Утверждения "эллипс($A$)",
"гипербола($A$)", "равнгипербола($A$)" \ (равносторонняя
гипербола), "парабола($A$)" вводятся, соответственно, при помощи
пар клавиш "Е","Л"; \ "Г","И"; \ "Р","Г"; \ "П","А".

Выражения "фокпараметр($A$)" \ (фокальный параметр кривой $A$),
"полуось($A,B$)" \ (величина полуоси эллипса $B$ в направлении его
оси $A$), "эксцентриситет($A$)" \ (эксцен\-триситет кривой $A$),
"фокхорда($A$)" \ (длина хорды, проходящей через фокус кри\-вой
второго порядка $A$ перпендикулярно фокальной оси) вводятся при
помощи пар клавиш "ф","п"; \ "П","О"; \ "е","к"; \ Ф","Д".
Утверждение "фркус($A,B$)" \ ($A$ есть фокус кривой второго
порядка $B$) вводится при помощи "ф","о".

Утверждения "направлпараболы($A,B$)" \ (вектор $B$ задает
направление оси пара\-болы $A$), "действось($A,B$)" \ (прямая $A$
есть действительная ось гиперболы $B$), "мни\-маяось($A,B$)",
"директриса($A,B,C$)" \ (прямая $A$ есть директриса кривой второго
порядка $C$, соответствующей фокусу $B$), "асимптота($A,B$)"
(прямая $A$ является асим\-птотой кривой $B$) вводятся,
соответственно, при помощи пар клавиш "Н","п"; \ "Д",\ "О"; \
"М","О"; \ "Д","И"; \ "А","С".

Выражение "ветвькривой($A,B$)" \ (ветвь кривой $B$, содержащая
точку $A$) вводится при помощи клавиш "Е","К".

Утверждения "диаметр($A,B$)" \ (прямая $A$ является диаметром
кривой второго порядка $B$), "сопряжнаправления($A,B,C$)" \
(направления прямых $A,B$ являются со\-пряженными относительно
кривой второго порядка $C$)вводятся при помощи клавиш "Д","М"; \
"С","Н" (кир.).

Выражения "большаяось($A$)" \ (длина большой оси эллипса $A$),
"малаяось($A$)", "действполуось($A$)" \ (длина действительной
полуоси гиперболы $A$), "мнимаяполуось\\ ($A$)" \ вводятся
текстовым редактором.

Утверждение "каноничкоорд($A,B$)" \ ($A$ есть каноническая система
координат для кривой либо поверхности второго порядка $B$)
вводится при помощи клавиш "К","Ч". Утверждение
"фоксистема($A,B$)" \ ($A$ есть прямоугольная система координат с
цент\-ром в фокусе кривой второго порядка $B$, положительное
направление оси абсцисс которой в случае параболы совпадает с
направлением оси параболы; в случае эллипса совпадает с
направлением на другой фокус; в случае гиперболы противоположно
этому направлению) вводится с помощью текстового редактора.

17. Уравнения поверхностей. Утверждение "Плоскость($A$)" \ ($A$
есть множество точек плоскости в трехмерном пространстве) вводится
последовательным нажатием клавиш "П","Л". Уравнение плоскости
вводится в виде "коорд(поскость($ABC$),$K$) =
$set_{xyz}(ax+by+cz+d=0 \ \& \ x-\mbox{число} \ \& \
y-\mbox{число}\ \& \ z-\mbox{число})$". Если переменная $x,y,z$
явно входит в равенство под описателем "$set$", то указывать
численный тип ее значения не обязательно. Аналогичным образом
задаются уравнения других поверх\-ностей. Уравнения кривых в
трехмерном пространстве задаются с помощью двух равенств под
описателем "$set$".

Утверждение "плоскбазис($P,K,a,b$)" \ ($a,b$ - два координатных
набора для ортого\-нальных единичных векторов, лежащих на
плоскости $P$, относительно прямоуголь\-ной системы координат $K$
в трехмерном пространстве) вводится при помощи клавиш "П","о".

Утверждения "Цилиндр($a$)" \ ($a$ - цилиндрическая поверхность),
"Конус($a$)" \ ($a$ - коническая поверхность), "эллипсоид($a$)",
"гиперболоид($a$)", \ "параболоид($a$)" вводя\-тся,
соответственно, при помощи пар клавиш "Ц","И"; \ "К","О"; \
"Е","Д"; \ "Г","Д"; \ "П","Д".  Утверждение "поввторпорядка($a$)"
вводится текстовым редактором.

Уточняющие тип поверхности утверждения "круглый($a$)" \ (цилиндр,
конус), "эл\-липтический($a$)",\ "гиперболический($a$)",\
"параболический($a$)", \ " однополостный($a$)", \
"двуполостный($a$)" \ вводятся, соответственно, при помощи пар
клавиш "к","р"; \ "Е",\\ "Ч"; \ "Г","Ч"; \ "П","Ч"; \ "О","Й"; \
"Д","Й".

Утверждения "осьцилиндра($A,B$)" \ (прямая $A$ - ось цилиндра
$B$), \ "направляю\-щая($A,B$)" \ (кривая $A$ - направляющая
цилиндра $B$), "образующая($A,B$)" \ (прямая $A$ - образующая
цилиндра $B$), "оськонуса($A,B$)" \ (прямая $A$ - ось конуса $B$),
"осьвраще\-ния($A,B$)" \ (прямая $A$ - ось вращения поверхности
$B$) вводятся, соответственно, при помощи пар клавиш "О","Ц"; \
"Н","П"; \ "О","Щ"; \ "О","К"; \ "о","в" (кир.).

Утверждение "направлпараболоида($A,B,C$)" \ (координатный набор
$C$ определяет направление оси параболоида $A$ в системе координат
$B$) вводится с помощью тексто\-вого редактора.

В случае эллипсоида вращения $A$ длина той оси эллипса,
относительно которой происходит вращение, обозначается
"высота($A$)"\ ; длина другой полуоси эллипса - "радиус($A$)".

Выражение "полуось($A,B$)" \ (длина полуоси эллипсоида $B$ по
направлению его оси $A$) вводится при помощи "П","О".

Утверждения "диаметрплоскость($A,B$)" \ ($A$ есть диаметральная
плоскость повер\-хности второго порядка $B$),
"сопряжнаправления($A,B,C$)" \ (направления плоскости $A$ и прямой
$B$ являются сопряженными относительно поверхности второго порядка
$C$) вводятся при помощи пар клавиш "д","п"; \ "С","Н" (кир.).

Утверждение "собствкоорд($A,B$)" \ ($A$ есть прямоугольная система
координат, еди\-ничные векторы которой задают направления главных
осей поверхности второго порядка $B$) вводится текстовым
редактором.

18. Матрицы. \ Матрица переменной или чрезмерно большой
размерности вводится как обычная функция двух натуральных
аргументов - $\lambda_{ij}(a(i,j),i \in {1, \ldots, n} \ \& \ j
\in {1, \ldots, m})$. Если размеры матрицы невелики, то ее можно
прорисовать на экране стандартным образом. Для этого сначала
нажимаются последовательно клавиши "м","а" \ (кир.) - появляется
левая скобка матрицы. Затем набираются элементы первой строки
матрицы. Вместо разделителя после каждого элемента нажимается
"Enter". После последнего элемента строки вместо "Enter"
нажимается "Page Down" - для перехода к следующей строке. Если
строка была последней, то вместо "Page Down" после ввода ее
последнего элемента нажимается "End". Размеры скобок мат\-рицы и
уровень текущей строки корректируются во время набора
автоматически. Наконец, можно прорисовать матрицу константных
наборов путем перечисления ее строк либо столбцов - в виде
"строки($(A_11 \ldots A_{1n}) \ldots (A_{m1} \ldots A_{mn})$)"
либо "столбцы\\ ($(A_11 \ldots A_{m1}) \ldots (A_{1n} \ldots
A_{mn})$)". Логические символы "строки" и "столбцы" вводятся:
первый - путем двукратного нажатия клавиши "м", второй - "М" \
(кир.).

Выражение "ранг($A$)" вводится при помощи двукратного нажатия "р"
(кир.).

Операции сложения матриц и изменения знака матрицы - те же, что и
для произ\-вольных вещественнозначных функций ("плюсфунк",
"минусфунк"). Они вводятся так же, как обычные операции сложения и
изменения знака, и в начале решения задачи предпринимается попытка
автоматической их коррекции. Это же относится и к операциям
умножения матрицы на число ("матркоэфф") и умножения двух матриц
("умножматр").

Утверждения "собствзначение($A,a,k$)" \ ($a$ есть собственное
значение матрицы $A$, имеющее кратность $k$) и
"собствектор($A,a,v$)" \ ($v$ есть собственный вектор - столбец,
соответствующий собственному значению $a$ матрицы $A$) вводятся
при помощи клавиш "с","з" и "с","в".

Выражение "линкомбинации($A$)" \ (множество линейных комбинаций с
веществен\-ными коэффициентами матриц множества $A$), а также
утверждения "каноничматри\-ца($A,x,B$)" \ ($B$ - матрица,
являющаяся канонической формой матрицы $A$, элементы которой
рассматриваются как многочлены относительно переменной $x$) и
"жордфор\-ма($A,B,C$)" \ (матрица $B$ является канонической
жордановой формой матрицы $A$, причем $C$ - матрица,
трансформирующая $A$ в $B$) вводятся текстовым редактором.

19. Комплекные числа. Утверждение "$a$ - комплексное" \ вводится в
следующем порядке: сначала набирается $a$, затем "$\backslash$",
затем "к" \ (кир.). Мнимая единица вводится двукратным нажатием
клавиши "с". Арифметические операции и элементарные фун\-кции для
комплексных чисел вводятся так же, как для вещественных;
преобразование их в комплекснозначные операции внутреннего языка
решателя выполняется автома\-тически (хотя и требует контроля).

Выражения $Re(a)$, $Im(a)$, $Arg(a)$ (главное значение аргумента)
вводятся, соответ\-ственно, при помощи клавиш "R","e"; "I","m";
"A","r" (лат.). Выражение "Корень($a,\\ n,k$)" \ ($k$-й корень
натуральной степени $n$ из комплексного числа $a$) вводится при
помощи "К","о" \ (кир.). Выражение "сопряженное($a$)" вводится при
помощи "с","о" \ (кир.).

\subsection{Текстовый редактор}

В решателе используется интерфейс текстового редактора, несколько
отличающий\-ся от стандартных версий. Этот редактор используется,
главным образом, для работы с программами приемов, однако он может
понадобиться и при вводе элементов задачи. Приведем краткое
описание основных его функций.

Текстовый редактор позволяет работать только с текстами, целиком
помещающи\-мися на экране. Для работы с большими текстами
использующие текстовый редак\-тор процедуры имеют режим
"перелистывания", определенный в описании их ин\-терфейса.

При входе в текстовый редактор появляется прямоугольный курсор
светло - ко\-ричневого цвета и автоматически устанавливается режим
кирил\-лицы; для перехода в режим латиницы нажимается F12, для
возвращения в режим кириллицы - F11. Для ускорения перемещений
курсора вводится режим увеличенного шага (5-кратное смещение по
вертикали либо 8-кратное по горизонтали). Переключе\-ние между
одно\-шаговым режимом и ускоренным осуществляется нажатием клавиши
"TAB". Завер\-шение редактирования происходит при нажатии клавиши
"Enter"; отмена ре\-дакти\-рования - при нажатии "Esc". При всех
операциях с текстом выполняется принцип: позиция, следующая за
крайней правой позицией строки, есть начальная позиция следующей
строки. При достижении правого края окна редактирования курсор
авто\-матически переходит в начало следующей строки этого окна.

Для вставки пустой строки начиная с текущей позиции (все, что было
правее этой позиции, смещается на одну строку вниз) используется
клавиша F7. Для исключения одной строки начиная с текущей позиции
(все, что было на следующей строке правее этой позиции, сдвигается
вверх на одну строку) нажимается F6. Переход в начало либо в конец
строки - как обычно, с помощью "Home" и "End".

Для вставки текста перед \ заданной позицией курсор перемещается к
этой пози\-ции, и нажимается клавиша "Insert". Курсор после этого
становится голубым - вклю\-чается режим вставки. В этом режиме
каждый вводимый с клавиатуры символ вста\-вляется непосредственно
перед курсором (который сдвигается так, что расположен все время
над исходным символом). По завершении вставки снова нажимается
"Insert" \ - курсор перекрашивается в светло-коричневый цвет. Если
во время вставки нажать "Backspace" - для отмены последнего
введенного символа, то также происходит выход\ из режима вставки.
В режиме вставки курсор не реагирует на нажатия кла\-виш сдвига
курсора.

Для удаления фрагмента текста курсор сначала подводится к началу
этого фраг\-мента (первый удаляемый символ) и нажимается клавиша
"Delete". Курсор перекра\-шивается в красный цвет. Фактически, это
лишь маркер начала удаляемой части, наложенный поверх курсора, а
курсор (светло-коричневого цвета) обычным образом реагирует на
клавиши сдвига. Далее курсор подводится к концу удаляемого
фрагмен\-та (первый сохраняемый символ) и снова нажимается
"Delete" \ - выбранный фрагмент при этом удаляется. Если после
выбора начала удаляемой части нажать "Backspace", то удаление
отменяется, и красный маркер исчезает.

Возможна операция перенесения выбранной части текста на новое
место. Для ее выполнения сначала курсор подводится к началу этой
части и нажимается F2. Курсор перекрашивается в светло-зеленый
цвет. Фактически, это лишь наложенный поверх курсора маркер начала
переносимой части. Затем курсор подводится к концу переносимой
части (последний относящийся к ней символ) и снова нажимается F2.
 Появляется наложенный поверх курсора светло-зеленый маркер конца.
Наконец, курсор подводится к тому месту, начиная с которого должен
быть расположен выб\-ранный фрагмент, и снова нажимается F2 - при
этом происходит перенесение фраг\-мента на данное место. На каждом
этапе нажатие "Backspace" \ удаляет последний введенный маркер.

Для получения подсказки о клавиатуре текстового редактора (если
уже началось его использование) нажимается F3. После этого нажатие
любой клавиши возвращает в прерванное редактирование. Для
получения справочной информации, связанной с заданным логическим
символом, нажимается клавиша F4. Возникает диалогове окно, в
котором вводится название нужного логического символа. По
окончании ввода нажимается "Enter", и появляется необходимая
справочная информация. Вы\-ход из ее просмотра - по нажатию любой
клавиши, кроме клавиш, используемых при просмотре такой информации
(например, при нажатии клавиши "пробел"). При этом
восстанавливается прерванное редактирование.

Предусмотрен буфер для сохранения фрагмента текста. Практически во
всех случаях содержимое этого буфера при смене различных
интерфейсов системы, и его можно использовать при любом повторном
обращении к текстовому редактору. Для занесения фрагмента текста в
буфер сначала курсор подводится к началу этого фрагмента и
нажимается клавиша "PageDown". Появляется синий маркер начала
фрагмента, наложенный поверх курсора. Затем курсор подводится к
концу фрагмен\-та и снова нажимается "PageDown" \ - маркер начала
исчезает, и буфер сохраняет выбранный фрагмент. Если до второго
нажатия "PageDown" \ нажать "Backspace", то маркер исчезает и
операция отменяется. Для извлечения содержащегося в буфере
фрагмента курсор подводится на ту позицию, начиная с которой
должен быть встав\-лен текст. Затем нажимается "PageUp".
Содержимое буфера при этом сохраняется.

Возможно изменение цвета фона (Сtr-F4) и символов (Ctr-F5). Эти
цвета меня\-ются циклическим образом (длина цикла 16). Если
внешняя процедура, обративша\-яся к текстовому редактору,
игнорирует цвета, то они при сохранении в файле будут утеряны.

Ряд специальных символов вводится с помощью клавиш "Ctr- ...".
Так, символ $\neg$ вводится нажатием клавиши "Ctr-n"\ ; символ
$\exists$ - нажатием "Ctr-e" \ (лат.); символ $\forall$ - нажатием
"Ctr-a" \ (лат.). Заметим, что перечисленные символы используются
только при наборе текстовым редактором обычных текстов; при наборе
термов вместо них должны использоваться слова "не"\ , "существует"
\ ,"длялюбого".

Если был набран некоторый текст, то при сохранении в файле
автоматически отбрасывается его пустой конец. Если такой конец все
же нужно сохранить в файле, то для обозначения его завершающей
позиции используется символ $\bot$, вводимый клавишей F9.

Каждому коду клавиатуры в языке программирования ЛОС (описываемом
в последующих разделах) сопоставлен некоторый логический символ.
Если при про\-граммировании процедуры интерфейса нужно определить
этот символ, то курсор текстового редактора подводится на ту
позицию, начиная с которой должно быть записано название символа;
нажимается клавиша F8, и сразу же за этим - нажимается та клавиша
либо сочетание клавиш, для которой нужно узнать кодирующий ее
логический символ.

Термы вводятся текстовым редактором только в скобочной записи
$F(A_1 \ldots A_m)$. Логический символ $F$ вводится в виде слитно
написанного слова; между операндами $A_i$ необходимы разделители,
причем разделителем служит пробел либо скобка. Запя\-тые в
качестве разделителей не допускаются (запятая сама является
логическим символом). Числа вводятся как последовательности
расположенных подряд цифр. В случае десятичных дробей используется
запятая, а не точка, как в формульном редакторе. Знак "минус", как
и прочие операции, применяется в сочетании со скоб\-кой:
"минус($A$)". Для удобства работы со скобками предусмотрена
операция перехода от скобки к парной ей скобке. Курсор помещается
на одну из скобок, и нажимается клавиша F1, переводящая его на
парную скобку.

\subsection{Геометрический редактор}

Геометрический редактор позволяет создавать простые чертежи,
состоящие из неко\-то\-рой системы обозначенных буквами точек,
между которыми проведены линии (отрезки прямых либо окружности).
Чертежи используются в задачах по геометрии и в описании
геометрических приемов. Какой-либо функциональной нагрузки в
работе решателя они пока не имеют, а используются лишь для
обеспечения необходимой наглядности. Тем не менее, при выполнении
по ходу решения задачи дополнительных построений решатель сам
пополняет чертеж новыми точками и линиями. Все, что нужно для
этого сделать - ввести в описании задачи чертеж, обозначения точек
на котором согласованы с используемыми в условии задачи.

Если вводится новая геометрическая задача, для которой нужен
чертеж, то лучше всего начинать ее набор прямо с чертежа. Для
этого достаточно ввести бланк задачи (прорисована верхняя
горизонтальная линия, обозначающая начало задачи) и нажать клавишу
"ч". Если уже была набрана часть текста задачи, то вход в
геометрический редактор осуществляется тем же самым нажатием
клавиши "ч". В обоих случаях вся отведенная для задачи часть
экрана занимается прямоугольником геометрического редактора, а
набранная ранее часть текста задачи пропадает с экрана. Она будет
восстановлена по окончании (либо отмене) создания чертежа и
размещена под чер\-тежом. Можно попробовать создать чертеж с
помощью автоматической процедуры, имеющейся в решателе. Для этого
нажимается клавиша "Ч". Если до этого была введена ручная версия
чертежа, то она будет заменена автоматической; восстановле\-ние
предыдущей версии чертежа при этом достигается путем выделения
чертежа (левой клавишей мыши) и нажатия "Ctr-Del". Если нужно
вручную изменить ранее введенный чертеж задачи (в том числе,
автоматически введенный), то, как и при первоначальном вводе
чертежа, нажимается "ч".

Заметим, что по окончании редактирования чертежа либо при отмене
начатого редактирования автоматически выполняется прокрутка списка
задач, так что в верх\-ней части экрана оказывается начало
обрабатываемой задачи. Указанным выше способом можно входить в
редактирование чертежа только для последней задачи
просматриваемого списка задач. Если же задача не последняя, то ее
следует сначала выделить (нажатие правой клавиши мыши в любой
точке поля задачи), и лишь затем нажать "ч".

Окно геометрического редактора представляет собой прямоугольник,
ограничен\-ный линией синего цвета. В правом верхнем углу отделена
небольшая область, в которой появляется указатель текущего режима
редактирования. Управление сменой режимов осуществляется с помощью
меню геометрического редактора, появляюще\-го\-ся в верхней части
экрана. Предусмотрены следующие режимы работы:

 1. Нейтральный режим. \ Этот режим устанавливается при входе в
геометрический редактор. У него прямоугольник указателя режима -
пустой. Переход из любого другого режим в этот режим
обеспечивается нажатием клавиши пробела. В ней\-траль\-ном режиме
можно выполнять следующие операции:

а) Перемещение точки либо сопровождающего ее буквенного
обозначения. Для этого точка выделяется нажатием левой клавиши
мыши после подведения к ней курсора мыши. Затем можно сдвигать
точку нажатием клавиш курсора (постоянное удержание клавиши
нажатой приводит к медленному движению точки в выбранном
направлении). Аналогично, можно сдвигать обозначение выделенной
точки нажатием клавиш "Ctr-курсоры". При движении точки
корректируются все ведущие к ней отрезки прямых.

б) Изменение обозначения точки. \ Сначала нажимается буквенная
клавиша (быть может, сопровождаемая несколькими цифровыми при
указании индекса) для нового обозначения, затем выделяется нужная
точка (левая клавиша мыши) и нажимается "=". Как и в случае
добавления новой точки (см. ниже), для ввода большой буквы на
клавиатуре нажимается малая буква, и наоборот. Старое обозначение
заносится в накопитель обозначений точек, и будет использовано при
последующих вводе либо коррекции обозначения (если не сбросить
накопитель с помощью клавиши "Delete").

Эти операции можно применять и в других режимах (но не в режиме
ввода новых точек, так как тогда каждая попытка выделить точку
будет приводить к созданию новой точки).

2. Режим ввода новых точек. \ Вход в режим ввода новых точек
осуществляется при нажатии клавиши "Insert" либо выборе мышью
пункта "Точка" меню в верхней части экрана. В прямоугольнике
указателя режима появляется слово "точка". Для ввода новой точки
следует выбрать курсором мыши ее позицию и нажать левую клавишу
мыши. В качестве обозначения точки каждый раз выбирается первая не
использованная большая буква. Однако, можно явно указывать
обозначения точек, предварительно нажав последовательно некоторые
буквенные клавиши. Тогда по\-сле\-дующие нажатия левой клавиши
мыши на выбранных позициях приведут к исполь\-зованию для точек
обозначений из данной последовательности. Так как обычно точки
обозначаются большими буквами, предусмотрено автоматическое
преобра\-зо\-вание вводимых с клавиатуры малых букв в большие, а
больших - в малые. Для сброса накопителя обозначения новых точек
нажимается клавиша "Delete".

Обозначения точек можно сопровождать индексами - для этого после
нажатия буквенной клавиши нажимаются одна или несколько цифровых
клавиш, образующих индекс.

Если нужно удалить ранее введенную точку, то к ней подводится
курсор мыши и нажимается правая клавиша мыши. При этом обозначение
удаленной точки со\-хра\-няется в накопителе обозначений и будет
использовано (если не сбросить этот накопитель) при вводе новой
точки.

3. Режим сдвига точек. \  Переход в этот режим осуществляется
нажатием клавиши "Ctr-c" \ либо выбором мышью пункта "Сдвиг"\ меню
в верхней части экрана. Ука\-затель режима прорисовывает слово
"сдвиг". Далее можно изменить положение любой из точек, не
прибегая к сравнительно медленному перемещению ее клавишами
курсора. Для этого сначала точка выделяется мышью (нажатие левой
клавиши после подведения к точке курсора мыши), затем курсор мыши
подводится к новой позиции точки, и снова нажимается левая клавиша
мыши.

4. Режим проведения отрезка.\ Переход в режим осуществляется при
нажатии "Ctr-о" ("о" - кир.) либо выборе мышью пункта "Отрезок"
меню в верхней части экрана. Указатель режима прорисовывает слово
"отрезок". Для проведения отрезка между двумя точками сначала
выделяется первая из них, затем курсор мыши подводится ко второй и
нажимается левая клавиша мыши. Если нужно не ввести, а наоборот,
удалить ранее введенный отрезок, то после выделения первой точки
отрезка на второй точке нажимается правая клавиша мыши.

5. Режим проведения прямой. \ Переход в режим осуществляется при
нажатии клавиши "Ctr-п" \ либо выборе мышью пункта "Прямая" \ меню
в верхней части экрана. Указатель режима прорисовывает слово
"прямая". Режим аналогичен режиму про\-ведения отрезков, однако
здесь отрезок продолжается вплоть до границ рамки. Ре\-жим
практически не используется.

6. Режим проведения перпендикуляра. \ Переход в режим
осуществляется при нажатии клавиши "Ctr-т" \ либо выборе мышью
пункта "Перпендикуляр" \ меню в верхней части экрана. Указатель
режима прорисовывает слово "перпендикуляр". Возможны две операции:
восставить перпендикуляр к прямой в заданной точке этой прямой,
либо опустить из заданной точки перпендикуляр на заданную прямую.

В первом случае левой клавишей мыши выбираются две различные точки
на прямой (вторая из них - та, через которую пройдет
перпендикуляр). Чтобы доопре\-делить направление перпендикуляра и
ввести на нем еще одну точку, курсором мыши выбирается какая-либо
из уже введенных ранее точек, и на ней нажимается правая клавиша
мыши. Тогда перпендикуляр к прямой, проходящей через первые две
точки, будет проведен из второй точки в направлении третьей точки,
причем на нем будет введена ближайшая к третьей точке новая точка.

Во втором случае, как и в первом, сначала левой клавишей мыши
выбираются две точки на прямой, к которой требуется провести
перпендикуляр, и затем на третьей точке - из которой должен быть
опущен перпендикуляр - нажимается левая клавиша мыши. При
проведении перпендикуляра вводится новая точка - основание этого
перпендикуляра.

7. Режим проведения окружности.\ Переход в режим осуществляется
при нажатии клавиши "Ctr-к" ("к" - кир.) либо выборе мышью пункта
"Окружность" меню в верхней части экрана. Указатель режима
прорисовывает слово "окружность". Для проведе\-ния новой
окружности сначала левой клавишей мыши выбирается ее центр, затем
берется какя-либо точка, через которую должна пройти окружность, и
снова нажи\-мается левая клавиша мыши. Чтобы удалить введенную
ранее окружность, сначала левой клавишей мыши выбирается ее центр,
затем на той точке окружности, с по\-мо\-щью которой она
вводилась, нажи\-мается правая клавиша мыши. Последняя операция
возможна лишь в том случае, если ранее введенная окружность не
перемещалась по экрану (такое перемещение происходит при
перемещении ее центра); иначе для удаления окружности нужно
удалить ее центр).

8. Режим параллельного перемещения всего изображения. \ Переход в
режим осуществляется при нажатии клавиши "Home" либо выборе мышью
пункта "Пере\-ме\-щение" меню в верхней части экрана. Указатель
режима прорисовывает слово "перемещение". Для задания вектора
перемещения сначала на некоторой позиции нажимается клавиша мыши,
затем курсор мыши переносится на новую позицию, и снова нажимается
клавиша мыши.

9. Режим изменения размеров рамки чертежа. \ Переход в режим
осуществляется при выборе мышью пункта "Рамка" \ меню в верхней
части экрана. Возникает под\-меню, в котором перечисляются
названия четырех сторон рамки ("правыйкрай", "левыйкрай",
"верхнийкрай" и "нижнийкрай"). После выбора в нем нужной стороны
указатель режима повторяет название выбранной стороны. Для выбора
нового по\-ло\-жения этой стороны курсор мыши перемещается на
требуемую позицию и нажима\-ет\-ся левая клавиша мыши. Режим
обычно используется для увеличения зоны чертежа, под которым
размещены другие изображения. Это увеличение относится только к
периоду редактирования; по завершении работы геометрического
редактора нижняя граница чертежа выбирается автоматически по
крайним снизу его точкам.

\chapter{Общая схема функционирования реша\-те\-ля}

\section{Сканирование задачи}

При обычном программировании для решения задач заданного типа
разрабатывается один общий алгоритм, который гарантирует получение
за конечное число шагов ответа в случае любой конкретной задачи
этого типа. Такой алгоритм представляется в виде нескольких
взаимодействующих между собой блоков, обеспечивающих цикли\-ческий
процесс постепенного упрощения параметров решаемой задачи (в
частности, уменьшения оставшегося объема перебора для процедур
"переборного" типа) - вплоть до получения окончательного ответа.
Каждый из блоков несет здесь вполне опреде\-ленную функциональную
нагрузку, как правило, основанную на том или ином теоре\-тическом
утверждении, связанном с обрабатываемыми алгоритмом объектами. Его
можно рассматривать как прием для достижения определенной текущей
подцели. В свою очередь, отдельный блок сам определяется схемой
своих подблоков, и т.д. Здесь возникает иерархия уровней, в
которой на каждом уровне несколько приемов (как правило, не более
одного - двух десятков) оказываются связаны в вычислительный цикл,
так что после выполнения очередного приема известно, к какому
приему следу\-ет переходить дальше.

К сожалению, такого рода четкую программу действий удается
составить лишь для достаточно узких классов задач. Хорошо известны
результаты об алгоритми\-чес\-кой неразрешимости различных общих
проблем, и даже в случае наличия алгоритма он часто оказывается
практически неприемлемым по своей трудоемкости. Для прео\-доления
возникающих здесь трудностей приходится резко увеличивать
количество используемых приемов, чтобы охватить алгоритмическими
возможностями если не все многообразие задач предметной области,
то хотя бы возможно больший класс задач, встречающихся в реальных
ситуациях. Эти приемы создаются уже не путем "теоретического"
проектирования алгоритма, а извлекаются из последовательности
конкретных обучающих задач и складываются в одну общую базу
приемов. Количес\-тво приемов, используемых для решения задач в
предметной области, обычно сущес\-твенно больше чем в
алгоритмической процедуре указанного выше "блочного" типа - сотни
и тысячи вместо десятков. Последовательность их работы заранее не
фиксиро\-вана, и после срабатывания очередного приема необходим
цикл поиска следующего применяемого приема. Разумеется, при
увеличении числа приемов, работающих в общем процессе, существенно
усложняется регулировка взаимодействия между ними, и возникает
необходимость в длительной эмпирической оптимизации их решающих
правил.

Для организации цикла поиска очередного применяемого приема в
решателе ис\-поль\-зуется процедура сканирования задачи, которую
можно представлять как своего рода модель внутреннего логического
зрения. Для большинства приемов активизация их при рассмотрении
задачи начинается с обнаружения в логических структурах данных
некоторого логического символа, заранее выбранного для этого
приема. В качестве такого "ключевого" \ логического символа
берется обычно некоторый логи\-чес\-кий символ, появление которого
необходимо для возможности применения рас\-смат\-риваемого приема,
причем при нескольких возможных выборах предпочтение отдается
наиболее редко встречающемуся логическому символу (для уменьшения
потерь времени при попытках применения приема). Указанное
закрепление за при\-емами логических символов предопределяет
организацию всей базы приемов решате\-ля по принципу энциклопедии:
она распадается на группы приемов, "принадлежа\-щих" \
соответствующим символам, причем каждая группа реализуется в виде
от\-дельной алгоритмической процедуры $A_f$ - программы
логического символа $f$. В особых случаях прием не удается связать
с каким-либо конкретным логическим символом, появление которого
является необходимым для срабатывания. Такие при\-емы (их совсем
немного) распределены по четырем логическим символам - названиям
"доказать", "описать", "преобразовать", "исследовать" \ типов
задач, при решении ко\-торых возможно их применение.

Текущая ситуация, возникающая в процессе работы решателя,
описывается по\-следовательностью задач $Z_1,Z_2, \ldots , Z_N$,
где $Z_{i+1}$ - вспомогательная задача, введенная при решении
задачи $Z_i$ ($i=1, \ldots, N-1$). В этой последовательности
(далее называем ее цепью задач) задача $Z_1$ является фиктивной -
она создается автоматически при запуске логической системы и
используется для организации интерфейса. Эта задача (далее
называемая исходной задачей) имеет тип "исследовать" и
единственную одно\-буквенную посылку "вход". При просмотре посылок
данной задачи решатель обра\-щается к программе логи\-чес\-кого
символа "вход", которая и является программой интерфейса
логической системы. С помощью интерфейса можно ввести некоторую
задачу $Z_2$, которая далее и решается, порождая вспомогательные
задачи $Z_3, \ldots , Z_N$. Будем называть задачу $Z_N$ текущей
задачей; $Z_2$ - корневой задачей. Исходная задача, кроме
организации интерфейса, выполняет функции "доски объявлений" \ -
раз\-лич\-ные процедуры ре\-ша\-теля могут обмениваться между
собой сообщениями, раз\-ме\-щая их в списке коммен\-тариев к
посылкам этой задачи.

Каждая задача $Z_i$ ($i=1, \ldots, N$) характеризуется натуральным
числом $M_i$, на\-зы\-ваемым ее максимальным уровнем и
определяющим уровень средств, отведенных для ее решения (по
исчерпании этих средств выдается отказ), целым неотрицательным
числом $m_i$, $m_i \leq M_i$, называемым текущим уровнем этой
задачи и определяющим уровень средств, среди которых в текущий
момент ведется поиск очередного пре\-об\-разования задачи $Z_i$, а
также вспомогательной информацией, необходимой для возобновления
прерванной процедуры решения задачи $Z_{i-1}$ по окончании решения
задачи $Z_i$.

 Текущий уровень задачи является одним из входных параметров,
получаемых приемами; он учитывается решающими правилами приемов и
позволяет организовать необходимые приоритеты в их применении: при
меньших значениях этого уровня срабатывают приемы с большим
приоритетом. В процессе обучения решающие пра\-вила приемов
корректируются таким образом, чтобы на каждом шаге выбирался
прием, наиболее целесообразный с точки зрения обучающего систему
эксперта. При первоначальном обращении к задаче $Z_i$ ее текущий
уровень равен 0.

Изменение текущей ситуации происходит в следующем рабочем цикле
решателя:

1) Происходит обращение к программе логического символа $f$ - типа
задачи $Z_N$. Если при этом не срабатывает ни один из приемов,
либо сработавшие приемы изменили лишь комментарии задач и ни один
из них не указал явно на необходимость повторного рассмотрения
задачи (в таких случаях говорим, что процедура не внесла
существенных изменений в текущую ситуацию), то переход к пункту 3,
иначе - к пункту 2.

2) Если в результате срабатывания приема определился ответ на
задачу $Z_N$ либо был выдан отказ на нее, то возобновляется
прерванный ранее прием решения задачи $Z_{N-1}$, в процессе
реализации которого возникла задача $Z_N$. При $N=2$ в этом случае
выдается ответ либо отказ на решаемую задачу и возвращение в
программу интерфейса решателя; при $N=1$ - происходит выход из
логической системы. При отсутствии ответа либо отказа на задачу
$Z_N$ текущий уровень этой задачи заменяется на 0, и переход к
пункту 1. Это означает, что при наличии существенных изменений,
внесенных приемом, решатель повторяет цикл анализа текущей
ситуации с самого начала.

3) Осуществляется последовательный просмотр всех условий и посылок
$F$ задачи $Z_N$, вес $v$ которых равен текущему уровню $m_N$ этой
задачи либо равен $m_N+1$. Сначала просматриваются условия, затем
посылки; порядок просмотра условий (по\-сылок) - слева направо по
соответствующим спискам задачи $Z_N$. Если $v=m_N$, то происходит
однократный просмотр всех вхождений логических символов $\varphi$
в $F$ (слева направо); если же $v=m_{N+1}$, то - серия таких
просмотров, в процессе которых значение текущего уровня задачи
$Z_N$ полагается последовательно равным $0,1, \ldots, m_N$. Для
каждого рассматриваемого вхождения логического символа $\varphi$ в
$F$ осуществляется обращение к программе логического символа
$\varphi$ (исходные данные этой программы содержат полную
информацию о координатах вхождения символа $\varphi$ в задачу
$Z_N$). Если процедура не внесла существенных изменений в текущую
ситуацию, то переход к рассмотрению очередного вхождения
логического символа, иначе - к пункту 2. Если просмотр терма $F$
закончился безрезультатно, то вес его увеличивается на 1 (новые
либо видоизмененные посылки и условия задачи получают вес 0). Если
просмотр всех условий и посылок задачи $Z_N$ закончился
безрезультатно, то текущий уровень задачи $Z_N$ увеличивается на
1. Если в результате он становится больше, чем максимальный
уровень $M_N$, то на задачу $Z_N$ выдается отказ, иначе - переход
к пункту 1.

Использование весов посылок и условий позволяет сузить область
просмотра при поиске очередного приема, исключая из нее посылки и
условия, имеющие большой вес (они уже были достаточно хорошо
рассмотрены ранее, и срабатывание связанного с ними приема
маловероятно). В результате происходит локализация рассмотрения
задачи, направляемого в первую очередь на новые либо
видоизмененные посылки и условия; рассмотрение же всей задачи в
целом имеет место, как правило, лишь на начальном этапе ее
решения. По мере повышения текущего уровня $m_N$ задачи $Z_N$ в
просмотр вовлекаются ранее отложенные посылки и условия $F$, вес
$v$ которых больше $m_N$; это происходит при $v=m_N+1$ (см. пункт
3), причем предварительно осуществляется поиск приема,
срабатывающего при рассмотрении $F$ для меньших, чем $m_N$,
значений текущего уровня. Переключение внимания при рассмотрении
за\-дачи может происходить также в результате срабатывания
приемов, уменьшающих веса тех или иных условий и посылок.

\section{Запуск решения задачи и его пошаго\-вый про\-смотр}

Запуск решения задачи происходит из просмотра списка задач
некоторого концевого раздела задачника. Войдя в этот список и
создав в нем новую задачу либо выбрав для решения одну из ранее
имевшихся задач, следует прежде всего добиться, чтобы верхняя
горизонтальная линия данной задачи была прорисована на экране, а
верхняя линия предыдущей задачи - не была видна на экране.
Альтернативный способ - выделение нужной задачи нажатием правой
кнопки мыши на ее поле (чтобы задача оказалась выделена, ее
верхняя горизонтальная линия опять же должна быть видна на
экране), после чего можно произвольно перемещаться по списку задач
и выполнять запуск выделенной задачи из любой его точки.

Если требуется получить ответ задачи без отображения процесса
решения, то нажимается клавиша "о" \ (кир.). Если на задачу будет
получен ответ, то он будет прорисован в верхней части экрана, с
указанием времени решения (в секундах либо минутах), а также с
указанием трудоемкости, измеряемой в числе шагов работы
интерпретатора языка ЛОС (этот язык нижнего уровня, используемый
для записи приемов, описывается в последующих разделах книги).
Ответ и трудоемкость сохра\-няются в файлах задачника и
впоследствии будут прорисовываться непосредственно под условием
задачи (время решения не сохраняется). Для исключения их из файлов
следует выделить задачу (правой кнопкой мыши) и нажать "Ctr-F4".
Если ответ на задачу не получен, то происходит перерисовка ее
текста с указанием под ним време\-ни, затраченного на решение.

Если нужно отображать процесс решения по шагам, то нажимается
клавиша "р" \ (кир.). Каждый последующий шаг обеспечивается
нажатием "Enter". Если в некоторый момент нужно оборвать пошаговое
отображение решения и далее решать задачу до получения ответа, то
нажимается клавиша "0" (ноль). Если нужно вообще прервать решени,
то нажимается клавиша "Esc", возвращающая к тексту задачи в
задачнике.

При показе очередного шага решения в верхней части экрана
прорисовывается описание текущего действия. Над этим описанием
отображается вся цепь задач (кро\-ме фиктивной исходной задачи)-
сначала идет выбранная из задачника задача (воз\-можно, измененная
в процессе решения по сравнению с ее первоначальной версией,
оставшейся в задачнике), затем вспомогательная задача, к которой
произошло обра\-щение от первой задачи, и т.д. Под последней
задачей этой цепи задач и размеща\-ет\-ся описание текущего
действия. При просмотре всех этих записей применяется та же
прокрутка, что и при просмотре списка задач в задачнике.

Отображаемые на экране задачи приводятся с теми же сокращениями,
что и в задачнике (для включения либо выключения полного просмотра
нажимается кла\-ви\-ша "ы"). Кроме того, в просматриваемой цепи
задач могут встречаться "замаски\-ро\-ванные" под задачи обращения
к вспомогательным процедурам (пакетным операто\-рам, см. описание
языка ГЕНОЛОГ), не являющиеся задачами. Такие вспомога\-тель\-ные
операторы введены из соображений оптимизации: каждый из них
содержит в себе сравнительно небольшое число приемов, и поиск
нужного приема в нем уско\-ря\-ется на порядок по сравнению с
поиском по всей базе приемов. Типы этих операторов аналогичны
типам задач: проверочный оператор является аналогом задачи на
дока\-зательство, нормализатор - ана\-логом задачи на
преобразование, синтезатор - ана\-логом задачи на описание и
анализатор - аналогом задачи на исследование.

Под кадром, содержащим описание текущего действия, могут быть
размещены несколько кадров со вспомогательными задачами - эти
задачи решались в процессе выполнения данного действия. Можно
повторно запустить решение любой из них - выделив ее либо
разместив ее верхнюю линию в верхней части экрана и нажав "Enter".
Эту процедуру можно применять любое число раз и внутри пошагового
просмотра решения вспомогательных задач - таким образом создается
подобие ги\-пер\-текста решения. Для возвращения на предыдущий
уровень данного гипертекста нажимается клавиша "End".

Комментарии к очередному действию решателя размещаются в скобках
после описания этого действия. Вспомогательные задачи,
сопровождающие текущее дей\-ствие, также снабжаются комментарием,
размещаемым в скобках перед описанием задачи. Иногда эти
комментарии специально подготовлены для объяснения приме\-ненного
приема, иногда они просто представляют собой подзаголовок того
раздела оглавления базы приемов, в котором размещен примененный
прием.

Если комментарий недостаточен для понимания выполненного действия
или во\-обще непонятен (такое может случиться, если комментарий
просто является подза\-головком концевого пункта оглавления
приемов - некоторые из этих подзаголовков понятны только в
контексте заголовков внешних разделов), то можно перейти к
просмотру описания сработавшего приема. Конечно, здесь понадобится
знакомство с языками, на которых задаются приемы решателя - ЛОСом
и ГЕНОЛ\'ОГом (им посвящены последующие разделы книги). Для этого
нажимается клавиша "б", пере\-водящая в просмотр приема (если
прием реализован на языке ГЕНОЛОГ) либо (если прием реализован на
языке ЛОС) переводящая в тот концевой пункт оглавления программ,
который связан с последней пройденной перед реализацией приема
кон\-трольной точкой. В обоих случаях можно также просмотреть
ЛОС-программу при\-мененного приема, нажав клавишу "ф" \ - она
переводит в отладчик ЛОСа. Для возвращения в просмотр текущего
действия решателя из просмотра описания приема на ГЕНОЛОГе следует
нажать клавишу "End". Для возвращения из просмотра ЛОС-программы
приема следует нажать клавишу "з".

При просмотре текущего шага решения можно посмотреть исходную
задачу в задачнике, не прерывая процесса решения. Для этого
достаточно нажать клавишу "Home"; возвращение к просмотру текущего
шага решения из задачника - по нажатии "End".

Если при пошаговом просмотре возник промежуточный результат,
представ\-ля\-ю\-щий самостоятельный интерес (даже в случае, когда
ответ на решаемую задачу так и не будет получен), то можно
выделить этот результат (целую формулу или ее часть, одну или
несколько) - так же, как это делалось в задачнике, перейти в
задачник (через "Home") и зарегистрировать выделенную формулу в
любой из задач или введя новый бланк задачи. Как и обычно, для
этого следует войти в формульный редактор и нажать "Insert" \ -
"N", где N - номер выделенного элемента среди всех выделенных
элементов; $1 \le N \le 9$. Далее можно нажать "End" и продолжить
просмотр шагов решения.

Если возникла необходимость прервать процесс пошаговой трассировки
решения некоторой задачи из цепи задач и перейти к очередному шагу
для ее надзадачи, то следует выделить (правой кнопкой мыши) данную
надзадачу и нажать "Enter". Тогда следующий отображаемый на экране
шаг будет относиться уже к выбранной надзадаче.

Если требуется прервать затянувшийся шаг решения задачи, то
нажи\-ма\-ется кла\-виша "Break". В результате появится текст
теку\-щего выполняемого фрагмента ЛОС-программы, в котором
теку\-щий (еще не выполненный) оператор выделен малиновым цветом.
Далее возможен анализ текущей ситуации с помощью средств отладчика
ЛОСа (см. последующие разделы) либо возвращение в главное меню при
нажатии клавиши Esc. Можно также просмотреть текущую цепь задач
(нажатием клавиши "з") либо (до нажатия "з" либо вернувшись из
просмотра цепи задач в ЛОС-про\-грам\-му нажатием "ф") запустить
процесс пошаговой трассировки на уровне той задачи, которая при
прерывании оказалась текущей. Это делается нажатием клавиш
"пробел" \ и "Enter".

Иногда пошаговый просмотр решения оказывается неудобен из-за того,
что на некотором этапе начинается решение трудоемкой
вспомогательной задачи, обращение к которой не было вынесено в
самостоятельный шаг. Разумеется, по завершении этого решения и
отображении срабатывания приема, в рамках которого оно
происходило, решение вспомогательной задачи можно повторить для
ознакомления с подробнос\-тями. Однако, длительная пауза из-за
неотображаемого процесса решения может оказаться нежелательной. В
таких случаях можно повторно запустить пошаговый просмотр решения,
изменив его режим непосредственно перед появлением паузы. Для
выбора нужного режима трассировки следует нажать клавишу "т" \
(это делается либо до запуска решения, из задачника, либо уже в
начатом процессе трассировки). После нажатия появляется диалог
установки режима.

Для ввода либо отмены условия на трассировку, определяемого в
одном из пунк\-тов диалога, следует переместить курсор мыши внутрь
прямоугольника этого пункта и нажать левую клавишу мыши (наличие
плюса справа от прямоугольника означает, что условие включено,
иначе - выключено). После выбора необходимой комбинации условий,
курсор мыши перемещается в прямоугольник "Ввести" и снова
нажимается левая клавиша мыши.

Для преодоления указанных выше пауз можно воспользоваться пунктом
"ручной выбор входа в подпроцесс". Если этот пункт активирован, то
каждая попытка обра\-щения решателя к вспомогательной задаче
(включая наиболее крупные пакетные операторы) будет вводиться на
экран. Чтобы продолжить решение без входа в поша\-говую
трассировку этой вспомогательной задачи, нажимается "Enter" \
;чтобы войти в нее, нажимается "Сtr-Enter". Заметим, что в этом
режиме текущее действие решате\-ля не сопровождается выдачей
списка вспомогательных задач, решенных для его выполнения -
сообщения об обращениях к этим задачам уже выдавались на экран до
соуществления действия, и была возможность просмотреть их решение
по шагам. Недостатком режима с ручным входом в подпроцессы
является чрезмерное количес\-тво выдаваемых на экран сообщений о
попытках решения вспомогательных задач, б\'ольшая часть которых
оказывается неудачной. Действительно ценные шаги тонут в этом
потоке сообщений. Поэтому данный режим является лишь техническим,
в обычных ситуациях отключенным.

Отладочные режимы трассировки описываются в разделе, посвященном
отладчи\-ку ЛОСа. С помощью этих режимов можно, в частности,
обеспечить прерывание процесса решения при попытке применения
заданного приема, что часто использу\-ет\-ся при оптимизации его
решающих правил.

Возможен серийный запуск решения задач из задачника. Такой запуск
бывает необходим для контроля за изменениями в поведении решателя
при его обучении. Простейшая форма этого запуска - выбор в
оглавлении задачника нужного подраз\-де\-ла и нажатие клавиши
"Ctr-з" \ либо клавиши "Ctr-э". В первом случае из цик\-ла решения
будут исключены все задачи, которые при предыдущем запуске
решателем не были решены; во втором случае будут решаться все
задачи подряд.

При серийном решении последовательно решаются сначала все задачи
из текуще\-го пункта просматриваемого меню (выделенного в момент
запуска) оглавления задач\-ни\-ка, затем - все задачи из
следующего пункта этого меню, и т.д. до конца подраздела. На
экране при этом последовательно сменяются формулировки решаемых
задач. Если решатель слишком долго решает какую-либо задачу
(возможно, "залипает" на ней из-за плохих решающих правил), то
последовательное нажатие клавиш "Break" \ и "Esc" \ переводит в
решение следующей задачи. Если до конца решения всех задач
подраздела произойдет "зависание" программы и понадобится ее
перезапуск, то после перезапуска автоматически восстанавливается
прерванный цикл решения задач - вплоть до достижения конца меню.

Для обрыва серийного режима следует нажать клавишу "Break" \ (на
экране поя\-вит\-ся фрагмент ЛОС-программы, в котором произошло
прерывание, и установится пошаговый режим отладочной трассировки),
и далее - нажать клавишу "Ctr-з". Лишь после этого нажатие клавиши
"Esc" выведет в главное меню.

По окончании серийного запуска обновляется статистика о
результатах решения задач подраздела. Такая статистика позволяет
находить "особые точки" в задачнике (например, выявлять задачи,
которые перестали решаться или решение которых замедлилось после
внесенных в приемы изменений). Для просмотра статистики сле\-дует
войти в меню нужного подраздела и нажать клавишу "з". После
небольшой паузы, необходимой для просмотра всех задач подраздела,
на экране возникает таб\-лица, в которой указываются следующие
сведения:

а) Пять наибольших величин замедления в решении задач по сравнению
с пре\-ды\-дущим запуском. Эти величины измеряются в числе шагов
интерпретатора ЛОСа, как и величины трудоемкости решения задач,
сохраняемые в задачнике - отсюда легко извлекается процент
замедления. Если нужно просмотреть имеющие самые большие значения
замедления задачи, то нажимается клавиша "з", переводящая в
просмотр первой из этих задач. Переход к очередной задаче
(отобранные для просмотра задачи упорядочены по убыванию
замедлений) осуществляется нажатием клавиши "ш". Для просмотра в
таком режиме отбира\-ют\-ся не более 40 задач подраз\-де\-ла (это
же ограничение распространяется на дру\-гие приводимые ниже случаи
отбора серий задач).

б) Число нерешенных задач раздела. Для просмотра этих задач
нажимается клавиша "н". Чтобы перейти к просмотру очередной
нерешенной задачи, следует нажать "ш".

в) Число утерянных решений задач подраздела (только по сравнению с
пред\-по\-след\-ним циклом решения). Для просмотра серии таких
задач сначала нажимается "у", и далее - через нажатия "ш".

г) Пять наибольших величин ускорения в решении задач. Просмотр
задач с ус\-ко\-рив\-шимся решением - через нажатие клавиши "с",и
далее к каждой следующей задаче - через нажатие "ш".

д) Суммарное замедление в решении задач подраздела (отрицательная
его ве\-ли\-чи\-на означает суммарное ускорение).

е) Число изменившихся по сравнению с предпоследним циклом решения
ответов на задачи подраздела. Для просмотра серии соответствующих
задач сначала на\-жи\-ма\-ется клавиша "и", и далее - через
нажатия "ш".

ж) Число сомнительных ответов. Для просмотра серии соответствующих
задач - нажатие "о", и далее - через "ш".

з) Число задач, замедлившихся более чем на 10000 шагов
интерпретатора ЛОСа, и число задач, замедлившихся более чем на
100000.

и) Можно просмотреть список всех ответов на задачи подраздела. Для
этого нажимается клавиша "О". Если на выделенном ответе нажать
клавишу "курсор вправо", то происходит переход к просмотру условия
соответствующей задачи.

к) Пять наибольших величин трудоемкости решения задач подраздела (
в числе шагов интерпретатора). Для просмотра задач в порядке
убывания трудоемкости (не более 40 задач) - нажатие "т", и далее -
через "ш".

Серийный запуск позволяет косвенно оценивать "холостой ход" \
приема - сум\-мар\-ную трудоемкость попыток его применения, не
приводивших к срабатыванию приема. Фактически здесь оценивается
относительная трудоемкость попыток при\-ме\-нения приема на одно
его срабатывание. Чтобы получить такую статистику, требу\-ет\-ся
запустить серийное решение не через "Ctr-з", а через "Ctr-х"
(кир.). Тогда в указан\-ной выше таблице статистики будут
отображены данные о пяти наихудших случаях такой относительной
трудоемкости ("холостого хода"). Эти данные суть пары (суммарная
трудоемкость попыток применить прием - число срабатываний приема),
для которых отношение первого элемента ко второму (если второй
равен 0, то вметсо него берется 1) наибольшее. Возможен просмотр
серии наихудших приемов (по убыванию ука\-зан\-ной характеристики)
- через нажатие клавиши "х" (кир.). Пе\-ре\-ход к каждому
очередному приему - через "ш". При просмотре приема повторный
вызов на экран указанной пары чисел - через "Х" (кир.); пара
($A_1,A_2$) прорисовы\-ва\-ет\-ся в виде двух термов -
"пассив($A_1$)" и "актив($A_2$)".

\section{Диалоговые задачи}

Для большего единообразия интерфейса системы, различные процедуры
диалогового характера (построение графиков и моделей, игровые
процессы и т.п.) реализуются в виде фиктивных задач, причем запуск
этих процедур происходит так же, как запуск настоящих задач -
путем нажатия клавиши "о". Перечисленные выше режимы трассировки
при этом обычно не используются. Ниже перечисляются интерфейсы
диалога для задач таких типов.

\subsection{Построение графиков}

Задача на построение графика оформляется как задача на
преобразование, условием которой служит то выражение, для которого
нужно построить график. Целевая установка ее вводится, как указано
выше, через оглавление типов целевых установок. После нажатия
клавиши "о" под условием возникает информационная полоса, в
ко\-то\-рой содержатся либо тексты "переменная", "от", "до", $x_1,
\ldots, x_n$ (если выражение имеет более одной переменной и $x_1,
\ldots, x_n$ - все его переменные), либо тексты "пе\-ре\-менная
$x$", "от", "до", $x$ - если выражение имеет всего одну
переменную. Эти тексты представляют собой заготовки указателей
варьируемой переменной, нижней и верхней границ диапазона ее
изменения, а также список переменных - для различных операций,
требующих выбора переменной.

Если переменных более одной, то под информационной полосой
прорисовывается текст "переменная:", после которого размещается
курсор формульного редактора. Этим редактором требуется ввести
варьируемую переменную и нажать "Enter"\ (в случае единственной
переменной выбор варьируемой переменной производится
ав\-томатически, и в информационной полосе она уже указана). Далее
под полосой появляется сначала текст "от:", после которого
формульным редактором вводится число - нижняя граница диапазона
изменения варьируемой переменной, а затем "до:"\ - верхняя граница
этого диапазона. Введенные значения границ диапазона переносятся в
информационную полосу - после соответствующих указателей "от",\\
"до". Если пе\-ре\-менных больше одной, то после указания границ
диапазона под полосой последовательно прорисовываются оставшиеся
переменные, для каждой из которых формульным редактором вводится
ее численное значение. После ввода зна\-чения последней из
переменных под информационной полосой прорисовывается гра\-фик. Он
ограничен двумя координатными шкалами - вертикальной (размещенной
слева) и горизонтальной (размещенной снизу). Масштабы на этих
шкалах изначально выбираются автоматически (обычно это делается
так, чтобы наибольшее и наимень\-шее значения на рассматриваемом
диапазоне занимали крайние верхнюю и нижнюю точки области экрана,
отведенной для графика). После того, как график прорисован, с ним
можно выполнять следующие операции:

1) Клавишами "курсор вправо - курсор влево" можно перемещать
промежуток значений варьируемой переменной с сохранением масштаба.
Клавишами "курсор вверх - курсор вниз" можно сдвигать график вверх
либо вниз, если интересующие участки его оказались вне экрана (как
и горизонтальное перемещение, это происходит с сохранением
масштаба).

2) Если нужно изменить масштаб по вертикали, то прежде всего можно
исполь\-зовать клавиши "в" и "н". После нажатия первой из них под
информационной полосой появляется окно диалога "Верхняя граница
значений:", в котором формульным ре\-дак\-тором вводится
наибольшее прорисовываемое на экране значение. Аналогично, клавиша
"н" активизирует окно "Нижняя граница значений:".Чтобы
восстановить исходный (автоматически выбранный масштаб),
нажимается клавиша "а".

3) Чтобы изменить наибольшее либо наименьшее из отображаемых на
экране значений, можно также воспользоваться мышью. Ее курсор
подводится к верхней либо нижней части экрана слева от
вертикальной координатной оси. Нажатие левой кнопки приведет к
уменьшению диапазона просматриваемых значений на 20 про\-цен\-тов
с выбранной (верхней либо нижней) стороны, нажатие правой кнопки -
к его увеличению на 20 процентов.

4) Для выбора новой переменной, по которой строится график, нужно
подвести курсор мыши к надписи "переменная" в информационной
полосе и нажать левую кнопку. Далее формульным редактором вводится
переменная.

5) Для выбора диапазона значений переменной нужно подвести курсор
мыши либо к надписи "от", либо к надписи "до", нажать левую кнопку
и далее ввести формульным редактором начало либо конец диапазона
значений переменной. Можно увеличивать цифры для границ диапазона
непосредственно мышью. Для этого нужно подвести курсор мыши к
нужной цифре и нажать либо левую клавишу (уменьшение данного
разряда на 1), либо правую клавишу (увеличение его на 1).

6) Для указания значения параметра выражения, отличного от
варьируемой пе\-ре\-менной, следует подвести курсор мыши к
обозначению этого параметра в информа\-ционной полосе и нажать
левую кнопку. Далее формульным редактором вводится значение
параметра. Как и границы диапазона, значение параметра можно
менять непосредственно мышью.

7) Можно выделить для просмотра любой прямоугольник внутри
отображаемой области графика. Для этого следует активизировать
пункт меню "Рамка", и далее сначала выбрать нажатием левой клавиши
мыши левый верхний угол прямоуголь\-ни\-ка, а затем нажатием
правой клавиши мыши - правый нижний его угол. Для выделения границ
прямоугольника прорисовываются синие линии. Повторными
на\-жа\-тиями указанных клавиш мыши можно корректировать их
положение. Далее следует снова активизировать пункт "Рамка" -
область внутри выбранного прямоуголь\-ни\-ка отобразится на всем
экране. Для отмены просмотра прямоугольника (во время выбора его
границ или после выхода в его просмотр) активизируется пункт
ме\-ню "Отмена" (либо нажимается клавиша пробела). Если
последовательно выбиралось несколько подпрямоугольников, то каждое
нажатие "Отмена" возвращает к пре\-ды\-дущей картинке в цепочке.

8) Для уточнения координат точки на графике можно перейти в режим,
в котором от выбранной точки к вертикальной и горизонтальной
шкалам ведут отрезки прямых, выделенные голубым цветом.
Одновременно в углу графика прорисовываются зна\-чения абсциссы и
ординаты точки. Для перехода в данный режим следует сначала нажать
левую кнопку мыши на пункте меню "Точка", после чего нажать левую
кнопку мыши на выбранной для просмотра точке графика. После того,
как режим просмотра абсциссы и ординаты текущйе точки уже
установлен, можно менять по\-ло\-жение этой точки - либо используя
клавиши "курсор вправо" \ - "курсор влево" (для сдвига на один
пиксел), либо нажимая левую кнопку мыши в нужной точке. Для выхода
из режима повторно нажимается левая кнопка мыши на пункте меню
"Точка".

9) Выход из работы с графиком - "Esc".

\section{Упражнения по вводу и решению за\-дач}

Ввести перечисленные ниже задачи в соответствующие разделы
задачника и просмотреть процесс их решения.

\subsection{Элементарная алгебра}

\begin{enumerate}

\item Упростить выражение:
$$\sqrt{\frac{4}{x}+\frac{1}{4x^{-1}}-2}+
\sqrt{\frac{1}{4x^{-1}}+\frac{2^{-2}}{x}+\frac{1}{2}}$$

\item Решить уравнение:
$$\frac{x^2}{x+2}+1 = \frac{4}{x+2}$$

\item Решить неравенство:

$$\frac{\sqrt{x^2+x-6}+3x+13}{x+5} > 1$$

\item Решить систему уравнений:

$$
  \left\{
    \begin{array}{rcl}
    (x+y)(x^2-y^2)&=&16 \\
    (x-y)(x^2+y^2)&=&40.\\
    \end{array}
  \right.
$$

\item Решить уравнение:

$$ (tg x) ^ {\cos^2 x} = (ctg x) ^ {\sin x}$$

\item Решить неравенство:

$$ |x-2|^{\log_4(x+2)-\log_2 x} < 1 $$

\item Для всех $a$ решить неравенство $ ax^2 +(a+1)x+1 > 0 $.

\item При каких $a$ неравенство $ \sin^6 x + \cos^6 x +a\sin x
\cos x \ge 0$ выполнено для всех значений $x$ ?

\item Найти все $a$, при которых из неравенства
$x^2-a(1+a^2)x+a^4<0$ следует неравенство $x^2+4x+3>0$.

\item При каких $a$ система
 $$ \left\{
    \begin{array}{rcl}
     x^2 + y^2&=&2(1+a) \\
     (x+y)^2&=&14 \\
    \end{array}
  \right.
 $$
 имеет ровно два решения ?

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Находясь в главном меню, выбрать пункт "Оглавление
задачника" \ (клавиша "з" \ либо левая кнопка мыши в
прямоугольнике указанного пункта). Используя клавиши курсора,
найти в корневом меню оглавления раздел "Элементарная алгебра" \
(возможно, сначала понадобится несколько раз нажать "курсор
вле\-во"). Войти в этот раздел, далее войти в подраздел "Упрощение
выражений", затем - в любой из подразделов "Упрощение
иррациональных выражений - 1,2,3". В действительности выбор
раздела несущественен; решатель будет ра\-бо\-тать вне зависимости
от того, в каком разделе находится задача, и клас\-си\-фикация
задач по разделам нужна лишь для упрощения поиска нужной задачи
вручную. Используя "PageDown" \ либо "курсор вниз", вывести на
экран последний пункт выбранного концевого раздела (все его пункты
- номера с тремя штрихами). Затем нажать клавишу "к" \ (кир.) для
создания бланка новой задачи. Далее нажимается "ц" \ и в
оглавлении типов целевых установок вы\-би\-ра\-ются разделы
"Преобразовать выражение" \ - "Упростить выражение в области
допустимых значений", причем после выбора последнего пункта
нажимается "курсор вправо". Экран расчищается, и в верхней его
части возникает текст "Упростить в о.д.з. выражение:". Далее
нажимается "Enter", и формульным редактором вводится упрощаемое
выражение. В процессе набора можно по\-лу\-чать справки о
клавиатуре формульного редактора, нажимая F1. Точнее, нажатие F1
переводит в общее оглавление справочника по системе, и из его
корневого меню нужно перейти в раздел "Формульный редактор". Далее
полез\-но прочитать раздел "общие сведения"; для получения
информации о вводе конкретных символов - переходить в
соответствующие подразделы. Чтобы вер\-нуться в набор формулы,
достаточно нажать "End". По завершении набора упрощаемого
выражения нажимается "Enter". В данном примере задача
ока\-зы\-вается полностью введенной, и для решения ее без
пошаговой трассировки нажимается "о" \ (кир.), а для входа в
пошаговую трассировку (она отображает лишь верхний уровень
процесса решения - срабатывания приемов; такую трас\-си\-ров\-ку,
в отличие от отладочной трассировки, называем далее семантической)
нажимается "р". Каждый очередной шаг трассировки - нажатие
"Enter". Если в некоторый момент под кадром, поясняющим текущее
действие, оказываются расположены другие кадры, то эти последние
суть кадры обращений к вспо\-мо\-га\-тель\-ным задачам, решавшимся
для выполнения текущего действия. Можно выбрать любой из них для
детального просмотра решения вспомогательной задачи. При этом
верхняя отделяющая линия кадра должна быть в точности верхней
границей экрана; такое выравнивание обеспечивается клавишами
"Ctr-курсор вверх либо вниз". Вход в решение вспомогательной
задачи - нажатие "Enter". По завершении трассировки решения
вспомогательной задачи нажатие "Enter" возвращает на предыдущий
уровень (такое возвращение можно обес\-печить в процессе
трассировки нажатием "End").

\item Действия аналогичны предыдущим, но выбирается раздел
"Элементарная ал\-геб\-ра" \ - "Решение уравнений" \ -
"Рациональные уравнения 1,2". Нажимаются "к","ц", и выбирается
раздел оглавления целевых установок "Найти значения неизвестных" \
- "Получить полное явное описание значений неизвестных". На экране
появляется текст "Найти", под которым размещен курсор формульного
редактора. Этим редактором вводятся неизвестные задачи (отделенные
запя\-той) - в данном примере единственная переменная $x$. После
нажатия "Enter" ввод целевой установки завершается. Для ввода
уравнения снова нажи\-ма\-ет\-ся "Enter", и далее происходит набор
уравнения.

\item Действия аналогичны предыдущим, но выбирается подраздел для
неравенств.

\item Для вводы системы уравнений и (или) неравенств сначала
вводится целевая установка (аналогично предыдущему, но число
неизвестных может быть более одной). Затем по отдельности вводятся
условия - уравнения и неравенства; ввод каждого нового условия
начинается с "Enter" \ и завершается "Enter". После ввода
последнего условия задача готова к запуску решателя.

\item Аналогично задаче 2; тригонометрические операции вводятся
последователь\-ным набором двух (в особых случаях трех) первых
латинских букв обозначения этих операций: синус - s,i; косинус -
c,o; тагенс - t,g; котангенс - c,t, и т.д. Заметим, что степень
тригонометрической операции набирается нестандартным образом:
сначала набирается вся операция, затем - курсор вверх, затем -
пока\-за\-тель степени и "Enter". Тригонометрическая операция
относится к наимень\-ше\-му расположенному после нее осмысленному
выражению (суммы и произведе\-ния под такой операцией следует
заключать в скобки), и степень оказыва\-ет\-ся относящейся не к
аргументу операции, а ко всей операции.

\item Аналогично задаче 3; вертикальные отрезки модуля вводятся с
помощью кла\-виш "Ctr-м" \ (лат.), для ввода логарифма
последовательно вводятся буквы l,o, после чего набирается
основание логарифма. После набора основания нажима\-ет\-ся
"Enter", и набирается выражение под логарифмом (суммы и
произведения следует заключать в скобки).

\item Аналогично предыдущей задаче; параметр $a$ не включается в
число неизвестных задачи, и никак более не выделяется.

\item Неизвестной задачи служит переменная $a$. Условие ее
набирается в виде $$\forall_x (x -\mbox{число}\rightarrow \sin x^6
+ \cos x^6 +a\sin x \cos x \ge 0).$$ Для ввода "$x -
\mbox{число}$" \ сначала вводится $x$, затем нажимается /, затем
"ч".

\item Аналогично предыдущему; условие набирается в виде:
$$\forall_x (x^2-a(1+a^2)x+a^4<0 \rightarrow x^2+4x+3>0.$$
Заметим, что понятие "следует" \ здесь трактуется таким образом,
что если левая от стрелки часть ложная (в частности, неравенство
слева вообще не имеет решений), то вся импликация истинна. Это
приводит к тому, что концевые точки указанного в ответе промежутка
(для них левое неравенство не имеет решений) отнесены к ответу.

\item Условие задачи состоит в том, что множество пар $(x,y)$,
удовлетворяющих уравнениям, имеет мощность 2. Оно записывается в
виде $$ card(set_{xy}(x^2 + y^2=2(1+a) \ \& \ (x+y)^2=14))=2.$$

\end{enumerate}

\subsection{Планиметрия}

\begin{enumerate}

\item Основание равнобедренного треугольника равно $a$, угол при
вершине равен $b$. Найдите биссектрису, проведенную к боковой
стороне.

\item В трапеции $ABCD$ с основаниями $AD$ и $BC$ имеем $AD=3$,
$BC=1$. Точка $P$ лежит на стороне $AB$, а точка $Q$ - на стороне
$CD$, причем отрезок $PQ$ параллелен основаниям и проходит через
точку пересечения диагоналей тра\-пе\-ции. Найти длину отрезка
$PQ$.

\item Известно, что $ABCD$ - ромб и радиусы окружностей, описанных
около тре\-у\-голь\-ников $ABC$ и $ABD$ соответственно, равны $R$
и $r$. Найти площадь ромба $ABCD$.

\item В параллелограмме $ABCD$ биссектриса угла $BAD$ пересекает
сторону $CD$ в точке $M$, причем $DM/MC=2$. Известно, что угол
$CAM$ равен $a$. Найти угол $BAD$.

\item Окружность проходит через вершины $A$ и $C$ треугольника
$ABC$, пересекает сторону $AB$ в точке $D$ и сторону $BC$ в точке
$E$. Известно, что $AD=5,AC=2\sqrt{7},BE=4, BD/CE = 3/2$. Найти
угол $CDB$.


\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Вычислительные задачи по геометрии вводятся в следующем
порядке: сначала набираются посылки задачи, перечисляющие
известные свойства чертежа; за\-тем вводится целевая установка
задачи; затем указываются неизвестные ве\-ли\-чи\-ны, которые
должны быть вычислены. Перед набором посылок можно ввести чертеж,
однако чертеж может быть создан системой и автоматически (по
окончании набора задачи нажимается "Ctr-ч").

При наборе посылок следует обязательно обозначить все точки,
участвующие в задаче, буквами (обычно большими; можно использовать
натуральные индек\-сы). Ссылаться на плоские фигуры (треугольники,
многоугольники, окруж\-нос\-ти, прямые, и т.д.) можно только через
их "базисные" \ точки. В нашем случае обозначим вершины
треугольника буквами $A,B,C$ и введем первую посылку
"$\triangle(ABC)$". Для ввода посылки нажимается "Enter", затем
последовательно нажимаются клавиши "т","р" (обычно используются
первые две буквы вво\-ди\-мо\-го понятия). Это приводит к
прорисовке символа $\triangle$ с расположенной после него
открывающей скобкой. Далее последовательно нажимаются $A$,$B$,$C$
и закрывающая скобка, после чего - завершающее набор формулы
"Enter". Никакие разделители между буквами не ставятся. Заметим,
что если в обоз\-на\-че\-нии треугольника либо другой фигуры
используется буква с индексом, то после такой буквы, перед набором
следующей, обязательно нужно нажать на клавишу "умножение"\
(звездочка).

После ввода первой посылки (она указывает только на то, что три
точки $A,B,C$ образуют вершины некоторого треугольника, то есть не
лежат на одной прямой) нужно ввести посылку, определяющую, что
треугольник равнобедренный. Вы\-бе\-рем в качестве основания
треугольника вершины $A,C$ и введем посылку $l(AB) = l(BC)$. Для
обозначения расстояния дважды нажимается клавиша "l", что приводит
к появлению рукописной латинской буквы $l$ с идущей после нее
открывающей скобкой. Затем (как в обозначении треугольника) подряд
вводятся буквы для точек, между которыми рассматривается
расстояние, и ставится закрывающая скобка.

Далее вводятся: посылка $l(AC)=a$, обозначающая длину основания
треуголь\-ника через $a$, и посылка $\angle(ABC) = b$ - для
величины угла при основании. Чтобы получить обозначение угла,
последовательно нажимаются клавиши "у","г". Далее - как для
обозначения треугольника. Как и обычно, вершина угла
раз\-ме\-ща\-ет\-ся в обозначении угла посередине.

Для ввода основания $D$ биссектрисы треугольника $ABC$,
проведенной из угла $BAC$, можно использовать посылку
"Биссектреуг($BACD$)". Другой способ (бо\-лее громоздкий, но не
использующий специального обозначения "Биссектреуг") - пара
посылок "$D \in \mbox{прямая}(BC)$", "биссектриса($BACD$)". В
первом случае нажимаем "И","Т", и далее - как в случае обозначения
треугольника, но для четырех букв. Во втором случае сначала вводим
$D$, затем нажимаем пробел, $b$, $e$ (лат.; появляется символ
$\in$). Далее нажимаем "п","р" \ (кир.; появляется слово "прямая"
\ с открывающей скобкой), вводим буквы $B,C$ и закрывающую скобку.
Для ввода "биссектриса($\ldots$)" \ нажимаем клавиши "и","т".

На этом ввод посылок завершен. Для ввода целевой установки
нажимаем кла\-ви\-шу "ц", переводящую в оглавление типов целевых
установок. Из корневого меню этого оглавления переходим к пункту
"Найти значения неизвестных" \ - "Выразить значения неизвестных
через заданные параметры". Заметим, что применявшийся в
элементарной алгебре пункт "Получить полное явное описа\-ние
значений неизвестных" \ в планиметрических задачах на вычисление
НЕ следует использовать. Это объясняется принципиальным различием
понятий "известная" \ и "неизвестная" \ в задачах из двух этих
разделов. В элементарной алгебре все переменные из списка посылок
по умолчанию считались известными и могли входить в ответ задачи.
В геометрической задаче на вычисление посыл\-ки содержат
обозначения точек $A,B,C,\ldots$, которые не должны появляться в
ответе. Соответственно различаются и типы выбираемых целевых
установок. После выбора указанного типа целевой установки
нажимается "курсор вправо". Далее сначала вводится буква (или
несколько отделенных запятыми букв) для неизвестной (неизвестных)
и нажимается "Enter". Затем вводятся разделенные запятыми буквы
для известных числовых параметров, через которые должны быть
выражены неизвестные (если таких параметров вообще нет, сразу
на\-жи\-ма\-ет\-ся "Enter", иначе оно нажимается после ввода
параметров). В нашем примере обозначим неизвестную длину
биссектрисы через $x$; параметры суть $a,b$.

После ввода целевой установки вводим равенства, связывающие
неизвест\-ные (переменные) с теми выражениями, которые они
обозначают и которые нужно вычислить. В ответ войдет сама
неизвестная, а не обозначаемое ею выражение.

Как уже говорилось выше, после ввода задачи по планиметрии можно
ввести чертеж - либо попробовать сделать это автоматически
(нажатием "Ctr-ч"), либо ввести чертеж вручную (нажать "ч" \ и
далее воспользоваться геометрическим редактором; чертеж появится
перед списком посылок, в начале задачи). Можно также
скорректировать вручную чертеж, созданный автоматически (вход в
редактирование уже созданного чертежа - снова через "ч"; удаление
чертежа - выделить его левой кнопкой мыши и нажать "Ctr-Del").

\item Напомним, что в решателе предусмотрены два варианта
обозначения трапеции: "трапеция($ABCD$)" \ и "Трапеция($ABCD$)" \
- первый из них для случая трапеции с большим основанием $AD$ и
острыми углами при основании; второй - для случая, когда углы при
основании не обязательно острые. В обоих случаях указанные записи
предствляют собой даже не обозначения трапеции, а лишь утверждения
о том, что точки $A,B,C,D$ являются вершинами соответствующей
трапеции. Сама трапеция (как и любой другой четырехугольник)
обозначается посредством выражения "фигура($ABCD$)". В нашем
примере годится любой из указанных способов записи. Например,
введем посылку "трапеция($ABCD$)". Затем вводятся посылки
$l(AD)=3,l(BC)=1$. Принадлежность точки $P$ стороне $AB$, а точки
$Q$ - стороне $CD$, записываются в виде $P \in
\mbox{отрезок}(AB)$, $Q \in \mbox{отрезок}(CD)$. Параллельность
отрезка $PQ$ основаниям трапеции запи\-сы\-ва\-ется как
$\mbox{прямая}(PQ) \| \mbox{прямая}(AD)$. Чтобы сформулировать
условие о том, что отрезок $PQ$ проходит через точку пересечения
диагоналей трапеции, нужно ввести обозначение для этой точки.
Например, обозначим ее через $M$. То, что $M$ является точкой
пересечения диагоналей, записываем как $M \in \mbox{прямая}(AC)$,
$M \in \mbox{прямая}(BD)$. Далее добавляем посылку $M \in
\mbox{отрезок}(PQ)$. На этом ввод посылок завершается. Как и в
предыдущей задаче, выбираем целевую установку и вводим
единственное условие $x = l(PQ)$ для неизвестной $x$.

\item Начинаем со ввода посылки "ромб($ABCD$)". Так как в задаче
речь идет об описанных окружностях, надо ввести обозначения для
этих окружностей, то есть обозначить центр окружности и выбрать
какую-либо точку на окружности (в планиметрии ссылки на окружности
могут быть только такими). Например, обозначим центры через $M,N$.
В случае описанной окружности, которая дол\-жна проходить через
вершины треугольника, в качестве второй точки можно взять
какую-либо вершину треугольника (например, $A$). Тогда добавятся
по\-сыл\-ки "окружность($MA$) \ описана около фигура($ABC$)";
"окружность($NA$) \ опи\-сана около фигура($ABD$)". Заметим, что
хотя эти тексты кажутся до\-ста\-точно длинными, набираются они
весьма малым числом нажатий клавиш: сна\-чала нажимаем "о","к" \
(кир.) - появляется слово "окружность" \ с открывающей скобкой.
Затем вводим буквы $M,A$ и закрывающую скобку. Далее нажимаем
"Ctr-ф" \ - появляются слова "описана около". Наконец, нажимаем
"ф","и" \ - появляется слово "фигура" с открывающей скобкой. В
заключение вводим $A$,$B$,\ $C$ и закрывающую скобку. Радиусы
окружностей указываем с помощью посылок $l(MA)=R,l(NA)=r$. При
вводе целевой установки указываем, что значение неизвестной $x$
должно быть выражено через $R,r$. Наконец, набираем условие $x =
S(\mbox{фигура}(ABCD))$. Заметим, что знак площади $S$ здесь
вводится дву\-крат\-ным нажатием малой латинской буквы $s$; если
его ввести нажатием клавиши большой латинской $S$, то задача
окажется набранной неверно и не будет решена (вместо площади
окажется введенным значение какой-то неопределенной фун\-кции
$S$).

\item Вводятся посылки "параллелограмм($ABCD$)",
"биссектриса($BADM$)", $M \in \mbox{отрезок}(CD)$,
$l(DM)/l(MC)=2$, $\angle(CAM)=a$. Затем выбирается целевая
установка "Выразить $x$ через $a$", и вводится условие $x =
\angle(BAD)$.

\item Вводятся посылки $\triangle(ABC)$, $C \in
\mbox{окружность}(PA)$, $D \in \mbox{окружность}(PA)$, $D \in
\mbox{отрезок}(AB)$, $E \in \mbox{окружность}(PA)$, $E \in
\mbox{отрезок}(BC)$, $l(AD)=5, l(AC)=2\sqrt{7}, l(BE)=4,
l(BD)/l(CE) = 3/2$. Затем вводятся целевая установка и условие $x
= \angle(CDB)$.

\end{enumerate}

\subsection{Математический анализ}

\begin{enumerate}

\item Вычислить производную функции
$$\frac{e^{-x^2}\arcsin(e^{-x^2})}{\sqrt{1-e^{-2x^2}}} +
\frac{1}{2}\ln(1-e^{-2x^2})$$

\item Вычислить предел функции
$$(2e^{\frac{x}{x+1}}-1)^{\frac{x^2+1}{x}}$$
при $x \to 0$.

\item Исследовать поведение функции $y = (x-5)\sqrt[3]{x^2}$.

\item Найти точки экстремума для функции $y = x^2 - ln(x^2)$.

\item Исследовать на непрерывность функцию $y= \arctg(1/x + 1/x-1
+ 1/x-2)$.

\item Найти неопределенный интеграл $$\int \frac{2\sin x - \cos x
+ 3}{3\sin x + \cos x +1}dx$$

\item Вычислить определенный интеграл $$\int_0^{ln 2} \sqrt{e^x -
1}dx $$

\item Вычислить двойной интеграл от $\sqrt{|x-y^2|}$ по области
$(x,y): |y| \le 1, 0 \le x \le 2$.

\item Найти площадь области, заключенной между параболой $y^2 =
\frac{b^2}{a}x$ и прямой $y = \frac{b}{a}x$; $0<a,0<b$.

\item Найти объем тела $x^2 \le ay \le  bx, x^2+y^2 \le hz \le
2x^2 +2y^2$; $0<a,0<b,0<h$.

\item Найти площадь поверхности $z=xy, x^2+y^2 \le R^2$.

\item При каких значениях параметра $p$ \ сходится ряд
$$\sum_{i=1}^\infty \frac{1}{i^p}\sin \frac{\pi}{i}? $$

\item Разложить в ряд Тейлора по переменной $x$ в точке 0 функцию
$$y = (x - \tg x)\cos x$$

\item Разложить в ряд Фурье на отрезке $[-\pi,\pi]$ функцию $y =
(\pi^2 - x^2)^2$.

\item Найти сумму ряда
$$\sum_{n=1}^\infty\frac{3n^2+3n+1}{n^3(n+1)^3}.$$

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Прежде всего нужно войти в оглавление целевых установок и
выбрать пункт "Упростить выражение в области допустимых знчений".
Затем набирается про\-из\-вод\-ная указанного выражения. Она
вводится как дробь вида $\frac{dA}{dx}$; $A$ -
диф\-фе\-рен\-цируемое выражение. После символа $d$ нужно ставить
знак умножения; дифференцируемое выражение заключается в скобки. В
принципе, переменную $d$ можно использовать и внутри выражения
$A$, и даже взять ее в качестве $x$. Если нужно найти значение
производной в некоторой точке $t$, то вместо $dx$ набирается
$d(x=t)$, причем и здесь после $d$ ставится знак умножения.

\item Снова вводится установка "Упростить выражение в области
допустимых зна\-чений". Затем набирается условие: сначала
нажимаются клавиши $l,i$ - по\-яв\-ля\-ется символ $\lim$, справа
внизу от которого размещен курсор. Набираем $x \to 0$ (стрелка
вводится клавишей "курсор вправо") и нажимаем Enter - курсор
перемещается вверх в ту же строку, в которой расположен символ
$\lim$. Здесь набираем выражение под знаком предела. Это выражение
обязательно нужно заключить в скобки, иначе знак предела будет
отнесен к минимальному ос\-мыс\-лен\-ному его началу. В нашем
примере, если не заключить все выражение в скобки, то степень
окажется вне предела и ответ будет другим.

\item Выбирается целевая установка "Исследовать поведение
функции", в которой указывается обозначение функции - переменная
$y$. Затем вводится условие $y =
\lambda_{x}((x-5)\sqrt[3]{x^2},x-\mbox{число})$.

\item Выбираем переменные, которые будут обозначать,
соответственно, точку экс\-тре\-мума, значение функции в этой
точке, и тип экстремума (максимум либо минимум). Например, пусть
это будут переменные $u,v,w$. Вводим целевую ус\-та\-новку "Найти
полное явное описание значений неизвестных" \, в которой
ука\-зываем выбранные неизвестные. Затем вводим условие
$$Extr(\lambda_x(x^2 - \ln(x^2),x-\mbox{число}),u,v,w).$$
Аналогично вводятся задачи на поиск множества точек минимума либо
мак\-си\-мума некоторой функции внутри заданной области, но число
неизвестных здесь будет равно двум (искомое множество точек и
значение функции в этих точках). Вместо $Extr$ используются
символы $Min,Max$, причем после функции должна быть указана
область, по которой берется минимум или максимум.

\item Отличие от общего исследования поведения функции - только в
том, что вы\-би\-ра\-ется целевая установка "Исследовать функцию
на непрерывность".

\item Выбирается целевая установка "Упростить выражение в области
допустимых значений". Затем набирается неопределенный интеграл:
нажимается "Ctr-j" и вводится подынтегральное выражение, которое
умножается справа на про\-из\-ве\-де\-ние $dx$.

\item Аналогично неопределенному интегралу, но нажимается "Ctr-i".
Тогда курсор сначала оказывается под знаком интеграла, где
набирается нижний предел. После нажатия "Enter" \ курсор
переводится вверх, где набирается верхний пре\-дел. Еще одно
нажатие "Enter" \ - и набирается подынтегральное выражение,
умножаемое на $dx$.

\item При вычислении двойных интегралов область интегрирования
обычно задается в списке посылок. Выбираем для нее обозначение -
например, переменную $P$, и введем посылку $P = set_{xy}(|y| \le
 1 \ \& \ 0 \le x \ \& \ x \le 2)$. Затем вводим целевую установку
"Упростить выражение в области допустимых значений". Затем
на\-би\-раем двойной интеграл - нажимаем "Ctr-2"; под интегралом
вводим об\-оз\-на\-чение области $P$, нажимаем "Enter", и далее
набираем подынтегральное вы\-ра\-же\-ние, умноженное на
произведение $dxdy$.

\item Плоскую область определяем в списке посылок, обозначив ее
вспомогательной переменной (например, $P$). Эту область задаем,
используя ссылку на пря\-мо\-угольную систему координат, которую
тоже обозначаем вспо\-могательной пе\-ре\-менной (например, $K$).
После этого в нашем примере вводим посылки $$P =
\mbox{точки}(\mbox{областьграницы}(set_{xy}(y^2 = \frac{b^2}{a}x)
\cup set_{xy}(y = \frac{b}{a}x)),K),$$ $0<a$, $0<b$,
"прямкоорд($K$)". Заметим, что операция "областьграницы" \
при\-ме\-ня\-ется к теоретико-множественному объединению пар
ко\-ор\-ди\-нат точек кривых, ограничивающих область, а значением
этой операции служит множество пар ко\-ор\-ди\-нат точек области.
Для перехода от пар координат к точкам плоскости используется
операция "точки". Далее выбирается целевая установка
"Уп\-рос\-тить выражение в области допустимых значений" \ и
вводится условие $S(P)$. Как и в случае геометрических задач,
символ площади $S$ вводится двойным нажатием клавиши $s$.

\item В случае нахождения объемов применяется аналогичная
конструкция, но мно\-жество троек координат трехмерной области
задается непосредственно, с по\-мо\-щью неравенств. В нашем
примере вводим посылки $$P = \mbox{точки}(set_{xyz}(x^2 \le ay \
\& \ ay \le bx \ \& \ x^2+y^2 \le hz \ \& \ hz \le 2x^2
+2y^2),K),$$ $0<a$,\ $0<b$,\ $0<h$,\ "прямкоорд($K$)". Целевая
установка - та же, что и в предыдущем примере; условие имеет вид
"объем($P$)" \ (двукратное нажатие клавиши "О", кир.).

\item Посылки вводятся аналогично предыдущей задаче, причем вместо
множества троек координат точек трехмерной области задается
множество троек коорди\-нат точек поверхности. Условие имеет вид
$S(P)$.

\item Целевая установка при наличии параметров ряда - "Получить
полное явное описание значений неизвест\-ных" \ (при их отсутствии
- "Проверить истинность утверждения"); неизвестная - параметр ряда
$p$. Условие имеет вид утвержде\-ния о сходимости
последовательности частичных сумм ряда:
$$\mbox{сходится}(\lambda_n(\sum_{i=1}^n(\frac{1}{i^p}\sin
\frac{\pi}{i}),n-\mbox{натуральное}))$$

\item Выбирается установка "Разложить в ряд Тейлора", в которой
указываются переменная разложения и точка разложения. Условием
задачи служит вы\-ра\-жение $(x - \tg x)\cos x$.

\item Аналогично предыдущему - с установкой "Разложить в ряд
Фурье".

\item Установка - "Упростить выражение в области допустимых
значений". Условие задачи набирается непосредственно в виде
бесконечной суммы.

\end{enumerate}

\subsection{Аналитическая геометрия и линейная алгебра}

\begin{enumerate}

\item Даны три вектора $a (4,1,5)$, $b (0,5,2)$ и $c (-6,2,3)$.
Найти вектор $x$, удо\-влет\-во\-ряющий системе уравнений
$(x,a)=18,(x,b) = 1, (x,c) = 1$. Система координат прямоугольная.

\item Даны координаты двух вершин треугольника $A(-1,3),B(2,5)$ и
точки пе\-ре\-се\-чения его высот $H(1,4)$ в прямоугольной системе
координат. Найти координаты третьей вершины треугольника и
составить уравнения его сторон.

\item Составить уравнения плоскостей, проходящих через прямую
$\frac{x-1}{3} = \frac{y-1}{5} = \frac{z+2}{4}$ и равноудаленных
от точек $A(1,2,5)$ и $B(3,0,-1)$.

\item Составить уравнение касательной к параболе $y^2 = -8x$,
отрезок которой между точкой касания и директрисой делится осью
$Oy$ пополам. Система координат прямоугольная.

\item Найти уравнение плоскости, пересекающей эллипсоид
$x^2+2y^2+4z^2 = 9$ по эллипсу, центр которого находится в точке
$C (3,2,1)$. Система координат пря\-мо\-у\-гольная.

\item Поверхность задана уравнением $6xy-8y^2-z^2+60y+2z+89=0$ в
прямоугольной системе координат. Найти каноническую систему
координат и каноническое уравнение этой поверхности. Определить
тип поверхности.

\item Решить матричное уравнение:
  $$ \left(\begin{array}{ccc} 2 & -3 & 1 \\ 4 & -5 & 2 \\
  5 & -7 & 3 \end{array} \right) \cdot X \cdot
  \left(\begin{array}{ccc} 9 & 7 & 6 \\ 1 & 1 & 2 \\
  1 & 1 & 1 \end{array} \right) =
  \left(\begin{array}{ccc} 2 & 0 & -2 \\ 18 & 12 & 9 \\
  23 & 15 & 11 \end{array} \right)$$

\item Вычислить определитель

$$ \left| \begin{array}{ccc} \sin a & \cos a & \sin(a+d) \\ \sin b &
\cos b & \sin(b+d) \\ \sin c & \cos c & \sin(c+d)\end{array}
\right|$$

\item Найти собственные значения и собственные векторы линейного
преобразования, заданного матрицей:

$$\left(\begin{array}{cccc} 3 & -1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\
 3 & 0 & 5 & -3 \\ 4 & -1 & 3 & -1 \end{array} \right)$$

\item Найти каноническую жорданову форму для матрицы:

$$\left(\begin{array}{cccc} 1 & 2 & 3 & 4 \\ 0 & 1 & 2 & 3 \\
 0 & 0 & 1 & 2 \\ 0 & 0 & 0 & 1 \end{array} \right)$$




\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item В задачах по аналитической геометрии обычно приходится
вводить обозначение для используемой системы координат. Обозначим
ее в нашем примере через $K$ и введем посылку "прямкоорд($K$)".
Напомним, что в решателе системы координат на плоскости
отождествляются с тройками точек общего положения (первая точка -
начало системы координат, две последние - концы координатных
векторов), а в пространстве - с четверками таких точек. Если в
задаче имеются ссылки на координатные оси либо плоскости, то
приходится явным образом вводить такие тройки либо четверки точек.
В нашем примере этих ссылок нет, поэтому далее вводим посылки,
определяющие координаты векторов $a,b,c$ относительно $K$:
"$\mbox{коорд}(a,K) = (4,1,5)$"; "$\mbox{коорд}(b,K) = (0,5,2)$";
"$\mbox{коорд}(c,K)\\ = (-6,2,3)$". Затем вводим посылки
"$\mbox{скалумнож}(a,x)=18$", "$\mbox{скалумнож}(b,x)\\ =1$",
"$\mbox{скалумнож}(c,x)=1$". Выбираем целевую установку "Выразить
значения неизвестных через заданные параметры" \ и вводим
переменную $y$ для неизвест\-ной. Наконец, вводим условие задачи
"$y = \mbox{коорд}(x,K)$".

\item Вводим обозначение $K$ для прямоугольной системы координат и
заносим по\-сыл\-ки "прямкоорд($K$)", $\triangle(ABC)$,
"$\mbox{коорд}(A,K)=(-1,3)$", "$\mbox{коорд}(B,K) = (2,5)$". Чтобы
определить $H$ как точку пересечения высот, проводим две высоты -
из вершины $A$ и из вершины $B$. Это можно сделать, добавив две
посылки "Высота($ABCM$)" \ и "Высота($BCAN$)"; $M,N$ - основания
высот. Далее до\-бав\-ля\-ем посылки, связанные с точкой $H$: $H
\in \mbox{прямая}(AM)$; $H \in \mbox{прямая}(BN)$;
"$\mbox{коорд}(H,K) = (1,4)$". Выбираем в качестве неизвестных
переменные $x,y,z,v$ - для уравнений сторон треугольника и
координат его третьей вершины. Наконец, создаем целевую установку
(так же, как в предыдущей задаче) и вводим усло\-вия: $x =
\mbox{коорд}(\mbox{прямая}(AB),K)$, $y =
\mbox{коорд}(\mbox{прямая}(AC),K)$, $z =
\mbox{коорд}(\mbox{прямая}\\(BC),K)$,$v = \mbox{коорд}(C,K)$.

\item В этой задаче система координат не предполагается
прямоугольной. Поэтому выбираем обозначающую ее переменную $K$, но
никаких специальных посылок для $K$ не вводим. Так как в условии
задачи говорится о прямой, а прямые в решателе обозначаются только
с помощью пары точек, выбираем переменные $P,Q$ для обозначения
этих точек. После этого можно ввести посылку, задающую уравнение
прямой: "$\mbox{коорд}(\mbox{прямая}(PQ),K) =
set_{xyz}(\mbox{пропорцнаборы}((x-1,y-1,z+2),(3,5,4)))$". Заметим,
что использование отношения "пропорцнаборы" \ пропорциональности
двух числовых наборов при задании канонического урав\-нения прямой
в пространстве является для решателя стандартом. Чтобы
обоз\-на\-чить плоскость, выбираем переменные $C,D,E$ для трех
точек общего по\-ло\-же\-ния на этой плоскости. Затем вводим
посылку, выражающую включение прямой $PQ$ в искомую плоскость:
"$\mbox{прямая}(PQ) \subseteq \mbox{плоскость}(CDE)$". Вводим
посылки, определяющие координаты указанных в задаче точек $A,B$:
"$\mbox{коорд}(A,\\ K)=(1,2,5)$", "$\mbox{коорд}(B,K)=(3,0,-1)$".
Наконец, указываем на равноуда\-лен\-ность плоскости $CDE$ от
точек $A,B$: "$\mbox{расстдоплоскости}(A,\mbox{плоскость}(CDE))=
\mbox{расстдоплоскости}(B,\mbox{плоскость}(CDE))$". Затем вводим
целевую установку (так же, как в предыдущих задачах), указывая в
ней неизвестную $x$ для координат плоскости $CDE$. Завершаем набор
задачи условием $x = \mbox{коорд}(\mbox{плоскость}(CDE\\),K)$.

\item Так как система координат прямоугольная, вводим посылку
"прямкоорд($K$)". Обозначаем параболу через $E$ и указываем ее
уравнение: "$\mbox{коорд}(E,K) = set_{xy}\\(y^2 = -8x)$". Выбираем
обозначение "прямая($AB$)" для касательной и вводим посылку
"$\mbox{прямая}(AB) - \mbox{касательная к}\ E$". Для точки касания
можно было бы выбрать специальное обозначение, однако без
ограничения общности можно считать, что этой точкой служит точка
$A$. Поэтому вводим посылку $A \in E$. Для директрисы вводим
обозначение "прямая($FG$)". Так как в решателе упоминание о
директрисе связано с обязательным упоминанием фокуса, которому она
со\-от\-вет\-ствует, то выбираем обзначение $C$ для фокуса и
заносим посылки "фокус($C,\\ E$)",
"директриса(прямая($FG$),$C,E$)". В качестве точки пересечения
касатель\-ной с директрисой можно без ограничения общности выбрать
точку $B$; соответ\-ству\-ю\-щая посылка имеет вид $B \in
\mbox{прямая}(FG)$. Для обозначения середины отрезка $AB$ выбираем
переменную $D$ и заносим посылки $D \in \mbox{отрезок}(AB)$,
$l(AD)=l(BD)$. Чтобы указать на принадлежность точки $D$ оси
ординат, вводим явное обозначение для тройки точек, образующих
систему координат $K$ : $K = (M,N,P)$. Теперь принадлежность точки
$D$ оси ординат записывается в виде $D \in \mbox{прямая}(MP)$.
Чтобы предотвратить недопустимый в задаче случай сов\-па\-де\-ния
прямой $AB$ с осью ординат, добавляем посылку $\neg(A \in
\mbox{прямая}(MP))$. Далее вводим целевую установку (как в
предыдущей задаче) с упоминанием неизвестной $x$ и добавляем
условие "$x = \mbox{коорд}(\mbox{прямая}(AB),K)$".

\item Вводим посылки "прямкоорд($K$)" \ и "$\mbox{коорд}(E,K) =
set_{xyz}(x^2+2y^2+4z^2 = 9)$";\\ $E$ - обозначение эллипсоида из
условия задачи. Обозначаем искомую плоскость "плоскость($ABC$)", а
сечение ею эллипсоида - $F$, после чего вводим посылки $E \cap
\mbox{плоскость}(ABC) = F$ и "эллипс($F$)". Обозначив центр
эллипса через $D$, добавляем посылки "центр($D,F$)" \ и
"$\mbox{коорд}(D,K) = (3,2,1)$". Далее вводим целевую установку с
неизвестной $x$ и условие "$x =
\mbox{коорд}(\mbox{плоскость}(ABC),K)$".

\item Вводим посылку "прямкоорд($K$)" \ и выбираем целевую
установку "Исследо\-вать свойства поверхности, заданной своим
уравнением". В этой установке обоз\-на\-чаем исследуемую
поверхность через $E$, и вводим условие задачи:
"$\mbox{коорд}(E,K)\\ = set_{xyz}(6xy-8y^2-z^2+60y+2z+89=0)$".

\item Для решения матричного уравнения используем обычную целевую
установку уравнений "Получить полное явное описание значений
неизвестных". Для на\-бо\-ра матрицы нажимаем клавиши "м","а" \
(кир.) - появляется левая скобка матрицы. Затем вводится первая
строка, причем после каждого элемента на\-жи\-ма\-ется "Enter".
Чтобы перейти к следующей строке, после набора последнего элемента
вместо "Enter" \ нажимается "Page Down". После набор последней
строки нажимается "End" \ - возникает правая скобка матрицы. Для
отката в случае ошибочных действий при наборе матрицы используется
"Backspace". После набора первой матрицы вводится обычный символ
умножения (клавиша "звездочка"), затем $X$, затем снова умножение,
далее - вторая матрица, и после знака равенства - третья.
Преобразование умножения чисел в матричное умножение
предпринимается автоматически при запуске решения задачи.

\item Для вычисления определителя выбирается целевая установка
"Упростить вы\-ра\-же\-ние в области допустимых значений". При
наборе условия сначала на\-жи\-маются клавиши "d","e" (лат.) -
возникает символ $\det$. Затем водится матрица.

\item Выбираем обозначение для матрицы - переменную $A$. Затем
вводим посылку - равенство с переменной $A$ в левой части и
матрицей в правой. Выбираем в качестве неизвестных переменные
$x,y,z$; $x$ - собственное значение, $y$ - его кратность, $z$ -
собственный вектор, отвечающий данному собственному значе\-нию.
Затем выбираем целевую установку "Получить полное явное описание
значений неизвестных" \ для указанных неизвестных и вводим условия
"соб\-ств\-зна\-чение($A,x,y$)", "собствектор($A,x,z$)". В ответе
для $z$ приводится условие принадлежности множеству линейных
комбинации базиса собственных векто\-ров, соответствующих
собственному значению $x$.

\item Выбираем целевую установку "Получить полное явное описание
значений не\-из\-вест\-ных" \ для не\-из\-вестных $x$ (жорданова
форма) и $y$ (матрица, преобразующая к жордановой форме, т.е.
такая, что произведение обратной к ней матрицы, исходной и снова
матрицы $y$, равно $x$). Затем вводим условие "жордформа($A$,x,\\
y)", где $A$ - исходная матрица.

\end{enumerate}

\subsection{Дифференциальные уравнения}

\begin{enumerate}

\item Решить уравнение $$2(y - 2xy -x^2\sqrt{y})+x^2y'=0$$

\item Решить уравнение $$xyy'' +xy'^2-yy'=0$$

\item Найти решения уравнения $y = xy' - 2y'^2$, проходящие через
точку (4,2).

\item Найти решение системы дифференциальных уравнений:

$$\left\{
  \begin{array}{rcl}
  \frac{dx}{dt} &=& x - y +4\cos(2t) \\
  \frac{dy}{dt} &=& 3x - 2y + 8\cos(2t) + 5\sin(2t).\\
  \end{array}
  \right.
$$

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Выбираем целевую установку "Решить функциональные уравнения"
\ (эта ус\-тановка берется и для остальных задач на решение
дифференциальных урав\-нений). В качестве неизвестной указываем
уже не переменную $y$, а выражение $y(x)$. Затем вводим условие
задачи
 - уравнение, в котором везде вместо функции $y$ записывается ее
 значение $y(x)$ в точке $x$, а вместо производной $y'$ -
 $\frac{dy(x)}{dx}$. Напомним, что по всем произвольным постоянным,
 возникающим при ин\-тег\-рировании уравнения, в ответе навешивается
 квантор существования.

 \item Задача вводится аналогично предыдущей; производная второго
 порядка на\-би\-ра\-ет\-ся в виде $\frac{d^2y(x)}{dx^2}$. Символ
 дифференцирования $d$ здесь рассматривается как переменная - то
 есть после него или его степени нужно нажимать клавишу
 "звездочка" \ для умножения.

 \item После ввода дифференциального уравнения добавляем условие
  $y(4)=2$.

 \item В целевой установке указываем две неизвестных функции -
 $x(t),y(t)$. Уравнения системы набираются аналогично предыдущим
 задачам; вместо $x,y$ в них ис\-поль\-зуются записи $x(t),y(t)$.

\end{enumerate}

 \section{Анализ траекторий решения задач при обучении решателя}

 Пополнение базы приемов решателя происходит при ручном обучении
 только за счет анализа траекторий решения задач. Создавать
 какие-либо приемы из общих соображений, без примерки на задачах,
 не рекомендуется. Велика вероятность того, что такой прием не будет
 использоваться решателем - либо из-за того, что он ока\-жет\-ся
 избыточным и его срабатывание предвосхитят другие приемы, либо
 из-за того, что действия других приемов уведут задачу из области
 его применимости. Обучаю\-щий материал для решателей дают
 задачники, а не учебники.

 Таким образом, чтобы научиться создавать решате\-ли, прежде всего
 нужно овла\-деть техникой разбиения траектории решения
 задачи на последовательность при\-ме\-нений приемов. Отсюда возникают
 исходные неформальные версии описаний при\-емов, кото\-рые затем
 уже записываются на ГЕНОЛОГе или на ЛОСе. Разумеется, для одной и
 той же задачи могут быть предложены сильно отличающиеся друг от дру\-га
 способы решения, а для одного и того же решения - различные версии
 объясняющих его приемов. Наиболее простые и эффективные варианты не
 всегда удается "угадать" \ по единственному примеру, так что
 оптимизация решателя предполагает более или менее регулярные откаты
 для модернизации уже созданных групп приемов. Обыч\-но эти откаты имеют
 локальный характер, а использование компилятора ГЕНОЛОГа делает их в
 техническом отношении не слишком дорогостоящими.

 Рассмотрим несколько примеров анализа траекторий решения задач, в
 которых не будем предполагать наличия каких-либо ранее созданных
 приемов. Все эти зада\-чи взяты из задачника решателя, и
 в качестве упражнения можно рекомен\-до\-вать про\-сле\-дить по шагам его
 действия. Приводимые ниже рассуждения дают лишь первое, весьма
 приблизительное представление о разбиении решений на приемы.
 Реаль\-ное обучение решателя требует учета гораздо большего числа
 технических подроб\-нос\-тей. Лучшее представление об этом можно будет
 составить по второй книге монографии, при знакомстве с уже созданными
 приемами.

 Начнем с простейшего примера - решения уравнения
 $$\frac{6a+7b}{6a}-\frac{3bx}{2a^2} = 1 - \frac{bx}{a^2-ab}.$$
 Первый шаг, который представляется естественным в этой задаче -
 группировка в левой части всех членов с неизвестной $x$, а в
 правой - всех известных членов. Этот шаг сразу подсказывает
 прием: если обе части числового уравнения имеют неизвест\-ные либо
 известные слагаемые, то выполняется указанная выше перегруппировка
 членов. Уровень срабатывания приема можно взять совсем
 маленьким, например, равным 1. Для усиления стандартизации
 вводим еще один прием, переводящий неиз\-вест\-ную часть
 равенства влево, а известную - вправо. Уровень его пусть тоже
 бу\-дет равен 1. Каких-либо соображений об ограничении применения
 данных прие\-мов не возникает. Однако, следует учитывать, что теперь на
 уровнях выше первого все уравне\-ния будут иметь известные
 слагаемые только в правой части. Поэтому, на\-при\-мер, шаблон для
 усмотрения квадратных уравнений должен иметь вид \ $ax^2 + bx = c$, вместо
 привычного $ax^2+bx+c=0$.

 Итак, получаем уравнение:
 $$\frac{bx}{a^2-ab}-\frac{3bx}{2a^2}=1 - \frac{6a+7b}{6a}.$$
 Следующий шаг - сложить дробные слагаемые в левой части
 уравнения. Фор\-му\-ли\-ру\-ем соответствующий прием: "если левая часть
 уравнения имеет дробное слагае\-мое, то обращаемся к
 вспомогательной задаче на преобразование ее к виду дроби, после
 чего выполняем замену". Каких-либо оснований откладывать это
 действие не вид\-но, так что уровень срабатывания приема снова
 выбираем равным 1. Целесообраз\-ность применения данного
 приема уже не столь очевидна, как в предыдущем случае. Сложение
 дробных выражений может привести к очень громоздкому результату,
 и задача будет заведена в тупик. С другой стороны, сразу привести
 условия, от\-де\-ля\-ю\-щие допустимые применения от недопустимых, мы не можем.
 Чтобы возникли ка\-кие-то подсказки на этот счет, нужно все-таки ввести
 прием таким, как есть, и подо\-ждать появления задачи, в которой он
 будет мешать. Тогда и начнется накопление серии дополнительных
 эвристических ограничений, которые обеспечат должное управле\-ние
 приемом.

 В нашем случае эта работа уже проделана - можно заглянуть в решатель
 и посмотреть, какие ограничения возникли. Прежде всего,
 оказалось, что для систем уравнений уровень срабатывания данного приема
 лучше положить равным не 1, а 3. Если нужно не складывать неизвестные
 дробные выражения, а обозначить их новыми неизвестными и решить
 полученную вспомогательную систему, то прием, выполняющий эти действия,
 успеет сработать. Если уравнение содержит неизвест\-ную, явно выраженную
 с помощью еще одного уравнения через другие неизвест\-ные, то прием
 блокируется - лучше (вообще говоря) сначала подставить найден\-ное
 значение. Блокировка происходит также при наличии в уравнении
 неизвест\-ного логарифма от суммы с дробным слагаемым. Она
 заставляет решатель сна\-ча\-ла преобразовать указанный логарифм.
 Наконец, в случае единственной неизвест\-ной применение приема
 откладывается (как и в случае систем) до уровня 3 при нали\-чии
 неизвестных логарифмов по разным основаниям. Перечисленные
 условия относят\-ся к сравнительно редким ситуациям, и таким образом
 применение рассматривае\-мо\-го приема оказалось "почти всегда" \
 оправданным.

 Введенный нами прием обратился к вспомогательной задаче на
 сложение дроб\-ных выражений. Поэтому временно прерываем анализ
 цепочки преобразований основ\-ной задачи и переходим к рассмотрению
 выражения $$\frac{bx}{a^2-ab}-\frac{3bx}{2a^2}.$$ План наших
 действий очевиден - сначала нужно разложить на множители
 зна\-ме\-на\-тели, а затем выполнить сложение дробей. Оформим эти действия
 в виде приемов.

 Разложение на множители числителей и знаменателей можно считать
 пре\-об\-ра\-зо\-ва\-нием общей стандартизации, предшествующим применению
 других прие\-мов, относящихся к дробям. Однако, на этапе
 завершающего редактирования упрощае\-мо\-го выражения может понадобиться
 обратное преобразование - иногда раскрывание скобок приводит к
 получению более компактной записи. Момент перехода к за\-вер\-шающему
 редактированию ответа можно помечать вводом специального ком\-мен\-та\-рия
 задачи, и тогда первый прием (разложение на множители) будет
 срабатывать при отсутствии данного комментария, а второй (попытка
 упрощающего рас\-кры\-ва\-ния скобок) - при его наличии. Точкой применения
 приема обращения к раз\-ло\-же\-нию на множители можно считать сумму -
 основание степени, являющейся сомножи\-те\-лем знаменателя (соответственно,
 числителя) дроби, допуская вырожденный слу\-чай степени с показателем
 единица. В нашем примере единственной такой точ\-кой является выражение
 $a^2-ab$.

 Прием, применяемый здесь для разложения на множители, состоит в
 вынесении за скобку общего множителя всех слагаемых. Для его
 программирования пона\-до\-бит\-ся вспомогательная процедура, находящая
 наибольший общий делитель двух од\-но\-чле\-нов.

 После разложения на множители знаменателя получаем выражение
 $$\frac{bx}{a(a-b)}-\frac{3bx}{2a^2}.$$ Прием, выполняющий
 сложение дробных выражений, сначала находит общий мно\-жи\-тель
 числителей и общий множитель знаменателей. Они сразу выносятся за
 скоб\-ки, после чего применяется обычное преобразование: числители
 и знаменатели пе\-ре\-множаются "крест накрест" \ и складываются.
 Перед тем, как составить ре\-зуль\-ти\-ру\-ющую дробь, предпринимается
 попытка разложить эту сумму на множи\-те\-ли. Последнее действие может
 показаться излишним - ведь уже имеется прием, кото\-рый пытается
 разложить на множители числитель. Однако, тогда понадобятся
 два цик\-ла сканирования задачи вместо одного - система как бы
 "забудет" \ о том, что только что сложила дроби, и лишь после нового
 цикла рассмотрения задачи натолкнется на указанный числитель. Циклы
 сканирования задачи в решателе обычно составляют главную часть
 вычислительного времени. Поэтому лучше объединять в одном и том же
 приеме как основное действие, так и все сопровождающие его
 дополнительные - это дает весьма ощутимое ускорение.

 В нашем случае задача решается с целью сложить дроби, и каких-либо
 осо\-бых эвристических решающих правил не требуется. Достаточно ввести
 в прием про\-вер\-ку наличия данной цели. Впрочем, можно ввести
 ограничение, требующее при сложе\-нии нескольких дробных выражений начинать
 с самых коротких. Иногда это упроща\-ет выкладки.

 Возвращаемся к цепочке преобразований уравнения, которое после
 сложения дро\-б\-ных выражений в левой части приобретает вид
 $$\frac{bx(3b-a)}{2(a-b)a^2} = 1 - \frac{6a+7b}{6a}.$$ Это
 уравнение имеет в левой части дробь; для устранения ее
 естественно домно\-жить обе части уравнения на знаменатель.
 Однако, если сформулировать прием подобным образом, то он иногда
 будет приводить к излишним вычислительным затратам. Целесообразно
 до исключения знаменателя левой части сложить дроб\-ные выражения в
 правой, известной части. Тогда можно будет сначала вынести за
 скобку общие множители числителей и знаменателей, и лишь затем
 избавлять\-ся от знаменателей. Результатом преобразований станет
 дизъюнкция, объединяю\-щая в себе уравнение с исключенными
 знаменателями и частные случаи равенства ну\-лю общих множителей
 числителей: $$b = 0 \vee 3x(3b-a)=-7a(a-b).$$ Как и прием
 сложения дробных выражений, данный прием исключения знаменате\-лей
 объединяет сразу несколько независимых преобразований, ускоряя тем
 са\-мым про\-цесс вычислений.

 Следующий шаг решения задачи - разбор случаев. Прием,
 используемый для этого, последовательно рассматривает уравнения,
 соответствующие подслучаям, и затем объединяет полученные ответы
 связкой "или". Ответ каждого подслучая упро\-ща\-ется отдельно,
 однако дизъюнкция ответов, вообще говоря, допускает
 даль\-ней\-шее упрощение - какие-то серии корней или целые
 промежутки могут склеивать\-ся. Поэтому прием должен обращаться
 к вспомогательной задаче на упроще\-ние полученной дизъюнкции.
 Более того, этот же прием должен сразу выдать ответ задачи, иначе
 дизъюнкция, которая им получена, снова вызовет разбор случаев,
 и система зациклится.

 В нашем примере первый подслучай - условие $b=0$. Оно не содержит
 неизвест\-ных, и может быть сразу выдано в качестве ответа. Это
 действие, хотя и очень простое, тоже требует специального приема.
 Кроме усмотрения того, что условия за\-да\-чи не содержат неизвестных,
 данный прием должен обратиться к вспомога\-тель\-ной задаче на
 упрощение их конъюнкции, и результат упрощения выдать в ка\-чест\-ве
 ответа.

 Второй подслучай - уравнение $3x(3b-a)=-7a(a-b)$. Согласно
 условиям на область допустимых значений (хотя мы и опустили их
 рассмотрение, но приве\-ден\-ные выше приемы должны были сопровождать
 все преобразования коррекцией та\-ких условий), правая
 его часть отлична от нуля. Поэтому уравнение эквивалент\-но
 соотношению $$x = -\frac{7a(a-b)}{3(3b-a)}.$$ Формулировка
 приема, выполняющего данный переход, очевидна.

 Далее следует подстановка найденного значения неизвестной в
 сопровождаю\-щие условия на область допустимых значений и упрощение
 этих условий. Эти действия требуют специального приема,
 выполняющего обращение к задаче на редакти\-ро\-ва\-ние ответа.
 Полученный ответ $$a \ne 0, a-b \ne 0, 3b-a \ne 0,
 x = \frac{7a(b-a)}{3(3b-a)}$$ возвращается приему разбора случаев,
 объединяющему его с ответом $a \ne 0, b = 0$ первого подслучая и
 выдающему окончательный ответ.

 Разобранный пример оказался совсем простым с точки зрения
 управления пре\-об\-ра\-зо\-ваниями - каждое действие было практически
 однозначным. Рассмотрим нес\-коль\-ко более сложный случай - решение
 системы уравнений. Будем решать систе\-му:

 $$
 \left\{
 \begin{array}{rcl}
 x^2+y^2 & = & z^2\\
 xy+yz+xz & = & 47\\
 (z-x)(z-y) & = & 2.\\
 \end{array}
 \right.
 $$

 Поначалу каких-то соображений однозначного характера о ее
 преобразо\-ва\-ни\-ях не возникает. Однако, есть соображения о том, с чего
 начинать анализ ситуа\-ции. Например, можно попробовать
 раскрыть скобки в третьем уравнении и посмот\-реть, не станут ли
 очевидными следующие шаги. Это - тоже преобразование, одна\-ко не
 основной задачи на описание, а сопровождающей ее задачи на
 исследование, в которой накапливаются общие следствия посылок и
 условий. Здесь мы имеем сра\-зу два приема: первый принимает решение
 о переходе к выводу следствий в задаче на исследование, второй -
 выводит из третьего уравнения следствие, получае\-мое раскрыванием
 скобок. Впрочем, в действительности эти приемы в реша\-те\-ле
 переставлены местами - раскрывание скобок выполняется сразу же.
 Случаи, ког\-да оно может повредить, отслеживаются приемами,
 срабатывающими на мень\-ших уровнях. Создавая прием для раскрывания
 неизвестных скобок в уравнениях, мы не должны сразу же
 предусматривать какие-то ограничения на его примене\-ние. Если они
 необходимы, то проявятся позднее, при анализе других задач.
 Так или иначе, получаем в списке посылок задачи на исследование
 первые два уравне\-ния, сопровождаемые уравнением $xy-xz-yz+z^2=2$.
 Теперь становится видно, что при сложении второго и третьего
 уравнений уничтожаются сразу два неизвест\-ных слагаемых в левой
 части. Получается уравнение $2xy+z^2=49$ - следствие двух
 исходных уравнений. Прием, выполняющий это действие, можно
 несколько обоб\-щить - чтобы он искал линейную комбинацию двух
 уравнений, позволяющую устра\-нить сразу два неизвестных слагаемых.
 Следующий естественный шаг - сложить первое уравнение с полученным
 следствием, чтобы исключить неизвестную $z$. Форму\-ли\-ров\-ка
 соответствующего приема несложна. После сложения уравнений имеем
 следст\-вие $x^2+y^2+2xy = 49$. Очередной шаг очевиден -
 представить левую часть как полный квадрат: $(x+y)^2 = 49$.
 Прием, выполняющий это действие, обращается к вспомогательной
 задаче на разложение левой части уравнения на множители. Если
 такое разложение удается, то есть вероятность, что полученное
 уравнение будет полезно для дальнейшего (например, чтобы поделить
 два уравнения, сократив не\-из\-вест\-ный множитель). Разумеется,
 нужно принять меры, чтобы прием не пытал\-ся разложить на множители
 левую часть уравнения, полученного после раскрыва\-ния скобок, и обратно.
 Для этого можно использовать специальные комментарии к уравнениям,
 блокирующие "обратный ход". Следующий шаг - решение про\-стей\-ше\-го
 степенного урав\-не\-ния. После него появляется дизъюнкция
 $x+y=7 \ \vee \ x+y = -7$. Обычно по\-лу\-че\-ние дизъюнкции в задаче
 на исследование означает, что следует вер\-нуть\-ся в исходную задачу
 на описание и предпринять разбор случаев. В нашей си\-ту\-а\-ции нужно,
 кроме того, учесть, что найденная дизъюнкция эквивалентна, при
 на\-ли\-чии первых двух уравнений, третьему. Это позволяет при разборе
 случаев исклю\-чить третье уравнение. Таким образом, цикл вывода
 следствий из уравнений завер\-шил\-ся, и далее решаем две независимых
 системы. Ограничимся рассмотрением первой из них -

 $$
 \left\{
 \begin{array}{rcl}
 x+y & = & -7\\
 x^2+y^2 & = & z^2\\
 xy+yz+xz & = & 47.\\
 \end{array}
 \right.
 $$

Очередной шаг состоит в преобразовании первого уравнения к виду
$x=-(y+7)$. Прием, реализующий это шаг, можно было бы представить
как обращение к вспомогательной задаче, разрешающей одно из
уравнений системы для исключе\-ния неизвестной. На первый взгляд,
такое обобщение нашего шага может пока\-зать\-ся естественным.
Однако, при рассмотрении последующих примеров выясни\-лось бы, что
данный прием почти всегда вреден - если произвольно выбрать
какое-то уравнение системы и разрешить (пусть даже успешно)
относительно одной из неизвестных, то чаще всего возникает такое
усложнение системы, после кото\-ро\-го решить ее становится весьма
затруднительно. Сравнивая случаи, где выраже\-ние одной
неизвестной через другие полезно, со случаями, где оно вредно,
можно было бы создать несколько приемов, применяемых в очень
специальных ситуациях. Для нашей задачи вводим прием, выражающий
неизвестную из уравнения, если оно ли\-ней\-но по всем своим
неизвестным.

Далее подставляем найденное выражение для $x$ через $y$ и
переходим к реше\-нию системы относительно $y,z$. Это делается
отдельным приемом, который дол\-жен создать вспомогательную задачу
для двух неизвестных и обратиться к ее реше\-нию. Завершающая
обработка ответа допускает разные варианты. Можно получить ответ
на вспомогательную задачу, объединить его с уравнением $x =
-(y+7)$ и упрос\-тить результат. Однако, если при решении
вспомогательной задачи происходил раз\-бор случаев и ответ на нее
имеет вид дизъюнкции, то при упрощении снова понадо\-бит\-ся
разбор случаев. Поэтому в решателе реализован другой способ -
урав\-не\-ние $x = -(y+7)$ передается вспомогательной задаче через
ее технические струк\-ту\-ры данных и извлекается оттуда при
редактировании ответа для каждого подслу\-чая. Тогда после решения
вспомогательной задачи какой-либо дополнительной обра\-бот\-ки
ответа не потребуется.

После перехода к неизвестным $y,z$ выполняются простые
преобразования, свя\-зан\-ные с общей стандартизацией вида
уравнений и с раскрыванием скобок. Они реализуются простыми
приемами, на которых можно сейчас не останавливаться. В результате
возникает система $14y+2y^2-z^2=-49, 7y+7z+y^2=-47$. Легко
заме\-тить, что члены с неизвестной $y$ в обоих уравнениях
пропорциональны, и после вычи\-та\-ния из первого уравнения
удвоенного второго остается уравнение с единствен\-ной неизвестной
$z$. Прием, усматривающий возможность получить уравнение с
единст\-вен\-ной неизвестной за счет линейной комбинации
уравнений, практически не тре\-бу\-ет каких-либо дополнительных
ограничений на целесообразность срабатыва\-ния. В результате
получаем систему $14y+2y^2-z^2=-49, -14z-z^2=45$. Дальней\-шие
действия очевидны, и мы их разбирать не будем.

Разобранные примеры продемонстрировали два режима работы решателя
- эк\-ви\-валентные преобразования уравнения в первом случае и
вывод следствий для получения дополнительной информации о
неизвестных во втором. Первый режим, априори, требует большой
осмотрительности при выборе каждого действия, так как неудачное
преобразование может завести задачу в тупик. В действительности,
од\-на\-ко, для многих областей наблюдается явление устойчивости:
если в целом следо\-вать некоторым несложным представлениям о том,
какие преобразования упрощают задачу, то выбор конкретного порядка
их выполнения несущественен - в любом случае за разумное число
шагов получается один и тот же ответ. Это и позволяет в таких
областях "избавляться от перебора". Второй режим позволяет
исключать перебор в его классическом виде рассмотрения дерева
задач, сводя поиск решения к рассмотрению расширяющегося списка
посылок одной и той же задачи. Так как приемы, выводящие
следствия, снабжены решающими правилами, отсекающими
ма\-ло\-пер\-спективные (например, чрезмерно громоздкие) с точки
зрения эксперта след\-ствия, то через определенное время наступает
полное исчерпание разумных след\-ст\-вий, и процесс обрывается.
Процедура решения задачи, вместо перебора, приобре\-та\-ет здесь
характер "логического замыкания" \ исходных данных.

Рассмотрим при\-мер, в котором возникает еще одна разновидность
"логичес\-ко\-го режима". Бу\-дем решать задачу на доказательство
неравенства $$0 \le a^4 - 2a^3b + 2a^2b^2 - 2ab^3 + b^4.$$ В таких
задачах часто помогает прием, использующий неравенство для
сред\-не\-го арифметического и среднего геометрического. Удобнее
переформулировать его в виде приема, выделяющего в оцениваемой
сумме квадрат суммы или квадрат раз\-нос\-ти. В нашей задаче можно
заметить, что слагаемые $a^2b^2, b^4$ и $-2ab^3$ представ\-ля\-ют
собой квадрат разности величин $ab, b^2$. Поэтому, если доказать
неравенство $0 \le a^2b^2 + a^4 - 2a^3b$, полученное отбрасыванием
данных слагаемых, то задача будет реше\-на. Применяя к последнему
неравенству тот же прием, получаем искомое доказа\-тель\-ство.

Заметим, что выбор группы слагаемых, образующих квадрат суммы или
раз\-нос\-ти, выполняется неоднозначно. Например, на первом шаге
можно было бы выде\-лить группу $2a^2b^2, a^4, b^4$ и сразу
завести задачу в тупик. По этой причине мо\-жет показаться, что
прием выделения оцениваемой группы слагаемых требует ка\-ко\-го-то
сильного управления, без чего возникнет трудоемкий перебор.
Однако, дан\-ный прием обычно сильно упрощает правую часть
неравенства, так что длина цепо\-чек неравенств, возникающих при
доказательстве, невелика. Кроме того, часто появ\-ля\-ют\-ся
тупиковые ситуации, в которых прием неприменим. Поэтому реальный
пере\-бор оказывается невелик, и особых проблем с принятием
решения не возникает. Здесь возникает режим "ограниченного
перебора", у которого ограничения обусловлены не какими-то
специальными решающими правилами, а просто тем фактом, что
слож\-ность задачи при каждом шаге сильно уменьшается. Этот режим
используется в решателе для разных разделов (например, вычисление
пределов и интегрирование), и обычно дает очень быстрое получение
ответа.

Перейдем к примерам из других разделов. Рассмотрим сначала простую
гео\-мет\-ри\-ческую задачу на вычисление. В параллелограмме
$ABCD$ из точки $N$ пересечения диагоналей проведены
перпендикуляры $NF$, $NE$ к сторонам $AB$,$AD$. Длины этих
перпендикуляров равны, соответственно, $p,m$. Угол $BAD$ равен
$a$. Найти длины $x,y$ диагоналей $AC$, $BD$ и площадь
параллелограмма $z$.

Схема решения геометрических задач на вычисление напоминает схему
решения систем уравнений - происходит вывод следствий из посылок и
условий до тех пор, пока не возникают либо равенства для значений
неизвестных, либо уравнения, из которых значения неизвестных
извлекаются чисто алгебраическими методами. В начале процесса
вывода порождаются совсем простые утверждения, которые можно
рассматривать как логическое представление чертежа задачи. В нашем
приме\-ре таковыми являются утверждения о параллельности прямых
$AB$, $CD$ и $AD$, $BC$. При решении геометрической задачи
последовательность рассуждений допус\-ка\-ет множество вариаций.
Итоговая картина при этом обычно оказывается не очень
чув\-ст\-вительной к ее конкретной версии. Приведем для нашего
примера одну из таких возможных последовательностей.

Прежде всего, замечаем, что в задаче нужно найти площадь
параллело\-грам\-ма и что к стороне $AD$ проведен перпендикуляр
$NE$. Для получения высоты, длина которой участвует в формуле
площади, продолжаем перпендикуляр до пересечения с противоположной
стороной в точке $G$, и одновременно выписываем соотношение $z =
l(AD)l(EG)$. Эти действия оформляем в виде отдельного приема.
Основаниями для его применения служат указанные выше признаки -
упоминание в задаче о пло\-ща\-ди параллелограмма и "недоведенный"
\ до конца перпендикуляр к одной из сторон.

Продолжая общий анализ чертежа, выводим из равенства $\angle(BAD)
= a$ соот\-но\-ше\-ния для четырех остальных углов
параллелограмма. Основанием для приме\-не\-ния этого приема
является упоминанение в задаче хотя бы одного из углов
парал\-ле\-ло\-грам\-ма.

Аналогичным образом, выводим равенство длин противоположных сторон
па\-ра\-лле\-ло\-грамма $l(BC)$ и $l(AD)$. Основанием применения
приема служит упоминание в задаче одной из этих длин.

Так как выделена точка $E$ пересечения диагоналей параллелограмма,
заме\-ча\-ем, что диагонали делятся в ней пополам: $l(CN)=l(AN)$,
$l(DN)=l(BN)$. Еще один прием отмечает, что точка $E$ не просто
лежит на прямой $BD$, но является точкой отрезка $BD$. Основанием
для его срабатывания служит наличие в посылках зада\-чи равенства
$l(DN)=l(BN)$. Этот же прием устанавливает, что точка $N$ лежит на
отрезке $AC$.

Так как точка $N$ находится на отрезке $AC$, причем длина отрезка
и расстоя\-ния от $N$ до его концов упоминаются в задаче, то
выводим соотношение равенства дли\-ны отрезка сумме длин
подотрезков: $x = 2l(AN)$. Аналогично, выводим $2l(BN) = y$.

Далее выводится условие принадлежности точки $N$ отрезку $EG$ -
проведен\-ной высоте параллелограмма. Основаниями являются
принадлежность точки $N$ диа\-го\-на\-ли и параллельность сторон.
Отсюда, аналогично предыдущему, получается след\-ствие $l(EG)=2m$
- прием о равенстве длины отрезка сумме длин подотрез\-ков
срабатывает уже в третий раз.

Так как угол $BAD$ и высота $l(EG)$ теперь известны, можно
выписать тригоно\-мет\-рическое соотношение $\sin(a)l(AB) = 2m$, в
котором единственный неизвест\-ный числовой параметр - длина
отрезка $AB$. Выписывание таких соотношений (возмож\-но, не на
самых малых уровнях сканирования задачи) представляется разумным,
так как постепенно доопределяются новые параметры чертежа.

После того, как предыдущее соотношение занесено в посылки задачи,
оно пре\-об\-ра\-зуется к виду $l(AB)=2m/\sin(a)$. Здесь работает
прием, разрешающий линей\-ное соотношение относительно числового
параметра, определенного через ссылки на точки.

Как только оказалась введена в рассмотрение длина стороны $AB$,
срабаты\-ва\-ет уже упоминавшийся выше прием, выписывающий
равенство длин сторон $AB$,$CD$.

Далее вводится высота параллелограмма $CH$, проведенная к
продолжению сто\-ро\-ны $AB$. Основанием для этого действия служит
то, что, во-первых, длины отрез\-ков $AN$,$NC$ пропорциональны, а
длина $p$ высоты $FN$ - известна. Отсюда прием выво\-дит следствие
$l(CH) = 2p$. Во-вторых, основанием для срабатывания является
на\-ли\-чие известного угла $CBA$, который мог бы позволить
выразить впоследствии через $l(CH)$ какие-то новые параметры
чертежа.

Условие перпендикулярности прямых $CH$ и $AB$ преобразуется в
условие парал\-лель\-ности прямых $CH$ и $FN$ - чтобы в дальнейшем
иметь дело с классами па\-рал\-лельных прямых, выбирая в каждом
таком классе единственного представителя.

Снова применяется прием, выписывающий тригонометрическое
соотношение $$\sin(a)l(AD) = 2p.$$ Однако, это другой прием,
срабатывающий на меньшем уровне, чем рассмотрен\-ный выше.
Оснований для его срабатывания больше - параметр $l(AD)$ к этому
момен\-ту уже встречается в задаче. Введенное соотношение сразу
преобразуется к виду $l(AD) = 2p/\sin(a)$.

Теперь начинает срабатывать прием, подставляющий найденное
значение $l(AD)$ во все посылки, где этот параметр встречается. В
частности, таким образом из посылки $z = 2ml(AD)$ получаем
фрагмент ответа $z = 4mp/\sin(a)$. Накопле\-ние информации о
параметрах чертежа "само собой" \ привело к нахождению иско\-мой
площади. Разумеется, существенную роль при этом сыграли приоритеты
на по\-лу\-че\-ние соотношений, устанавливающих связь данных и
искомых параметров. Вы\-вод следствий имеет характер "встречного
распространения" \ цепочек зависимостей - от известных и от
неизвестных величин.

К текущему моменту определились длины сторон параллелограмма и его
углы. Поэтому для нахождения неизвестных диагоналей и завершения
решения остается воспользоваться теоремой косинусов. Основания для
срабатывания приема - известны длины двух сторон треугольника и
угол между ними, а длина третьей стороны связана с неизвестными
задачи каким-либо соотношением.

Перечисленные выше действия в действительности совпадают с
действиями ре\-ша\-теля. Таким образом, видно, что даже после
накопления большой базы приемов удается избежать чрезмерного
количества выводимых следствий. Это достигается тенденцией вводить
при обучении как можно более сильные ограничения на
сра\-ба\-ты\-вания, пропускающие лишь действительно разумные шаги.

Сразу заметим, что при обучении решателя геометрическим задачам
было до\-пу\-ще\-но одно отклонение от "человеческих" \
стандартов. Вместо того, чтобы в цикле предварительного анализа
чертежа определять, какие его элементы можно выра\-зить через
другие, и лишь затем выписывать нужные соотношения, решатель
вво\-дит эти соотношения сразу. Однако, за исключением редких
случаев, он никак их не преобразует, а использует лишь для
установления самого факта взаимной выра\-зи\-мос\-ти параметров -
как своего рода "граф" \ взаимосвязей. На быстродейст\-вии
компьютерной системы это сказывается мало, но у пользователя,
анализирую\-ще\-го ход решения по шагам, складывается впечатление
об избыточной громозд\-кос\-ти накапливаемой информации. Впрочем,
за счет дальнейшего усиления решаю\-щих правил, с данным явлением
можно достаточно эффективно бороться. Иногда оно и вовсе
незаметно.

Следующая задача - на качественное исследование поведения функции
$f(x) = x^x$ с помощью пределов и производных. Она решается по
схеме, аналогичной только что разобранному геометрическому
примеру. Решение заключается в последователь\-ном выводе
следствий, характеризующих функцию $f$, и в отборе тех из них,
кото\-рые целесообразно включить в итоговый список. Прежде всего
применяется прием, находящий область определения функции. Он
выписывает условия на область до\-пус\-тимых значений $x$ и
обращается к вспомогательной задаче на упрощение клас\-са таких
значений. Выводится следствие $\mbox{Dom}(f) = (0,\infty)$.
Следующий шаг - вычисле\-ние производной. Получаются следствия
$g(x) = (1+ \ln x)x^x$; "Производная($f,g$)". Снова применяется
прием, определяющий область определения введенной в
рас\-смот\-рение функции $g$. После того, как явно указаны области
определения $f,g$, вво\-дит\-ся посылка, указывающая множество
точек, где производная не определена либо не вычислена:
$\mbox{Dom}(f) \setminus \mbox{Dom}(g) = \emptyset$. Следующий шаг
- срабатывание приема, обраща\-ю\-ще\-го\-ся к вспомогательной
задаче для отыскания корней производной и вводя\-ще\-го следствие
$\mbox{roots}(g,\mbox{Dom}(g)) = \{1/e\}$. Чтобы анализировать
поведение функции в точках, где ее производная определена и
отлична от нуля, эта область явно на\-хо\-дит\-ся и разбивается на
промежутки. Соответствующий прием обращается к
вспомо\-га\-тель\-ной задаче, осуществляющей такое разбиение,
после чего появляется по\-сыл\-ка "областьроста($f,
(0,1/e)\cup(1/e,\infty))$", распадающаяся на утверждения
"областьрос\-та($f,(0,1/e)$)", "областьроста($f,(1/e,\infty)$)".
Используя информацию о промежут\-ках монотонности и анализируя
знак производной на их стыке (точка $1/e$), следую\-щий прием
выводит утверждения "возрастает($f,(1/e,\infty)$)",
"убывает($f,(0,1/e)$)". Далее применяется прием, анализирующий
знаки функции $f$ на интервале монотонности. Он выводит следствия
о числе корней на интервале: $\mbox{card}(\mbox{roots}(f,(0,1/e)))
= 0$, $\mbox{card}(\mbox{roots}(f,(1/e,\infty))) = 0$, немедленно
преобразуемые к виду $\mbox{roots}(f,(0,1/e)) = \emptyset$,
$\mbox{roots}(f,(1/e,\infty)) = \emptyset$. Следующий прием
усматривает экстремум на стыке про\-ме\-жут\-ков монотонности -
$$\mbox{Extr}(f,\frac{1}{e},\frac{1}{\exp \frac{1}{e}}, \min).$$
На этом поток вывода следствий исчерпывается, и выдается ответ, в
который от\-би\-ра\-ют\-ся: соотношение, определяющее функцию $f$,
информация об экстремуме, о промежутках монотонности, об области
определения функции $f$ и о числе ее кор\-ней на промежутках
монотонности.

В этом примере управляющая компонента приемов была почти
вырожден\-ной - по существу, совокупность приемов составляла
алгоритм исследования функции. Однако, разбиение такого алгоритма
на отдельные почти не связанные друг с дру\-гом фрагменты - приемы
- предоставляет несомненные удобства для последующего пополнения
его все новыми и новыми элементами, ориентированными на
различ\-ные специальные случаи.

Еще один пример, решаемый по схеме вывода следствий - из
аналитической гео\-мет\-рии. Пусть стороны треугольника заданы
уравнениями $7x+y-2=0, 5x+5y-4=0, 2x-2y+5=0$. Нужно найти
координаты точки внутри треуголь\-ника, равноудаленной от первых
двух прямых и отстоящей от третьей на расстояние
$\frac{3\sqrt{2}}{4}$. В аналитической геометрии, а в особенности
в таких разделах, как теория вероятнос\-тей и физика, обычной
математической символики для полной формулировки зада\-чи
оказывается уже недостаточно. Поэтому пошаговому анализу решения
здесь пред\-шест\-вует анализ возможных вариантов логической
формализации условия и отбор наиболее удобных вариантов. В нашем
примере обозначения возьмем из логичес\-ко\-го языка решателя.
Пусть вершины треугольника обозначены $A,B,C$, а прямоуголь\-ная
система координат, относительно которой берутся уравнения - $K$.
Сами уравне\-ния можно записать тогда, например, в следующем виде:
"коорд(прямая($AB$),$K$) = $\mbox{set}_{xy}(x-\mbox{число} \ \& \
y-\mbox{число} \ \& \ 7x+y-2=0 $)"; "коорд(прямая($AC$),$K$) =
$\mbox{set}_{xy}(x-\mbox{число} \ \& \ y-\mbox{число} \ \& \
5x+5-4=0 $)"; "коорд(прямая($BC$),$K$) =
$\mbox{set}_{xy}(x-\mbox{число} \ \& \ y-\mbox{число} \ \& \
2x-2y+5=0 $)". Искомую точку обозначим $D$; условие ее
принадлеж\-нос\-ти треугольнику запишем в виде $D \in
\mbox{фигура}(ABC)$. Равноудаленность точ\-ки от первых двух
прямых представляем записью "расстдопрямой($D$,прямая($AB$))=
расстдопрямой($D$,прямая($AC$))". Указываем расстояние до третьей
прямой: "расст\-допря\-мой($D$,пря\-мая($BC$)) =
$\frac{3\sqrt{2}}{4}$". Перечисленные утверждения образуют список
по\-сылок задачи, т.е. то, что дано. Условием ее служит равенство
$z=\mbox{коорд}(D,K)$, причем переменная $z$ является неизвестной
задачи. По постановке задачи, в выра\-же\-ние для $z$ не должны
входить обозначения $A,B,C,D,K$, хотя они и появляются в посылках
задачи, а следовательно, формально являются "известными". Это
спе\-ци\-аль\-но оговаривается в целевой установке задачи.

Процесс решения задачи выглядит как вывод следствий из
объединенного спи\-с\-ка посылок и условий. Приведем цепочку
выводов, реализуемую решателем. Хотя она, быть может, и не
оптимальна, однако для новичка вполне допустима.

Прежде всего, вводятся координаты точек $A,B,C$: "коорд($A$,$K$)"
\ $=(a,b)$; "ко\-орд($B$,$K$)"\ $=(c,d)$; "коорд($C$,$K$)"\
$=(e,f)$. Основанием для такого действия служит то, что точки
встречаются в обозначениях прямых, для которых известны уравнения.
Следующий шаг - ввод координатного набора для неизвестной $z$:
$z=(g,h)$. Осно\-ва\-ни\-ем является то, что в задаче
рассматривается расстояние от точки $D$ до прямой, уравнение
которой известно. Для всех введенных новых параметров $a,b,\ldots,
h$ ре\-гист\-рируются посылки, указывающие, что параметры -
числовые. Подставляя коор\-ди\-на\-ты точки $A$ в уравнение прямой
$AB$, получаем соотношение $b+7a-2=0$. Его преобразуем к виду $b =
2-7a$ и подставляем $b$ во все остальные посылки задачи.
Аналогичным образом, выводим соотношение $d+7c-2=0$ и преобразуем
к виду $d=2-7c$. Подставляя координаты точки $A$ в уравнение
прямой $AC$, нахо\-дим $a=1/5$. Все эти действия выполняются
простыми приемами, срабатывающими без ограничений. Подставляя
значение $a$ в уравнение для $b$, находим $b=3/5$. Для точек $B,C$
выполняем аналогичные действия; в итоге получаем $c = -1/16$, $d =
2+7/16$, $e=-17/20$, $f = 33/20$.

Определив координаты точек $A,B,C$ (быть может, они для
дальнейшего и не понадобятся), решатель переходит к выводу
соотношений для искомых коор\-ди\-нат $g,h$. Так как уравнение
прямой $AC$ известно, можно воспользоваться формулой для
расстояния от точки до прямой и получить соотношение
$$50(\mbox{расстдопрямой}(D, \mbox{прямая}(AC)))^2 =
50gh+25g^2+25h^2-40g-40h+16.$$ Основанием для этого действия
служит то, что указанное расстояние уже упоми\-на\-ет\-ся в
задаче, а уравнение прямой известно. Выражаем квадрат расстояния:
$$(\mbox{расстдопрямой}(D, \mbox{прямая}(AC)))^2 =
\frac{50gh+25g^2+25h^2-40g-40h+16}{50}.$$ Аналогичным образом, для
расстояния от $D$ до прямой $AB$ получаем:
$$(\mbox{расстдопрямой}(D, \mbox{прямая}(AB)))^2 =
\frac{14gh+49g^2+h^2-28g-4h + 4}{50}.$$ С учетом посылки задачи,
указывающей равенство данных расстояний, вы\-во\-дим соотношение
$$\frac{50gh+25g^2+25h^2-40g-40h+16}{50} = \frac{14gh+49g^2+h^2
-28g-4h+4}{50}.$$ Далее переходим к расстоянию от $D$ до прямой
$BC$: $$(\mbox{расстдопрямой}(D, \mbox{прямая}(BC)))^2 =
\frac{-8gh+4g^2+4h^2+20g-20h+25}{8}.$$ В это равенство подставляем
значение расстояния, данное в формулировке задачи:
$$\frac{9}{8} = \frac{-8gh+ 4g^2 +4h^2 +20g -20h+25}{8}.$$
Начинается цепочка общей стандартизации последних уравнений. После
устра\-не\-ния знаменателей и сокращения они преобразуются к виду:
$5g-2gh-5h+g^2+h^2=-4$, $g+3h+2g^2-3gh-2h^2=1$.

Теперь начинается учет условия принадлежности точки $D$
треугольнику. Здесь-то и используются найденные ранее координаты
вершин. Условие расположения точ\-ки $D$ по ту же сторону от
прямой $AB$, что и точка $C$, дает неравенство $h+7g-2 \le 0$. В
случае прямой $AC$ получаем $0 \le 5g+5h-4$. В случае прямой $BC$
- $0 \le 2g-2h+5$.

Далее решатель усматривает систему из двух приведенных выше
уравнений от\-но\-си\-тель\-но числовых параметров $g,h$ и решает
ее вне общего контекста, учиты\-вая также неравенства для $g,h$. В
результате получается $g=0,h=1$, $z = (0,1)$, и зада\-ча решена.

Процесс вывода следствий похож на решение задачи по элементарной
геомет\-рии, однако управление приемами здесь существенно проще.

Следующий пример - задача по теории вероятностей. Формулировка ее
такова. Радиолокационная станция ведет наблюдение за объектом,
который может приме\-нять или не применять помехи. Если объект
применяет помехи, то за один цикл обзора станция обнаруживает его
с вероятностью $p_1$; если не применяет - с веро\-ят\-нос\-тью
$p_2$. Вероятность того, что во время цикла будут применены
помехи, равна $p$ и не зависит от того, как и когда применялись
помехи в остальных циклах. Най\-ти вероятность того, что объект
будет обнаружен хотя бы один раз за $n$ циклов обзора.

Хотя обучение логической системы пониманию текстов и начато, но
объем пред\-стоящей здесь работы чрезвычайно велик, и пока
логическую формализацию за\-дач текстового характера придется
выполнять вручную. В любом случае, определение логического языка
должно будет предшествовать созданию системы, понимающей тексты,
ибо переводить их придется именно на этот язык. В нашем примере
введем обозначение $A(i)$ для случайных событий, состоящих в
применении помех на $i$-м цикле, а также обозначение $B(i)$ для
случайных событий, состоящих в обнаружении объекта на $i$-м цикле.
Обозначим также $C$ вероятностное пространство. Тогда
фор\-му\-лировка задачи на логическом языке может быть
представлена в следующем виде:

"незавсобытия($A$,$C$)" \ (независимость событий семейства $A$);

$l(A)=n$ (число со\-бы\-тий в семействе $A$);

$\forall_i(i \in \{1, \ldots , n\} \rightarrow
\mbox{вероятность}(A(i),C)=p)$ (вероятность собы\-тия $A(i)$);


"незавсобытия($B$,$C$)";

$l(B)=n$;

$\forall_i(i \in \{1, \ldots , n\} \rightarrow
\mbox{услвероятн}(B(i),A(i),C)= p_1)$ (вероятность события $B(i)$
при условии события $A(i)$);

$\forall_i(i \in \{1, \ldots , n\} \rightarrow
\mbox{услвероятн}(B(i),\mbox{элемсобытия}(C)\setminus A(i),C) =
p_2)$ (вероятность события $B(i)$ при условии отсутствия события
$A(i)$).

Смысл логических символов, используемых в этих утверждениях,
понятен из их названия. После перечисления посылок задачи
формулируем ее условие. Очевид\-ным образом, оно состоит в
определении вероятности объединения событий семейства $B$: $$x =
\mbox{вероятность}(\bigcup_{i=1}^n B(i),C).$$ Здесь $x$ -
неизвестная.

Первый шаг в решении - выразить вероятность объединения событий
$B(i)$ че\-рез вероятности отдельных $B(i)$, используя их
независимость. Прием преобразу\-ет исходное условие к виду $$x = 1
- \prod_{i=1}^n(1 - \mbox{вероятность}(B(i),C)).$$ Каких-либо
ограничений на срабатывание приема не имеется - он применяется
все\-гда, как только усматривается объединение независимых
событий. Разумеется, это не исключает возможности появления таких
ограничений при продолжении обучения.

Дальнейшее решение происходит в рамках вывода следствий из условия
и посы\-лок. Числовое выражение "вероятность($B(i)$,$C$)",
встречающееся под знаком ко\-неч\-ного произведения, можно
попытаться выразить через числовые переменные. При\-ем,
выполняющий эту попытку, обращается к решению вспомогательной
задачи. Посылки ее получаются присоединением к посылкам текущей
задачи ограниче\-ний на переменную $i$, т.е. утверждений:
$i-\mbox{целое}$, $1 \le i$, $i \le n$. Условие имеет вид
"вероятность($B(i)$,$C$) $ = a$", где $a$ - неизвестная
вспомогательной задачи. Исполь\-зуя имеющиеся кванторные посылки,
получаем следствия "услвероятн($B(i)$,$A(i)$,$C$) $ = p_1$",
"услвероятн($B(i)$, элемсобытия($C$)$\setminus A(i)$,$C$) $ =
p_2$". Основанием примене\-ния приемов вывода здесь является то,
что получаемые утверждения содержат значения функциональных
переменных $A,B$ в точке $i$. Далее применяем формулу полной
вероятности, связывающую $a$ с найденными условными вероятностями:
$$p_1 \mbox{вероятность}(A(i),C)+
p_2\mbox{вероятность}(\mbox{элемсобытия}(C)\setminus A(i),C) = a.
$$ Основанием для применения приема служит упоминание в задаче
вероятности "ве\-ро\-ятность($B(i)$,$C$)" \ и обеих условных
вероятностей. В найденном утверждении ве\-ро\-ят\-ность дополнения
преобразуется к виду $1-\mbox{вероятность}(A(i),C)$. Затем
приво\-дят\-ся подобные члены, и получается "$p_2 +
(p_1-p_2)\mbox{вероятность}(A(i),C)=a$". Наконец, из кванторной
посылки выводится следствие "вероятность($A(i)$,$C$) = $p$".
Получен\-ное значение вероятности подставляется в предыдущее
уравнение, и возникает равен\-ст\-во $a = pp_1+p_2(1-p)$,
определяющее значение неизвестной $a$. По завершении реше\-ния
вспомогательной задачи возвращаемся в основную задачу, подставляя
вместо "$\mbox{вероятность}(B(i),C)$" \ выражение $p_2
+pp_1-pp_2$. Под конечным произведением теперь находится
выражение, не зависящее от индекса $i$. Поэтому данное
произведение заменяется на
$$(1-(p_2+pp_1-pp_2))^n.$$ Отсюда получаем ответ
 $x = 1 - (1+pp_2-p_2-pp_1)^n.$

Разобранный пример достаточно типичен для задач по теории
вероятности - сначала выполняется цепочка эквивалентных
преобразований условия задачи на опи\-са\-ние, и лишь затем, если
без этого ответ получить не удалось, используется вы\-вод
следствий.

Следующий пример - задача по элементарной физике. Формулировка ее,
разу\-ме\-ет\-ся, текстовая: "С вершины наклонной плоскости
высотой 5 м и углом на\-кло\-на к горизонту 45 градусов начинает
соскальзывать тело. Определите скорость тела в конце спуска, если
коэффициент трения тела о плоскость 0.19".

Логическую формализацию рассуждений в физике приходится
осуществлять в ситуации, когда многое принимается по умолчанию.
Например, если специ\-аль\-но не оговаривается в задаче, трение не
учитывается; нити считаются невесомыми и нерастяжимыми;
сопротивление воздуха не учитывается; спуск по наклонной
плос\-кос\-ти происходит вдоль линии с наибольшим уклоном, и т.п.
Чтобы извлекать эту, опущенную в постановке задачи информацию,
приходится вводить приемы, вос\-ста\-нав\-ливающие ее согласно
принятым условностям. В процессе обучения часто скла\-ды\-вается
ситуация, когда приемы, введенные с ориентацией на какие-то
апри\-ор\-ные предположения, приходится корректировать, оговаривая
новые и новые осо\-бые случаи, где эти предположения некорректны.
Все это здесь можно считать нормой.

Предлагаемая логическая формализация физических задач никоим
образом не претендует на завершенность. Ее следует рассматривать
как результат прора\-бот\-ки конкретного обучающего материала из
элементарной физики, оказавшийся доста\-точ\-ным для работы с этим
материалом. Видимо, первые же попытки выйти за рам\-ки
элементарной физики потребуют радикального пересмотра всего
созданного здесь логического языка. Однако, эту работу можно будет
проводить уже не на пустом месте, а с учетом всех плюсов и минусов
данной версии.

Уже на этапе выбора базисных предикатов, необходимых для задания
положе\-ния и скорости тел, возникает некоторое осложнение. Можно
было бы, например, обозначать положение тела (для простоты -
материальной точки) $A$ в момент $t$, используя запись вида
"Место($A$,$t$)". Однако, в задачах часто встречается ситуация,
когда рассматриваемое тело, кроме реального движения, участвует в
одном или нескольких воображаемых процессах движения. Например,
про пешехода гово\-рит\-ся: "если бы он шел на 2 км/час быстрее,
то пришел бы на 10 минут раньше". Ясно, что здесь для задания
положения пешехода недостаточно указания мо\-мен\-та времени. В
логической записи нужно вводить еще один параметр, доопределяющий
контекст - в каком "мире" \ происходит движение пешехода
(реальном, вообража\-е\-мом и т.п.). Такой дополнительный параметр
пришлось бы вводить для указа\-ния любых физических характеристик
объекта - скорости, ускорения, силы воздейст\-вия и т.п. Все это,
безусловно, утяжелило бы логические конструкции. Более
рациональ\-но пойти по другому пути. Можно объединить пару "объект
- контекст его рассмот\-ре\-ния" \ в понятие процесса, и таким
образом получить более экономную запись, сохранив число
параметров. Однако, тогда придется основные физические
ха\-рак\-те\-рис\-тики - положение в пространстве, скорость,
ускорение, силу и т.д. связы\-вать уже не с объектом, а с
процессом. Впрочем, такая точка зрения становится впол\-не
естественной, если понимать под процессом просто функцию,
определенную на некотором временном промежутке и принимающую в
качестве значения совокуп\-ность качественных и количественных
характеристик, полностью определяющих те\-кущее состояние
рассматриваемого объекта. Отнесение различных упоминаемых в задаче
процессов к общему контексту происходит за счет использования
связей меж\-ду ними, явно указанных в задаче. Если таких связей
нет, процессы считают\-ся происходящими в различных контекстах
("мирах", и т.п.).

Согласно вышесказанному, в качестве одного из базисных предикатов
для зада\-ния движущихся объектов выбран предикат "движение($a$
$b$ $c$)". Он означает, что $a$ есть процесс движения материальной
точки $b$ вдоль траектории $c$. Послед\-няя представляет собой
какую-либо ориентированную кривую в пространстве, возможно,
имеющую самоналожения.

В нашем примере речь идет не просто о движении, а о движении по
наклон\-ной плоскости. Такая разновидность движения настолько
часто встречается в задачах по элементарной физике, что для нее
разумно ввести специальный предикат "движ\-наклплоск($a$ $b$ $c$
$d$)". Здесь $a$ - процесс движения тела по наклонной плоскос\-ти,
совершающей процесс движения $b$; $c$ - прямоугольная система
координат в про\-стран\-ст\-ве, определяющая ориентацию наклонной
плоскости; $d$ - угол ее наклона. Для определенности считаем, что
наклонная плоскость параллельна оси $OY$ и накло\-не\-на под углом
$d$ к направлению оси абсцисс. Угол $d$ изменяется от 0 до
$\pi/2$. Можно было бы пойти по другому пути - ввести предикат для
движения одного тела по поверхности другого, предикат для
характеризации объекта "наклонная плос\-кость", а также
функциональный символ для определения угла. Однако, в этом случае
каждый раз пришлось бы дополнительно уточнять, что движение
происходит по линии наибольшего уклона, и все вместе взятое
оказалось бы существенно более громоздким, чем предикат
"движнаклплоск($\ldots$)". Несколько неудобно то, что этот
предикат позволяет вводить только наклонные плоскости с уклоном
"справа нале\-во". Необходимости рассматривать в задачах другие
наклонные плоскости пока не возникало; если понадобится, то
нетрудно перейти к использованию двух различ\-ных предикатов
"движлевнаклплоск" \ и "движправнаклплоск".

Возвращаясь к рассматриваемой задаче, вводим первые две ее посылки
- "движ\-наклплоск($a$ $b$ $K$ $\pi/4$)", "движение($a$ $c$ $d$)".
По умолчанию, в задаче присутству\-ет поверхность Земли, по
отношению к которой и берется угол наклона. Систему координат, у
которой ось $OZ$ направлена вертикально вверх по отношению к
дан\-ной поверхности, выделяем посылкой "поверхнземли($K$)". Чтобы
указать на непод\-виж\-ность наклонной плоскости (опять же
предполагаемую по умолчанию), вво\-дим посылку "неподв($b$ $P$)".
Здесь $P$ - сама наклонная плоскость (как физическое те\-ло).
Условие о том, что высота наклонной плоскости равна 5 м,
представим как соотношение для разности $z$ - координат тела в
начале и конце процесса движения. Будем обозначать положение в
момент $t$ материальной точки, совершающей процесс движения $a$,
через "Место($a$,$t$)". $i$-ю координату точки (либо вектора) $A$
в сис\-те\-ме координат $K$ обозначаем посредством
"крд($A$,$K$,$i$)". Тогда посылка задачи запи\-сы\-ва\-ет\-ся в
виде: "крд(Место($a$, исхмомент($a$)),$K$,3)$-$ крд(Место($a$,
послмомент($a$)),$K$,3) = 5м". Условие неподвижности тела в
начальный момент дает посылку "Скорость($a$, $K$,исхмомент($a$)) =
вектор0". Здесь посредством "Скорость($A$,$B$,$t$)" \
обознача\-ет\-ся вектор скорости в момент $t$ объекта,
находящегося в процессе движения $A$, относи\-тель\-но объекта,
находящегося в процессе движения $B$. Допускается в качестве $B$
использовать также ссылку на систему координат. Чтобы задать
коэффициент тре\-ния, введем в рассмотрение силовое воздействие
$f$ наклонной плоскости на дви\-жу\-ще\-е\-ся тело. Согласно
общему принципу, будем считать это воздействие тоже процес\-сом.
Тогда добавляется посылка "воздействие($f$,$a$,$b$)". Коэффициент
трения, харак\-те\-ри\-зу\-ющий это воздействие, осредняется на
весь период движения, и задается посыл\-кой вида "коэффтрения($f$
Период($f$)) = 0.19".

Для искомой скорости тела в конце спуска вводим единственное
условие за\-да\-чи: $x = \mbox{длина}(\mbox{Скорость}(a, K,
\mbox{послмомент}(a)))$.

Как видно из этого примера, для физических задач значительную
часть процес\-са обучения составляет выбор логической
формализации. Иногда такая формали\-за\-ция даже не требует
пополнения ранее введенных понятий, оставаясь при этом достаточно
трудоемкой и кропотливой работой. Переходим далее к анализу
соб\-ст\-вен\-но траектории решения и приводим (с небольшими
упрощениями) последова\-тель\-ность действий, реализуемых
решателем.

Сначала применяются приемы, выполняющие простейшую стандартизацию
по\-сы\-лок и их пополнение. Во-первых, все последние моменты
процессов выражаются через исходные моменты и длительность.
Во-вторых, выписываются принимаемые по умолчанию соотношения о
равенстве периодов взаимосвязанных процессов (в на\-шем случае -
$a$ и $b$). В-третьих, добавляется посылка о том, что $K$ -
прямоуголь\-ная система координат. Для неподвижной наклонной
плоскости вводится фиктив\-ный процесс движения
"дви\-же\-ние($b$,$P$,$e$)".

Далее вводится в рассмотрение сила притяжения, действующая на тело
$a$: "воз\-дей\-ствие($g$,$a$,$K$)", "притяжение($g$)". В качестве
воздействующего объекта услов\-но принимается связанная с
поверхностью Земли система координат $K$. Срабаты\-ва\-ет прием,
замечающий, что сила притяжения около поверхности Земли
постоян\-на: "констсила($g$)". Выводится соотношение равенства
периодов процесса движения $a$ и силового воздействия $f$ на тело
со стороны наклонной плоскости.

Так как угол наклона известен, выписывается соотношение,
связывающее иско\-мую величину скорости тела с вер\-ти\-каль\-ной
составляющей этой скорости:
$$|\mbox{крд}(\mbox{Скорость}(a, K, \mbox{исхмомент}(a)+
\mbox{длительность}(a)), K, 3)|=x/\sqrt{2}.$$ Это соотношение
может оказаться полезным, так как последующий анализ силовых
воздействий даст вертикальную и горизонтальную проекции ускорений.

Чтобы исключить из посылок как можно большее число атомарных
число\-вых характеристик, выражаем далее $z$ - координату исходной
позиции тела через $z$ - координату заключительной позиции:
"крд(Место($a$,исхмомент($a$)), $K$, $3$) $=$ 5м $+$
крд(Место($a$,исхмомент($a$)+длительность($a$)), $K$, $3$)". Так
как в задаче упоми\-на\-ют\-ся скорости тела в начале и конце
спуска, а действующие на тело силы постоянны, то выписываем
соотношение, связывающее $z$ - компоненты данных скоростей,
дли\-тель\-ность спуска и ускорение: "крд(Скорость($a$,$K$,
исхмомент($a$)+ длительность($a$)), $K$, $3$) $=$
длительность($a$)крд(Ускорение($a$, $K$,Период($a$)), $K$, $3$)".

На этом цикл вывода простейших следствий завершается, и начинается
сос\-тав\-ление списка всех сил, действующих на тело.
Предполагается, что к моменту сраба\-ты\-ва\-ния данного приема
(уровень его равен 3) все такие силы уже явно обозначены в
посылках задачи. Прием извлекает ссылки на них из утверждений
"воздействие($\ldots$)" \ и добавляет посылку
"Силы($a$,$\{g,f\}$)". Из постоянства этих сил выводится
ут\-вер\-жде\-ние "Равносукоренное($a$)".

Для равноускоренного движения выписывается соотношение, выражающее
$z$ - координату в конце движения через $z$ - координату в начале,
ускорение и дли\-тель\-ность (исходная скорость равна 0). После
несложной стандартизации это соотно\-ше\-ние принимает вид:
$$(\mbox{длительность}(a))^2 \mbox{крд}(\mbox{Ускорение}(a, K,
\mbox{Период}(a)), K, 3) = - 10\mbox{м}.$$ С целью уменьшения
числа атомарных числовых параметров, присутствующих в посылках
задачи, преобразуем последнее соотношение так, чтобы получилось
яв\-ное выражение для $z$ - компоненты ускорения:
$$\mbox{крд}(\mbox{Ускорение}(a,K,\mbox{Период}(a)),K,3)=
- \frac{10 \mbox{м}}{(\mbox{длительность}(a))^2}.$$ Найденное
выражение подставляется в ранее полученные соотношения. После
упро\-ще\-ния равенства с неизвестной $x$ возникает равенство:
$$\frac{10\mbox{м}}{\mbox{длительность}(a)} = \frac{x}{\sqrt{2}}.$$
Из него получаем выражение для длительности спуска:
$$\mbox{длительность}(a) = \frac{10\sqrt(2)\mbox{м}}{x}.$$
Подстановка последнего в выражение для $z$ - компоненты ускорения
дает: $$\mbox{крд}(\mbox{Ускорение}(a,K,\mbox{Период}(a)),K,3) = -
\frac{x^2}{20\mbox{м}}.$$

После указанной цепочки чисто алгебраических преобразований
решатель сно\-ва выписывает физическое соотношение. На этот раз
применяется прием, выражаю\-щий $x$- и $z$- координаты силы трения
через величину силы тяжести, коэффициент трения и угол наклона
плоскости. Ввиду того, что ситуация с движением тела по наклонной
плоскости под действием только сил тяжести и воздействия со
стороны наклонной плоскости является стандартной, для нее
заготовлены формулы, сразу дающие указанное выражение. Основанием
для применения приема является упо\-ми\-нание в задаче
коэффициента трения. В результате возникают две новые посылки:
$$\mbox{крд}(\mbox{силатрения}(f,\mbox{Период}(a)),K,1) =
\frac{19\mbox{длина}(\mbox{сила}(g,\mbox{Период}(a)))}{200},$$
$$\mbox{крд}(\mbox{силатрения}(f,\mbox{Период}(a)),K,3) =
\frac{19\mbox{длина}(\mbox{сила}(g,\mbox{Период}(a)))}{200}.$$
Следующее действие - подстановка в эти соотношения вместо величины
силы при\-тя\-же\-ния "длина(сила($g$,Период($a$)))" \ выражения
"масса($c$)$g$" \ и подстановка вместо $g$ приближенного значения
$9.8\mbox{м}/\mbox{сек}^2$.

Так как сила трения уже появилась в посылках, вводится
соотношение, пред\-став\-ля\-ющее силу $f$ воздействия плоскости
на тело в виде суммы силы трения и силы нормальной реакции:
$$\mbox{сила}(f,\mbox{Период}(a))=\mbox{силатрения}(f,\mbox{Период}(a))
+\mbox{нормреакция}(f,\mbox{Период}(a)).$$ Далее, так как в
посылках встречается $z$ - координата силы трения, применя\-ет\-ся
прием, переходящий от векторного соотношения к соотношению для $z$
- коорди\-нат. После исключения знаменателя получается:
$\mbox{сек}^2\mbox{крд}(\mbox{сила}(f,\mbox{Период}(a)),K,3) -
0.931\mbox{масса}(c)\mbox{м} - \mbox{сек}^2 \mbox{крд}
(\mbox{нормреакция}(f,\mbox{Период}(a)),K,3)=0$. Для $x$ -
коор\-ди\-на\-ты силы трения, тоже встречающейся в посылках,
выписывается аналогичное соот\-но\-ше\-ние. Из него получается
выражение $x$ - координаты силы $f$ через $x$ - коорди\-на\-ту
силы нормальной реакции.

Появление выражений для координат силы нормальной реакции влечет
сра\-ба\-ты\-вание приема, выписывающего тригонометрические
соотношения, связывающие их с величиной этой силы:
$$\mbox{крд}(\mbox{нормреакция}(f,\mbox{Период}(a)),K,1) =
-\frac{\mbox{длина}(\mbox{нормреакция}(f,\mbox{Период}(a)))}{\sqrt{2}};$$

$$\mbox{крд}(\mbox{нормреакция}(f,\mbox{Период}(a)),K,3) =
-\frac{\mbox{длина}(\mbox{нормреакция}(f,\mbox{Период}(a)))}{\sqrt{2}}.$$
Так как на тело действуют только силы притяжения и воздействия со
сто\-ро\-ны наклонной плоскости, то применяется прием, связывающий
координаты нормаль\-ной реакции с величиной силы притяжения:
$$\frac{\mbox{длина}(\mbox{нормреакция}(f,\mbox{Период}(a)))}
{\sqrt{2}}=
\frac{\mbox{длина}(\mbox{сила}(g,\mbox{Период}(a)))}{2}.$$ Далее
идет цепочка подстановок найденных значений и упрощающих
преобразо\-ва\-ний; попутно подставляется явное выражение для
величины силы притяжения. В результате возникают выражения для
координат нормальной реакции и силы $f$ через массу тела:
$$\mbox{длина}(\mbox{нормреакция}(f,\mbox{Период}(a)))=
\frac{9.8\mbox{масса}(c)\mbox{м}}{\sqrt{2}\mbox{сек}^2};$$
$$\mbox{крд}(\mbox{нормреакция}(f,\mbox{Период}(a)),K,3)=
\frac{4.9\mbox{масса}(c)\mbox{м}}{\mbox{сек}^2};$$
$$\mbox{крд}(\mbox{нормреакция}(f,\mbox{Период}(a)),K,1)=
\frac{4.9\mbox{масса}(c)\mbox{м}}{\mbox{сек}^2};$$
$$\mbox{крд}(\mbox{сила}(f,\mbox{Период}(a)),K,1)=
\frac{3.969\mbox{масса}(c)\mbox{м}}{\mbox{сек}^2};$$
$$\mbox{крд}(\mbox{сила}(f,\mbox{Период}(a)),K,3)=
\frac{5.831\mbox{масса}(c)\mbox{м}}{\mbox{сек}^2}.$$ Так как в
задаче упоминается $z$- координата ускорения, причем найден список
сил, действующих на тело, то выписывается второй закон Ньютона для
$z$ - координа\-ты:
$$\mbox{крд}(\mbox{Сила}(a,\mbox{Период}(a)),K,3) =
- \frac{x^2\mbox{масса}(c)}{20\mbox{м}}.$$ В это соотношение
подставляется выражение для $z$ - компоненты суммы сил:
$$\frac{5.831\mbox{масса}(c)\mbox{м}}{\mbox{сек}^2} + \mbox{крд}(
\mbox{сила}(g,\mbox{Период}(a)),K,3) = -
\frac{x^2\mbox{масса}(c)}{20\mbox{м}}.$$ После подстановки явного
выражения для $z$ - компоненты силы притяжения и упро\-ще\-ний
получается уравнение $$x^2\mbox{сек}^2 - 79.38\mbox{м}^2 = 0.$$ Из
посылок задачи нетрудно усмотреть неотрицательность величины $x$
(длина век\-то\-ра), так что окончательно
$$x = \frac{63\mbox{м}}{5\sqrt{2}\mbox{сек}}.$$

Хотя приведенная цепочка действий решателя и выглядит несколько
громоздко и беспорядочно, однако почти все выведенные утверждения
использованы при полу\-че\-нии ответа, так что в итоге
избыточность оказывается не очень большой. Некото\-рым оправданием
громоздкости служит явное указание всех подробностей
рассужде\-ния. Кроме того, нужно учитывать, что отображено не
готовое решение, а процесс его поиска. Обычно при проработке новой
задачи, которую решатель заведомо не мо\-жет решить из-за наличия
нового материала, предпринимается трассировка его дейст\-вий
вплоть до выдачи отказа. Анализ завершающего состояния задачи
подсказывает, какие именно приемы лучше всего добавить для
продолжения цепочки решения. Если после этого задача все еще не
решается, то анализируется новая "тупико\-вая" \ ситуация, и т.д.
При таком режиме обучения борьбе с избыточностью,
проявляю\-щей\-ся в каких-либо бесполезных действиях решателя на
промежуточных шагах, уделяется совсем мало внимания. После того,
как решатель выдает правиль\-ный ответ, сразу берется очередная
задача. Однако, как показывает только что разо\-бран\-ный пример,
даже такая черновая версия, безусловно, требующая последую\-щей
существенной оптимизации и переработки, уже демонстрирует
сравнительно эффективное поведение.

Завершим разбор примеров рассмотрением текстовой задачи.
Формулировка ее такова: "Расстояние между А и В по железной дороге
66 км, а по водному пути - 80.5 км. Из А поезд выходит на 4 часа
позже парохода и прибывает в В на 15 мин. раньше парохода.
Определить средние скорости поезда и парохода, если пер\-вая
больше второй на 30 км/час".

При решении задачи можно выделить следующие основные этапы:

\begin{enumerate}

\item Этап чтения решателем текста и морфологического разбора
каждого сло\-ва фразы. Слово разбивается на фрагменты, число
которых обычно не более трех. Сначала идет основная часть,
включающая в себя корень и приставку; за\-тем - суффикс, и затем -
окончание. При морфологическом разборе указыва\-ют\-ся род, число,
время, возможные падежи, часть речи, к которой относится слово, и
т.п.

\item Этап синтаксического разбора фразы. Здесь устанавливается
подчинен\-ность слов, а для сложных фраз - также подчиненность
подфраз.

\item Этап предварительного отождествления объектов. Еще до
перехода от естест\-вен\-но\-го языка к логическому
предпринимается попытка усмотреть в различ\-ных местах фразы
ссылки на один и тот же объект. Кроме того, выполня\-ют\-ся
попытки отождествить объекты, на которые ссылается фраза, с
объек\-та\-ми предыдущих фраз, уже перенесенными в логическую
структуру данных. Роль такой структуры данных играет список
посылок вспомогательной задачи на исследование, имеющей цель
"текстоваязадача".

\item Этап получения логического подстрочника текущей фразы. Такой
подстроч\-ник представляет собой некоторый список утверждений
псевдологического языка, пока никак не связанных с логическим
языком решателя. Его логические сим\-во\-лы суть условные
обозначения, выбранные для кодирования корневых частей слов при
регистрации этих слов в словаре текстового анализа. Если
обозначение вводится для нового понятия, то оно может быть
использовано далее как пол\-но\-правный элемент логического языка
решателя. Если же логический сим\-вол, соответствующий слову, уже
занят, логический язык придется попол\-нять другим символом, и на
этапе семантического анализа потребуется соответст\-ву\-ю\-щая
коррекция обозначений.

\item Этап предварительного семантического анализа. Логический
подстрочник те\-ку\-щей фразы представляется как список посылок
вспомогательной задачи на исследование, имеющей цель
"анализфразы". Происходит первоочередная кор\-рекция утверждений,
которую можно делать в изолированном контексте од\-ной фразы.

\item Основной этап семантического анализа. Логические фрагменты
различных фраз текстовой задачи объединяются в списке посылок
задачи на исследование, имею\-щей цель "текстоваязадача". Здесь и
происходит основная часть работы по переводу утверждений на
логический язык решателя.

\item Переход к решению задачи, сформулированной на логическом
языке решателя. По итогам семантического анализа находится
утверждение "най\-ти($\ldots$)", кото\-рое и указывает на
неизвестные вспомогательной задачи на описание. Для решения этой
задачи привлекаются обычные возможности решателя.

\item Ответ, полученный при решении задачи на описание,
переводится на ест\-ест\-вен\-ный язык. Применяется процедура,
создающая названия фигурирую\-щих в ответе объектов на основе
данных, сохранившихся в задаче семантичес\-ко\-го анализа.

\end{enumerate}

Сейчас мы не будем затрагивать этапы с первого по пятый. Более
подробно о них будет рассказано в разделах данной книги, связанных
с текстовым анализом. Проследим наиболее интересный с логической
точки зрения основной этап семанти\-чес\-ко\-го анализа.
Разумеется, те приемы, которые будут применяться на этом этапе, не
дают логически корректных переходов в обычном математическом
смысле. Одна\-ко, естественный язык содержит множество вполне
однозначно расшифровы\-ва\-е\-мых условностей, и фактически речь
идет лишь о логике данной расшифровки. Приве\-дем исходный список
посылок задачи семантического анализа, составленной решате\-лем по
приведенному выше тексту. Трехместные отношения $P(A \ B \ C)$ в
этом списке соответствуют упоминаемым в фразе действиям, процессам
либо отношениям. Пе\-ре\-менная $A$ является обозначением самого
действия (отношения); $B$ - обозначением субъекта, и $C$ -
обозначением объекта. Все утверждения представляются в скобочной
записи, так формульный редактор рассчитан на логический язык
решателя, а не на язык логических подстрочников. По этой причине
все переменные при текстовом анализе имеют вид "х$i$".

\begin{enumerate}

\item Фраза "Расстояние между А и В по железной дороге 66 км, а по
водному пу\-ти - 80.5 км" \ преобразована в следующие два списка
термов:

"расст(х2)"; "между(х2 перечень(набор(х3 х4)))"; равно(х2
умножение(66 км))"; "по(х2 х5)"; "железный(х5)"; "дорога(х5)";

"расст(х7)"; "между(х7 перечень(набор(х3 х4)))"; "по(х7 х8)";
"чей(х8 х9)"; "вещество(х9 вода)"; "путь(х8)"; "составлять(х6 х7
умножение(80.5 км))".

\item Фраза "Из А поезд выходит на 4 часа позже парохода и
прибывает в В на 15 мин. раньше парохода" \ преобразована в:

"выходить(х10 х11 х12)"; "поезд(х11)"; "из(х10 х3)"; "выходить(х14
х13 х15)"; "пароход(х13)"; "из(х14 х3)"; "позже(х16 х10 х14)";
"на(х16 умножение(х17 4))"; "час(х17)";

"прибывать(х20 х13 х21)"; "в(х20 х4)"; "прибывать(х18 х11 х19)";
"в(х18 х4)"; "раньше(х22 х18 х20)" "на(х22 умножение(15 мин))";
"время(х18 настоящее)".

\item Фраза "Определить средние скорости поезда и парохода, если
первая больше второй на 30 км/час" \ преобразована в:

"найти(х23 х24
перечень(набор(средний(скорость(х11))средний(скорость(х13)\\
))))";

"равно(плюс(минус(средний(скорость(х11)))
средний(скорость(х13)))минус(ум\-ножение(дробь(км час)30)))".

\end{enumerate}

Прежде всего срабатывает прием, связанный с единицей измерения
"час". Ес\-ли имеется посылка "час($x$)", то предпринимается
подстановка во все выраже\-ния "умножение($a$ $x$)" логического
символа "час" \ вместо переменной $x$. В данном при\-ме\-ре -
утверждение "на(х16 умножение(х17 4))" \ заменяется на "на(х16
умножение(4 час))".

Логический символ "расст" \ введен для обозначения при текстовом
анализе сло\-ва "расстояние", чтобы избежать блокировки большого
числа приемов основ\-но\-го решателя, использующих логический
символ "расстояние". Такие приемы имеют\-ся, например, в
геометрии. Блокировка была бы нужна для предотвращения отка\-зов
интерпретатора ЛОСа, вызванных тем, что логический символ
"расстояние" \ - двуместный, а в логическом подстрочнике слово
"расстояние" \ возникает как одно\-мест\-ное отношение. В процессе
семантического анализа символ "расст" \ подлежит исключению. В
нашем примере исключение выполняет прием, заменяющий посыл\-ки
"расст(х2)", "равно(х2 умножение(66 км))" \ на посылку
"равно(длина(х2)умно\-же\-ние(66 км))".

В задачах по элементарной физике был введен трехместный предикат
"движе\-ние($a$ $b$ $c$)", означающий, что $a$ есть процесс
движения объекта $b$ по траектории $c$. В действительности этот
предикат был подсказан именно задачами на анализ текста,
рассмотрение которых предшествовало в обучении решателя проработке
задач по физике. К нему и будем сводить разнообразные варианты
ссылок на процессы дви\-же\-ния, встречающиеся в текстовых
задачах. Остальные понятия логического под\-строч\-ника тоже
постепенно будут заменяться понятиями, используемыми в
физичес\-ких задачах.

В нашем примере встречается утвержде\-ние "выходить(х14 х13 х15)".
Оно озна\-ча\-ет, что х14 есть начальный момент про\-цес\-са
движения, выполняемого объек\-том х13. Решатель вводит две новых
посылки - "движение(х1 х13 х25)" \ и "равно(х14 начало(х1))".

Процесс х14 выхода парохода х13 сопровождается указателем "из(х14
х3)". Это дает основание добавить новую посылку
"равно(началопути(х25)х3)".

Для поезда х10 аналогичным образом выводятся утверждения
"движение(х26 х11 х27)", "равно(х10 начало(х26))" \ и
"равно(началопути(х27)х3)".

Посылки "составлять(х6 х7 умножение(80.5 км))", "расст(х7)",
"между(х7 пере\-чень(набор(х3 х4)))", "по(х7 х8)" \ означают, что
длина пути х8 между х3,х4 рав\-на 80.5 км. Они заменяются на
"между(х8 перечень(набор(х3 х4)))",
"равно(длина(х8)ум\-но\-жение(80.5 км))".

Аналогичный прием в случае поезда заменяет посылки
"равно(длина(х2)ум\-но\-же\-ние(66 км)), "по(х2 х5)", "между(х2
перечень(набор(х3 х4)))" \ на "между(х5 пере\-чень(набор(х3
х4)))", "равно(длина(х5)умножение(66 км))".

Посылки "раньше(х22 х18 х20)", "на(х22 умножение(15 мин))" \
заменяются на одну посылку
"равно(момент(х20)плюс(момент(х18)умножение(15 мин)))".

Наличие посылок "движение(х26 х11 х27)" \ и "прибывать(х18 х11
х19)" \ дает основание заменить во всех прочих посылках выражение
"момент(х18)" на "посл\-мо\-мент(х26)" \ - последний момент
процесса движения х26. Аналогичным обра\-зом решатель поступает с
посылками "движение(х1 х13 х25)", "прибывать(х20 х13 х21)",
заменяя повсюду "момент(х20)" \ на "послмомент(х1)".

Из посылок "движение(х1 х13 х25)". "прибывать(х20 х13 х21)" \
делается вы\-вод "равно(х20 конец(х1))".

Далее рассматриваются посылки "движение(х1 х13 х25)",
"равно(конец(х1)х20)", "в(х20 х4)". Из них извлекается утверждение
"равно(конецпути(х25)х4)".

Аналогичным образом, для поезда выводятся утверждения "равно(х18
конец(х26)\\ )", "равно(конецпути(х27)х4)".

Так как в основном решателе логический символ "час" \ представляет
собой еди\-ни\-цу измерения и используется без скобок, то
предпринимается замена посылки "час(х17)" \ на "равно(х17 час)".

В тексте задачи упоминаются два пути - железная дорога и водный
путь, однако нигде явно не говорится, по какому из этих путей
следует поезд, а по какому - пароход. Теперь наступает момент,
когда необходимо сделать соответствующий вы\-бор. Вообще говоря,
этот выбор можно было бы подразбить на несколько элемен\-тар\-ных
шагов. Пока в решатель введен загрубленный прием,
при\-ни\-ма\-ю\-щий решение за один шаг. Он усматривает посылки
"пароход(х13)", "движение(х1 х13 х25)",
"рав\-но(конецпути(х25)х4)", "равно(началопути(х25)х3)",
"путь(х8)", "чей(х8 х9)", "ве\-ще\-ство(х9 вода)", "между(х8
перечень(набор(х3 х4)))" \ и делает вывод "равно(х25 х8)". Для
большей достоверности можно было бы ввести в прием фильтры,
про\-ве\-ря\-ю\-щие, что в задаче не упоминается другой водный
путь или какой-то его аналог (река, море, и т.п.).

Аналогичный прием усматривает посылки "поезд(х11)", "движение(х26
х11 х27)", "равно(конецпути(х27)х4)", "равно(началопути(х27)х3)",
"дорога(х5)", "же\-лез\-ный(\\ х5)", "между(х5 перечень(набор(х3
х4)))" \ и делает вывод "равно(х27 х5)".

Требование "найти(х23 х24
перечень(набор(средний(скорость(х11))средний(ско\-рость(х13)))))"
\ преобразуется к виду, в котором искомые величины соединены
связ\-кой "и": "найти(х23 х24
и(средний(скорость(х11))средний(скорость(х13))))".

Так как единственным рассматриваемым в задаче процессом движения
поезда х11 является процесс х26, то выражение "скорость(х11)" \
заменяется на "скорость(х26 х5)", т.е. на среднюю скорость
процесса х26. После этого относящийся к данной скорости
указа\-тель "средний($\ldots$)" \ становится излишним и удаляется.
Анало\-гич\-ным образом, выражение "средний(скорость(х13))" \ за
два шага преобразуется в "ско\-рость(х1 х8)". Посылка,
определяющая искомые величины, приобретает вид "най\-ти(х23 х24
и(скорость(х26 х5)скорость(х1 х8)))". Аналогичные преобразования
вы\-ра\-жений "скорость($\ldots$)" \ выполняются в остальных
посылках задачи.

Утверждения "позже(х16 х10 х14)" \ и "на(умножение(4 час))" \
заменяются на равенство "равно(момент(х10) плюс(момент(х14)
умножение(4 час)))".

Так как имеются посылки "движение(х1 х13 х8)" \ и "выходить(х14
х13 х15)", то выражение "момент(х14)" \ заменяется на
"исхмомент(х1)". Аналогичным обра\-зом, "момент(х10)" \ заменяется
на "исхмомент(х26)".

На этом цепочка преобразований логического подстрочника
завершается. Спи\-сок утверждений, формулирующих задачу на
логическом языке решателя, полнос\-тью укомплектован. Далее
срабатывает прием, который по установке "найти(х23 х24
и(скорость(х1 х8)скорость(х26 х5)))" \ строит задачу на описание,
имеющую своими неизвестными вспомогательные переменные х2,х6;
условиями - равенства "равно(х6 скорость(х26 х5))" \ и "равно(х2
скорость(х1 х8))", а посылками - все посылки резуль\-тата
семантического анализа, за исключением установки "найти($\ldots$)"
\ и ряда других посылок, остающихся за рамками собственного языка
решателя. Для большей на\-гляд\-ности, перечислим эти посылки.
Сначала приведем посылки, сформулиро\-ван\-ные на логическом языке
решателя - для решения задачи понадобятся только они:

\begin{enumerate}

\item "равно(исхмомент(х26)плюс(умножение(4 час)исхмомент(х1)))";

\item "равно(конецпути(х5)х4)";

\item "равно(конец(х26)х18)";

\item "равно(конецпути(х8)х4)";

\item "равно(послмомент(х1)плюс(умножение(15
мин)послмомент(х26)))";

\item "равно(длина(х5)умножение(66 км))";

\item "равно(длина(х8) умножение(80.5 км))";

\item "равно(началопути(х5)х3)";

\item "движение(х26 х11 х5)";

\item "равно(началопути(х8)х3)";

\item "движение(х1 х13 х8)";

\item "равно(плюс(минус(скорость(х26 х5)) скорость(х1 х8))
минус(дробь(ум\-но\-же\-ние(30 км)час)))";

\end{enumerate}

Кроме того, сохраняются следующие посылки, сохранившиеся от этапа
семан\-ти\-чес\-кого анализа:

\begin{enumerate}

\item "равно(конец(х1)х20)";

\item "равно(конец(х26)х18)";

\item "между(х5 перечень(набор(х3 х4)))";

\item "между(х8 перечень(набор(х3 х4)))";

\item "равно(начало(х26)х10)";

\item "равно(начало(х1)х14)";

\item "прибывать(х20 х13 х21)";

\item "в(х20 х4)";

\item "в(х18 х4)";

\item "прибывать(х18 х11 х19)";

\item "выходить(х14 х13 х15)";

\item "пароход(х13)";

\item "из(х14 х3)";

\item "из(х10 х3)";

\item "поезд(х11)";

\item "выходить(х10 х11 х12)";

\item "путь(х8)";

\item "железный(х5)";

\item "дорога(х5)"

\end{enumerate}

Эти посылки почти не замедляют решение, ибо приемов, связанных с
их поня\-ти\-ями, в решателе нет. Поэтому средств для исключения
таких посылок пока не введено.

Дальнейший ход решения задачи обеспечивается приемами по
элементарной фи\-зи\-ке, наподобие разобранного выше примера.
Находится ответ "равно(х2 умноже\-ние(14 дробь(км час)))",
"равно(х6 умножение(44 дробь(км час)))", и далее вклю\-чается
процедура, предпринимающая попытку определить названия для х2 и
х6. Здесь используется информация, сохранившаяся в списке посылок
задачи семанти\-чес\-кого анализа. Фактически, процедура
представляет собой небольшую базу при\-емов. Для х2 определяется
название "скорость пархода"; для х6 - "скорость поез\-да".
Окончательный текст ответа, выводимый на экран, имеет вид
"Скорость по\-ез\-да равна 44 км/час, скорость парохода равна 14
км/час".

База приемов, используемых логической системой для семантического
анализа, пока крайне невелика. Эти приемы возникли всего лишь из
полусотни проработан\-ных текстовых задач. Однако, она позволяет
рассмотреть траектории решения данных задач с хорошей степенью
детализации и заставляет осознать подлинный объем работы,
необходимой для обучения решателей пониманию естественного языка.
Ви\-ди\-мо, для ускорения этого процесса понадобятся какие-то
дополнительные техно\-ло\-ги\-ческие средства. Пока процедура
пополнения базы приемов семантического ана\-ли\-за состоит в
поиске таких фрагментов текущего состояния логического
подстроч\-ни\-ка, которые достаточно убедительным образом
транслируются на формаль\-ный язык. Степень убедительности не
всегда оказывается достаточной; эти случаи нуж\-но рассматривать
как постановки задач для поиска более приемлемых версий. Видимо,
во многих ситуациях полезными будут промежуточные понятия, не
относящиеся к логическому языку и исключаемые по окончании
семантического анализа. Цепоч\-ки вывода с применением таких
понятий могут сделать расшифровку подстроч\-ни\-ка более
однозначной.

\section{Сравнение логической системы с си\-сте\-ма\-ми ком\-пью\-тер\-ной
ма\-те\-ма\-ти\-ки}

После того, как возникло предварительное представление о работе
решателя, мож\-но предпринять сравнение его с другими системами
компьютерной математики, рас\-смот\-рев серию конкретных примеров.
Однако, перед таким сравнением следует еще раз подчеркнуть
принципиальное различие целей, которые ставились при
раз\-ра\-бот\-ке решателя и целей, для которых были созданы
упомянутые коммерческие системы. Решатель представляет собой
инструмент для изучения логических процессов путем их
моделирования. Он необходим для получения ответа на главный вопрос
- как научиться создавать саморазвивающиеся интеллектуальные
системы. К сожалению, в этом отношении успехи сегодняшних
технологий более чем скромны.

Можно вспомнить времена, когда прогресс в искусственном интеллекте
свя\-зы\-вал\-ся с прогрессом в шахматных программах;
предполагалось, что по мере усиления их игры удастся обнаружить
фундаментальные принципы разработки интел\-лек\-ту\-аль\-ных
систем. В наше время уже созданы исключительно мощные такие
программы, способные обыгрывать чемпиона мира. Технология
экспертных систем добилась впе\-чатляющих результатов и во многих
других областях. Во всех этих случаях мы имеем дело с чрезвычайно
сложными узкоспециализированными алгоритмическими комплексами,
зачастую разрабатывавшимися многими программистами, а иногда -
поколениями программистов. Даже если предположить, что такого рода
эксперт\-ные системы будут созданы практических для всех областей
интеллектуальной де\-я\-тель\-ности человека и окажутся по своей
эффективности превосходящими его воз\-мож\-нос\-ти (что пока
далеко не так), можно ли будет считать, что эта галлерея
экспертных систем и есть "настоящий" \ искусственный интеллект?
Вероятно, нет, - ведь такая коллекция ничуть не ускорит
научно-технический прогресс, а лишь зафиксирует его текущее
состояние.

Создается впечатление, что курс на разработку высокоэффективных
экспертных систем для конкретных задач загоняет проблему изучения
явления саморазвития алгоритмических комплексов в тупик.
Программисты сразу начинают решать все проблемы организации такого
комплекса "своим умом"; отвлекаться на само\-ана\-лиз им, в
общем-то, некогда, да и технологии здесь никакой не создано, и
ког\-да дело доходит до завершающих этапов, вся та сложнейшая
интеллектуальная работа, которой и нужно было бы научить саму
проектируемую систему, остается лишь в головах ее создателей.

Каким мог бы оказаться выход из данного тупика? Видимо, исходить
нужно из того факта, что программы и алгоритмы имеют своим
источником теоретичес\-кие знания - будем их называть, для
краткости, теоремами. Поэтому ключи к проблеме саморазвития
интеллектуальных систем следует искать прежде всего в пограничной
зоне между теоремами и алгоритмами, используя для программирования
таких сис\-тем алгоритмический язык, максимально приближенный к
языку теорем.

Именно на таком языке, названном ГЕНОЛОГ'ом, и реализована база
прие\-мов предлагаемой логической системы. Этот язык, прежде
всего, принципиально упро\-ща\-ет и ускоряет процесс обучения,
делая возможным за разумные сроки осваи\-вать сложные предметные
области просто за счет количества созданных прие\-мов. Например,
так удалось выйти на сравнительно высокий уровень в
вычислитель\-ных задачах по планиметрии. Разумеется, там, где
имеются эффективные специаль\-ные вычислительные процедуры,
использование решателя нецелесообразно - рассужде\-ния на
логическом уровне будут выполняться на порядки медленнее (хотя и
су\-щест\-венно быстрее, чем они выполняются человеком). Однако,
любые эффектив\-ные алгоритмические процедуры возникают, в
конечном счете, из теорем, и для изучения этого процесса снова
оказывается необходим ГЕНОЛОГ. Его компиля\-тор предусматривает
функционирование в двух режимах - как для создания
эвристи\-чес\-кой алгоритмики логического уровня, так и для
создания эффективных вычис\-ли\-тельных процедур, использующих
специализированные "технические" \ струк\-ту\-ры данных.
Использование такой компиляции делает данную систему, по крайней
ме\-ре, в некоторой перспективе, вполне подходящей и для
прикладных вычислений. Бо\-лее того, возникает интересная новая
возможность, недоступная обычным си\-сте\-мам компьютерной
математики - смешанный логико-вычислительный режим при
исследовании решателем свойств каких-либо математических моделей.

Развитие в решателе способности решать не только символьные
"вычисли\-тель\-ные" \ задачи (системы компьютерной математики на
большее и не претендуют), но и задачи "теоретического" \ характера
позволило бы выйти в прикладном аспекте на качественно новый
уровень. Ведь, по существу, сила современного математичес\-ко\-го
аппарата заключается не в символьных вычислениях, а в том, что с
его помощью решаются теоретические задачи, позволяющие создавать
алгоритмические блоки для прикладных вычислительных процедур.

Уровень ГЕНОЛОГа не является предельно высоким при изучении
истоков про\-граммирования. Логический вывод, приводящий к
получению теорем, на которых основаны приемы и алгоритмы, в
значительной степени направляется потребнос\-тя\-ми расширения
аппарата решения задач. В этом смысле он может рассматри\-вать\-ся
как продолжение линии компиляции вверх от пограничного слоя между
теоремами и программами. Видимо, одна из основных, если не самая
важная, функция раз\-ви\-ва\-емого решателя состоит именно в том,
что он дает исходный материал, для прослеживания таких верхних
линий компиляции. Более подробно об этом будет говориться в
третьем томе данной монографии.

Но вернемся к основной цели раздела - сравнению на конкретных
при\-ме\-рах воз\-можностей логической системы и систем
компьютерной математики. Будем рас\-сматривать одну из наиболее
мощных в плане символьных вычислений систем - Maple(v7). При
сравнении нас будет интересовать не столько степень развития
сис\-темы, сколько достоинства и недостатки, предопределяемые
лежащими в ее осно\-ве принципами. Все рассматриваемые ниже задачи
взяты из задачника решателя и, следовательно, им решаются.

\subsection{Упрощение выражений и уравнения с одной неизвестной}

Начнем с простейших примеров на упрощение алгебраических
выражений. Из общих соображений, можно предположить, что здесь
роль логики не слишком вели\-ка, и ответы сравниваемых систем не
будут слишком сильно отличаться друг от друга. Действительно,
предлагаем задачу на упрощение выражения:
$$\left(\frac{\sqrt{a}+\sqrt{b}}{\sqrt{a+b}} -
\frac{\sqrt{a+b}}{\sqrt{a}+\sqrt{b}}\right)^{-2} -
\left(\frac{\sqrt{a} - \sqrt{b}}{\sqrt{a+b}} -
\frac{\sqrt{a+b}}{\sqrt{a}-\sqrt{b}}\right)^{-2}.$$

Решатель выдает ответ $(a+b)/\sqrt{ab}$; Maple - ответ
$(a+b)/\sqrt{a}\sqrt{b}$. Ответ решате\-ля чуть-чуть экономнее,
однако различие несущественно. Преимущество решате\-ля
усматривается здесь лишь в том, что он позволяет просмотреть
выкладки по шагам.

Предлагаем следующую, по виду похожую, задачу:

$$\left(\frac{\sqrt{a-b}}{\sqrt{a+b}+\sqrt{a-b}}+\frac{a-b}{\sqrt{a^2-b^2} -
 a+b}\right)\sqrt{\left(\frac{a^2}{b^2} - 1 \right)^{-1}}.$$

Решатель выдает ответ $\mbox{sg}(b)$. Ответ системы Maple выглядит
совсем по-дру\-го\-му:

$$ - \frac{\left(\sqrt{a-b}\sqrt{a^2 - b^2} + a\sqrt{a+b} -
b\sqrt{a+b}\right)\sqrt{\frac{b^2}{a^2-b^2}}}{\left(\sqrt{a+b} +
\sqrt{a-b}\right)\left(-\sqrt{a^2-b^2} + a - b \right)}.$$

Попытки применять функцию "simplify" \ с различными опциями
приводят прак\-ти\-чес\-ки к такому же результату. Это уже
несколько настораживает - ведь неот\-ри\-ца\-тель\-ность выражений
под радикалами видна непосредственно из условий на область
допустимых значений, и переход от $\sqrt{a^2-b^2}$ к
$\sqrt{a-b}\sqrt{a+b}$, доста\-точ\-ный для получения сильных
упрощений, не связан с каким-то особым логическим вы\-во\-дом.

Еще один несложный пример на упрощение, теперь уже связанный с
лога\-риф\-ма\-ми:

$$\sqrt{\log_ab + \log_ba + 2}\left(\log_ab - \log_{ab} b \right)
\sqrt{\log_ab}.$$ Решатель выдает ответ $(\log_ab)^2$. Ответ
системы Maple почти такой же по слож\-нос\-ти - $\ln{b}^2 /
\ln{a}^2$. Однако, при уточнении выясняется, что преобразования
дела\-лись лишь в предположениях $1<a, 1<b$, в то время как
решатель рассмотрел всю область допустимых значений, существенно
более широкую.

Рассматриваем далее два тригонометрических выражения -
$$ \frac{\cos(-a+\pi/2)\cos(b+
\pi/2)-\cos(-a+\pi)\cos(-b+2\pi)}{\sin(a+b+\pi/2)};
$$

$$-\tg(-a+\pi/3)\tg(a+\pi/3)\tg a + \tg(3a) + 1.$$ В обоих случаях
решатель выдает ответ 1. Maple в первом случае дает ответ:

$$\frac{\cos a \cos b - \sin a \sin b}{\cos(a+b)},
$$ по каким - то причинам отказываясь усматривать равенство числителя
и зна\-ме\-на\-те\-ля. Во втором случа ответ Maple оказывается
существенно более громозд\-ким, чем исходное выражение - перейдя к
синусам и косинусам, она не смогла найти каких-либо дальнейших
упрощающих преобразований.

Из этой серии примеров видно, что Maple испытывает трудности трех
ти\-пов. Во-первых, из-за отсутствия аккуратного логического
описания контекста пре\-об\-ра\-зо\-ваний ("списка посылок" \
решателя), она оказывается во множестве случаев попросту
неспособной определить, какие преобразования допустимы, а какие -
нет. Это приводит к отказу от любых дальнейших преобразований и
преждевремен\-но\-му обрыву задачи. Во-вторых, объем ее базы
упрощающих приемов, видимо, не очень велик, и в сколь-нибудь
нестандартных ситуациях выдается текущее "тупи\-ко\-вое" \
выражение. Наконец, из примера для дроби с косинусом суммы в
знамена\-те\-ле видна ее неспособность предпринимать эвристические
попытки усмотрения силь\-ных упрощений хотя бы на два шага вперед.

Хотя эти недостатки и не очень существенны для простейших задач,
однако уже и здесь ответы часто выглядят неряшливо, а иногда и
просто неприемлемо.

Переходим к рассмотрению уравнений с одной неизвестной. Для
решения их системой Maple будем использовать функцию "solve".
Рассмотрим сначала прос\-тей\-шее линейное уравнение с
параметрами:
$$\frac{6a+7b}{6a}-\frac{3bx}{2a^2} = 1 - \frac{bx}{a^2-ba}.$$
Решатель выдает ответ $x= 7a(b-a)/3(3b-a)$, сопровождая его
условиями на параметры: $a \ne 0, a-b \ne 0, 3b - a \ne 0$.
Дополнительно в ответ включается вырож\-ден\-ный слу\-чай $b=0,
a\ne 0$, когда неизвестная $x$ может принимать произволь\-ное
чис\-ло\-вое значение. Система Maple ограничивается выдачей
первого ответа, упус\-кая из виду вырожденный случай и никак не
комментируя ограничения на параметры.

Стандартные алгебраические уравнения - полиномиальные и сводимые к
ним уравнения с радикалами Maple, разумеется, решает неплохо, если
отвлечься от та\-ких мелочей, как появление лишних корней и полное
отсутствие сопровождающих ответ условий на значения параметров.
Например, для уравнения
$$ \frac{x+a+\sqrt{x^2-a^2}}{x+a-\sqrt{x^2-a^2}} =
\frac{9(x+a)}{8a}$$ система Maple выдает правильные ответы
$-29a/21, 5a/3$. Решатель в этом слу\-чае добавляет ограничение
$0<a$. Заметим, что из исходного уравнения оно не очевидно.

Несколько хуже обстоят дела с уравнениями, обращающимися в
тождество на целых промежутках. Так, для уравнения
$$\sqrt{x+3-4\sqrt{x-1}}+\sqrt{x+8-6\sqrt{x-1}}=1$$ решатель дает
ответ: $x\mbox{-число}, x\le 10, 5 \le x$. Maple прорисовывает в
качестве от\-ве\-та переменную $x$.

Чуть более сложное уравнение - и появляются "лишние" \ корни:
$$2\sqrt{a+x}+\sqrt{a-x}=\sqrt{\sqrt{x(a+x)}+a-x}.$$ Решатель дает
ответ $x = -a, 0\le a$, в то время как Maple, кроме значения $-a$,
выдает также лишние значения 0, $64a/1025$.

Аналогичная картина для уравнения
$$\sqrt[3]{a+x^2}+2/\sqrt[3]{a+x^2} = 3.$$
Правильный ответ, выдаваемый решателем, состоит из двух частей.
При $1<a, a \le 8$ имеются два корня $-\sqrt{-a+8},\sqrt{-a+8}$.
При $a \le 1$ к ним добавляются еще два кор\-ня $-\sqrt{-a+1},
\sqrt{-a+1}$. Maple просто выдает все четыре корня.

Впрочем, для многих уравнений рассматриваемого типа (как правило,
без па\-ра\-мет\-ров) ответы Maple cовершенно точны.

С логарифмическими и показательными уравнениями у Maple начинаются
труд\-нос\-ти. Например, несложное, в общем, уравнение
$$\log_{1-2x}(6x^2-5x+1)-\log_{1-3x}(4x^2-4x+1)=2$$ Maple
"решает", выдавая ответ в виде чрезвычайно громоздкого выражения,
содер\-жа\-ще\-го так называемое "RootOf" \ от некоторого
уравнения, которое на вид ни\-чуть не проще исходного. Здесь Maple
просто создает видимость того, что решает зада\-чу. Решатель
находит для указанного урав\-не\-ния единственный корень $1/4$.
Ре\-шая совершенно стандартное уравнение с параметром
$$\sqrt{\log_a\left(\sqrt[4]{ax}\right)+\log_x\left(\sqrt[4]{ax}\right)}+
\sqrt{\log_a\left(\sqrt[4]{\frac{x}{a}}\right) +
\log_x\left(\sqrt[4]{\frac{x}{a}}\right)}=a,$$ Maple предлагает
ответ из двух десятков строк (здесь и далее имеется в виду формат
экрана 640 на 480), в то время как решатель дает пол\-ный ответ
$$1<a, x \in \{a^{1/a^2},a^{a^2}\}.$$ Какие-то логарифмические
уравнения Maple, все же, решает - например, для урав\-не\-ния
$$\sqrt{\log_x\left(\sqrt{3x}\right)}\log_3x= -1$$ находит корень
$1/9$. В качестве примеров другого рода приведем два уравнения:
$$2\left|\log_{10}(ax)\right|\log_x10 =
\left(4\log_{10}a-3\right)\log_{x^2}10-\frac{1}{2}\log_{10}x;$$
$$(x-3)^{3x^2-10x+3} = 1.$$ В первом случае решатель дает ответ из
двух частей. При $1000 < a$ корнями явля\-ют\-ся числа
$0.001,0.1$; при $10 \le a \le 1000$ - числа $0.1, 10^{-\sqrt
{8\log_{10}a + 1}+2}$. Во втором слу\-чае решатель находит ответ
$x=4$. Первую задачу Maple оставляет без ответа; во втором случае
она просто переписывает исходное уравнение под RootOf.

Тригонометрические уравнения обычно легко сводятся к
полиномиальным, и с решением их Maple справляется неплохо. Правда,
ответы выглядят неряшливо - серии корней измельчаются на множество
подсерий. Например, для уравнения
$$\cos x = \left(\cos\frac{3x}{4}\right)^2$$ решатель находит три
серии корней - $x = 4\pi n$, $x = \pi(6n+1)/3$, $x = \pi(6n+5)/3$.
Maple предлагает следующий ответ: $4\pi-8\pi m +8\pi n, 8\pi n,
4\pi - 4\arccos(1/4 + 1/4 \sqrt2)-8\pi m + 8m\arccos(1/4+ 1/4
\sqrt2)+8\pi n, 4\arccos(1/4 + 1/4 \sqrt2)- 8m\arccos(1/4 + 1/4
\sqrt2)+8\pi n, 4\pi - 4\arccos(1/4 - 1/4 \sqrt2)-8\pi m +
8m\arccos(1/4 - 1/4 \sqrt2)+8\pi n, 4\arccos(1/4 - 1/4 \sqrt2)-
8m\arccos(1/4 - 1/4 \sqrt2)+8\pi n$. Здесь и целочисленных
параметров два вме\-сто одного, и арккосинус не устранен.
Разумеется, тригонометрические уравнения, требующие использования
неравенств, Maple в общепринятом смысле не решает. Например,
таковы уравнения $(\cos x)^7 + (\sin x)^4 = 1$ или $\cos (\pi x) +
x^2 - 6x +10 = 0$. Ответы выражены через RootOf, во втором случае
- по существу просто переписано исходное уравнение. Показательные
уравнения с тригонометрическими функциями вызывают у Maple
примерно те же затруднения, что и обычные показательные уравнения.
Например, для несложного уравнения $$81^{(\sin x)^2} + 81^{(\cos
x)^2} = 30$$ решатель находит две серии корней - $\pi (3n+1)/6$ и
$\pi (3n+2)/6$. Maple предлагает в качестве ответа около десятка
громоздких выражений, каждое из которых содержит мнимые единицы,
радикалы и арктангенсы. Аналогичное уравнение $$(\tg x)^{(\cos
x)^2} = (\ctg x)^{\sin x}$$ Maple, по существу, вообще не решает.
Для уравнений с параметром, даже если ответ и находится системой
Maple, часто он оказывается неоправданно громоздким. Например, для
уравнения $$(k+1)\frac{\cos x \cos(2x-a)}{\cos(x-a)} = k
\cos(2x)+1$$ решатель дает три серии корней, сопровождая каждую
соответствующими ог\-ра\-ни\-чениями на значения параметра - $$x =
\frac{-\arcsin(k \sin a)+ a - 2\pi n - \pi}{2}, x =
\frac{\arcsin(k \sin a) + a - 2\pi n}{2}, x = \pi n.$$ Maple дает
целых 8 выражений для серий, причем некоторые из них содержат до
16 вхождений тангенса. Для большей наглядности приведем одно из
таких выраже\-ний:
$$
 \begin{array}{l}
\arctg\biggl(-\sqrt{-\frac{2(\tg a)^2k-2-2(\tg a)^2 - 2\sqrt{1+
(\tg
a)^2 -(\tg a)^2k^2}}{(\tg a)^2 + 1}} \times \\

\times -\frac{1}{4}\frac{2(\tg a)^2k - 2 - 2(\tg a)^2 -
2\sqrt{1+ (\tg a)^2 - (\tg a)^2k^2}}{(\tg a)^2 + 1}/ \\
/ \tg a \cdot -\frac{1}{2}\cdot \frac{2(\tg a)^2k - 2 - 2(\tg a)^2
- 2\sqrt{1 + (\tg a)^2 - (\tg a)^2k^2}}{(\tg a)^2 +1}\biggr).
\end{array}
$$

Приведенная выше картина, в общем, не удивительна. Уравнения
элементар\-ной математики, хотя и могут, путем грубого их сведения
к чисто полиномиальным задачам и применения достаточно развитых в
компьютерной алгебре алгорит\-мов нахождения корней полиномов,
как-то быть доведены до ответа, но трудно ожидать, чтобы эти
ответы имели сколь-нибудь обозримый вид. Чтобы получать
дейст\-ви\-тель\-но качественные ответы, необходимо такое
разнообразие методов, которое может быть обеспечено только
системой эвристического типа. Как показывают
мно\-го\-чис\-лен\-ные примеры, во многих случаях ответ не
достигается даже грубыми "сило\-вы\-ми" \ методами, причем это
сплошь и рядом относится к уравнениям, решаемым впол\-не
стандартными средствами элементарной математики. С другой стороны,
логичес\-кая система успешно справляется с задачами стандартного
типа, а при некотором доучивании оказывается способной решать и
менее стандартные задачи.

В то время как для систем компьютерной математики умение решать
поли\-но\-ми\-аль\-ные задачи очень большой размерности является
критическим - именно на нем и базируется вся их эффективность, для
логических систем излишнее вни\-ма\-ние к таким задачам
представляется чем-то искусственным, ибо почти всегда удается
обойтись вообще без них. В решатель были введены несколько приемов
для раз\-ло\-же\-ния на множители целочисленных полиномов малых
(до 7-й включительно) степе\-ней, но случаи их использования -
единичные, лишь для специально подобран\-ных задач. Эффективная
реализация на ГЕНОЛОГе, например, алгоритма Берле\-кэм\-па,
представляется интересной лишь как упражнение по развитию
"вычислитель\-ной" \ компоненты компилятора этого языка.

Современные системы компьютерной математики, безусловно,
представляют со\-бой важный шаг в компьютерном освоении
накопленного элементарной алгеб\-рой умения решать задачи. Однако,
сделан лишь первый шаг, и он создал ложное пред\-ставление о том,
что умение решать их, в приниципе, уже освоено такими
си\-сте\-ма\-ми. Как показывают хотя бы приведенные выше примеры,
это далеко не так. Дело даже не в том, что системы Maple,
Mathematica и т.п. неспособны объяснять ход решения по "шагам",
разумным с точки зрения школьника. Сколь-нибудь качественные
ответы они дают лишь для весьма узкого класса стандартных задач
элементарной алгебры, а немного более сложные задачи, даже
стандартные, не решают вовсе. В этом отно\-ше\-нии логические
системы имеют гораздо большие достижения и перспективы.

Задачи типа "найти все значения параметра, при которых уравнение
имеет ре\-шения (или имеет заданное число корней)", и тому
подобные задачи "с кванто\-ра\-ми", часто встречающиеся в
задачниках, логическая система решает (по крайней мере в
стандартных ситуациях) без особого труда. Сравнение с Maple здесь
не прово\-ди\-лось, так как в данной системе нет языка, на котором
их можно сформулировать. По мере продвижения вперед в нашем
сравнении двух подходов такая ситуация бу\-дет возникать все чаще.

Разумеется, пока мы проводим сравнение логической системы и систем
ком\-пью\-тер\-ной математики лишь в отношении сколь-нибудь
"интеллектулаьных задач", не затрагивая численных процедур.
Однако, и в этом отношении логическая система имеют хорошие
перспективы. Они связаны с разви\-ти\-ем исследований по
компи\-ля\-ции вычислений непосредственно с уровня теорем.
Не\-ко\-то\-рые уже имеющиеся ее вычислительные возможности мы
обсудим ниже.

\subsection{Системы уравнений и неравенств}

Системы полиномиальных уравнений без труда решаются программами
ком\-пью\-тер\-ной алгебры, так как здесь существует хорошо
развитый аппарат, основанный на алгоритме Бухбергера. Предлагаем
несложную систему уравнений $xy+xz=x^2+2,xy+yz=y^2+3,xz+yz=z^2+4$
решателю и системе Maple. Реша\-тель выдает ответ сразу в явном
виде; Maple сначала выражает его через RootOf, и лишь после
обращения к команде "allvalues" \ преобразует к явному виду. Точно
такая же ситуация для системы уравнений с радикалами
$\sqrt{x+\sqrt{y}}-\sqrt{x-\sqrt{y}}=1,\sqrt{x^2-y}+\sqrt{x^2+y}=1$.
Решатель выдает ответ $x=5/8,y=3/8$ сразу; Maple сначала
выра\-жа\-ет $y$ через RootOf, а явный ответ выдает только после
ввода команды "allvalues". Впрочем, наличие мощной полиномиальной
техники не спасает Maple от сис\-тем иррациональных уравнений,
требующих искусственного приема. Например, сис\-те\-ма из двух
уравнений
$$
\left\{
\begin{array}{rcl}
 \sqrt{\frac{20y}{x}} = \sqrt{x+y}+\sqrt{x-y}\\
 \sqrt{\frac{18x}{y}} = \sqrt{x+y}-\sqrt{x-y}\\
\end{array}
\right.
$$ Mapl'ом не решается. Логическая система, усматривая, что при
перемножении урав\-не\-ний неизвестные под радикалами в левых
частях сокращаются, без труда по\-лу\-ча\-ет ответ $x=5,y=4$. Если
уравнение одно, а неизвестных две, но из экстре\-маль\-ных
соображений они определяются однозначно (или в конечном числе
вариантов), то Maple просто не понимает задачи - выражает одну
неизвестную через другую и этим ограничивается. Например, так
получается для уравнения
$\sqrt{x+1}\sqrt{-y+1}+\sqrt{x}\sqrt{y}+x=\sqrt{2}(x+1)$. Решатель
в этом случае находит единственное реше\-ние $x=\sqrt{2}+1,
y=\sqrt{2}-1$, применяя аппарат отыскания экстремальных точек
функции двух переменных. Впрочем, если система из нескольких
уравнений с радикалами основана на экстремальных соображениях, но
легко сводится к полиномиальной системе, то дальнейшее является
для Maple очевидным - корни находятся, причем часто выдается
большое количество дополнительных "решений" \ с RootOf-ами.

Системы уравнений с параметрами вызывают у Maple затруднения того
же типа, что и одиночные уравнения. В ответах отсутствуют условия
на параметры, при которых имеются корни; появляются "лишние" \
корни; выражения плохо упрощены. Например, система
$x\sqrt{1-y^2}=a,y\sqrt{1-x^2}=b$ имеет при $|b^2-a^2| \le 1$
ровно два решения. Maple выдает здесь 8 решений. Для простенькой
системы
$$
\left\{
\begin{array}{l}
\left(\frac{x}{a}\right)^b \left(\frac{y}{c}\right)^d = e\\
\left(\frac{x}{c}\right)^d \left(\frac{y}{a}\right)^b = f\\
\end{array}
\right.
$$ нужно разбирать отдельно два случая: $b+d = 0$, $b+d \ne 0$, так
как выражения в ответе будут различными. Maple этого не делает.
Решатель находит для $x$ выражение $$
(a^bc^d)^\frac{1}{b+d}\left(\frac{f^d}{e^b}\right)^\frac{1}{d^2-b^2},$$
в то время как Maple, даже после применения команды "simplify", то
же самое записывает гораздо более громоздким образом
$$exp\left(\frac{-\ln(f)d+\ln(f)b +b\ln(e)-\ln
\left(\frac{a}{c}\right)db+b^2\ln\left(\frac{a}{c}\right)}{-d^2+db+b^2}
\right)c.$$ Системы с логарифмическими и показательными
уравнениями Maple начинает ре\-шать c перебоями, иногда не выдавая
никакого ответа (даже с RootOf). Напри\-мер, она не решает систему
$$
\left\{
\begin{array}{l}
xy^{\log_xy}=y^{2/5}\\
\log_4x\log_x(x-3y)=1.\\
\end{array}
\right.
$$ Систему
$$
\left\{
\begin{array}{l}
(\log_{10}x)^2 = (\log_{10}(xy))^2 + (\log_{10}y)^2\\
\log_{10}x\log_{10}y + (\log_{10}(x-y))^2 = 0\\
\end{array}
\right.
$$ Maple решает, хотя и присоединяет какое-то явно лишнее решение с
RootOf. Похо\-жую систему
$$
\left\{
\begin{array}{l}
2\log_{1-x}(-xy-2x+y+2)+\log_{2+y}(x^2-2x+1)=6\\
\log_{1-x}(y+5)-\log_{2+y}(x+4)=1\\
\end{array}
\right.
$$ Maple снова не решает. Заметим, что все это - совершенно
стандартные сис\-те\-мы, легко решаемые "школьными" \ методами. На
примере тригонометрической системы
$$
\left\{
\begin{array}{l}
(\sin x)^3 = \frac{1}{2} \sin y \\
(\cos x)^3 = \frac{1}{2} \cos y\\
\end{array}
\right.
$$ обнаруживается, что Maple может не только давать "лишние" \
корни, но и терять верные. Вместо четырех серий решений она здесь
находит только две. Систему
$$
\left\{
\begin{array}{l}
\frac{1}{\sqrt{\sin \left(\frac{\pi}{4} -
x\right)}}(3\cos(2x)-6\ctg y + 2) = 0 \\
18(\sin x)^2 - 2\tg y - 3 = 0\\
\end{array}
\right.
$$ Maple не решает. Для системы
$$
\left\{
\begin{array}{l}
\ctg x + \sin(2y) = \sin(2x) \\
2\sin y \sin(x+y) = \cos x,\\
\end{array}
\right.
$$ имеющей две серии корней, Maple представляет ответ в виде
десяти серий. В отве\-тах тригонометрических систем часто
встречаются RootOf, хотя и легко устранимые, но все же требующие
для этого обращений к специальным командам. Для системы
$$
\left\{
\begin{array}{l}
\tg x + \ctg x = 2\sin \left(y - \frac{3}{4}\pi\right)\\
\tg y + \ctg y = 2 \sin \left(x + \frac{\pi}{4}\right),\\
\end{array}
\right.
$$ имеющей единственную серию решений $x = \pi/4 + 2\pi n, y = 5\pi/4 +
2\pi m$ , Maple выдает пять серий решений. Выражение для $y$ в
одной из таких серий занимает пятнад\-цать строк.
Тригонометрическая система с параметром
$$
\left\{
\begin{array}{l}
\sin x \cos (2y) = a^2 + 1\\
\cos x \sin (2y) = a \\
\end{array}
\right.
$$ имеет решения только при $a=0$. В этом случае она имеет две
серии решений $x = \pi/2 + \pi m +2\pi n, y = \pi m /2$ и $x =
3\pi/2 + \pi m + 2\pi n, y = \pi /2 + \pi m /2$. Maple
игнори\-ру\-ет тот факт, что при $a \ne 0$ система решений не
имеет, и предлагает ответ из 8 серий, занимающих 49 строк. Еще
более "впечатляет" \ ответ Maple для системы
$$
\left\{
\begin{array}{l}
\cos(x - 2y) = a(\cos y)^3 \\
\sin(x - 2y) = a(\cos y)^3.\\
\end{array}
\right.
$$ Он занимает около 210 строк, в то время как ответ решателя
помещается всего на 4 строках.

Переходя к неравенствам, обнаруживаем, что здесь легко провести
границу меж\-ду задачами, доступными и недоступными Maple.
Неравенства без параметров Maple решает достаточно хорошо (хотя
ответы временами выглядят неряшливо). Неравен\-ств с параметрами,
кроме крайне простых, Maple вообще не решает. Например, без
отве\-та остается система из двух линейных неравенств $x-3 \le
a(x-2), 8(a+1)x > 8ax + 9$. Как и в случае уравнений, задачи с
кванторами для неравенств Maple не решает, и даже неясно, как
такие задачи для нее формулировать.

Задачи на доказательство неравенств можно предлагать Maple,
обращаясь к функ\-ции "verify", которая выдает "истина" \ или
"ложь". Однако, даже очень простые неравенства приводят к отказу.
Например, неравенство $$1 \le \frac{1}{a^2+1}+a^2.$$ Решатель
обучен доказательству неравенств на обычном материале школьных
за\-дач\-ников, и неплохо справляется со стандартными задачами
такого рода.

Завершая сравнение Maple и решателя на материале элементарной
алгебры, мож\-но констатировать два факта. Во-первых, роль
логических процессов для многих классов алгебраических задач не
очень велика - задачи сводятся к полиномам, и применяются
специальные алгоритмы для работы с последними. Это позволяет
сис\-те\-ме Maple решать или "почти решать" \ многие задачи.
Во-вторых, остается впе\-чат\-ле\-ние, что логическая система
справляется с задачами элементарной алгебры безусловно лучше, чем
Maple. Число таких задач из стандартных задачников, ре\-ша\-емых
логической системой, значительно больше, чем число решаемых Maple,
а качество ответов - существенно выше. Разумеется, можно доводить
вручную не\-ряш\-ливые ответы, отбрасывать неподходящие корни и
проводить целые исследова\-ния, связывая найденные корни с
параметрами, но лучше, все-таки, когда этим занимается сама
компьютерная программа.

\subsection{Элементарная геометрия}

Логическая система располагает обширной базой приемов,
предназначенной для ре\-ше\-ния школьных планиметрических задач
"на вычисление". Она сформирова\-лась в результате проработки
около двух тысяч задач и насчитывает примерно четы\-ре тысячи
приемов. При обучении не делалось каких-либо исключений - задачи
брались из задачников подряд, и для каждой, если она не решалась
сразу, создавались не\-до\-ста\-ющие приемы. Фильтры приемов
формулировались из эвристических соо\-бра\-же\-ний, чтобы
сохранить лишь минимально необходимые для получения ответа
дейст\-вия. Такая стратегия предопределяла итеративные приближения
к границе, от\-де\-ля\-ющей полную блокировку инициативы системы
от неконтролируемых лавино\-об\-раз\-ных срабатываний приемов.
Где-то на этой границе и начало проявляться более-ме\-нее разумное
поведение решателя, иногда вполне сопоставимое по своей
целенаправ\-лен\-нос\-ти с поведением школьника. Ход решения можно
прослеживать по шагам, и даже получать на экране текст-формульные
пояснения этих шагов. При обуче\-нии не ставилось задачи буквально
воспроизводить поведение человека. Хотелось просто обеспечить
наискорейшее получение ответа, так что в ряде случаев
отда\-ва\-лось предпочтение режимам, выгодным с точки зрения
компьютерной реализации, но мало приемлемым для человека. Вообще,
предлагаемая версия "геометрии" \ явля\-ет\-ся сугубо
экспериментальной и обладает немалым числом недостатков. Анализ и
исправление их могли бы привести к созданию новых, существенно
более мощ\-ных версий.

Однако, даже и в данном варианте, система может делать довольно
много. Уда\-лось достичь сравнительно устойчивого решения ею
стандартных задач средней сте\-пени сложности. Примером может
служить следующая задача, которая была реше\-на системой
самостоятельно на одной из демонстраций: "В некотором треугольнике
ABC биссектриса, медиана и высота делят угол A на четыре равные
части. Най\-ти этот угол". Система получила правильный ответ
$\pi/2$ после 30-40 секунд. Анализ и коррекция ее действий
позволили уменьшить время решения до 8 секунд. Единствен\-ное, что
было изменено - несколько ослаблен фильтр приема, принимающий
реше\-ние о выписывании соотношения для отрезков, на которые
биссектриса делит про\-ти\-во\-по\-ложную сторону.

Кроме обучения решению планиметрических задач, рассматривалось
также са\-мо\-сто\-ятельное построение системой эскизов,
соответствующих условию задачи. Та\-кой решатель для "чертежей" \
был создан, и работает вполне стабильно. Он состоит из базы
приемов, формирующих некоторую схему вычислений для итеративной
оп\-ти\-ми\-зации параметров чертежа, а также из интерпретатора,
выполняющего вычисле\-ния по данной схеме. Последние
осуществляются с помощью математического со\-про\-цес\-со\-ра, так
что весь цикл построения эскиза происходит быстро - обычно не
более секунды. Если задача не имеет параметров, то построение
эскиза (кроме особо сложных случаев) эквивалентно численному ее
решению. С общей точки зрения, разработка процедуры построения
чертежей оказалась интересной в первую оче\-редь как пример
использования логических процессов для создания программы
вы\-чис\-ле\-ний. Возвращаясь к приведенному выше примеру
планиметрической зада\-чи, заметим, что система успешно справилась
с построением чертежа и нарисовала пря\-моугольный треугольник.

Кроме вычислительных задач по планиметрии, были рассмотрены также
пла\-ни\-метрические задачи на доказательство и на построение.
Однако, эти задачи требу\-ют самостоятельной проработки, а пока на
малом количестве примеров были опреде\-ле\-ны лишь общие
особенности логических режимов их решения. Это же замеча\-ние
относится к задачам по стереометрии. Здесь открыто широкое поле
деятель\-нос\-ти, освоение которого могло бы привести к
значительному развитию геометрического решателя системы.

Примерно так понимается проработка элементарной геометрии в
логической сис\-те\-ме. Перейдем к рассмотрению того, как этот
раздел представлен в системе Maple.

Для работы с геометрическими объектами Maple имеет так называемые
па\-ке\-ты расширений - "geometry" \ и "geom3d", обслуживающие,
соответственно, двумерный и трехмерный случаи. Эти пакеты содержат
большое количество функций, поз\-во\-ля\-ющих определять различные
геометрические фигуры и тела, находить их харак\-те\-рис\-тики и
рисовать на экране. Например, можно ввести в рассмотрение
окруж\-ность, проходящую через 3 заданные точки $A,B,C$ с
заданными координатами, обозна\-чив саму окружность $c1$, а ее
центр $O1$. Для этого вводится команда "circle(c1,
[point$(A,0,0)$, point$(B,2,0)$, point$(C,1,2)$],'centername' =
O1)". Команда "radius(c1)" \ позволяет найти радиус данной
окружности; команда "Equation(c1)" \ - получить ее уравнение;
команда "draw(c1)"  \ - нарисовать на экране, и т.п. Таким
образом, Maple просто предоставляет пользователю некоторый язык
программирования для ра\-бо\-ты с геометрическими объектами.
Какой-либо геометрической функции, анало\-гич\-ной
"алгебраической" \ функции "solve", у Maple не предусмотрено.
Обычные школь\-ные задачи по планиметрии (кроме совсем простых,
сводящихся к применению функций указанного выше типа) нельзя даже
сформулировать на языке системы Maple.

\subsection{Аналитическая геометрия}

В логической системе имеется база приемов по аналитической
геометрии. Обуча\-ю\-щим материалом для ее создания послужили
задачи из классического сбор\-ни\-ка П.С.Моденова и
А.С.Пархоменко. Всего было проработано около 770 задач, из которых
извлечено примерно 2400 приемов. Рассматривались, в основном,
за\-да\-чи не теоретического характера, практически по всем
основным разделам - векторной алгебре, системам координат,
уравнениям прямой и плоскости, линиям и поверх\-нос\-тям второго
порядка. В большинстве этих задач, как и в задачах по
элементар\-ной геометрии, требовалось восстановить неизвестные
параметры какой-либо группы объектов по частичному их заданию.
Поэтому стратегия обучения и логичес\-кие режимы здесь оказались
похожими. В качестве примера приведем задачу "Напи\-сать уравнение
плоскости, параллельной плоскости Oyz и пересекающей
однополост\-ный гиперболоид
$$\frac{x^2}{9} + \frac{y^2}{4} - z^2 = 1$$ по гиперболе,
действительная полуось которой равна 1". Хотя и не очень
слож\-ная, она все-таки не сводится к определению какой-то
стандартной характеристики полностью заданной поверхности или
кривой. С другой стороны, Maple, как и в случае элементарной
геометрии, может предложить лишь набор функций для работы с
полностью определенными кривыми и поверхностями. Эти функции даже
не отде\-ле\-ны от используемых в элементарной геометрии и
содержатся в уже упоминавшихся выше пакетах "geometry" \ и
"geom3d". К ним примыкает пакет "algcurves" \ для
ал\-геб\-ра\-и\-ческих кривых. Как и в предыдущем разделе,
констатируем, что сколь-нибудь нетривиальные в логическом
отношении, и притом вполне стандартные, задачи по аналитической
геометрии нельзя даже сформулировать на языке системы Maple.
Например, такой является приведенная выше задача.

\subsection{Алгебра логики, алгебра множеств и комбинаторика}

Решатель имеет приемы для решения несложных задач по алгебре
логики и ал\-геб\-ре множеств. Они позволяют упрощать формулы и
решать уравнения. Напри\-мер, можно предложить решателю систему
уравнений для множеств $x \cup (y \setminus a) = (x \setminus b)
\cup (b \cap y), (x\setminus y) \cup (y\setminus x) = c$ и
получить ответ $x = c \bigtriangleup y, y \cap (c \setminus (a
\bigtriangleup b)) = \emptyset, b\cap c \subseteq y, y -
\mbox{set}$. Здесь допустимые значения неизвестной $y$
определяются как множества, содержащие одно фиксированное
множество и не пересекающиеся с другим. Неизвестная $x$
однознач\-но определяется по $y$. Можно предложить решателю для
упрощения выражение $a\setminus (b \cup c) \cup (a \cap
d)\setminus b$ и получить ответ $a \setminus (b \cup (c \setminus
d))$.

В Maple решение аналогичных типов задач не предусмотрено, хотя для
операций алгебры множеств и имеются соответствующие функции. Эти
функции, как и у геометрических пакетов, ориентированы лишь на
выполнение действий с кон\-крет\-ны\-ми множествами. Maple
отказывается упростить даже выражение $a \setminus (a \cap b)$.

В решателе создана также база приемов для задач по комбинаторике.
Общее количест\-во проработанных задач и созданных по ним приемов
не очень велико - всего около сотни задач и двух сотен приемов.
Однако, они уже позволяют сравнительно ста\-биль\-но решать
стандартные комбинаторные задачи средней сложности. Часть
обуча\-ю\-ще\-го материала предоставили школьные задачники, часть
- задачники по тео\-рии вероятностей. Чтобы задача была понятна
решателю, она должна быть переве\-де\-на на
теоретико-множественный язык. Например, имеется задача "Из вазы,
где стоят 10 красных и 4 розовых гвоздики, выбирают один красный и
два розовых цветка. Сколькими способами это можно сделать?". Для
ее формализации вводим обозначения $A,B$ множеств красных и
розовых гвоздик. В посылки задачи заносим следующие данные об этих
множествах: $\mbox{card}A = 10; \mbox{card}B = 4; A\cap B =
\emptyset$. Затем вводим задачу на упрощение выражения
$card(\mbox{set}_x(x - \mbox{set}\ \& \ x\subseteq A \cup B \ \& \
\mbox{card}(x \cap A) = 1 \ \& \ \mbox{card}(x \cap B) =2))$. При
такой постановке решатель выдает ответ 60. Многие разделы
математики и физика предлагают задачи только текстового характера.
Что\-бы работать с ними в логической системе, приходится много
внимания уделять во\-про\-сам логической формализации. Здесь
происходит встречное движение: с од\-ной стороны, начато обучение
решателя чтению и пониманию текстов естественного язы\-ка. С
другой стороны, развивается тот формальный язык, на котором должен
будет задаваться смысл этих текстов. Промежуточные между
естественным и ма\-те\-ма\-ти\-ческим языком этапы требуют работы
с расширенным спектром понятий, таких, как встречающиеся в
приведенной выше задаче понятия "гвоздика", "цветок", "крас\-ный"
\ и т.п. По этой причине, предстоит развитие решателя,
обеспечивающего пре\-об\-ра\-зование задачи с полуформального
логического языка промежуточного уров\-ня на уровень завершающей
математической формализации. Такую работу нужно будет проделать по
многим уже рассматривавшимся в логической системе разде\-лам -
комбинаторике, геометрии, теории вероятностей, элементарной физике
и т.п.

В системе Maple каких-либо средств для формулировки комбинаторных
за\-дач указанного выше типа не обнаружено.

Наконец, упомянем задачи на преобразование выражений, связанных с
ком\-би\-на\-тор\-ными функциями. При обучении решателя в этой
области были созданы око\-ло трех сотен приемов, позволивших
решать стандартные школьные задачи. Maple тоже хорошо справляется
с такими задачами. Особенно это видно на примерах, связан\-ных с
вычислением конечных сумм. Однако, для различных задач
пользова\-те\-лю Maple приходится привлекать различные функции, в
то время как у решате\-ля везде работает целевая установка
"упростить выражение". В некоторых случа\-ях Maple, несмотря на
использование своей мощной техники, все же не очень удачно
преобразует сравнительно стандартные суммы, например:
$$ \sum_{k=0}^{\left[n/4 \right]}C_n^{4k},$$
$$ \sum_{i=1}^n (\sin(3i+1))^2.$$
Ответы выдаются чрезмерно громоздкие, хотя обе суммы представимы
неслож\-ны\-ми тригонометрическим выражениям. Вычисление кратных
сумм предусмотрено в Map\-le только для случая, когда они сразу
вводятся как повторные. Если область сум\-мирования определяется
какими-то более сложными условиями, то такую задачу нельзя даже
сформулировать. Решателю же часто приходилось работать с такими
сум\-ма\-ми, например, в задачах по теории вероятностей.


\subsection{Математический анализ}

Задачи на символьное вычисление производных, пределов и интегралов
в боль\-шин\-ст\-ве случаев решаются с помощью стандартных
вычислительных процедур. Естест\-венно ожидать, что Maple с ними
будет легко справляться. Однако, в дейст\-ви\-тель\-ности задачник
по математическому анализу значительно шире - кроме чисто
вы\-чис\-ли\-тельных примеров, в нем встречается большое
количество задач теоретичес\-ко\-го \ характера, а также задач,
пусть и не претендующих на роль теоретичес\-ких, но все же
требующих определенных рассуждений. В этих случаях, столь же
естественно, Maple оказывается бессилен. Продвижение в указанной
области мо\-жет дать только развитие логической системы.

Само по себе вычисление производных не составляет какого-либо
труда ни для решателя, ни для Maple. Трудности начинаются на этапе
упрощения результата дифференцирования; сравнение двух систем для
задач последнего типа уже про\-во\-ди\-лось выше. В решателе, как
и в Maple, предусмотрена возможность дифферен\-ци\-ро\-вать
функции, заданные неявно.

Пределы без параметров вычисляются обеими системами хорошо; для
громозд\-ких выражений здесь у Maple имеется неоспоримое
преимущество в скорости. Однако, в случае выражений с параметрами
Maple начинает давать отказы, даже там, где получение ответа не
связано с разбором случаев.

Приемы решателя для вычисления неопределенных и определенных
интегра\-лов были созданы при проработке задачника Б.П.Демидовича.
Некоторой неожидан\-нос\-тью оказалось то, что Maple не берет
части этих интегралов, например, интеграла $$\int \frac{\arcsin x
(1+x^2)}{x^2 \sqrt{1+x^2}}dx.$$ Если подынтегральное выражение
зависит от параметров, причем в вырожден\-ных случаях результат
интегрирования определяется особым выражением, то решатель
разбирает все случаи, а Maple выдает лишь общий случай. Упрощение
результа\-тов интегрирования, даже после применения функции
simplify, часто оставляет у Maple желать лучшего. Вычисляя
интеграл $$\int_0^{\pi/2}\frac{1}{a^2(\sin x)^2+b^2(\cos
x)^2}dx,$$ равный $\pi/2|ab|$, Maple дает громоздкий ответ на 7
строках.

В целом, анализ того, как Maple вычисляет производные, пределы и
интегралы, не оставляет впечатления, что эта тема закрыта для
дальнейшего совершен\-ство\-ва\-ния. Время от времени попадаются
"неудобные" \ для Maple примеры, где ответ ли\-бо не находится,
либо является неоправданно громоздким, неполным и т.п. Надо
сказать, что приемы решате\-ля, обеспечивающие аналогичные
вычисления, собраны в нескольких крупных бло\-ках (пакетах),
функционирующих автономно, вне ска\-нирования задачи. Это резко
отличается от ситуации в других разделах и говорит о том, что роль
логики при решении указанных задач не очень велика.
Прин\-ци\-пи\-аль\-ных преимуществ в данной области (кроме, быть
может, задач с параметрами) решатель не имеет, хотя и не сильно
уступает Maple. Впрочем, ход вычисле\-ний решателя ближе к
привыч\-но\-му для человека, и его пошаговые пояснения могут в
этом плане представ\-лять определенную ценность.

Обучение решателя было продолжено на такие разделы, как вычисление
двой\-ных интегралов и нахождение с их помощью площадей, объемов и
площадей поверхнос\-тей; вычисление длины кривой и криволинейных
интегралов. Были прорабо\-та\-ны задачи из соответствующих
разделов задачника Б.П.Демидовича. Логическая со\-став\-ля\-ющая
здесь уже становится заметной, так как кривые и области задаются с
помощью систем утверждений. Видимо, по этой причине у Maple данные
разделы развиты слабо или вообще не развиты. Например, вычисление
кратных интег\-ра\-лов там предлагается вручную сводить к
последовательному вычислению однократных.

Следующий раздел - нахождение экстремумов, максимумов и минимумов.
Ре\-ша\-тель применяет здесь весь свой аппарат решения уравнений и
неравенств, под\-клю\-чая к нему возможности доказательства
неравенств с помощью производной (напри\-мер, для установления
отсутствия корней производной на некотором промежутке). Хотя и
несколько медленно, он, как правило, получает вполне аккуратные
отве\-ты. В них разобраны все подслучаи и отброшены лишние
значения. Поведение Maple прокомментируем на примере использования
функции "extrema". Предлагаем найти экстремумы функции
$x(x-1)^2(x-2)^3$ и обнаруживаем, что кроме "настоя\-щих" \
экстремумов в точках $1,(5-\sqrt{13})/6,(5+\sqrt{13})/6)$,
выдается также точка пере\-ги\-ба $2$. В качестве экстремумов
синуса почему-то выдается единственная точка $\pi /2$. Для функции
$ \cos(2x)/2+ \cos(x)$ верно выдаются точки экстремума (с
точ\-ностью до периода $2\pi$), но почему-то пропущено одно из
экстремальных значений для этих точек. Для функции
$$\ln(\frac{x^2-3x+2}{x^2+1})$$ еще хуже - в качестве одной из
точек экстремума выдается значение $(1+\sqrt{10})/3$,
расположенное вне области определения (выражение под
ло\-га\-риф\-мом отрица\-тель\-но). Каких-либо пояснений
относительно того, где имеем точку локального мак\-си\-му\-ма, а
где - локального минимума, не выдается. Все это никак не
укладывается в представление о математической аккуратности.

Для решателя проводилось также обучение задачам на общий
"качест\-вен\-ный" \ анализ поведения функции с помощью
производных и пределов. По задан\-ной функ\-ции предпринимаются
попытки найти ее область определения, интер\-ва\-лы
мо\-но\-тон\-ности, экстремумы, определить число корней на
участках монотон\-нос\-ти, исследо\-вать функцию на
выпуклость-вогнутость. Рассматривались задачи на определение
промежутков непрерывности с классификацией точек разрыва и на
анализ рав\-но\-мер\-ной непрерывности. Хотя у Maple и существует
функция "discont", предназна\-чен\-ная для поиска точек разрыва,
она не дает никакой их клас\-си\-фи\-ка\-ции. Например, для
функции $x/\sin(x)$ просто выдается серия $\pi n$, хотя в этой
серии, кроме точек разры\-ва второго рода, есть и точка
устранимого разрыва $0$.

Стандартные задачи на исследование сходимости рядов также были
прорабо\-та\-ны при обучении решателя. Например, можно предложить
ему задачу на определение всех таких $p,q$, при которых сходится
ряд
$$\sum_{i=1}^{\infty} \left( \prod_{j=0}^{i-1}(p+j)/(i! i^q)
\right)$$ и получить ответ $p<q$. Система Maple не предусматривает
решения задач тако\-го типа. Разложение функций в ряды Тейлора и
Фурье - еще один тип стандартных задач по математическому анализу.
Функции системы Maple находят заданное ко\-неч\-ное число членов
разложения в степенные ряды. По каким-то причинам, ряды Фурье при
этом не рассматриваются. Решатель, кроме того, обучался на
примерах, где нужно получить разложение в виде бесконечной суммы.
Например, при разложении функции
$$\ln \left( \sqrt{\frac{x+1}{1-x}}\right)$$ в окрестности нуля он
дает ответ
$$\sum_{n=0}^\infty \frac{x^{2n+1}}{2n+1}.$$ Maple не выполняет таких
разложений ни для степенных, ни для тригонометричес\-ких рядов.
Впрочем, зато она неплохо решает обратную задачу -
суммиро\-ва\-ние бесконечных рядов. Решатель также обучен этой
задаче, в пределах стандарт\-ных задачников по математическому
анализу.

\subsection{Дифференциальные уравнения}

Решатель имеет базу приемов для решения обыкновенных
дифференциальных урав\-нений и систем таких уравнений. Обучение
предпринималось по известному за\-дач\-нику А.Ф.Филиппова. Всего
было проработано около 550 задач, и по ним создано около 450
приемов. Хотя основные общие приемы и были заложены в решатель,
его коллекция, видимо, не очень полна, и обучение можно продолжить
по многочис\-лен\-ным справочникам, извлекая из них уже более
специальные приемы. В системах компьютерной математики решению
дифференциальных уравнений уделялось самое серьезное внимание, и в
целом они располагают здесь весьма мощным аппаратом. Конечно, не
на все задачи из стандартных задаников они дают "хорошие" \
ответы. Иногда получаются в десятки раз более громоздкие формулы.
Другой, более не\-при\-ят\-ный недостаток - нередко теряются
особые решения. Впрочем, это неизбежное следствие пренебрежения
логикой. Данные замечания проиллюстрируем на единст\-вен\-ном
примере. В задаче
$$b\left(\frac{dy(x)}{dx}\right)^3+\frac{dy(x)}{dx}=y(x)$$ Maple
и теряет особое решение $y(x)=0$, и получает крайне громоздкое
выражение с квадратурами на семи строках, в то время как ответ в
параметрической форме выглядит несложно: $y = t(bt^2+1); x =
3bt^2/2+\ln(Ct)$. Несмотря на ограниченный объем обучающего
матриала, решатель довольно стабильно решает стандартные примеры,
значительно аккуратнее обращаясь с особыми случаями. При этом он
немного уступает (хотя и не всегда) системе Maple по времени
решения.

\subsection{Теория вероятностей}

Начато обучение решателя задачам по теории вероятностей.
Источником обучаю\-ще\-го материала послужила книга "Е.С.Вентцель,
Л.А.Овчаров. Задачи и упражнения по теории вероятностей".
Текстовые условия задач переводились на формаль\-ный логический
язык вручную; одновременно происходило развитие языка. В настоящее
время проработана примерно половина задачника - первые 5 глав.
Сюда вошли: задачи на непосредственный подсчет вероятностей;
теоремы сложения и умноже\-ния вероятностей; формула полной
вероятности и формула Бейеса; повторение опы\-тов; случайные
величины (скалярные), законы их распределения и числовые
харак\-те\-рис\-ти\-ки. Первые задачи фактически продолжают
комбинаторику. В качестве приме\-ра задачи собственно по теории
вероятностей рассмотрим следующую: "Прибор состо\-ит из двух
узлов. Работа каждого узла безусловно необходима для работы
прибора в целом. Надежность (вероятность безотказной работы) в
течение времени $t$ первого узла равна $p_1$, второго $p_2$.
Прибор испытывался в течение времени $t$, в результате чего
обнаружено, что он вышел из строя (отказал). Найти вероятность
того, что отка\-зал только первый узел, а второй исправен". Чтобы
сформулировать эту задачу на логическом языке, обозначим
рассматриваемое вероятностное пространство $C$. События,
соответствующие безотказной работе первого и второго узлов в
тече\-ние времени $t$, обозначим $A,B$. Тогда имеем посылки:
"вероятность($A$,$C$)=$p_1$"; "веро\-ят\-ность($B$,$C$)=$p_2$". К
ним добавляем подразумеваемое по умолчанию условие
ста\-тис\-ти\-ческой независимости событий $A,B$ -
"незавсобытия($(A,B)$,$C$)". После этого остается добавить условие
задачи "$x$ = услвероятн($B\setminus A$,
элемсобытия($C$)$\setminus (A \cap B)$,$C$)". Переменная $x$
объявляется неизвестной задачи; параметры $p_1,p_2$ -
извест\-ны\-ми, и далее решатель реализует ту же логическую схему
действий, которая при\-ме\-ня\-лась для геометрических задач на
вычисление. После несложных выкла\-док находится ответ $$x =
\frac{p_2(1 - p_1)}{1 - p_1p_2}.$$ Конечно, применение
компьютерной системы для решения задач, подобных дан\-ной, требует
от пользователя хорошего владения логическим "словарем" \ и
определен\-но\-го привыкания к базе приемов, его использующей.
Возможно, эту работу можно будет упростить за счет каких-то
вспомогательных средств интерфейсного порядка (схем, меню,
подсказок и т.п.). Последнее могло бы оказаться даже более
перспективным, чем обучение решателя пониманию самого текста
задачи, ибо ввод текста тоже весь\-ма трудоемок.

Приведем еще один пример задачи, доступной решателю: "Случайная
ве\-ли\-чи\-на $X$ подчинена закону Лапласа $f(x) =
a\exp(-\lambda|x|$ $(\lambda > 0)$. а) Найти коэффициент $a$; б)
построить графики плотности распределения и функции распределения;
в) найти математическое ожидание и дисперсию величины $X$".
Формализация посылок задачи выглядит так: "случвеличина($X$,$A$)"
\ ($A$ - вероятностное пространство); "плотнрас\-пред($X$,$A$) =
$\lambda_x(a \exp(-n|x|),x-\mbox{число}$"; "$0 < n$". Условия
задачи суть: $k = a$; "$f$ = функраспред($X$,$A$)"; "$m$ =
матожидание($X$,$A$)"; "$D$ = дисперсия($X$,$A$)". Здесь
неизвестными являются $k,f,m,D$. Ответы, полученные решателем,
таковы: $D= 2/n^2, m = 0, k = n/2$,
$$f = \lambda_x\left(\left(-\frac{1}{2\exp(nx)}+1 \mbox{при} 0\le x
\mbox{,иначе} \frac{\exp(nx)}{2}\right),x-\mbox{число}\right).$$

Система Maple имеет пакет для статистической обработки данных,
однако задач, подобных приведенным выше, она не решает, и даже не
предусматривает языка для их формулировки.

\subsection{Линейная алгебра}

Решатель имеет приемы для выполнений элементарных действий с
матрицами, ре\-ше\-ния простейших матричных уравнений, нахождения
ранга матрицы, вычисле\-ния определителей, нахождения собственных
векторов и собственных значений, а также для приведения матрицы к
жордановой форме. Все эти задачи имеют явно вычислительный
характер (хотя и в символьном представлении) и обычно ста\-вят\-ся
для конкретных числовых матриц фиксированного порядка. Разумеется,
Maple такие задачи тоже решает. Кроме того, была предпринята
попытка обучить реша\-тель вычислению определителей $n$-го
порядка. Рассмотрено два-три десятка таких за\-дач, из которых
извлечены необходимые для их решения приемы. Даже формулиров\-ка
этих задач оказалась достаточно громоздкой - для описания вида
матрицы ис\-поль\-зуются конструкции со вложенными условными
выражениями. Однако, какого-либо принципиального тупика здесь не
возникло, и при необходимости проработка таких задач может быть
продолжена. Этого класса задач Maple не решает. Сложилось
впечатление, что с точки зрения изучения логических процессов
наиболее интересны не вычислительные задачи линейной алгебры, а
теоретические задачи, проработка которых планируется в будущем.
Однако, важным достижением представляется ком\-пиляция
вычислительных процедур для перечисленных выше типов задач
не\-по\-сред\-ст\-венно с теоремного уровня. Это позволит перейти
к такому развитию компи\-ля\-то\-ра, которое обеспечит
трансформацию тех же самых теорем уже не в символьные, а в
численные процедуры.

\subsection{Комплексный анализ}

Для работы с комплексными числами в решателе введены обозначения
операций и функций, отличающиеся от обозначений
вещественнозначного случая. Таким об\-ра\-зом, решение задач в
вещественных числах выполняется независимо от реше\-ния их в
числах комплексных. При отсутствии вещественных решений уравнения,
про которое явно указано, что оно вещественнозначное, никаких
комплексных зна\-че\-ний выдаваться не будет. Чтобы задача была
воспринята решателем как комплекс\-но\-знач\-ная, в посылках явно
задается тип переменных "комплексное($\ldots$)". Формуль\-ный
редактор прорисовывает вещественнозначные операции и их
комплексные ана\-ло\-ги одинаково; различие имеется лишь во
внутреннем логическом представлении.

Обучение решателя комплексному анализу выполнялось по сравнительно
прос\-тым задачникам и имеет предварительный характер, хотя и
охватывает основ\-ные классы задач. Кроме простейших задач на
преобразование выражений и решение уравнений, рассматривались
задачи, связанные с подмножествами ком\-плекс\-ной плос\-кос\-ти:
переход от геометрического описания к описанию с помощью
комплекс\-ных чисел и обратно, нахождение образов и прообразов при
отображениях, опреде\-ле\-ние области аналитичности функции и
нахождение аналитической функции, ото\-бра\-жа\-ю\-щей одну
область на другую. Рассматривались также задачи на
восстановле\-ние аналитической функции по ее вещественной либо
мнимой компоненте, на вычисление интегралов, определение области
сходимости ряда, и т.д. Maple решает задачи лишь некоторых из
перечисленных типов. Например, она не решает задач на постро\-ение
конформного отображения, переводящего одну область в другую, не
вычисляет ин\-те\-гра\-лов по замкнутому контуру или (для
неаналитических функций) вдоль задан\-ной кривой, не определяет
области сходимости рядов и т.п. Видимо, это связано с тем, что
перечисленные задачи требуют не только преобразования выраже\-ний,
но и достаточно интенсивной работы с утверждениями, описывающими
текущий контекст.

\subsection{Элементарная физика}

Естественным этапом развития логической системы, уже обученной
решению стан\-дарт\-ных математических задач из различных
разделов, является попытка ис\-поль\-зовать этот потенциал в
смежных областях, и в первую очередь - в физике. Спектр возможных
приложений компьютерной системы, способной самостоятельно
созда\-вать математические модели по качественным описаниям
объектов и исследовать эти модели, значительно шире, чем у обычной
системы компьютерной матема\-ти\-ки. Однако, такое расширение
предполагает уже весьма интенсивное использо\-ва\-ние логических
процессов. Maple и подобные ей системы не имеют каких-либо функций
для решения школьных задач элементарной физики. Хотя существуют
разнообраз\-ные компьютерные системы для выполнения физических
расчетов, они тоже не решают проблемы логической формализации и
моделирования реше\-ния задач хотя бы на уровне школьных
задачников по физике. Недостатки этих систем аналогич\-ны уже
перечисленным выше недостаткам систем компьютерной математики.

Обучение логической системы решению задач по элементарной физике
пока весь\-ма далеко от завершения. Обучающий материал, в
основном, берется из задач\-ни\-ка "А.И.Черноуцан. Физика, задачи
с ответами и решениями". Проработаны разде\-лы "Кинематика",
"Динамика", "Закон сохранения импульса", а также (частично)
"Работа и энергия". Рассмотрены примерно 450 задач, по которым
созданы бо\-лее двух тысяч приемов. Основную трудность
представляет выбор оптимальной, с точ\-ки зрения логических
вычислений, формализации понятий, используемых при описа\-нии
структур и процессов. Чтобы пояснить, как предлагаемая
формализация связана с исходными текстами задач, эти тексты
сохраняются и могут быть вызваны на экран при просмотре
формализованной версии из задачника решателя.

В физических задачах многое подразумевается "по умолчанию".
Переход от со\-кра\-щен\-ной формы представления задачи к полной
ее форме пока выполняется вру\-чную. Полная формулировка
оказывается, как правило, достаточно громоздкой, что создает
дополнительные трудности. Причиной отказа от решения задачи, даже
по\-доб\-ной уже рассмотренным ранее, может быть случайный пропуск
какой-либо мел\-кой подробности или неадекватное использование
имеющихся понятий. Видимо, пре\-одоление этой трудности потребует,
с одной стороны, создания приемов, способ\-ных переходить от
сокращенной формулировки задачи к полной, а с другой стороны,
привлечения специальных средств интерфейса - схем, меню и т.п.

С точки зрения сложности эвристических решающих правил,
используемых прие\-мами, физические задачи особых трудностей пока
не предоставили. Новизна задачи обычно проявляется не в каких-то
новых особенностях прорабатываемых физичес\-ких понятий, а в новых
типах элементов той конструкции, которая рассматри\-ва\-ет\-ся.
Примером, иллюстрирующим эту ситуацию, может служить появление
задачи про "струю воды, бьющую из шланга" \ в разделе, посвященном
броску под углом к горизонту. Разумеется, при проработке такой
задачи сразу возникает мно\-жест\-во новых понятий (струя, поток,
русло, течение, и т.п.) и множество связанных с ними приемов. Это
обстоятельство, с одной стороны, придает процессу обуче\-ния
определенную бессистемность, а с другой стороны, очень сильно
замедляет обучение. Тем не менее, проработка в решателе полного
курса школьной физики за срав\-ни\-тель\-но разумный срок
представляется вполне реальной. Версия, которая при этом
возникнет, будет, видимо, достаточно грубой, но она может
послужить хорошим организующим началом для следующего, более
глубокого цикла проработки тех же разделов.

\subsection{Вычисления}

Для задач некоторых классов удается выделить сравнительно
небольшую груп\-пу приемов, связать их между собой в определенную
схему, указывающую очеред\-ность срабатываний, и получить таким
образом алгоритм, достаточный для решения любой задачи класса.
Применение его, в отличие от общего случая решения задач, обыч\-но
называется вычислением, хотя грань, отделяющая одно от другого,
весьма рас\-плыв\-ча\-та.

В принципе, вычисления можно выполнять непосредственно в
логических струк\-ту\-рах данных, используя приемы решателя.
Однако, такой подход приводит к очень плохим результатам - по
сравнению с обычными программами время получения ответа
увеличивается в сотни или даже в тысячи раз. Поэтому логическая
сис\-те\-ма должна использовать для вычислений традиционные
"технические" \ струк\-ту\-ры данных и приспособленные к ним
программы. Она может брать эти программы из своей вычислительной
библиотеки либо создавать их по мере надобности, опира\-ясь на
аппарат решения задач.

Таким образом, возникают два направления исследований. Первое
заключается в развитии ГЕНОЛОГа и его компилятора, которое
позволило бы задавать вы\-чис\-ли\-тельные процедуры
непосредственно на уровне языка теорем. Запасы этих проце\-дур и
составили бы вычислительную библиотеку логической системы. Так как
все рав\-но источником любой программы служит некоторая
совокупность знаний предмет\-но\-го уровня (в нашей терминологии -
теорем), то данное направление означает лишь вполне естественную
попытку автоматизации верхних уровней "обычного" \
про\-грам\-ми\-рования.

Второе направление состоит в обучении решателя стандартным приемам
раз\-ра\-бот\-ки алгоритмов по накопленному здесь достаточно
обширному обучающему ма\-те\-ри\-алу (например, по монографиям,
посвященным методам вычислений). Отличие от первого направления
состоит в том, что передаваемые компилятору ГЕНО\-ЛО\-Га "теоремы"
\ (логическое описание схемы вычислений) берутся не из базы
теорем, а из ответа задачи на программирование. При решении ее
исходные условия, связы\-ва\-ю\-щие входные и выходные данные
программы, задаются на обычном математичес\-ком языке. Решатель
преобразует их, применяя различные стандартные схемы
вычис\-ле\-ний (метод Ньютона для итерационного уточнения корней;
формулу Симпсона для интегирования; метод Рунге-Кутта для решения
дифференциальных уравне\-ний и т.п.). Результатом становятся
условия, определяющие схему вычислений, которая может быть
непосредственно откомпилирована. В процессе решения воз\-мож\-ны
раз\-личные дополнительные преобразования условий, направленные на
повышение ка\-чества создаваемой программы.

В логической системе начата проработка обоих указанных выше
направле\-ний. Вычислительные возможности ГЕНОЛОГа и его
компилятора описываются в по\-сле\-ду\-ющих разделах. Результатом
компиляции служат программы ЛОСа, быстро\-дей\-ст\-вие которых для
использования логической системы как системы компьютерной
математики, видимо, пока вполне достаточно. Наиболее часто
применяемые вы\-чис\-ли\-тельные операции вынесены в базисные
операторы ЛОСа. При необходи\-мос\-ти, компилятор ГЕНОЛОГа можно
было бы ориентировать и на получение СИ-прог\-рамм. Однако, пока
использование ЛОСа представляется более удобным из соо\-бра\-жений
совместного использования вычислительных и логических процедур.

Что касается обучения решателя программированию, то здесь освоены
следую\-щие простейшие типы задач: программирование составления
таблицы значений фун\-кции на заданном интервале; вычисление
определенных интегралов; численное ре\-шение одного или системы
дифференциальных уравнений первого порядка; на\-хож\-дение корней
системы уравнений. Исходное условие задачи может содержать
па\-ра\-метры, которые являются входными данными для
программируемой процедуры. Это условие может вообще быть неявным
(например, требовать предваритель\-но\-го решения физической
задачи для последующего программирования на основе
по\-лу\-чен\-ных формул). В результате решения возникает группа
утверждений, кото\-рые сразу же преобразуются компилятором
ГЕНОЛОГа в программу. Если име\-ют\-ся параметры, обеспечивается
вход в интерфейс для задания их конкретных значе\-ний. Полученная
программа сохраняется в блоке программ и может быть
исполь\-зо\-ва\-на как отдельный вычислительный модуль.

Системы компьютерной математики предоставляют обширные возможности
для составления новых программ на основе имеющейся у них
библиотеки стандарт\-ных функций. Однако, такое составление
предпринимается вручную. Функции системы могут лишь сделать этот
процесс менее трудоемким - например, продифферен\-ци\-ро\-вать и
упростить какие-то вспомогательные выражения, включаемые в
программу.

Составление новых программ в математике и приложениях обычно
бывает ос\-но\-ва\-но на предварительном решении таких задач,
которые носят скорее теоретичес\-кий, чем
"символьно-вычислительный" \ характер. Эти задачи недоступны
обыч\-ным системам компьютерной математики. Существующая версия
логической сис\-те\-мы тоже пока недостаточно развита, чтобы
эффективно решать задачи этого типа. Од\-на\-ко, приемы решения
данных задач мало чем отличаются от других приемов, уже имеющихся
в системе. Обучение решателя теоретическим задачам проводится, и
хо\-тя оно оказалось несколько более трудоемким, чем обучение
задачам на символь\-ные вычисления, никаких приниципиальных
ограничений, препятствующих постепен\-но\-му выходу на требуемый
уровень, здесь не видно. Разумеется, существенным уси\-ли\-телем
решателя теоретических задач являются процедуры развития базы
теорем и атоматического синтеза приемов по теоремам, речь о
которых пойдет в третьем то\-ме данной монографии.

\subsection{Понимание текстов}

Переходим к разделам, освоение которых является естественным для
логичес\-кой системы, но которые, по вполне понятным причинам,
отстуствуют в системах ком\-пьютерной математики. В первую
очередь, выделим проблему понимания текстов. Вряд ли можно всерьез
рассчитывать, что без использования ре\-ша\-телей будет соз\-дана
система, способная по-настоящему хорошо понимать смысл текстов.
Оче\-вид\-но, такая система должна будет постоянно решать задачи -
восстанавливая опус\-ка\-е\-мые "по умолчанию" \ компоненты
текста, устраняя различные неоднозначности или смысловые
искажения, используя извлеченную из текста информацию для ответов
на возникающие при диалоге с ней вопросы, и т.п. Поэтому, развивая
технику реша\-те\-лей, следовало позаботиться о том, чтобы
определить способы "подключения" \ их к анализу естественноязычных
текстов. Эта работа была начата, и проводится на материале
текстовых задач по элементарной математике.

Реализованы процедуры, осуществляющие техническую предобработку -
чте\-ние слов, разбиение их на стандартные компоненты (корни,
суффиксы, окончания) и снабжение морфологическими
характеристиками. Следующий этап, промежу\-точ\-ный между
технической и логической обработкой - синтаксический анализ фразы,
за\-клю\-чающийся в разбиении ее на подфразы и нахождении
подчинений слов друг другу. Далее - этап отождествления объектов,
на которые происходят ссылки из раз\-лич\-ных мест одной и той же
фразы, а также объектов, упоминавшихся в ранее прочитан\-ных
фразах задачи. Наконец, этап перехода от фразы к ее логическому
"подстрочнику" \ - крайне грубой, но уже представленной в виде
списка утверждений логического языка переформулировке смысла
фразы.

Лишь после этого начинается работа решателя. Первая задача,
которую он дол\-жен выполнить - перейти от неформализованного, с
его точки зрения, подстроч\-ни\-ка к списку утверждений,
передающему тот же смысл, но уже в терминах аккуратной логической
формализации, понятной решателю. Этот этап и представляет собой,
собственно, семантический анализ фразы. По завершении его
возникает результат математической переформулировки исходного
текста задачи, который и реша\-ет\-ся. Полученный в виде
математических формул ответ переводится обратно на
ест\-ест\-венный язык, с использованием сохранившейся информации о
названиях объек\-тов, упоминаемых в задаче.

Приведенный выше цикл обработки задачи был прослежен примерно на
50 тек\-сто\-вых задачах. В качестве примера приведем одну из них:
"После встре\-чи двух пароходов один из них пошел на юг, а другой
на запад. Через два часа после встречи расстояние между ними было
60 км. Найти скорость каждого парохода, ес\-ли извест\-но, что
скорость одного из них была на 6 км/час больше скорости
второ\-го". Ответ, получаемый решателем, имеет вид: "Скорость
первого парохода равна 24 км/час, скорость второго парохода равна
18 км/час".

Цепочка обработки текстовой задачи до момента получения ее
математичес\-кой формулировки является чрезвычайно сложной.
Поэтому обучение пока продвига\-ет\-ся медленно, хотя приемы
синтаксического анализа, извлеченные всего лишь из 50 задач, уже
начинают самостоятельно выполнять значительную часть своего этапа
обработки текста. Общая архитектура процесса анализа текста, после
ряда кор\-рек\-ций, стабилизировалась, однако для ускорения
обучения в целом, видимо, пона\-до\-бят\-ся дополнительные
технологические решения.

\subsection{Анализ изображений}

Понимание изображений, как и понимание чего-либо вообще, очевидно,
требует ис\-поль\-зования логических структур данных, фиксирующих
смысл увиденного. Что\-бы работать с такими структурами данных, а
в особенности чтобы их получать, необходимы решатели. Хорошо
известно, что во многих, если не в большинст\-ве случаев человек
распознает изображение лишь в контексте априори известного ему
плана окружающей обстановки. Без этой априорной логической
информации, на основе одних только зрительных данных,
распознавание оказывалось бы в прин\-ци\-пе невозможным. Видимо,
логическое представление изображений открывает но\-вые перспективы
и для задач их сжатия. Оно позволяет отбрасывать множест\-во
несущественных деталей, и при определенном развитии техники
восстановления изо\-бражений можно рассчитывать на получение
результатов, общее восприятие кото\-рых ничем существенным не
будет отличаться от восприятия оригиналов. Такой возможностью
сжатия изображений человек пользуется уже давно - описывая их в
художественной литературе и воспроизводя при чтении книги.

Как и в случае понимания текстов, в данной работе мы изучаем лишь
общую схему подключения решателя к анализу изображений. Простейшая
версия ана\-ли\-за\-то\-ра использует в качестве входных данных
черно-белые двоичные битмэпы, соз\-да\-ва\-е\-мые с помощью
курсора мыши. Эти битмэпы обрабатываются на уровне
интер\-пре\-та\-то\-ра ЛОСа для выделения системы линий,
соединяющих узловые точки. Таким образом получается граф
изображения, представленный как набор линий и набор точек. Линии
сопровождаются наборами качественных и грубых количествен\-ных
характеристик - разбиением на фрагменты одинакового знака
кривизны, на почти прямолинейные фрагменты и т.п.

Выполняется сканирование наборов точек и линий. На нижних уровнях
это\-го сканирования реализуются простейшие приемы, осуществляющие
предоб\-ра\-бот\-ку - отбрасывание мелких заведомо избыточных
линий и создание дополнитель\-ных линий (например, объединяющих
несколько исходных линий в одну длинную ли\-нию, либо возникающих
при отождествлении близких точек, и т.п.). Наконец, на верх\-них
уровнях сканирования реализуются приемы, усматривающие простейшие
образы. Пока в качестве таких образов рассматривались русские
рукописные буквы и циф\-ры. Приемы для узнавания букв записаны на
ГЕНОЛОГе. Приводится неслож\-ное логическое описание эталонного
образа буквы, а дополнительные указатели иден\-ти\-фи\-ка\-ции
позволяют создать компилятору программу, способную узнавать
бук\-ву, заданным образом отличающуюся от эталона. Такие
указатели, как и в дру\-гих разделах, сильно упрощают обучение
решателя, позволяя сравнительно компакт\-ны\-ми средствами
аппроксимировать логику образа. Результаты распознавания
ато\-мар\-ных фрагментов изображения заносятся в логический
контекст, реализо\-ван\-ный традиционным для решателя способом как
задача на исследование. Сканиро\-ва\-ние этой задачи берет на себя
управление всеми последующими действиями, необ\-хо\-ди\-мы\-ми для
логического анализа картинки.

На текущий момент введены приемы для всех русских букв,
позволяющие ре\-ша\-те\-лю распознавать сравнительно аккуратно
написанные небольшие слова. Каких-ли\-бо проблем с быстродействием
не наблюдается - ответы выдаются мгновенно, даже для случаев,
когда одна буква расположена внутри другой. Это неудивительно, так
как основная работа по выделению линий осуществляется на уровне
С-программ, а на уровень логического анализа выносятся лишь
сравнительно маломерные струк\-ту\-ры данных (десятки линий и
точек). Возможности логического управления вы\-бо\-ром окна
анализа картинки и параметров предобработки позволяют надеяться,
что та\-кое быстродействие сохранится и впоследствии.

В случае более сложных изображений ввод логических описаний
вручную ста\-нет затруднительным. По-видимому, потребуется
развитие технологии обучения "на примерах", по которым решатель
будет формировать такие описания самостоя\-тель\-но.

\subsection{Игровые ситуации}

Логические процессы необходимы также при выборе очередного хода в
игро\-вых ситуациях. Хорошим модельным объектом здесь являются
шахматы, для которых накоплен огромный обучающий материал.
Несмотря на наличие сильно играю\-щих шахматных программ,
создается впечатление, что адекватное компьютерное
мо\-де\-ли\-рование рассуждений шахматиста так и не реализовано. В
этих программах, как отмечал выдающийся шахматист и исследователь
в области искусственного ин\-тел\-лек\-та М.М.Ботвинник, основной
акцент делается на перебор. Нам не интересен "спор\-тивный" \
аспект соревнования с такими программами, а важна лишь
возмож\-ность выявления, с помощью богатейшего шахматного
обучающего материала, общих прин\-ципов управления логическими
процессами при планировании действий. Поэтому и было начато
обучение решателя игре в шахматы.

Принятие решения о выборе хода в игровой ситуации существенно
отличается от приня\-тия решения о срабатывании приема при решении
задачи. В первом случае речь идет об использовании логического
процесса для выбора какого-то воздействия на внешнюю среду; во
втором - об отдельном шаге этого логического процесса. Ошибка во
втором случае может привести лишь к тому, что у решателя
появят\-ся несколько "лишних" \ верных мыслей, которые, быть
может, и не повлияют ни\-как на окончательный результат и на время
его получения. Ошиб\-ка в первом случае гораз\-до более критична.

Принятие решения о выборе очередного хода реализовано в логической
сис\-те\-ме как процесс решения задачи на исследование. Условия ее
описывают теку\-щую шахматную позицию, сопровождаемую, быть может,
какой - либо предысторией - например, фрагментами ранее
составленных планов, по-прежнему актуальными для позиции. Решение
состоит в выводе следствий, дополняющих информацию о пози\-ции. В
частности, такими следствиями могут служить представляющие интерес
цели или отдельные ходы. После того, как цель или ход "введены в
рассмотрение", даль\-ней\-шие выводы уточняют их последствия и
вводят оценки. Как обычно, в процессе решения могут быть
поставлены вспомогательные задачи либо применены пакеты продукций,
выполняющие какой-либо специализированный перебор с просмот\-ром
нескольких последовательных ходов.

Система оценок выбрана пока двухкомпонентная. Первая компонента
опреде\-ля\-ет степень приоритетности оценки; вторая - собственно
значение оценки. Ходы или цели, мажорируемые согласно таким
оценкам, отбрасываются. По ис\-чер\-па\-нии выводов, выбирается
любой из оставшихся ходов. Приемы записываются на ГЕ\-НО\-ЛО\-Ге.
В процессе их накопления развивается некоторая логическая
формализация шахматных понятий, оптимизируемая для получения
возможно более компактных и понятных текстов. Интересно то
обстоятельство, что в шахматах предметный и структурный уровень
описания приема практически идентичны. Если в матема\-ти\-ке вид
каких-либо формул, встречающихся в уравнении, обычно мало что
говорит о числах, являющихся их значениями, и наборот, то в
шахматах "форма" \ и "со\-дер\-жа\-ние" \ совпадают. По этой
причине, для шахмат вся логика принятия реше\-ния сосредоточена в
теореме приема. В сравнении с математикой, это проще.

Проработка шахматного решателя пока находится на начальном этапе.
Освое\-ны простейшие эндшпильные ситуации, связанные с
преследованием одинокого коро\-ля и пешечными окончаниями.
Фактически, этот материал позволил лишь про\-вес\-ти несколько
первых коррекций языка и архитектуры процесса принятия решения.

\subsection{Прочие возможности}

Список областей, с необходимостью предполагающих использование
логических про\-цессов, нетрудно продолжить. Безусловно, к ним
относится поиск в базах дан\-ных. Запросы на поиск представляют
собой, по сути дела, небольшие задачи для решате\-ля. Так как
приемы организованы по принципу энциклопедии, сканирование задачи
позволяет за единственный шаг обратиться к информации базы данных,
связан\-ной с упоминаемым в запросе объектом. Синтез приемов,
используемых для обработки запроса, можно при этом осуществлять по
исходной логической записи информа\-ции автоматически, с помощью
сопровождающего ГЕНОЛОГ аппарата. Следую\-щая перспективная для
подключения логических процессов область - управле\-ние
динамическими системами. Впрочем, работе в этом направлении должно
предшест\-во\-вать достижение решателями достаточно высокого
уровня в распознавании изо\-бра\-жений. Безусловно, очень важное
направление - техническое проектиро\-ва\-ние, хотя и здесь началу
работ должно предшествовать хорошее освоение системой как основ
физики, так и моделирования физических процессов. Можно и нужно
продол\-жать обучать логическую систему во всех областях, где
имеются хорошие задачники, постепенно переходя к рассмотрению
задач, предполагаю\-щих использование все бо\-лее разносторонних
знаний и дающих системе возможность все дольше работать в
ав\-то\-ном\-ном режиме. Архитектура системы позволяет увеличить
ее объем в сотни раз, практически не замедляя при этом решения
задач из уже проработанных раз\-де\-лов.

Объединение в одном комплексе даже таких областей, где уже имеются
силь\-ные экспертные системы, необходимо не только из-за общих
преимуществ интеграции знаний. Хотя и это существенно - ведь из-за
отсутствия каких-либо перегородок между приемами возможности
предметных областей как бы "перемножаются". Рас\-смотрение
различных областей на уровне ГЕНОЛОГа означает получе\-ние
мате\-ри\-а\-ла, необходимого для анализа того, как алгоритмика
возникает из теоре\-ти\-чес\-ких зна\-ний. Чем более
разносторонним будет накопленный материал, тем более достоверными
и полными будут извлеченные из него представления об организации
логичес\-ких процессов, и тем реалистичнее станет в конечном счете
создание саморазвиваю\-щей\-ся интеллектуальной системы.

\par\bigskip

На этом мы завершаем краткий обзор возможностей и перспектив
реша\-те\-ля. Более подробное описание его устройства будет
приведено во втором томе мо\-но\-гра\-фии. Однако, такому описанию
должно предшествовать изложение техни\-чес\-ких основ обучения
решателей - созданных для этого языков ЛОС и ГЕНОЛОГ, а так\-же
многочисленных средств интерфейса обучения. В оставшейся части
данного тома философия искусственного интеллекта уходит на второй
план, а на первый план выходят скучные технические подробности,
без которых, впрочем, никакое серьез\-ное продвижение вперед в
этой области не представляется возможным.


\chapter{Алгоритмический язык ЛОС}

\section{Структуры данных и общая схе\-ма ор\-га\-ни\-за\-ции про\-грам\-мы
   на язы\-ке ЛОС}

 Программы приемов решателя записываются на языке ЛОС (Логический
 Описатель Ситуаций) и реализуются интерпретатором этого языка.
 Язык ЛОС по своему уров\-ню сопоставим с ПРОЛОГом, однако
 специально адаптирован к изложенной выше схеме сканирования задач
 и имеет много принципиальных отличий от ПРОЛОГа. Для логической
 системы он является языком низкого уровня, и запись на нем
 прие\-мов "вручную" предпринимается крайне редко. Фактически приемы
 записываются на языке более высокого уровня, ГЕНОЛОГе, и далее
 компилятор ГЕНОЛОГа создает на основе этой записи исполняемую
 ЛОС-программу приема. Вместе с тем, основу языка ЛОС составляют
 около 200 предикатов и операций, которые могут рассмат\-ри\-ваться
 не только как алгоритмический, но и как вполне развитый
 логический язык для описаний ситуаций в логико-сетевых структурах
 данных. Поэтому в тех случаях, когда речь идет не о работе с
 объектами предметной области, а о работе с объектами структурного
 уровня (иными словами, когда предметной областью являются сами
 структуры данных), логические уровни ЛОСа и ГЕНОЛОГа, по
 существу, совпадают, и программирование приемов непосредственно
 на ЛОСе становится вполне оправ\-данным.

  В языке ЛОС выделяются следующие основные типы объектов, обрабатываемых
  программой:

  а) Символы переменных и логические символы. Максимально возможное число
  переменных и логических символов определяется конкретной версией
  интерпрета\-то\-ра; используемая в настоящее время версия допускает
  применение $2^{16} - 1$ логических символов и стольких же переменных.
  Можно вводить, удалять либо изменять на\-зва\-ние ранее введенных
  логических символов. Каждое название логического симво\-ла представляет
  собой произвольную последовательность символов расширенного ал\-фа\-вита
  (допускаются русские и латинские буквы,цифры и пр.), длина которой
  не более 24. Собственно в программных файлах ЛОСа логические символы
  представ\-ле\-ны при помощи своих номеров, а названия их хранятся в
  отдельном файле, что позволяет изменять эти названия, не изменяя
  программ.

  б) Термы, построенные из переменных и логических символов (заголовок
  опера\-ции - произвольный логический символ, число операндов - любое).
  Терм длины 1 отож\-дес\-твляется с набором длины 1 (см.пункт в) и отличается
  от входящего в него логического символа.

  в) Наборы $(a_1, \ldots ,a_n)$ ранее определенных допустимых объектов.

  г) Вхождения символов в термы и разрядов в наборы.

  Заметим, что для скобок не предусмотрены специальные логические символы,
  а терм $\varphi (a_1 \ldots a_n)$ не является набором входящих в него
  логических символов и скобок - в структурах данных интерпретатора с
  ЛОСа скобки представлены неявным образом (указаны длины подтермов и
  ссылки на внешние операции). Тем не менее, во многих случаях терм
  можно рассматривать как последовательность составляющих его логических
  символов и символов переменных с опущенными скобками, применяя при этом
  операторы, предназначенные для работы с наборами. Для обозначения
  пустого набора выделен логический символ "пустоеслово", воспринимаемый
  рядом операторов языка как набор длины 0.

  Все логические символы пронумерованы натуральными числами. При
  ис\-поль\-зовании их в качестве заголовков операторов языка ЛОС выделяются
  непосредст\-вен\-но реализуемые логические символы (номера от 1 до 240)
  и программно реализуемые логические символы. С непосредственно
  реализуемыми символами связаны со\-от\-вет\-ствующие процедуры интерпретатора;
  выполнение операторов с программно ре\-али\-зуемыми заголовками происходит
  при помощи программ языка ЛОС.

  Представление чисел в решателе осуществляется четырьмя различными
  спо\-со\-бами. С одной стороны, для быстрых выкладок с целыми числами
  диапазона от -259 до 65535 используется кодирование их логическими
  символами (логический символ "0" имеет номер 260). С другой стороны,
  отличное от цифры десятичное число $a_1 \ldots a_n , a_{n+1} \ldots
  a_{n+m}$ кодируется набором $(a_1 a_2 \ldots a_n , a_{n+1} \ldots a_{n+m})$,
  где запятая яв\-ля\-ется логи\-чес\-ким символом (изменение знака числа
  происходит путем добавления либо удаления логического символа "минус"
  в начале набора), а цифра отождест\-вля\-ется с обоз\-на\-ча\-ющим ее логическим
  символом. При работе с термами применяется представление
  указанного числа в виде "величина ($a_1 \ldots a_n , a_{n+1} \ldots
  a_{n+m}$)" (отри\-ца\-тель\-ного числа - в виде "минус (величина ($a_1 \ldots
  a_n , a_{n+1} \ldots a_{n+m}$))"; цифры - в виде однобуквенного терма).
  Наконец, для приближенных вычислений с математическим сопроцессором
  и для вычислений с применением обычной 32-битной машинной
  ариф\-метики исполь\-зу\-ются форматы "с плавающей запятой" (64-битное
  представление) и "целое со знаком" (32 бита). Числа в указанных
  форматах кодируются специальным образом: первое - набором длины
  2, второе - набором длины 1. Эти наборы несколько отличаются от
  обычных наборов ЛОСа, и работать с ними нужно только при помощи
  операторов, специально предназначенных для машинной арифметики.

  Программе доступна совокупность данных, образованная, с одной стороны,
  зна\-че\-ниями ее переменных (входные данные и вспомогательные объекты,
  формируемые программой), а с другой стороны, некоторая совокупность
  внешних данных, опи\-сы\-вающих цепь задач, сложившуюся в процессе решения
  предложенной системе задачи. Как уже отмечалось в главе 3, задача
  $Z$ представляет собой набор $(p_0,p_1, \ldots ,p_n)$, где $p_0$ -
  логический символ, определяющий тип задачи; $p_1$ - набор посылок
  задачи; $p_2$ - набор весов посылок (логических символов от "0"
  до "20"); $p_3$ - набор наборов объектов, представляющих собой
  комментарии к посылкам, и т.д. Цепь задач пред\-став\-ляет собой
  упорядоченную последовательность задач $(Z_0,Z_1, \ldots , Z_N)$,
  где $Z_0$ - исходная задача; $Z_N$ - текущая решаемая задача;
  $Z_{i+1}$ - подзадача задачи $Z_i$ ($i=1, \ldots , N-1$). Эта
  последовательность сама не образует допустимого объекта (набора
  задач) и обращение к ней осуществляется через специальные операторы
  языка. Такие операторы, в частности, позволяют определить по
  каждому элементу $Z_i$ цепи задач его текущий $m_i$ и максимальный
  $M_i$ уровни (логические символы от "0" до "20"). Исходная задача
  $Z_0$ имеет фиктивный характер и создается автоматически при вклю\-чении
  системы. Она представляет собой задачу на исследование с единствен\-ной
  фиктивной однобуквенной посылкой "вход"; при сканировании этой
  посылки за\-пус\-кается написанная на языке ЛОС программа интерфейса,
  позволяющая сформи\-ро\-вать фактически решаемую задачу $Z_1$.
  Список общих комментариев к посылкам задачи $Z_0$ используется в качестве
  "доски объявлений", доступной любой процедуре системы. Главным
  образом, эта доска объявлений используется процедурами ин\-тер\-фейса.

  Помимо указанных здесь основных типов данных, предусмотрены
  различные ти\-пы данных внешнего характера (файлы с древовидными
  информационными кон\-струкциями, файлы программ ЛОСа и др.). Более
  подробно эти типы данных опи\-сы\-ваются ниже,
  при рассмотрении операторов языка ЛОС. Для работы с внеш\-ни\-ми
  данными используются ссылки, представленные посредст\-вом данных
  основ\-ных типов (как правило, наборы логических символов). Перечень
  внешних типов данных системы является, по существу, открытым, так как
  организация интерпретатора языка позволяет сравнительно легко
  подключать дополнительные непосредственно реализуемые операторы,
  работающие с данными нового типа.

  Программа решателя организована по энциклопедическому принципу
  и распа\-да\-ется на программы отдельных логических символов. Программа
  логического симво\-ла $\varphi$ имеет древовидную структуру и состоит из
  совокупности пронумерованных нату\-ральными числами текстов, называемых
  фрагментами этой программы. Каждый фрагмент программы логического
  символа $\varphi$ представляет собой последовательность $P_1 ,\ldots ,
  P_n$ термов специального вида, называемых операторами языка. В боль\-шинст\-ве
  случаев эти термы представляют собой просто утверждения логического
  языка, зна\-чениями переменных которых служат данные указанных выше типов.

Два специальных типа операторов, а именно "ветвь($N$)" \ и
"иначе($N$)", где $N$ - натуральное число, называются операторами
перехода (для краткости скобки в операторах перехода опускаются,
т.е. применяется запись "ветвь $N$", "иначе $N$"). Если в $i$ - м
фрагменте встречается оператор "ветвь $j$" \ либо "иначе $j$", то
говорим, что этот фрагмент имеет ссылку на $j$ - й фрагмент. Граф
ссылок между фрагментами программы является деревом с корнем в 1-м
фрагменте; 1-й фрагмент называется также началом программы символа
$\varphi$. Оператор "иначе $N$" располагается в фрагмен\-те только
после некоторого другого оператора, не являющегося оператором
перехода. Во избежание путаницы сразу заметим, что в интерфейсе
программного редакто\-ра ЛОСа применяется не глобальная, как
сказано выше, а локальная нумера\-ция фрагментов программы: ссылки
из каждого фрагмента на подфрагменты про\-ну\-ме\-ро\-ва\-ны там
независимым образом последовательными натуральными числами (по
мере появления их в тексте фрагмента), начинающимися с 1.
Указанная выше глобальная нумерация фрагментов введена здесь лишь
для удобства описания языка; фактически в файле программы ЛОСа
ссылка из фрагмента на подфрагмент задается смещением этого
подфрагмента в файле.

В операторах используется специальный класс подтермов, называемых
оператор\-ными выражениями. В большинстве случаев эти подтермы
суть некоторые выраже\-ни\-я логического языка. Входящие в
операторные выражения переменные обознача\-ются в программе ЛОСа
посредством буквы "х" с номером: х1, х2, \ldots . По
определе\-нию, каждое однобуквенное выражение является
операторным. Синтаксис опера\-тор\-ных выражений $\varphi (t_1
\ldots t_n)$ определяется независимо для каждого символа
$\varphi$. Непосредственно реализуемые символы $\varphi$
рассматриваются в следующем разделе данной главы; в случае
программ\-но реализуемого символа все операнды $t_1, \ldots , t_n$
сами должны быть операторными выражениями (число $n$ может
варьироваться, при условии, что программа способна самостоятельно
определить его по заведомо доступным ей данным). Аналогичным
образом, синтаксис операторов $\varphi (t_1 \ldots t_n)$, $n \ge
0$, определяется независимо для каждого символа $\varphi$, причем
в случае программ\-но реализуемого символа $\varphi$ все $t_1,
\ldots ,t_n$ суть операторные выражения. При определении оператора
вида $\varphi (t_1 \ldots t_n)$ указывается разбиение множества
его свободных перемен\-ных на входные и выходные переменные;
выходная переменная имеет (кроме случаев $\varphi \in \{$ "и",
"или", "альтернатива" $\}$) ровно одно вхождение, являющееся
вхождением некоторого операнда $t_i (i=1, \ldots , n)$. В
некоторых случаях допускаются различные варианты такого разбиения,
причем интерпретатор ЛОСа при реализации оператора выбирает то из
них, для которого значения всех входных переменных уже определены
программой, а всех выходных - не определены.

При обращении к программе логического символа $\varphi$, а также
на каждом шаге выполнения этой программы выделяется некоторый
набор переменных, значения которых считаются определенными ,
причем программа способна самостоятельно отличать их от прочих
переменных.

Обращения к программе символа $\varphi$ бывают следующих трех
типов:

1) Обращение в процессе сканирования текущей решаемой задачи $Z_N$
(см. описа\-ние процесса сканирования задачи в главе 4). Если
$\varphi$ - тип задачи и произошло обращение к процедуре,
объединяющей приемы решения задач типа $\varphi$ без привязки к
конкретному вхождению логического символа в задачу (см. пункт 1
описания процедуры сканирования), то определены значения
переменных $x1$ (задача $Z_N$) и $x5$ (текущий уровень $m_N$ этой
задачи). Если в задаче выделено конкретное вхождение символа
$\varphi$ (пункт 3 описания процедуры сканирования), то определены
$x1 = Z_N$, $x2$ - данное вхождение символа $\varphi$ в текущую
посылку либо условие задачи, $x3$ - вхождение текущей посылки либо
условия задачи в список посылок либо условий (при отсутствии
такового - в саму задачу), $x4$ равно 0, если просматривается
посылка задачи, и равно 1 в противном случае, $x5 = m_N$. Таким
образом, тройка ($x2,x3,x4$) определяет координаты вхождения в
задачу выделенного символа $\varphi$. Если произошло обращение к
процедуре символа, являющегося названием типа задачи (пункт 1
про\-це\-дуры сканирования), то значения $x2,x3,x4$ равны
логическому символу 0.

2) Обращение при выполнении программно реализуемого оператора либо
нахож\-дении значения операторного выражения $\varphi (t_1 \ldots
t_n)$. В этом случае определены все переменные $xi, 1 \le i \le
n$, для которых $t_i$ не является выходной переменной оператора.
Остальные переменные $xi, i \in \{ 1, \ldots ,n \}$, считаются не
определенными и должны оставаться таковыми вплоть до момента
присвоения им специальными заключитель\-ными операторами
результатов выполнения программы перед выходом из нее.

3) Приемы решения задач часто используют вспомогательные
процедуры, рас\-па\-дающиеся на систему независимых подпроцедур,
связанных с различными логи\-ческими символами. Такие процедуры
обеспечивают получение информации спра\-вочного характера,
связанной с соответствующими логическими символами (на\-при\-мер,
определяют арность символа; находят область допустимых значений
операции с заданным заголовком, и т.п.). Эти процедуры называем
далее справочниками. Каждая из них обозначается специальным
логическим символом, отличным от сим\-вола "0" \ - типом данного
справочника. Тип справочника $\psi$ рассматривается как
характеристика обращения к программе символа $\varphi$ при попытке
получить ин\-фор\-ма\-цию, связанную с этим символом. Чтобы
определить, что имеет место именно такой тип обращения,
используется вспомогательный оператор "обращение($\psi$)",
истинный лишь в этом случае. Значения переменных $x1, \ldots ,xn$,
определенных при обращениях к справочнику типа $\psi$, задаются
осуществляющим запрос операторным выражением "справка($\psi
\varphi t_1 \ldots t_n$)" ($x_i$ получает значение операторного
выражения $t_i$).

Операторы языка ЛОС делятся на проверочные, перечисляющие и
смешанного проверочно-перечисляющего типа. Проверочный оператор,
при указании значений его входных переменных, либо принимает
значение "ложь", либо однозначным об\-ра\-зом определяет значения
выходных переменных и принимает значение "истина". Перечисляющий
оператор, при определении значений его входных переменных,
ге\-не\-рирует некоторую конечную последовательность
(возможно,пустую) наборов зна\-че\-ний выходных переменных,
принимая после каждой выдачи очередного набора значение "истина",
после чего принимает значение "ложь". Операторы смешанного типа
функционируют либо в проверочном, либо в перечисляющем режиме, в
за\-ви\-си\-мости от конкретных значений их входных переменных.
Оператор "ветвь $N$" по определению считается перечисляющим. Для
возвращения к перечисляющему опе\-ра\-тору и получения от него
очередного набора значений выходных переменных при реализации
программы создается стэк перечисляющих операторов ($Q_1 \ldots
Q_m$), ко\-то\-рые относятся, вообще говоря, к различным
фрагментам программы символа $\varphi$, находящимся на пути от
начала программы к текущему фрагменту.

Реализация очередного оператора $P_i$ текущего фрагмента $P_1,
\ldots , P_n$ программы символа $\varphi$ происходит следующим
образом:

1) Если оператор имеет вид $\psi(t_1 \ldots t_n)$, где $\psi$ -
программно реализуемый символ, то последовательно определяются
значения входных операторных выражений $t_i$ и осуществляется
обращение к программе символа $\psi$; действия в случае
непосред\-ствен\-но реализуемого $\psi$ описаны в следующем
разделе. Если по окончании выполнения оператора он принимает
значение "ложь", то переход к пункту 2. В противном случае
оказываются определены значения всех выходных переменных этого
оператора. Если при реализации оператора $P_i$ имел место режим
перечисления, то оператор заносится в конец стэка перечисляющих
операторов. Если $i<n$, то переход к выполнению следующего
оператора $P_{i+1}$, иначе - переход к пункту 3.

2) Если $P_{i+1}$ имеет вид "иначе $N$", то осуществляется переход
к первому оператору $N$ - го фрагмента программы. Если стэк
перечисляющих операторов пуст, то вы\-пол\-нение программы символа
$\varphi$ завершается. При этом, если происходило сканирование
задачи, то делается очередной шаг сканирования; если вычислялось
операторное выражение $\varphi(\theta _1 \ldots \theta _k)$, то
выдается значение "0" \ (логический символ); если же
об\-ра\-ба\-ты\-вался оператор $\varphi ( \theta _1  \ldots \theta
_k)$, то он получает значение "ложь". Если стэк перечис\-ляющих
операторов ($Q_1 \ldots Q_m$) непуст, то осуществляется
возвращение к последнему оператору $Q_m$, который удаляется из
стэка. При этом значения всех переменных, номера которых больше
номера последней определенной до обращения к $Q_m$
пе\-ре\-мен\-ной, становятся не определены. Оператор $Q_m$
определяет очередной набор значений своих выходных переменных
либо, при отсутствии такого набора, принимает значе\-ние "ложь", и
далее повторяется выполнение программы начиная с оператора,
сле\-ду\-ющего за $Q_m$. Особо выделяется случай оператора $Q_m$
вида "ветвь $N$". В этом случае просто выполняется переход к
первому оператору $N$ - го фрагмента программы.

3) В языке ЛОС имеется несколько специальных операторов,
размещаемых обыч\-но в конце фрагментов программы и используемых
для управления ходом выполне\-ния программы. Если $P_i$
представляет собой один из таких заключительных опе\-ра\-торов, то
выполняются следующие действия:

а) $P_i$ = "выход". В этом случае программа символа $\varphi$
осуществляет реализацию проверочного оператора, который получает
значение "истина".

б) $P_i$ = "стоп". В этом случае программа осуществляет реализацию
оператора (не обязательно проверочного), который получает значение
"ложь".

в) $P_i$ = "результат($xk_1 \: t_1 \: xk_2 \: t_2  \ldots xk_s \:
t_s$)". Программа осуществляет реализацию перечисляющего оператора
$\varphi(\tau _1 \ldots \tau _p)$; выходным переменным $\tau
_{k_1} , \ldots , \tau _{k_s}$ этого опе\-ра\-тора присваиваются
значения операторных выражений $t_1, \ldots ,t_s$. Заметим, что
при реализации проверочного оператора $\varphi (\tau _1 \ldots
\tau _p)$ присвоение значений выходным переменным происходит таким
же образом, но оператор "результат(\ldots )" \ распо\-ла\-га\-ется
непосредственно перед завершаюшим оператором "выход".

г) $P_i$ = "продолжение". Этот оператор является тождественно
ложным, т.е. про\-ис\-ходит возвра\-щение к последнему оператору
$Q_m$ стэка перечисляющих операторов либо (при пустом стэке) выход
из программы.

д) $P_i$ = "обрыв" \ либо $P_i$ = "сброс($k$)"; $k$ - натуральное
число. Происходит возвра\-щение к оператору $Q_{m-k}$ (в первом
случае $k=1$) из стэка ($Q_1 \ldots Q_m$) перечисляющих
операторов; если такого оператора нет, то - выход из программы,
как при пустом стэке.

е) $P_i$ = "ответ($t$)". В этом случае программа либо выполняла
сканирование задачи, и тогда определяется ответ $t$ на эту задачу,
либо вычисляла операторное выражение (в частности, вида "справка(
$\psi \: \varphi \ldots$)" ), получающее значение операторного
выраже\-ния $t$.

ж) $P_i$ = "пересмотр". В этом случае программа выполняет
сканирование задачи, которое возобновляется повторно при нулевом
текущем уровне задачи.

з) $P_i$ = "контроль". Программа выполняет сканирование задачи.
Если эта задача имеет хотя бы один терм (посылку либо условие) с
нулевым весом (что бывает при изменении терма либо занесении
нового терма), то начинается повторное сканиро\-ва\-ние задачи при
нулевом текущем уровне. В противном случае - переход к последнему
перечисляющему оператору $Q_m$ (если его нет, то выход из
программы).

Если $P_n$ не является оператором одного из указанных видов, то
либо имеет место сканирование задачи, и тогда осуществляется
очередной шаг сканирования, либо происходит реализация
проверочного оператора без выходных переменных, который получает
значение "истина".

\section{Основные операторы языка ЛОС}
\subsection{Общие операторы}
Язык ЛОС имеет свыше 200 реализуемых интерпретатором операторов,
ориен\-ти\-ро\-ванных главным образом на обработку данных сетевого
и логического типов. Часть этих операторов ("выход", "стоп",
"результат($x1 \: t_1 \ldots xn \: t_n$)", "ответ($t$)", "обрыв",
"сброс($n$)", "продолжение", "контроль", "пересмотр") была
рассмотрена в пре\-ды\-дущем разделе. Приведем еще ряд простых
операторов управляющего характера.

Операторы "решить", "программа", "обращение($\psi$)" \ принимают
значение "исти\-на", соответственно, если программа символа
$\varphi$ применяется при сканировании за\-дачи, при реализации
оператора и при вычислении операторного выражения $t$; в последнем
случае $\psi \ne$ "0" \ означает, что $t$ имело вид "справка($\psi
\: \varphi
 \ldots $)", а $\psi = $ "0" \ - что $t$ не имело такого вида.
Оператор "определено($xi$)" \ истинен, если определе\-но значение
переменной $xi$. Оператор "повторение" \ представляет собой
вырожденный перечисляющий оператор, принимающий при каждом выходе
на него значение "исти\-на"; он аналогичен оператору repeat в
ПРОЛОГе. Оператор "уровень($n_1 \ldots n_k$)" \ ($n_1,\\ \ldots ,
n_k$ - логические символы от "0" до "20") истинен, если происходит
сканирование задачи, текущий уровень которой равен одному из чисел
$n_1,n_2, \ldots ,n_k$; оператор "последнийуровень" - если текущий
уровень решаемой задачи $Z_N$ равен ее максималь\-ному уровню.
Оператор "новый" применяется при сканировании задачи; он
принима\-ет значение "истина" в том случае, когда рассматриваемый
терм задачи впервые попал в поле зрения системы при данном текущем
уровне $m_N$. Более точно, этот оператор становится ложнм лишь в
ситуациях повторного просмотра при значениях текущего уровня $U =
0,1, \ldots ,m_N$ временно выпавшего из поля зрения терма,
имею\-щего вес $m_N+1$ (см. пункт 3 описания процедуры
сканирования задачи в последнем разделе первой главы). Оператор
"новый" \ позволяет блокировать повторную попыт\-ку рассмотрения
приема, если изменение окрестности терма не влияет на результаты
такого рассмотрения.

Перейдем к описанию серии общелогических операторов языка. Если
$P$ - произ\-вольный проверочный оператор, не имеющий выходных
переменных, то утверждение "не($P$)" \ является проверочным
опера\-тором, истинным тогда и только тогда, когда ложен $P$. Если
$P_1, \ldots ,P_n$ - операторы, то утверждение "и($P_1 \ldots
P_n$)" \ является опера\-тором. Если хотя бы один из операторов
$P_1, \ldots ,P_n$ реализуется в режиме пере\-чис\-ления, то
конъюнкция их также считается реализуемой в режиме перечисления. В
стэк перечисляющих операторов при этом заносится не последний
перечисляющий оператор $P_i$, а вся конъюнкция. Аналогичным
образом формируется дизъюнкция "или($P_1 \ldots P_n$)" \
операторов $P_1, \ldots ,P_n$. Если каждый из операторов $P_1,
\ldots ,P_n$ прове\-рочный и не имеет выходных переменных, то
дизъюнкция является проверочным оператором. Если каждый оператор
$P_i,i=1, \ldots ,n$, имеет непустое множество вы\-ход\-ных
переменных, то дизъюнкция реализуется в режиме перечисления (даже
если все $P_i$ - проверочные). При этом сначала перечисляются
значения выходных переменных, определяемые оператором $P_1$, затем
- $P_2$, и т.д. Дизъюнктивные конструкции, у которых часть
операторов $P_i$ имеет пустое множество выходных переменных, а
часть - непустое, не рекомендуются, так как тогда наличие либо
отсутствие режима пере\-чис\-ления определяется неоднозначно.

Если $P_1, \ldots , P_n$ - операторы, $n>0$,$P_0$ - проверочный
оператор, $x_1, \ldots , x_k$ - пере\-мен\-ные, содержащие все
выходные переменные операторов $P_0,P_1, \ldots , P_n$, то
ут\-вер\-ждение "длялюбого($x_1 \ldots x_k$ если $P_1 \ldots P_n$
то $P_0$)" \ является проверочным операто\-ром. К моменту его
реализации последняя определенная переменная должна иметь номер,
меньший номеров переменных $x_1, \ldots , x_k$. Все свободные
переменные операто\-ра $P$ являются его входными переменными. При
фиксированных значениях этих пере\-мен\-ных цепочка операторов
$P_1, \ldots , P_n$ (среди которых могут встречаться
пе\-ре\-числяющие операторы) определяет процесс перечисления
удовлетворяющих услови\-ям $P_1, \ldots , P_n$ наборов значений их
выходных переменных, причем для каждого тако\-го набора
вычисляется истинностное значение оператора $P_0$. Как только
здесь воз\-ни\-кает зна\-че\-ние "ложь", процесс обрывается и $P$
получает значение "ложь". В против\-ном случае, по завершении
перечисления, оператор $P$ получает значение "истина", а значения
всех переменных $x_1, \ldots , x_k$ снова оказываются не
определены. Заметим, что управляющие ходом перечисления операторы
"повторение", "обрыв", "сброс($n$)" \ вну\-три сложных операторов
(в частности, в кванторных операторах) не используют\-ся.
Аналогичным образом определяется оператор $P$ вида
"существует($x_1 \ldots x_k \: P_0$)" , где $P_0$ - некоторый
оператор (возможно, перечисляющий), все выходные переменные
которого содержатся среди $x_1, \ldots , x_k$. Как и в случае
квантора общности, к моменту реализации $P$ последняя определенная
переменная должна иметь номер, меньший номеров переменных $x_1,
\ldots , x_k$. (Это правило является общим для всех операторов и
операторных выражений со связанными переменными и далее особо не
оговаривается. Вообще, при программировании на ЛОСе
предпочтительно вводить новые про\-грам\-мные переменные так,
чтобы очередной номер переменной был на единицу больше наибольшего
из уже использованных номеров.) Если при фиксации значений входных
переменных оператора $P$ оператор $P_0$ оказывается истинным для
некоторого набора значений своих выходных переменных, то
определяемое им перечисление обрывается, $P$ получает значение
"истина", а значения переменных $x_1, \ldots ,x_k$ становятся
снова не определены.

К числу основных логических операторов присоединен оператор $P$ =
"аль\-тер\-на\-тива( $P_0 P_1 P_2$)", где $P_0$ - проверочный
оператор без выходных переменных; $P_1,P_2$ - некоторые операторы
(не обязательно проверочные). Если $P_0$ получает на некотором
наборе значений своих переменных значение "истина", то далее
выполняется опера\-тор $P_1$, иначе - оператор $P_2$. Здесь
возникает возможность появления смешанных проверочно-
перечисляющих операторов, так как если один из операторов
$P_1$,$P_2$ проверочный, а другой - перечисляющий, то выбор
фактического режима работы оператора $P$ происходит в зависимости
от значений его входных переменных. По аналогии с оператором
"альтернатива($P_0 P_1 P_2$)" \ устроено операторное выражение
"ва\-риант($P t_1 t_2$)", где $P$ - проверочный оператор без
выходных переменных; $t_1$ и $t_2$ - операторные выражения.
Значение этого выражения совпадает со значением $t_1$ при истинном
$P$ и со значением $t_2$ при ложном $P$.

Для формирования наборов объектов, накапливаемых в процессе
просмотра тех или иных структур данных, служат операторные
выражения со связанными пе\-ре\-мен\-ными "перечисление($x_1
\ldots x_k \: P \: t$)" и "выписка($x_1 \ldots x_k \: P \: t$)"
(аналоги setof  и findall в ПРОЛОГе). Здесь $P$ - некоторый (как
правило, перечисляющий) оператор; $t$ - операторное выражение;
$x_1, \ldots ,x_k$ - переменные, включающие все выходные
пе\-ре\-мен\-ные оператора $P$. При определении значения этих
выражений оператор $P$ перечисляет некоторые наборы значений своих
выходных переменных, и для каждого такого набора определяется
значение выражения $t$. В первом случае (оператор
"пе\-ре\-числение(\ldots)") найденные указанным образом значения
выражения $t$ записываются в формируемый набор подряд, с
исключением повторений; во втором случае (опера\-тор
"выписка(\ldots)") исключение повторений не выполняется.
Операторное вы\-ра\-же\-ние "суммавсех( $x_1 \ldots x_k \: P \:
t$)" осуществляет суммирование значений выражения $t$ (эти
значения должны быть числами, т.е. цифрами либо наборами, см.
описание представления чисел в разделе 1), возникающих в процессе
реализации перечис\-ля\-ющего оператора $P$ так же, как для
операторов "перечисление(\ldots)", "выписка(\ldots)". Это
выражение используется , например, при принятии решений для
интегральной оценки ситуации.

Вычисление значения уже упоминавшегося в первом разделе
операторного вы\-ра\-жения "справка($\psi \: \varphi \: t_1 \ldots
t_n$)", где $\psi$, $\varphi$ - логические символы; $t_1, \ldots ,
t_n$  - оператор\-ные выражения, осуществляется программой
логического символа $\varphi$ при "типе обраще\-ния" $\psi$ к этой
программе и исходных значениях $t_1, \ldots ,t_n$ переменных $x_1,
\ldots , x_n$. Это выражение используется в тех случаях, когда
некоторая процедура, условно обоз\-на\-ча\-емая логическим
символом $\psi$, естественным образом распадается на множество
независимых фрагментов, связанных с различными логическими
символами $\varphi$.

Оператор "равно($t_1 t_2$)" либо не имеет выходных переменных
(если все входящие в него переменные имеют уже определенные на
предыдущих этапах значения) и осуществляет проверку равенства
значений выражений $t_1$ и $t_2$ (равенство наборов понимается как
равенство определяемых ими древовидных конструкций), либо имеет
выходную переменную $t_1$, которой присваивается значение
выражения $t_2$.

Для изменения значения переменной $x_N$ используется оператор
"замена($x_N \ t$)", где $t$ - операторное выражение, определяющее
заменяющий объект. Сразу заметим, что в фактически исполняемой
программе здесь вместо переменной $x_N$ хранится ее символьный
номер (логический символ номер $260+N$), который и сообщается
интерпретатору ЛОСа в качестве первого входного данного оператора
"замена($\ldots$)". Аналогичный оператор "изменение($t_1 t_2$)"\
позволяет изменять разряд набора, вхож\-дение которого
определяется выражением $t_1$, на объект, являющийся значением
вы\-ражения $t_2$. При\-ме\-нение операторов "замена(...)" и
"изменение(...)" \ требует опре\-деленной аккурат\-нос\-ти, так
как после их реализации значения переменных могут измениться таким
образом, что истинность предшествующих операторов
рассмат\-риваемого фрагмен\-та программы нарушится.Эти операторы
оказываются полезны при реализации цик\-ли\-чес\-ких процедур в
тех достаточно редких случаях, когда цикл не удается оформить с
помощью перечисляющих операторов.

Возможно обращение к оператору либо операторному выражению,
заголовок ко\-то\-рых определяется некоторым операторным
выражением. Это осуществляется при помощи терма "процедура($t_1 \:
t_2 \: t_3$)", у которого значением $t_1$ является указанный
заголовок, причем при $t_3$  равном "0" данный терм реализует
обращение к оператору, а при $t_3$ равном "1" - к операторному
выражению. Значением $t_2$ является набор входных данных
соответствующего оператора либо операторного выражения. В случае
опе\-ра\-тора с выходными переменными позиции набора $t_2$,
соответствующие выходным переменным, заняты логическим символом
"неопред". Эти позиции после обращения к оператору
"процедура(\ldots)" изменяются на найденные значения выходных
пере\-мен\-ных.

В тех случаях, когда предпринимается обращение к процедуре,
выполнение ко\-то\-рой может оказаться неприемлемо трудоемким,
используется фиктивный пере\-чис\-ля\-ющий оператор
"лимит($t_1$)". Этот оператор устанавливает ограничение в $t_1$
шагов работы интерпретатора (количество таких шагов автоматически
фиксируется в специальном регистре интерпретатора и может
рассматриваться как машинно-независимые внутренние "часы"
решателя) начиная с момента обращения к нему. По истечении этого
числа шагов, если все еще не было выхода из следующей за данным
оператором ветви программы, реализуется откат к оператору с
присвоением ему истинностного значения "ложь". Если после
обращения к подпрограмме, которое могло оказаться слишком
трудоемким, нужно отменить откат к оператору "ли\-мит(\\
$\ldots$)", то применяется оператор "Обрыв". Единственное его
действие - исключение из стэка перечисляющих операторов последнего
элемента (не обязательно установ\-лен\-ного оператором
"лимит($\ldots$)"), без каких-либо откатов.

В заключение подраздела упомянем операторное выражение
"типданных($t$)", по\-зво\-ляющее различать типы значения $А$
выражения $t$. Если $A$ - логический символ либо символ
переменной, то значение $p$ выражения "типданных($t$)" равно 0;
если $A$ - терм, то $p$ равно 1; если $A$ - вхождение в терм либо
в набор, то $p$ равно 2; если $A$ - набор, не являющийся термом,
то $p$ есть 4. Значение $p = 3$ зарезервировано для тех случаев,
когда $A$ есть ссылка на недопустимый объект (сигнал о наличии
ошибки).

\subsection{Операторы просмотра и преобразования задачи}

Для выделения отдельных элементов задачи служит ряд специальных
опе\-ра\-тор\-ных выражений. Так, "цели($t$)" имеет своим
заголовком список целей задачи, определяе\-мой выражением $t$;
"неизвестные($t$)" \ - цель, перечисляющую неизвестные (если ее
нет, то это выражение имеет значение "пустоеслово");
"комментарии($t_1$)", "коммен\-та\-рии\-посылок($t_1$)",
"комментарииусловия($t_1 t_2$)", "комментариипосылки($t_1 t_2$)" \
- со\-от\-вет\-ствующие списки комментариев (задача определяется
здесь выражением $t_1$, а вхождение рассматриваемого условия либо
посылки - выражением $t_2$); "списокус\-ло\-вий($t$)" \ и
"списокпосылок($t$)" \ - списки условий и посылок. Значением
выражения "переменные($t$)" \ служит список всех переменных,
встречающихся в посылках и ус\-ло\-ви\-ях задачи, а также среди ее
неизвестных. Выражение "максимальныйуровень($t$)" \ по\-зволяет
определить максимальный уровень задачи. Для обращения к процедуре
решения задачи служат операторные выражения "ответзадачи($t$)" \ и
"прямойответ\\ ($t$)". Выражение $t$ в обоих случаях имеет своим
значением некоторую задачу (т.е. набор допустимого вида;
см.описание структуры данных задачи в третьей главе), причем в
первом случае эта задача начинает решаться с максимальным уровнем,
равным текущему уровню решаемой задачи $Z_N$, а во втором случае -
с максимальным уровнем 4. Если перед вычислением значения
выражения "ответзадачи($t$)" применить оператор
"уровеньобращения($k$)", то новая задача будет решаться с
максимальным уровнем $k$ (установка уровня обращения к задаче
имеет одноразовый характер и после обращения к задаче пропадает).
Ответ либо логический символ "отказ", най\-ден\-ный при решении
задачи, становится значением соответствующего операторного
выражения.

Операторы "исходнаязадача($x$)", "текущаязадача($x$)" присваивают
переменной $x$ исходную и текущую задачи цепи задач, а оператор
"надзадача($x$ $t$)" перечисляет в обратном порядке (т.е. от
текущей задачи к исходной) все элементы цепи задач, тип которых
равен значению выражения $t$. Если $t$ имеет значение 0, то
последнее ограничение отменяется. Сама текущая задача из
перечисления исключается. Опе\-ра\-тор "текущийуровень($x$)"
присваивает переменной $x$ значение текущего уровня те\-ку\-щей
задачи. Операторы "посылка($t_1 t_2 t_3$)"  и "условие($t_1 t_2
t_3$)" используются в сле\-ду\-ющих двух вариантах:

а) Значением выражения $t_3$ является задача $Z$; $t_1, t_2$ -
выходные переменные. В этом случае перечисляются все посылки либо,
соответственно, условия задачи $Z$ (порядок перечисления - слева
направо), причем значением $t_1$ становится рассмат\-ри\-ва\-емый
терм, а значением $t_2$ - его вхождение в список посылок либо
список условий. Если $Z$ не имеет списка условий, то при
реализации оператора "условие(\ldots)" режим перечисления не
включается; значением $t_1$ становится единственное условие
задачи, а значением $t_2$ - его вхождение в задачу.

б) $t_1$ и $t_3$ - входные выражения, значения которых суть терм
$\theta$ и задача $Z$; $t_2$ - выходная переменная. Выполняется
проверка того, что $\theta$ - посылка (условие) задачи $Z$, и если
это так, то $t_2$ становится равно вхождению $\theta$ в
соответствующий список либо в саму задачу $Z$.

В некоторых случаях бывает необходимо осуществить просмотр всех
посылок либо условий задачи, имеющих заданный вес; как правило,
таковыми оказываются вновь введенные за некоторый период посылки
либо условия. Для этого применяются операторы "новаяпосылка($t_1
t_2 t_3 t_4$)", "новоеусловие($t_1 t_2 t_3 t_4$)", \ реализация
которых отличается от случая а) реализации операторов
"посылка($t_1 t_2 t_3$)", "условие($t_1 t_2 t_3$)" \ лишь тем, что
отбираются термы с весом, равным значению выражения $t_4$.
Операторы "цель($t_1 t_2$)", "неизвестная($t_1 t_2$)" допускают
два режима реализации, причем в каждом из них значением выражения
$t_1$ является задача $Z$, не имеющая тип "доказать":

 а) $t_2$ - выходная переменная, и тогда оператор перечисляет значения
 переменной $t_2$, являющиеся целями (неизвестными) задачи $Z$.

 б) $t_2$ определено, и тогда оператор проверяет, что значением выражения
 $t_2$ являет\-ся цель (неизвестная) задачи $Z$.

Ряд операторов служит для преобразования задачи. Прежде всего, это
операторы "заменаусловия($t_1 t_2 t_3$)" и "заменапосылки($t_1 t_2
t_3$)" \ ($t_1$ - задача, $t_2$ - вхождение за\-ме\-ня\-емого
терма в соответствующий набор, $t_3$ - заменяющий терм);
\linebreak "занесениеусловия($t_1 t_2$)" и "занесениепосылки($t_1
t_2$)" ($t_1$ - терм, $t_2$ - задача, имеющая в первом случае тип
"описать"); "удалениеусловия($t_1 t_2$)" и "удалениепосылки($t_1
t_2$)" ($t_1$ - задача, $t_2$ - вхождение удаляемого терма).
Измененный либо новый терм получает в задаче вес 0; если оператор
указанного типа является заключительным в фрагменте программы и
обращение к этой программе произошло при сканировании задачи, то
текущий уровень задачи заменяется на 0 и цикл сканирования
повторяется сначала.

Для занесения в соответствующие списки новых комментариев
используются опе\-раторы "примечание($t \: \theta _1 \ldots \theta
_n$)" (вводится общий комментарий ($\alpha _1 \ldots \alpha _n$)
либо, при $n=1$, общий комментарий $\alpha _1$ к посылкам задачи,
определяемой выражением $t$; $\alpha _1, \ldots , \alpha _n$ -
значения выражений $ \theta _1 , \ldots , \theta _n$; $\alpha _1$
- логический символ), "замечание($t \: \theta_ 1 \\ \ldots \theta
_n$)" \ (вводится общий комментарий к задаче, определяемой
выражением $t$), "при\-мечпосылки($t \: \tau \: \theta _1 \ldots
\theta _n$)" \ (вводится комментарий к посылке, определяемой своим
вхождением $\tau$ в список посылок), "замечусловие($t \: \tau \:
\theta _1 \ldots \theta _n$)" \ ($t$ опре\-деляет задачу на
описание; $\tau$ - вхождение в список условий того условия, к
которому относится комментарий).

Проверка отсутствия заданного комментария выполняется аналогичными
по своей структуре операторами "коммент($t \: \theta _1 \ldots
\theta _2$)" (отсутствие среди общих комментариев к задаче набора
$(\alpha _1 \ldots \alpha _n)$ либо, при $n=1$, символа $\alpha
_1$), "комментпосылок ($t \: \theta _1 \ldots \theta _n$)",
"комментусловия($t \: \tau \: \theta _1 \ldots \theta _n$)",
"комментпосылки($t \: \tau \: \theta _1 \ldots \theta _n$)".

Завершают перечень операторов задач операторы
"удалениепримечания($t \: \theta$)", "удалениезамечания($t \:
\theta$)", "удалениепримечпосылки($t \: \tau \: \theta$)",
"удалениезамечусловия ($t \: \tau \: \theta$)", выполняющие
удаление определяемого выражением $\theta$ комментария ($t$
опре\-деляет задачу, $\tau$ - вхождение рассматриваемой посылки
либо условия.

\subsection{Операторы логического представления данных}

Начнем с перечисления операторных выражений, предназначенных для
работы с логическими конструкциями. Выражения
"списокпеременных($t$)", "параметры($t$)" \ определяют,
соответственно, набор всех переменных терма, являющегося значением
выражения $t$, и набор всех свободных переменных этого терма. В
последнем случае значением выражения $t$ может служить как один
терм, так  и набор термов. Для образования новых термов
используется операторное выражение "запись($t \theta _1 \ldots
\theta _n$)"; если выражения $t, \theta _1, \ldots , \theta _n$
определяют, соответственно, логический символ $\varphi$ и термы
либо символы (т.е. логические символы либо символы переменных)
$\tau _1, \ldots , \tau _n$, то формируется новый терм $\varphi
(\tau _1 \ldots \tau _n)$. В тех случаях, когда набор операндов
имеет переменную длину, новые термы определяются операторным
выражением "сбор\-ка($t \: \theta$)". Здесь $t$ определяет
логический символ $\varphi$; $\theta$ - набор операндов $\tau _1,
\ldots , \tau _n$ - термов либо символов. Для выделения фрагментов
уже построенного терма при\-ме\-няются операторные выражения
"подтерм($t$)" \ ($t$ указывает вхождение корня
пе\-ре\-писываемого подтерма), "набороперандов($t$)" \ ($t$
указывает вхождение первого сим\-во\-ла терма $\varphi ( \theta _1
\ldots \theta _n)$, и значением выражения становится набор термов
$\theta _1 , \ldots , \theta _n$), а также операторные выражения
"первыйтерм($t$)", "второйтерм($t$)", "предпоследтерм\\ ($t$)",
"последнийтерм($t$)" для наиболее часто рассматриваемых операндов
$\theta _1 , \theta _2 , \theta _{n-1}, \\ \theta _n$ терма
$\varphi( \theta _1 \ldots \theta _n)$, вхождение первого символа
которого определяется выражением $t$. Операторные выражения
"первыйоперанд($t$)", "второйоперанд ($t$)",
"предпос\-лед\-операнд($t$)", "последнийоперанд($t$)" позволяют
определить вхождения заголовков ука\-занных операндов $\theta _1,
\theta _2, \theta _{n-1}, \theta _n$. Операторные выражения
"следоперанд($t_1$)" и "пред\-операнд($t_1$)" позволяют находить
вхождения операнда некоторой операции, со\-от\-вет\-ственно,
непосредственно следующего за вхождением $t_1$ операнда той же
операции либо предшествующего ему. В концевых случаях, при
отсутствии следующего либо предыдущего операнда, выдается само
значение $t_1$. Операторное выражение "опе\-рандномер($t$ $n$)"
имеет своим значением вхождение $n$ - го операнда операции,
рас\-по\-ложенной по вхождению $t$. Здесь $n$ - символьный номер
(логический символ с номером $260+n$). Если операция имеет меньше
чем $n$ операндов, то выдается логи\-ческий символ 0.


Операторное выражение "заменатермов ($t_1 t_2 t_3$)" \ определяет
результат замены в терме $\theta$ набора вхождений $(\alpha _1
\ldots \alpha _n)$ расположенных слева направо непересекающих\-ся
подтермов (при $n=1$ рассматривается не набор $(\alpha _1)$, а
само вхождение $\alpha _1$) на набор термов либо символов $(\tau
_1 \ldots \tau _n)$. Здесь $t_1$ определяет $\theta$, $t_2$ -
вхождения, а $t_3$ - заменяющие термы. Выражение
"исключениеоперанда($t_1 t_2$)" позволяет находить терм $\varphi
(\theta _1 \ldots \theta _{i-1} \theta _{i+1} \ldots \theta _n)$,
получающийся из терма $\varphi (\theta _1 \ldots \theta _n)$
исключением операн\-да $\theta _i$ (если $n=2$, то результатом
исключения становится оставшийся операнд $\theta _j,j \ne i$);
здесь $t_1$ определяет вхождение первого символа терма $\varphi(
\theta _1 \ldots \theta _n)$, а $t_2$ - вхождение операнда $\theta
_i$. Если выражение $t$ определяет вхождение символа в некоторый
терм $\theta$, то операторное выражение "базавхождения($t$)" \
имеет своим значением данный терм $\theta$. Для определения
переменной с заданным номером применяется выражение "икс($t$)",
где $t$ определяет $N$ - й после "0" логический символ; $N$ -
номер требуемой переменной. Выражение "кортежпеременных($t_1
t_2$)" определяет набор $(y_1 \ldots y_k)$ переменных,
от\-лич\-ных от переменных набора - значения выражения $t_2$ и
имеющий ту же длину, что и набор - значение выражения $t_1$.
Аналогичной цели служит оператор "новаяпере\-мен\-ная($t_1 t_2$)",
у которого $t_1$ определяет набор переменных, а выходной
переменной $t_2$ присваивается переменная, не входящая в указанный
набор.

Операторы "логсимвол($t$)", "переменная($t$)" позволяют
распознавать логические символы и переменные; операторы
"корень($t$)", "стандарт($t$)" - распознавать корневое вхождение в
терм и вхождение символа, за которым идет открывающая скобка.
Последний оператор бывает полезен, чтобы отличить обычное
использование символа операции $\varphi$ в конструкциях вида
$\varphi (\theta _1 \ldots \theta _n)$ от использования его в
качестве син\-так\-сической константы в описаниях вида термов. При
обращении к оператору "символ\\ ($t_1 t_2$)" \ значением выражения
$t_1$ является вхождение в терм либо в набор. Если $t_2$ -
выходная переменная, то ей присваивается объект, имеющий указанное
вхождение; в противном случае оператор проверяет совпадение этого
объекта со значением вы\-ра\-жения $t_2$. Аналогично, оператор
"заголовок($t_1 t_2$)" либо присваивает выходной пе\-ре\-менной
$t_2$ первый символ терма, являющегося значением $t_1$, либо, если
$t_2$ определено, проверяет совпадение этого заголовка со
значением $t_2$. Операторы "первыйсимвол\\ ($t_1 t_2$)",
"второйсимвол($t_1 t_2$)", "предпоследсимвол($t_1 t_2$)",
"последнийсимвол($t_1 t_2$)" \ оп\-ределяют, соответственно,
заголовки (логические символы либо переменные) опе\-ран\-дов
$\theta _1 ,\theta _2, \theta _{n-1} ,\theta _n$ подтерма $\varphi
(\theta _1 \ldots \theta _n)$, вхождение первого символа которого
задается выражением $t_1$; если $t_2$ - выходная переменная, то ей
присваивается найденный заголовок, иначе он сравнивается со
значением $t_2$. Эти операторы часто используются при сканировании
задачи для идентификации того или иного подтерма. Оператор
"свобвхождение($t$)" распознает свободное вхождение переменной в
терм; оператор "лексикопредшствует($t_1 t_2$)" - проверяет
лексикографическое предшествование термов. Последний оператор
бывает полезен для стандартного упорядочения операндов
ком\-мутативных и ассоциативных операций.

Перечислим ряд операторов,используемых для перемещения по
вхождениям в терм. Оператор "операнд($t_1 t_2$)" \ используется в
следующих двух возможных режимах:

а) $t_2$ определено и имеет значением вхождение $\alpha$ в терм;
$t_1$ - выходная переменная, которой присваивается вхождение той
операции, чьим операндом является $\alpha$. Если такой нет, то
оператор ложен.

б) $t_1$ определено и имеет значением вхождение первого символа
подтерма \linebreak $\varphi (\theta _1 \ldots \theta _n)$; $n>0$.
$t_2$ - выходная переменная, значения которой перечисляют
вхожде\-ния операндов $\theta _i; i = 1, \ldots ,n$.

Оператор "новоперанд($t_1 \: t_2$)" имеет своим входным данным
$t_1$ вхождение операнда некоторой операции. Выходная переменная
$t_2$ перечисляет вхождения операндов той же операции, следующие
за $t_1$ (исключая само $t_1$).

Для просмотра всех внешних операций,а также всех подряд символов
некоторого подтерма служит оператор "подчинено($t_1 t_2$).
Существует три возможных режима его реализации:

а) $t_1$ определено и имеет своим значением вхождение $\alpha$ в
некоторый терм. $t_2$ - выходная переменная, перечисляющая в
направлении от $\alpha$ к корню терма все вхождения заголовков
содержащих $\alpha$ подтермов (само вхождение $\alpha$
отбрасывается).

б) $t_2$ определено и имеет своим значением вхождение $\beta$
заголовка некоторого подтерма; $t_1$ - выходная переменная,
перечисляющая слева направо все вхождения символов в этот подтерм
(начиная с заголовка).

в) $t_1, t_2$ определены и задают вхождения $\alpha , \beta$
заголовков подтермов $\tau _1, \tau _2$. Оператор истинен, если
$\tau _1$ лежит внутри $\tau _2$ либо совпадает с $\tau _2$.

Оператор "вхождениетерма($t_1 t_2 t_3$)" имеет входные данные
$t_1$ (терм $\theta _1$) и $t_2$ (терм $\theta _2$); $t_3$ -
выходная переменная, перечисляющая (слева направо) все вхождения
терма $\theta _2$ в терм $\theta _1$. Для просмотра всех
антецедентов $f_1 , \ldots , f_n$ импликативной конструкции
"длялюбого($x_1 \ldots x_k$ если $f_1 \ldots f_n$ то $f_0$)"
применяется оператор "антецедент($t_1 t_2$)", у которого значением
$t_1$ служит указанная конструкция либо вхождение ее заголовка, а
выходная переменная $t_2$ перечисляет вхождения корней утверждений
$f_1, \ldots ,f_n$.

Для сравнения термов,определенных вхождениями своих заголовков,
служит опе\-ратор "равныетермы($t_1 t_2$)".

Чтобы ускорить поиск в заданном наборе термов $A$ терма, подобного
терму $t$ (получающегося из него переобозначением связанных
переменных и перестановкой операндов коммутативных операций и
симметричных отношений), можно исполь\-зо\-вать оператор
"ключподобия($A$ $t$ $x$)". Его выходная переменная $x$
перечисляет вхождения в список $A$ тех термов, которые могут
оказаться подобными терму $t$ (сравниваются длины термов, их
заголовки и суммы кодов входящих в терм логи\-чес\-ких символов и
переменных; код любой переменной здесь равен 1).

Завершает перечень операторов логических структур данных оператор
"результ\-подст($t_1 t_2 t_3 t_4$)". Он допускает следующие два
возможных режима реализации:

а) $t_1,t_2$ определяют набор переменных $(x_1 \ldots x_k)$ и
набор термов $(\tau_ 1 \ldots \tau _k)$ соот\-ветственно; $t_3$
определяет терм $\theta$. $t_4$ - выходная переменная, которой
присваивается терм - результат подстановки термов $\tau _1, \ldots
, \tau _k$ вместо переменных $x_1 , \ldots ,x_k$ в терм $\theta$.

б) $t_1$ определяет набор переменных $(x_1 \ldots x_k)$; $t_3$ и
$t_4$ - термы $\theta$ и $\theta '$. $t_2$ - выходная переменная,
которой присваивается такой набор термов $(\tau _1 \ldots \tau
_k)$, подстановка ко\-то\-рого в терм $\theta$ вместо переменных
$x_1, \ldots ,x_k$ дает терм $\theta '$; если $x_i$ не входит в
$\theta$, то $\tau _i$ становится равно логическому символу
"пустоеслово". При отсутствии указанного набора оператор ложен.

\subsection{Операторы сетевого представления данных}

Операторы сетевого представления данных связаны с рассмотрением
наборов и вхож\-дений в них (в сетевых конструкциях вершины,а
иногда и ребра кодируются посред\-ством наборов). Операторное
выражение "набор($t_1 \ldots t_n$)" ($n \ge 1$) позволяет
фор\-ми\-ровать набор значений выражений $t_1 , \ldots ,t_n$. Если
выра\-жения $t_1 , \ldots , t_n$ определяют наборы либо символы
(т.е. логические символы либо символы переменных), то выра\-жение
"конкатенация($t_1 \ldots t_n$)" \ определяет конкатенацию этих
наборов и символов; логический символ "пустоеслово" при этом
рассматривается как набор длины 0. Вы\-ражения "суффикс($t \:
\theta$)" \ и "префикс($t \: \theta$)" \ позволяют присоединять к
концу (соответ\-ственно, к началу) набора, определяемого
выражением $t$, значение выражения $\theta$. Операторное выражение
"окончание($t$)" осуществляет удаление первого элемента на\-бора
(пустой набор этим выражением сохраняется); выражение "вставка(
$t_1 t_2 t_3$)" име\-ет своим значением набор ($\alpha _1 \ldots
\alpha _{i-1} \beta \alpha _i \ldots \alpha _n$), полученный из
набора ($ \alpha _1 \ldots \alpha _n$), определяемого выражением
$t_1$, заменой $i$ - го разряда, вхождение которого
опреде\-ля\-ется выражением $t_2$, на объект $\beta$ ,
определяемый выражением $t_3$. Если значения выражений $t_1,t_2$
суть набор $(\alpha _1 \ldots \alpha _n)$ и набор вхождений в этот
набор разрядов $\alpha _{i_1} , \ldots ,\alpha _{i_s}$; $i_1 <
\ldots < i_s$ (если $s=1$, то берется не набор вхождений, а само
вхождение), то значением операторного выражения "исключение($t_1
t_2$)" служит ре\-зультат удаления указанных разрядов из набора
$(\alpha _1 \ldots \alpha _n)$. Выражение "заменараз\-ряда($t_1
t_2 t_3$)" определяет результат замены в заданном наборе (значение
$t_1$) заданного вхождения разряда (значение $t_2$) на заданный
объект (значение $t_3$). Если выражения $t_1,t_2$ определяют
наборы $\alpha , \beta$, то выражение "пересечениесписков($t_1
t_2$)" имеет своим значением набор, полученный из $\alpha$
сохранением всех разрядов, встречающихся в $\beta$, причем с
учетом кратности: число сохраняемых экземпляров одного и того же
объекта набора $\alpha$ не превосходит числа его экземпляров в
наборе $\beta$. Выражение "объединениесписков($t_1 t_2$)" \ имеет
своим значением набор $\alpha \beta '$, где $\beta '$ получено из
$\beta$ удалением всех элементов, входящих в $\alpha$, а выражение
"вычеркивание($t_1 t_2$)" \ - набор, получающийся из $\alpha$ в
результате непродолжаемой последовательности одновременных
вычеркиваний у $\alpha$ и $\beta$ пар одинаковых элементов
(порядок просмотра $\alpha$ - слева направо). Выражение
"бланк($t_1 t_2 t_3$)", где $t_1$ определяет набор длины $k$, $k
\ge 0$, $t_2$ - некоторый объект $\alpha$; $t_3$ - $N$ -й после
"0" логический символ ($N \ge 0$), имеет своим значением набор
$(\alpha \ldots \alpha)$ длины $N+k$. Наконец, последнее из серии
операторных выражений, используемых для построения новых наборов,
- выражение "копия($t$)", формирующее копию набора (либо терма).

Выражение "буква($t$)" имеет своим значением объект, вхождение
которого в набор либо терм определяется выражением $t$. Если
значением выражения $t_1$ является набор $(\alpha _1 \ldots \alpha
_n)$, а значением $t_2$ - $N$ - й после "0" логический символ ($N
\ge 0$), то значением выражения "левпозиция($t_1 t_2$)" служит
объект $\alpha _{N+1}$; значением выражения "правпо\-зиция($t_1
t_2$)" \ - объект $\alpha _{n-N}$; значением выражения
"окрестность($t_1 t_2$)" \ - вхождение $N+1$ -го разряда в набор
$(\alpha _1 \ldots \alpha _n)$. В этой же ситуации значением
выражения "левыйкрай($t_1$)" \ является вхождение разряда $\alpha
_1$; выражения "правыйкрай($t_1$)" \ - вхо\-ждение $\alpha _n$;
выражения "начало($t_1$)" \ - объект $\alpha _1$ и выражения
"конец($t_1$)" \ - объект $\alpha _n$. Если значением выражения
$t$ является вхождение разряда $\alpha _i$ в некоторый набор
$(\alpha _1 \ldots \alpha _n)$, то выражение "левсосед($t$)"
определяет вхождение $\alpha _{i-1}$, а "правсосед($t$)" \ -
вхождение $\alpha _{i+1}$ (если разряд крайний и сдвиг невозможен,
то сохраняется значение $\alpha _i$). Оператор "позиция($t_1
t_2$)" имеет выходную переменную $t_1$, перечисляющую слева
направо все вхождения разрядов в набор, определяемый выражением
$t_2$. Оператор "входит($t_1 t_2$)", аналогичный предыдущему,
имеет два возможных режима реали\-за\-ции:

 а) $t_2$ определено и имеет своим значением набор $(\alpha _1 \ldots
 \alpha _n)$; $t_1$ - выходная пе\-ре\-мен\-ная, перечисляющая объекты
 $\alpha _i (i=1, \ldots ,n)$.

 б) $t_1,t_2$ определены и имеют значения $\alpha , \beta$; $\beta$ -
 набор. В этом случае оператор проверяет вхождение объекта $\alpha$
 в набор $\beta$.

 Для поиска в наборе используются: оператор "разряд($t_1 t_2 t_3$)",
 где $t_1$ определяет набор либо терм $\alpha$; $t_2$ - логический
 символ либо переменную $\varphi$; $t_3$ - выходная пе\-ре\-мен\-ная,
 перечисляющая все вхождения $\varphi$ в $\alpha$, а также операторы
 "ключ($t_1 t_2 \theta$)" \ и "биключ($t_1 t_2 t_3 \theta$)". У последних
 двух операторов $t_1$ определяет набор $\alpha$; $t_2$ - логи\-чес\-кий символ
 $\beta$;$t_3$ - некоторый объект $\gamma$. Выходная переменная $\theta$
 перечисляет все элементы набора $\alpha$, имеющие в первом случае вид
 $(\beta , \ldots)$ либо $\beta( \ldots)$ либо равные $\beta$, а во
 втором случае - вид ($\beta ,\gamma , \ldots$) либо $\beta(\gamma , \ldots)$,
 либо $\beta(\gamma(\ldots ), \ldots)$. Эти операторы часто применяются
 при поиске комментариев заданного типа, а также при отборе условий
 либо посылок задачи, имеющих заданный вид. Если выражения $t_2,t_3$
 опре\-де\-ляют наборы $(\alpha _1 \ldots \alpha _n)$ и $(\beta _1 \ldots
 \beta _m)$, а выражение $t_1$ - вхождение разряда $\alpha _i, i \le m$,
 то операторное выражение "соотвпозиция($t_1 t_2 t_3$)" определяет
 вхождение разряда $\beta _i$. Аналогично, если $t_1,t_2$ определяют
 наборы $(\alpha _1, \ldots ,\alpha _n)$ и $(\beta _1, \ldots , \beta _n)$,
 а $t_3$ - некоторый объект $\beta$, то выражение "таблзначение($t_1 t_2 t_3$)"
 либо имеет своим значением объект $\beta _j$, такой, что $\beta = \alpha _j$
 и $\beta \ne \alpha _1, \ldots ,\alpha _{j-1}$, либо, при отсутствии
 указанного объекта, имеет значение $\beta$. Оператор
 "Таблзначение($t_1 t_2 t_3 t_4$)" позволяет перечислять все
 элементы $t_4$ набора $t_2$, у которых на соответствующей позиции
 набора $t_1$ располагается элемент, равный $t_3$.

Приведем ряд специальных операторов, используемых для
перечисляения вхож\-де\-ний в наборы. Если выражения $t_1, \ldots
, t_n$ имеют своими значениями наборы $(\alpha _{1 1}, \ldots \\
,\alpha _{1 m_1}), \ldots , (\alpha _{n 1}, \ldots , \alpha _{n
m_n})$ \ соответственно; \ $\theta _1 , \ldots , \theta _n$ -
различные переменные, не \\ встречающиеся в $t_1 , \ldots ,t_n$,
то оператор "серия($\theta _1 \: t_1 \ldots \theta _n \: t_n$)"
имеет выходные пе\-ре\-мен\-ные $\theta _1 , \ldots , \theta _n$ и
перечисляет такие наборы $(\beta _{1 i}, \ldots , \beta _{n i})$
$(i = 1, \ldots , \min (m_1 , \ldots , m_n))$ их значений, что
$\beta _{j i}$ - вхождение разряда $\alpha _{j i}$ в набор
$(\alpha _{j 1} \ldots$ $\alpha _{j m_j})$; $j=1, \ldots ,n$.
Просмотр наборов "соответствующих" вхождений справа налево
выполняется оператором "кон\-трсерия($\theta _1 \: t_1 \ldots
\theta _n \: t_n$)", причем $t_1, \ldots ,t_n$ имеют своими
зачениями вхождения разря\-дов $\alpha _{1 j_1}, \ldots , \alpha
_{n j_n}$ в некоторые наборы $(\alpha _{1 1}, \ldots ,\alpha _{1
m_1}), \ldots ,$ $(\alpha _{n 1}, \ldots ,\alpha _{n m_n})$ и
оператор перечисляет наборы $(\beta _{1 j_1-i}, \beta _{2 j_2-i},
\ldots ,\beta _{n j_n-i}); i= 0,1, \ldots ,$ $\min (j_1-1, \ldots
,j_n-1)$.

Для просмотра разрядов набора начиная с некоторой фиксированной
позиции (слева направо) служит оператор "постпозиция($t_1 \:
t_2$)". Он допускает два режима реализации:

а) $t_1$ - выходная переменная; $t_2$ определяет вхождение разряда
$\alpha _i$ в набор $(\alpha _1 \ldots \alpha _n)$. Тогда $t_1$
перечисляет вхождения $\alpha _i, \alpha _{i+1}, \ldots , \alpha
_n$.

б) $t_1,t_2$ определены и имеют значения $\alpha ,\beta$ -
вхождения в некоторый набор. Опера\-тор проверяет, что вхождение
$\alpha$ расположено не раньше, чем $\beta$.

Иногда более удобно применять похожий оператор "новпозиция($t_1
t_2$)", у которого значением $t_2$ является набор $(\alpha _1
\ldots \alpha _n)$ либо вхождение разряда $\alpha _i$ в этот
набор, а выходная переменная $t_1$ перечисляет: в первом случае -
все вхождения $\alpha _1 , \ldots , \alpha _n$, а во втором -
$\alpha _{i+1}, \ldots , \alpha _n$.

В заключение перечислим ряд проверочных операторов для работы с
наборами. Оператор "пересекаются($t_1 t_2$)" проверяет наличие
общего элемента в наборах либо термах (в споледнем случае под
элементом понимается логический символ либо символ переменной);
операторы "равнойдлины($t_1 t_2$)" и "короче($t_1 t_2$)" -
равенство длин наборов и тот факт, что длина набора $t_1$ меньше
длины набора $t_2$. Оператор "различ\-ны($t$)" проверяет попарное
отличие друг от друга всех элементов набора. Если зна\-че\-нием
выражения $t_1$ является набор $\alpha$, а значением выражения
$t_2$ - $N$-й после "0" логический символ, то оператор
"длинатекста($t_1 t_2$)" истинен, если $\alpha$ имеет длину $N$, а
оператор "длинаменее($t_1 t_2$)" - если длина $\alpha$ меньше, чем
$N$.

Наконец, оператор "включается($t_1 t_2$)" проверяет, что набор -
значение выражения $t_1$ получается перестановкой и исключением
части разрядов набора - значения вы\-ра\-жения $t_2$.

\subsection{Арифметические операторы}

Арифметические операторы ЛОСа делятся на две группы: для работы с
символьным представлением чисел (число $N$ кодируется $N$-м после
"0" логическим символом) и с обычными десятичными представлениями
. В последнем случае цифры $0, \ldots , 9$ кодируются логическими
символами "0", \ldots , "9"; неодноразрядное положительное целое
число, имеющее десятичную запись  $a_1 \ldots a_n$, кодируется
набором логических символов, соответствующих цифрам $a_1, \ldots
,a_n$; для представления десятичных дро\-бей внутри этого набора
на соответствующей позиции размещается логический сим\-вол ","
(специальный символ для запятой); для получения отрицательных
чисел в начале набора добавляется логический символ "минус".
Заметим, что все десятичные числа, кроме цифр, кодируются наборами
логических символов, а цифры кодируются самими логическими
символами.

Для работы с символьным представлением чисел используются
операторные вы\-ражения "плюссимв($t_1 \: t_2$)", "вычитсимв($t_1
\: t_2$)", "умножсимв($t_1 \: t_2$)" (сложение, вы\-чи\-тание и
умножение). Заметим, что в ЛОСе логический символ "0" имеет номер
260, и логические символы с номерами от 1 до 259 могут
использоваться как символьные представления отрицательных целых
чисел от -259 до -1. В интерпретаторе ЛОСа предусмотрена
возможность для работы с 65535 логическими символами, т.е.
наи\-боль\-шее допустимое в символьном представлении целое число
есть 65275. Обычно символьные представления чисел используются для
таких технических целей, как нуме\-ра\-ция разрядов наборов,
представление весов посылок и условий задач, нуме\-ра\-ция
переменных, задание координат точек на экране, и т.п. Указанные
выше диа\-па\-зоны изменения символьных представлений чисел для
этого вполне достаточны.

Если значениями $t_1$ и $t_2$ служат переменные, то значением
выражения "вычитсимв ($t_1 t_2$)" служит символьное представление
разности номеров этих переменных; если значением $t_1$ является
переменная $x$, а значением $t_2$ - символьное представление числа
$n$, то значением выражений "плюссимв($t_1 t_2$)", "вычитсимв($t_1
t_2$)" служит пе\-ре\-менная, номер которой получается,
соответственно, увеличением либо уменьшением на $n$ номера
переменной $x$.

Оператор "частноесимв($t_1 \: t_2 \: t_3 \: t_4$)" позволяет
находить неполное частное $t_3$ и оста\-ток $t_4$ от деления числа
$t_1$ на $t_2$ (все представления здесь - символьные). Оператор
"менее($t_1 t_2$)" истинен, если число $t_1$ в символьном
представлении меньше числа $t_2$. Для перехода от одного
представления чисел к другому служат операторные вы\-ра\-жения
"симвномер($t$)" (логический символ с десятичным номером,
определяемым выражением $t$) и "номерсимв($t$)" (десятичный номер
логического символа, опре\-де\-ля\-емого выражением $t$).

Для работы с десятичным представлением служат операторные
выражения "ми\-нус($t$)",\ "плюс($t_1 t_2$)",\ "вычитание($t_1
t_2$)",\ "умножение($t_1 t_2$)",\ и оператор "мень\-ше ($t_1 \\
t_2$)". Для реализации деления десятичных чисел применяются
программы, напи\-сан\-ные на ЛОСе; в этих программах можно
использовать вспомогательные операторы "блокделения($t_1 t_2 t_3
t_4$)" \ ($t_1,t_2$ - делимое и делитель; выходным переменным
$t_3,t_4$ при\-сваиваются неполное частное и остаток, причем
оператор рассчитан только на слу\-чай, когда $t_1$ и $t_2$ не
превосходят 65535) и "шагделения($t_1 t_2 t_3$)" \ ($t_1,t_2$ -
целые неотри\-ца\-тельные; $t_1 \le 1000$; $1 < t_2 \le 100$;
выходной переменной $t_3$ присваивается целая часть от деления
$t_1$ на $t_2 + 1$). Здесь приведены лишь базисные операторы ЛОСа,
непосредственно реализуемые его интерпретатором; для вычислений в
десятичных числах на ЛОСе запрограммирована целая серия
дополнительных операторов, ко\-то\-рые будут указаны в последующих
разделах. Отметим, что вычисления в десятичных представлениях на
ЛОСе выполняются с "плавающим" числом разрядов; это чис\-ло
ограничено сверху лишь общими требованиями интерпрератора к длине
форми\-ру\-е\-мых наборов и может достигать даже тысячи знаков.
Приведенные выше базисные операторы сложения, вычитания,умножения
и изменения знака выполняются без округления; программно
реализованные на ЛОСе вычислительные операторы вы\-пол\-няют
округление с сохранением заданного числа знаков после запятой,
причем таким образом, что гарантируется получение нижней либо
верхней (по выбору) оцен\-ки для точного значения.

Для вычислений в машинных форматах "с плавающей запятой" и "целое
со зна\-ком" используются группа операторных выражений
"выч($\ldots$)" и операторов "Выч(\\ $\ldots$)". Заметим, что
кроме непосредственного представления чисел в этих форматах, можно
создавать массивы таких чисел. Манипулирование с массивом
осуществляется при помощи ссылки на него, которая формально
представляет собой некоторый набор длины 2 (как и представление
числа в машинном формате, такой набор нес\-колько отличается от
обычного набора ЛОСа, и для работы с ним следует применять только
указанные выше операторные выражения и операторы "выч","Выч").

Операторное выражение "выч(число $a$)" позволяет перейти от
обычного деся\-тич\-ного числа $a$ (цифры либо набора цифр и
знаков "минус","запятая") к формату "с плавающей запятой";
операторное выражение "выч(целое $a$)" - к формату "целое со
знаком". Обратное преобразование осуществляется операторным
выражением "выч(\\ выход $a$)". Здесь $a$ - число в формате "с
плавающей запятой" либо "целое со знаком". В первом случае
значением выражения служит пара десятичных чисел ($A_1 A_2$),
такая, что рассматриваемое число равно произведению $A_1$ на 10 в
степени $A_2$ (по мере возможности, $A_2$ выбирается равным 0). Во
втором случае значением выражения является целое десятичное число.

Чтобы извлекать элементы массива, используется выражение
"выч(значение $M$ $i$)". Здесь $M$ - ссылка на массив одного из
двух машинных форматов; $i$ - номер элемента массива,
представленный в формате "целое со знаком".  Значением
вы\-ра\-жения является представление в машинном формате $i$-го
элемента массива.

Операции над числами в одинаковых машинных форматах реализуются
выра\-же\-ниями "выч(плюс $a$ $b$)", "выч(минус $a$)" (изменение
знака), "выч(вычитание $a$ $b$)", "выч(умножение $a$ $b$)",
"выч(дробь $a$ $b$)" (в случае целых чисел берется неполное
частное), "выч(степень $a$ $b$)" (в случае целых чисел $b$ должно
быть неотрицательным), "выч(модуль $a$)". Для вычислений в формате
"с плавающей запятой" используются также выражения "выч(логарифм
$a$ $b$)" \ ($a$ - основание логарифма), "выч(натурлог $a$)"
(натуральный логарифм), "выч(синус $a$)", "выч(косинус $a$)",
"выч(тангенс $a$)", "выч(котангенс $a$)", "выч(арксинус $a$)",
"выч(арккосинус $a$)", "выч(арктангенс $a$)",\ "выч(арккотангенс
$a$)", "выч(квадркорень $a$)"\ (квадратный корень), "выч(эксп
$a$)"\ (экспонента), "выч(гипсинус $a$)" \ (гиперболический
синус), "выч(гипкосинус $a$)", \\ "выч(гиптангенс $a$)",
"выч(гипкотангенс $a$)".

Для получения псевдоконстант при построении графиков используются
выраже\-ния "выч(плюсбеск)"\ ($2e99$ - плюс-бесконечность),
"выч(минусбеск)"\ ($-2e99$), "выч(\\ нет)"\ ($1e99$) - указатель
на пропуск точки при построении графика).

Копирование представления числа в машинном формате выполняется при
помощи выражения "выч(копия $a$)".

Чтобы создать (неинициализированный) массив из $n$ чисел в
машинном формате, используется оператор "Выч(набор $a$ $n$ $x$)".
Здесь $a$ - указатель на тип чисел (ло\-ги\-чес\-кий символ
"число" - с плавающей запятой; "целое" - целое со знаком).
Переменной $x$ присваивается ссылка на созданный массив. Для
регистрации в массиве $m$ в качестве элемента с номером $n$
(нумерация начинается с 0) числа $a$ в соответствующем
ма\-шин\-ном формате применяется оператор "Выч(запись $m$ $n$
$a$)".

Для деления с остатком чисел типа "целое со знаком" служит
оператор "Выч(де\-ле\-ние $m$ $n$ $p$ $q$)". Здесь $m,n$ - делимое
и делитель; переменной $p$ присваивается неполное частное, $q$ -
остаток.

Сравнение чисел осуществляется операторами "Выч(меньше $a$ $b$)" и
"Выч(мень\-ше\-или\-равно $a$ $b$)", "Выч(равно $a$ $b$)". Чтобы
проверять отличие числа от 0 , служит оператор "Выч(0 $a$)"
(истинен, если $a$ не равно 0).

Оператор "Выч(изменение $a$ $b$)" изменяет старое представление
числа $a$, перенося в него значение числа $b$.

Чтобы ускорить вычисления по цепочке действий, не требующих
условных пе\-ре\-ходов, предусмотрено создание микропрограммы -
набора $P$ (как структуры данных ЛОСа) псевдокоманд; такая
микропрограмма выполняется за одно обращение к опе\-ра\-тору
"Выч(программа $P$ $A$ $B$)". Здесь $A$ - набор вход-выходных
данных типа "с плавающей запятой"; $B$ - набор вход-выходных
данных типа "целое со знаком". Если вычисления выходят за рамки
о.д.з., то оператор ложен. Каждая псевдокоманда предствляет собой
набор $(N n_1 \ldots n_k)$, где $N$ - номер операции, $n_1, \ldots
, n_k$ - номера операндов (входных и выходных). $N,n_1, \ldots,
n_k$ имеют символьный формат. Номера операндов берутся из набора
$A$ либо $B$, соответствующего типу операнда (такой тип однозначно
определяется по номеру операции). Можно выходить за рамки наборов
$A,B$, используя номера, большие их длины (но не большие 200).
Такие номера рас\-смат\-риваются как вспомогательные переменные,
которым присваиваются значения, используемые в дальнейших
вычислениях по микропрограмме. Нумерация элементов наборов $A,B$
начинается с 1.

Рассматриваются следующие типы псевдокоманд (номер операции
совпадает с номером в приводимом списке):

1. Сложение в формате "с плавающей запятой". Первые два операнда -
слагаемые, третий - сумма (аналогичное размещение операндов
используется и для других опе\-раций).

2. Сложение в формате "целое со знаком".

3. Изменение знака числа в формате "с плавающей запятой".

4. Изменение знака числа в формате "целое со знаком".

5. Умножение в формате "с плавающей запятой".

6. Умножение в формате "целое со знаком".

7. Деление в формате "с плавающей запятой".

8. Деление с остатком для формата "целое со знаком".

9. Возведение в степень в формате "с плавающей запятой".

10. Экспонента.

11. Возведение в натуральную степень числа типа "целое со знаком".

12. Модуль в формате "с плавающей запятой".

13. Модуль в формате "целое со знаком".

14. Натуральный логарифм.

15. Логарифм - общий случай.

16. Квадратный корень.

17. Синус.

18. Косинус.

19. Тангенс.

20. Котангенс.

21. Секанс.

22. Косеканс.

23. Арксинус.

24. Арккосинус.

25. Арктангенс.

26. Арккотангенс.

27. Гиперболический синус.

28. Гиперболический косинус.

29. Гиперболический тангенс.

30. Гиперболический котангенс.

31. Сигнум.

32. Тождественная операция (присвоение значения выходной
переменной).


\subsection{Операторы интерфейса}

\subsubsection{Клавиатура, мышь и меню}

Для ввода символов с клавиатуры используется оператор
"клавиатура($t$)". Здесь $t$ - выходная переменная, которой
присваивается логический символ, кодирующий нажатую клавишу. Для
того, чтобы определить в процессе написания программы на ЛОСе
логический символ, соответствующий той или иной клавише,
достаточно, находясь в текстовом редакторе решателя, нажать
сначала клавишу F8, а затем - ту клавишу, код которой
определяется; при этом с позиции курсора будет прорисовано
название соответствующего логического символа. Драйвер клавиатуры,
связанный с оператором "клавиатура", имеет следующие регистры:

а) Регистры больших и малых латинских букв;

б) Регистры больших и малых русских букв;

в) Регистры "левый Ctr"  и "правый Ctr".

\noindent Переключение между латинскими и русскими буквами в этом
драйвере выполняется при помощи клавиш F11,F12. Нажатие клавиши
F11 переводит драйвер в режим русских букв; F12  - в режим
латинских букв. Кроме того, имеется оператор
"рус\-шри\-фт($t_1$)", позволяющий переключать драйвер клавиатуры:
при $t_1$ = "1" \ - на русский шрифт; при $t_1$ = "0" \ - на
латинский.

При нажатии левой либо правой клавиши мыши оператор
"клавиатура($t$)" полу\-ча\-ет логический символ "мышь". Для
уточнения данных, введенных при помощи мыши, после получения
указанным образом логического символа "мышь", исполь\-зу\-ется
оператор "мышь($t_1 t_2 t_3$)". Его выходные переменные
$t_1,t_2,t_3$ получают в качестве значений, соответственно,
указатель нажатой клавиши (логический символ "0" \ - нажата левая
клавиша; "1" \ - нажата правая клавиша), номер столбца, на котором
при нажатии клавиши находился курсор мыши, и номер строки, где он
находился. Эти номера имеют символьное представление (т.е. суть
логические символы с но\-ме\-ра\-ми $260 + N$, где $N$ - номер
столбца либо строки).

Возможно обращение через оператор "Меню(\ldots)" к простейшим
функциям опе\-ра\-ционной системы Windows, обслуживающим работу с
меню - строкой, прорисовыва\-емой в верхней части экрана. Это меню
(далее будем называть его корневым) авто\-ма\-тически создается
при запуске решателя, однако вначале является пустым и на экран не
выводится. Для формирования новых пунктов корневого меню и его
подменю служит операция "меню(плюссимв  $t_1 \: t_2 \: t_3 \: t_4
\: t_5$)". Здесь $t_1$ - номер меню (в символьном представлении;
для корневого меню равен "0"); $t_2$ - идентификатор нового
концевого пункта (логический символ) либо номер подменю, вводимого
в качестве нового пунк\-та; $t_3,t_4$ - начало и конец в буфере
текстов для названия нового пункта меню; $t_5$ - указатель на то,
вводится ли концевой новый пункт ("0") либо новое подменю ("1").
Новые пустые подменю вводятся заблаговременно при помощи операции
"Меню(но\-вый $t_1$)". Выходной переменной $t_1$ при этом
присваивается номер введенного подменю. После того, как корневое
меню и все его подменю заполнены, для прорисовки резуль\-та\-та на
экране применяется операция "Меню(актив)". Расчистка корневого
меню и удаление всех его подменю выполняются операцией "Меню(0)".
Наконец, для по\-лу\-че\-ния входного сигнала после выбора
требуемого концевого пункта корневого меню либо некоторого его
подменю применяется операция "Меню(вход $t_1$)". Она
присва\-и\-ва\-ет выходной переменной $t_1$ идентификатор
выбранного пункта. Заметим, впро\-чем, что оператор
"клавиатура($t_1$)" тоже реагирует на выбор пункта меню
присвоением переменной $t_1$ его идентификатора, и операция
"Меню(вход \ldots)"является избыточ\-ной.

\subsubsection{Экранные операции}

Выдача изображений на экран осуществляется при помощи оператора
"видео$(M \: t_1$ $\ldots t_n)$", где $M$ - логический символ,
определяющий тип экранной операции; $t_1, \ldots ,t_n$ - входные
данные этой операции и ее выходные переменные. Параметр $n$
меняется в зависимости от $M$.

Подготовка области экрана к прорисовке изображения выполняется при
помощи операции  "видео(прямоугольник $t_1 t_2 t_3 t_4 t_5$)".
Здесь $t_1,t_2$ - номера столбца и строки для верхнего левого угла
прямоугольника; $t_3,t_4$ - номера столбца и строки для правого
нижнего угла (все номера здесь и в рассматриваемых ниже экранных
операциях - в символьном представлении). $t_5$ - логический
символ, определяющий цвет пря\-мо\-у\-голь\-ни\-ка. Для указания
цвета используются логические символы начиная с "1" до
"шестнадцать" : 1 - черный; 2 - синий; 3 - зеленый; 4 -
зеленовато-голубой; 5 - красный; 6 - пурпурный; 7 - коричневый; 8
- светло-серый; 9 - темно-серый; 10 - светло-синий; 11 -
светло-зеленый; 12 - светло-голубой; 13 - светло-красный; 14 -
светло-пурпурный; 15 - желтый; 16 - белый. Если $t_5$ равно "0",
то изображение на экране внутри указанного прямоугольника не
изменяется. В любом случае после применения операции
"видео(прямоугольник \ldots )" границы прямоугольника становятся
грани\-ца\-ми той области, внутри которой перечисляемыми ниже
текстовыми операциями выполняется выдача текста (в частности,
автоматически осуществляется переход к новой строке по достижении
правой границы).

Для прорисовки группы отрезков применяется операция "видео(отрезок
$t_1 t_2$)". Здесь $t_1$ - набор $a = (a_1 \ldots a_s); a_i =
(a_{i1} a_{i2} a_{i3} a_{i4})$, где $a_{i1},a_{i2}$ - позиция
(номера столбца и строки) начала $i$ - го отрезка; $a_{i3},a_{i4}$
- позиция конца этого отрезка. $t_2$ - цвет всех выдаваемых на
экран отрезков.

Дуга окружности изображается при помощи операции "видео(окружность
$t_1 \ldots \\ t_9$)". Здесь $t_1,t_2$ - координаты центра
окружности (номера столбца и строки); $t_3$ - радиус окружности (в
символьном представлении); $t_4,t_5$ - координаты точки, через
которую проходит исходный радиус дуги; $t_6,t_7$ - координаты
точки, через которую проходит заключительный радиус дуги; $t_8$ -
направление прорисовки (логический символ "0" - против часовой
стрелки; "1" - по часовой стрелке); $t_9$ - цвет окружности.

Текстовые фрагменты выдаются на экран решателя при помощи его
собственного шрифта, в котором каждый символ представляется
матрицей размера $8 \times 19$. Интер\-пре\-татор ЛОСа нетрудно
было бы расширить таким образом, чтобы стало доступным
использование стандартных шрифтов, однако при этом потребуется
существенная коррекция программ формульного редактора,
планирующего компоновку формул с учетом геометрических параметров
символьных элементов. В интерфейсе решателя предусмотрена
возможность изменения шрифта; кроме того, операторы ЛОСа
по\-зво\-ляют вводить и использовать различные наборы шрифтов
указанного выше размера. При работе решателя в оперативной памяти
создается специальная область (далее называем ее видеокассой),
хранящая двоичные матрицы символьных элементов. Из\-ме\-нение
содержимого видеокассы выполняется при помощи операции
"видео(бланк $t_1 t_2$)", где $t_1$ - логический символ,
определяющий прорисовываемую букву (со\-от\-вет\-ствие - то же,
что для драйвера клавиатуры); $t_2$ - набор $(a_1 \ldots a_{19})$;
$a_i = (a_{i1} \ldots a_{i8})$ - набор из логических символов "0"
и "1". Этот оператор заносит двоичную матрицу, определяемую
набором $t_2$, на позицию видеокассы, соответствующую логическому
символу $t_1$. Чтобы прочитать матрицу изображения буквы,
хранящейся в видеокассе, применяется операция "видео(развертка
$t_1 \: t_2$)". Здесь $t_1$ - логический символ, опре\-де\-ляющий
букву; выходной переменной $t_2$ присваивается набор длины 19,
состоящий из восьмиэлементных наборов логических символов "0" и
"1" \ - требуемая матрица изображения. При запуске решателя
видеокасса загружается из вспомогательного файла; для сохранения
ее измененной версии в этом файле служит специальный оператор (см.
ниже операторы работы с файлами решателя).

При выдаче на экран фрагмента текста начальная позиция либо
задается в опе\-ра\-циях явным образом, либо используются
координаты из указателя текущей позиции, который хранит некоторые
значения номеров текущих столбца и строки. Для за\-не\-сения в
указатель текущей позиции новых значений $t_1$ и $t_2$ номеров
столбца и строки используется операция "видео(позиция $t_1 \:
t_2$)". Для получения хранящихся в указателе номеров используется
операция "видео(точка $t_1 t_2$)". По окончании выдачи текстовой
операцией фрагмента текста указатель текущей позиции автоматически
устанавливается на первую свободную после фрагмента позицию. Как
уже отмеча\-лось выше, при достижении правой границы текущего
прямоугольника (т.е. того, который был указан при последнем
обращении к операции "видео(прямоугольник \ldots)") происходит
автоматическая смена строки. Каких-либо автоматических вставок
знаков переноса (по крайней мере на уровне базисных операторов)
при этом не предусмотрено.

Выдача буквы с заданной позиции выполняется операцией "видео(буква
\linebreak $t_1 \: t_2 \: t_3 \: t_4 \: t_5$)". Здесь $t_1,t_2$ -
номера столбца и строки позиции, с которой выдается буква; $t_3$ -
логический символ, кодирующий выводимую на экран букву; $t_4$ -
цвет фона; $t_5$ - цвет символа. Если буква выдается с текущей
позиции, то можно положить в качестве $t_1$ логический символ
"продолжение"; в качестве $t_2$ - логический символ "0".

Для работы с фрагментами текстов введен специальный накопитель,
называемый далее буфером текстов. Он представляет собой массив из
2000 ячеек, каждая из которых хранит некоторый экранный символ
(фактически - номер этого символа в видеокассе, т.е. число от 0 до
255), а также цвет фона и цвет символа. Буфер текстов используется
для обменов с файлами, хранящими текстовую информацию, а также для
временного хранения текстовых фрагментов (например, ранее выданных
на экран и требующих в определенных ситуациях повторной выдачи,
быть может, с изменением цветовых атрибутов). Большинство из
приводимых далее операций, выдающих на экран текстовые фрагменты,
автоматически заносят эти фрагменты в заданную область буфера
текстов. При ссылке на ячейки буфера текстов они нумеруются
числами от 0 до 1999, причем эти номера имеют символьное
представ\-ле\-ние.

Операция "видео (логсимвол $t_1 \: t_2 \: t_3 \: t_4 \: t_5 \: t_6
\: t_7$)" выводит на экран название логичес\-ко\-го символа $t_3$.
При этом $t_1,t_2$ суть номера исходных столбца и строки (при
выдаче с текущей позиции - "продолжение" и "0"); $t_4,t_5$ - цвет
фона и символов; $t_6$ - номер первой ячейки буфера, с которой в
него заносится название логического символа; $t_7$ - выходная
переменная, которой присваивается номер первой ячейки буфера
текстов, идущей после данного названия. Если на экране либо в
буфере текстов не хватило места, то оператор ложен. В этом
последнем случае прорисовка на экране начала названия логического
символа не выполняется.

Для выдачи на экран подтерма заданного терма в скобочной записи
используется операция "видео(терм $t_1 \: t_2 \: t_3 \: t_4 \: t_5
\: t_6 \: t_7 \: t_8$)". Здесь $t_1,t_2$ - номера столбца и строки
исходной позиции (либо логические символы "продолжение", "0");
$t_3$ - вхождение первого символа выдаваемого на экран подтерма;
$t_4$ - указатель раскраски. Этот указатель представляет собой
набор $(a_0, \ldots ,a_s)$, где $a_0 = (a_{01},a_{02})$ - цвет
фона и символов, используемые при прорисовке подтерма; $a_i =
(a_{i1},a_{i2}, a_{i3}), i=1, \ldots ,s$ - указывает, что подтерм
рассматриваемого подтерма, вхождение первого символа которого есть
$a_{i1}$, следует раскрасить цветом фона $a_{i2}$ и цветом
символов $a_{i3}$. Вхож\-де\-ния $a_{11}, \ldots ,a_{s1}$
упорядочены слева направо, причем соответствующие подтермы могут
пересекаться (т.е. быть вложенными друг в друга). Возможность
раскраски подтермов существенным образом используется в редакторе
программ ЛОСа, так как позволяет создавать многоцветную "указку",
выделяющую при просмотре сложных логических конструкций цепочку
вложенных термов и облегчающую концентрацию внимания и
декомпозицию этих конструкций при чтении программ. Значение $t_5$
используется в тех случаях, когда весь терм не поместился на
выделенную область экрана. Тогда для продолжения выдачи оставшейся
части терма (например, после нажатия соответствующей клавиши)
входной параметр $t_5$ полагается равным тому вхождению символа, с
которого следует продолжать выдачу подтерма. В исходной ситуации,
с начала выдачи подтерма, значение $t_5$ должно быть равно $t_3$.
$t_6$ - номер исходной ячейки в буфере текстов, начиная с которой
в буфер заносятся выводимые на экран символы. $t_7,t_8$ - выходные
переменные: $t_7$ - индикатор переноса: если выдача всего подтерма
успешно завершена, то он получает значение "0"; иначе - его
значени\-ем становится вхождение того символа, с которого следует
продолжать выдачу на экран. $t_8$ становится равно номеру первой
ячейки в буфере текстов, следующей после заключительного символа
подтерма. Если прорисовка терма на экране нежелательна, а
требуется лишь зарегистрировать последовательность выводимых на
экран сим\-во\-лов в буфере текстов и при этом получить некоторую
дополнительную информацию о соответствии вхождений в терм позициям
буфера текстов, то в указателе раскраски полагается $a_{01} =
a_{02}$. В этом случае, если $t_1$ положить равным номеру
некоторой позиции в буфере текстов, то $t_7$ становится равно
вхождению в подтерм логического символа либо переменной, к
прорисовке которого относится указанная позиция. Зна\-че\-ние
$t_2$ в указанной ситуации игнорируется. Если в буфере текстов не
хватило места, то оператор ложен.

Для выдачи набора термов можно использовать операцию "видео(серия
$t_1 \: t_2 \: t_3 \:$ $t_4 \: t_5 \: t_6$)", которая реализуется
быстрее, чем последовательное выполнение операций прорисовки
отдельных термов. Здесь $t_1,t_2$ - номера столбца и строки
исходной по\-зи\-ции (либо "продолжение", "0");$t_3,t_4$ - цвет
фона и символов; $t_5$ - набор термов. Термы этого набора
последовательно прорисовываются на экране начиная с исходной
позиции; буфер текстов при этом заполняется начиная с нулевой
ячейки. Выходной переменной $t_6$ присваивается набор той же
длины, что $t_5$. На позиции этого набора, соответствующей позиции
некоторого терма в наборе $t_5$, располагается пара номеров
исходной и заключительной ячеек буфера текстов, содержащих текст
данного терма.

Для выдачи на экран содержимого заданного отрезка буфера текстов
использу\-ет\-ся операция "видео(слово $t_1 \: t_2 \: t_3 \: t_4
\: t_5$)". Здесь $t_1,t_2$ - номера столбца и строки исходной
позиции на экране (либо "продолжение", "0"); $t_3$ - номер ячейки
буфера текстов, начиная с которой выдается текст; $t_4$ - номер
ячейки, до которой включительно происходит выдача (если $t_4$ -
логический символ "продолжение", то выдача про\-ис\-хо\-дит вплоть
до первой ячейки, хранящей "машинный ноль" \ либо, если такой нет,
до конца буфера текстов). Выходная переменная $t_5$ является
индикатором переноса: "0" \ - нет переноса, иначе - номер ячейки
буфера текстов, с которой следует продолжать выдачу.

Операция "видео(запись $t_1 \: t_2 \: t_3 \: t_4$)"  позволяет
занести в ячейку буфера текстов, имеющую номер $t_1$, букву $t_2$
(т.е. $t_2$- кодирующий эту букву логический символ)с цветом фона
$t_3$ и цветом символа $t_4$. В случае $t_1 = 0; t_2 = t_3 =$ "1"
в указанную ячейку заносится "машинный ноль", который
воспринимается рядом операций как указатель на конец используемой
части буфера текстов. Операция "видео(значение $t_1 \: t_2 \: t_3
\: t_4$)" присваивает выходной переменной $t_2$ логический символ,
обозначающий букву, расположенную в $t_1$-й ячейке буфера текстов;
при этом значения выходных переменных $t_3,t_4$ становятся равны,
соответственно, цвету фона и цвету символа, хранящимся в ячейке.
Операция "видео(0)" заполняет весь буфер текстов "ма\-шин\-ны\-ми
нулями". Операция "видео(пустоеслово $t_1 t_2$)" \ заполняет
"машинными нулями" \ отрезок буфера текстов начиная с $t_1$-й
ячейки и кончая $t_2$-й ячейкой. Для изменения цветовых параметров
хранящихся в буфере текстов символов (без изменения их изображения
на экране) служат операции "видео(актив $t_1 \: t_2 \: t_3 \:
t_4$)" и "видео(вхождение $t_1 \: t_2 \: t_3$)". У них $t_1,t_2$ -
номера первой и последней ячеек изменяемого отрезка буфера
текстов. В первом случае цвет фона всех букв этого отрезка
заменяется на $t_3$, а цвет символов - на $t_4$; во втором случае
изменяется на $t_3$ только цвет фона.

Для определения границ текущего прямоугольника служит операция
"видео(ли\-мит $t_1 \: t_2 \: t_3 \: t_4$)", присваивающая своим
выходным переменным $t_1,t_2,t_3,t_4$, соответ\-ствен\-но, номера
столбца и строки верхнего левого угла прямоугольника и номера
столбца и строки правого нижнего угла. Сдвиг изображения внутри
текущего прямоугольника выполняется операцией "видео(спуск $t_1 \:
t_2 \: t_3$)". Здесь логический символ $t_1$ указывает направление
сдвига: "префикс" \ - вниз; "суффикс" \ - вверх; "правсосед" \ -
вправо; "левсосед" \ - влево. $t_2$ - число (в символьном
представлении) пикселей, на которые сдвигается изображение; $t_3$
- цвет чистых полос, возникающих при сдвиге.

Для сохранения текущего экрана в буфере битмэпов используется
операция "ви\-део(минус)"; восстановление экрана по содержимому
данного буфера выполняется операцией "видео(плюс)", причем буфер
битмэпов после этого обнуливается. Для временного сохранения
содержимого буфера текстов введены два дополнительных буфера
текстов. Операция "видео(копия $t_1$)" \ при $t_1$ равном "0" \
копирует буфер текстов в первый дополнительный буфер; при "3" \ -
во второй; при "2" \ - обменивает содержимое буфера текстов и
первого дополнительного буфера; при "1" \ - копирует первый
дополнительный буфер в буфер текстов; при "4" \ - копирует второй
допол\-ни\-тельный буфер в буфер текстов.

В дополнение к буферу текстов, для сохранения текстовых заготовок
в опера\-тивной памяти с целью быстрой выдачи их на экран введен
так называемый массив текстов. Главным образом, он используется в
текст-формульном редакторе. Размеры массива текстов составляют
56000 ячеек; он позволяет сохранять извлекаемые из буфера текстов
фрагменты и возвращать сохраненные фрагменты в буфер текстов для
различных экранных операций.

Создание массива текстов осуществляется оператором
"видео(начало)"; уда\-ление его - оператором "видео(конец)". Для
пересылки в конец массива текстов фрагмента буфера текстов начиная
с позиции $m$ и кончая позицией $n$, используется оператор
"видео(образ $m$ $n$ $i$ $j$)". Его выходным переменным $i,j$
присваиваются, соответствен\-но, символьные номера первой и
последней ячейки массива текстов, отведенные для сохраненного
фрагмента. Для обратной пересылки служит оператор "видео(прообраз
$m$ $n$ $k$)". Здесь $m,n$ - символьные номера первой и последней
ячейки фрагмента массива текстов, $k$ - номер ячейки буфера
текстов, начиная с которой размещается фрагмент, извлеченный из
массива текстов.

Чтобы расчищать массив текстов, служит оператор "видео(сброс
$m$)", устанав\-ли\-вающий указатель номера первой
неиспользованной ячейки этого массива на сим\-вольный номер $m$.
Если нужно изменить ранее записанный в массив текстов фраг\-мент,
то применяется оператор "видео(заменавхождения $m$ $n$ $k$ $p$)".
Символьные номера $m,n$ здесь указывают начало и конец изменяемого
фрагмента; заменяющий фрагмент берется из буфера текстов - начиная
с ячейки $k$ и кончая ячейкой $p$. Если $p<k$, то происходит
просто исключение фрагмента массива текстов. Если длина
заменяющего фрагмента не равна длине заменяемого, то выполняется
соответ\-ству\-ющий сдвиг всех фрагментов массива текстов,
расположенных после измененного. Оператор "видео(вычеркивание $m$
$n$)" исключает фрагмент массива текстов начиная с позиции $m$ до
позиции $n$.

Оператор "видео(См $m$ $n$ $k$ $p$)" позволяет определять
находящуюся в массиве текстов на позиции $m$ букву $n$ с цветом
фона $k$ и цветом символа $p$. Оператор "видео(посылка $m$ $n$ $k$
$p$)", наоборот, заносит на позицию $m$ массива текстов букву $n$
с цветом фона $k$ и цветом символов $p$.

Для организации поиска в массиве текстов служит оператор
"видео(ключ $m$ $n$ $k$ $p$)". По заданным начальной и концевой
позициям $m,n$ и букве $k$ он перечисляет все номера позиций $p$,
на которых располагается эта буква.

Для прорисовки графиков функций одной переменной используется
оператор "видео(график $A_1$ $A_2$ $A_3$ $A_4$ $A_5$ $A_6$ $A_7$
$A_8$ $A_9$)". Здесь $A_1$ - ссылка на массив числовых данных в
формате с плавающей запятой (ординаты точек графика); $A_2$ -
длина этого массива (десятичное число); $A_3,A_4$ - нижняя и
верхняя границы отображаемого на экране диапазона значений (формат
с плавающей запятой); $A_5,A_6$ - верхняя и нижняя полосы для
графика (символьные числа); $A_7$ - столбец, начиная с которого
рисуется график (символьное число); $A_8,A_9$ - цвет фона и цвет
линии. Масштаби\-ро\-вание таково, чтобы нижняя и верхняя границы
диапазона значений соответствовали нижней и верхней полосам
графика. Прямоугольник, выделенный для графика, дол\-жен иметь
количество столбцов, не меньшее $A_2$.

Для небольших изображений можно непосредственно на ЛОСе создавать
битмэпы, прорисовывать их и сохранять в информационных блоках.
Первоначально битмэп формируется в виде набора $(A_1, \ldots,
A_m)$ наборов $A_i = (B_{i1}, \ldots , B_{in})$; каждое $B_{ij}$ -
логический символ "0" либо "1". Здесь $A_1, \ldots, A_m$ - строки,
перечисляемые сверху вниз; в каждой строке элементы перечисляются
слева направо. Далее битмэп пере\-ко\-дируется в более компактную
структуру данных - некоторый набор логических символов (двоичные
знаки выписываются последовательно и делятся на отрезки длины 15;
каждый тако отрезок образует номер очередного логического символа,
уменьшенный на 1). Такие наборы называем кодами двоичных матриц.
Перекодиров\-ка выполняется оператором "видео(матрица логсимвол
$a$ $b$)", у которого $a$ - исходное представление битмэпа, $b$ -
его код. Обратный переход от кода $b$ к явному представ\-ле\-нию
битмэпа $a$ осуществляется оператором "видео(матрица набор $b$ $m$
$n$ $a$)", у которого появляются дополнительные параметры $m$
(число строк) и $n$ (число столб\-цов). Наконец, собственно
прорисовка битмэпа по его двоичному коду $b$ осущест\-вля\-ется
оператором "видео(матрица видео $p$ $q$ $r$ $s$ $b$ $m$ $n$)".
Здесь $p,q$ - столбец и строка, определяющие верхний левый край
прямоугольника, в котором нужно прорисовать двоичную матрицу;
$r,s$ - цвет нулевых и единичных элементов; $m,n$ - число строк и
столбцов.

 Ряд редко используемых операций "видео(...)"
будет указан при описании тех процедур интерфейса, в которых они
применяются.

\subsubsection{Названия логических символов}

В структурах данных решателя логические символы представлены
своими номерами (от 1 до 65535), или, точнее, четырехбайтными
словами, содержащими эти номера. Для определения номера
логического символа по его названию либо названия символа по его
номеру используется специальная таблица, хранящаяся в файлах вида
Vi.lsi; $i=1, \ldots, 7$. Каждый такой файл рассчитан на хранение
названий 10000 символов. Для хранения названия используется
24-байтное слово, так что предельно допустимая длина названия
равна 24. В качестве названия допускаются произвольные
после\-до\-ва\-тель\-ности русских либо латинских букв, цифр и
спецзнаков. Большие и малые буквы в названии различаются. В начале
файла размещаются двухбайтные номера всех логических символов,
названия которых он хранит, причем эти номера расположены в
лексикографическом для соответствующих названий порядке (эти
номера занимают ровно 20000 байт. За ними располагаются сами
названия, строго по порядку номеров символов. Если для символа еще
не введено название, то соответствующие 24 байта заполнены нулями.

Для работы с названиями логических символов служит оператор
"словарь($M \: t_1$ $\ldots t_n$)". Здесь M - логический символ,
определяющий тип выполняемой операции; $t_1, \ldots ,t_n$ - набор
входных данных либо выходных переменных. Для ввода нового
логического символа с заданным названием (точнее, присвоения этого
названия не\-ко\-то\-ро\-му логическому символу, еще не имеющему
названия) служит операция "сло\-варь(запись $t_1$)". Перед
обращением к ней в начальном отрезке буфера текстов дол\-жно быть
сформировано требуемое название, после которого размещается
"машин\-ный ноль". Если логический символ с таким названием уже
имеется, то оператор ложен; в противном случае выбирается
некоторый логический символ, не имевший названия, ему
присваивается указанное в буфере текстов название, и выходной
пе\-ре\-мен\-ной $t_1$ присваивается номер выбранного логического
символа. Если не удалось найти символа без названия, то $t_1$
присваивается "0". Для определения названия заданного логического
символа служит операция "словарь(значение $t_1$)". Если $t_1$  -
логический символ, то в начальный отрезок буфера текстов заносится
слово, обоз\-на\-чающее этот символ. При отсутствии названия
данного символа первая ячейка буфера текстов обнуливается.
Изменение ранее введенного названия логического символа
выполняется операцией "словарь(изменение)". Перед обращением к ней
в буфер текстов заносится слово вида "А0В0 \ldots", где А -
заменяемое название; В - заменяющее название; 0 - "машинный ноль".
Если В уже использовано либо А не использовано, то оператор ложен;
в первом случае название А удаляется,но В не вводится. Проверка
существования логического символа с заданным названием
осуществляется операцией "словарь(проверка $t_1$)". Если
существует логический сим\-вол, название которого хранится в
начальном отрезке буфера текстов, то выходной переменной $t_1$
присваивается этот символ, иначе оператор ложен. Для удаления
хранящегося в начальном отрезке буфера текстов названия
логического символа служит операция "словарь(исключение)".

Наконец, упомянем оператор "кодтекста($t_1 \: t_2 \: t_3$)",
используемый для перевода текстов термов либо наборов термов в
сами термы либо наборы термов. Указанный текст размещается в
начальном отрезке буфера текстов. Если $t_1$ есть "0", то этот
текст транслируется в терм; если $t_1$ есть "1", то текст
транслируется в набор термов; если $t_1$ есть "2", то текст
транслируется в набор логических символов и термов (т.е. каждый
однобуквенный терм рассматривается как символ); если $t_1$
есть"3", то текст транслируется в единственный логический символ.
Если трансляция выполнена ус\-пеш\-но, то выходная переменная
$t_3$ получает значение "0", а выходной переменной $t_2$
присваивается результат трансляции. Если же в тексте обнаружена
ошибка, то $t_3$ указывает на ее тип:

1) $t_3$ = "2" \ - после номера переменной идет посторонний
символ. Тогда $t_2$ - ссылка на начало переменной в буфере
текстов.

2) $t_3$ = "3" \ - номер переменной больше 511. Тогда $t_2$ -
начало переменной в буфере текстов.

3) $t_3$ = "4" \ - неправильно набран логический символ; $t_2$ -
его начало в буфере текстов.

4) $t_3$ = "5" \ - нехватка места для формирования результата.

5) $t_3$ = "6" \ - избыточная правая скобка; $t_2$ - ссылка на
начало текста символа, после которого идет эта скобка.

6) $t_3$ = "8" \ - незакрытая левая скобка.

\subsubsection{Словарь текстового анализатора}

Для работы с текстами естественного языка используется словарь
текстового ана\-ли\-затора, хранящий 65535 фрагментов слов (корни,
окончания, суффиксы, приставки). Длина одного словарного фрагмента
не должна превышать 24 букв. Каждому сло\-варному фрагменту этого
словаря (далее называемого внешним сло\-ва\-рем) сопо\-став\-лен
кодирующий его логический символ. При чтении слова оно
раз\-би\-вается на фраг\-менты, и решателю передаются лишь коды
фрагментов.

Для регистрации во внешнем словаре нового словарного фрагмента
сначала про\-ис\-ходит размещение этого фрагмента в некотором
отрезке буфера текстов, и далее выполняется оператор
"внешсловарь(запись $s$ $m$ $n$)", где $m,n$ - номера начальной и
последней ячеек отрезка; $s$ - логический символ, который
становится кодом фрагмен\-та. Символ $s$ мог уже являться кодом
некоторого словарного фрагмента; в этом случае старая версия
фрагмента изменяется во внешнем словаре на новую. Чтобы получить
словарный фрагмент, закодированный некоторым логическим символом,
применяется оператор "внешсловарь(значение $s$ $m$ $p$ $q$ $n$)".
У него $s$ - логический символ, кодирующий фрагмент; $m$ - номер
ячейки буфера текстов, начиная с которой размещается словарный
фрагмент; $p$,$q$ - цвет фона и символов для размещаемого в буфере
текстов фрагмента. Выходной переменной $n$ передается номер первой
ячейки буфера текстов после фрагмента. Если символ $s$ не являлся
кодом словарного фраг\-мента, то оператор ложен.

Чтобы исключить из внешнего словаря словарный фрагмент, кодируемый
логи\-ческим символом $s$, применяется оператор
"внешсловарь(исключение $s$)".

Для чтения слова и разбиения его на словарные фрагменты
применяется оператор "поискслова($m$ $s$ $n$)". В качестве
входного данного он получает номер $m$ позиции в буфере текстов,
начиная с которого размещается еще не прочитанная часть слова.
Выходная переменная $s$ перечисляет логические символы, являющиеся
кодами сло\-вар\-ных фрагментов, расположенных в буфере текстов
начиная с позиции $m$. При этом переменная $n$ перечисляет номера
первых идущих после указанных словарных фрагментов позиций буфера
текстов. Окончательный отбор разбиения слова на сло\-варные
фрагменты выполняется уже с помощью программы, реализованной на
ЛОСе.

Имеется возможность просмотра всех словарных фрагментов внешнего
словаря, начинающихся с заданной последовательности букв. Для
этого служит оператор "текслово($m$ $n$ $s$)". Он получает в
качестве входных данных номера $m,n$ первой и последней ячеек
буфера текстов, между которыми хранится указанная
после\-до\-ва\-тельность букв. Выходная переменная $s$ перечисляет
коды словарных фрагментов, начинающихся с данной
последовательности. Перечисление происходит в
лексико\-гра\-фическом порядке.

\subsubsection{Информационные блоки}

Логическая и текстовая информация, используемая решателем, может
быть раз\-ме\-ще\-на в специальным образом организованных файлах.
Эти файлы разбиты на группы, называемые далее информационными
блоками. Информационный блок хра\-нит древовидную конструкцию,
образованную объектами следующих типов:

а) Корневой указатель - каталог. Этот объект фактически
представляет собой таблицу ссылок на другие объекты
информационного блока, длина которой равна числу логических
символов, т.е. 65535. Если на $i$ - й позиции этой таблицы
находится 0, то ссылка по логическому символу с номером $i$ из
данного указателя считается неопределенной, иначе - определен
переход из указателя по $i$-му символу к некоторо\-му объекту
информационного блока.

б) Указатель - список. Этот объект представляет собой набор
$((a_1,S_1), \ldots (a_n,S_n))$ пар, имеющих попарно различные
первые элементы $a_i$; каждый такой элемент (на\-зы\-ваемой меткой
перехода в данном указателе) представляет собой либо логический
символ, либо неоднобуквенный терм. $S_i$ есть набор ссылок на
объекты инфор\-ма\-ци\-он\-но\-го блока, к которым осуществляется
переход по метке $a_i$.

в) Логический терминал. Этот объект представляет собой набор
логических сим\-волов, переменных и неоднобуквенных термов
(однобуквенные термы при записи их в логический терминал
автоматически преобразуются в логические символы ли\-бо символы
переменных).

г) Текстовый терминал. Этот объект представляет собой просто
последова\-тель\-ность байт, кодирующих текст (в зависимости от
способа хранения текста, между байтами, кодирующими символы, могут
вставляться байты, кодирующие их цветовые атрибуты).

В действительности структура ссылок в информационном блоке "почти"
дре\-во\-вид\-ная, так как разрешаются ссылки на один и тот же
терминал из различных указателей.

Интерпретатор ЛОСа обеспечивает работу с 13 информационными
блоками, име\-ю\-щи\-ми номера от 1 до 13. За ними закреплена
определенная функциональная на\-груз\-ка, которая будет уточняться
далее по мере описания структуры и функциониро\-ва\-ния решателя.
Корневым объектом блоков с номерами 1 и 4 является указатель -
список; каждый из этих блоков представляет собой единственный
файл: для блока 1 это файл I0000.lsi; для блока 4 - файл
R0000.lsi. Остальные блоки имеют своим корневым объектом указатель
- каталог и состоят из группы файлов. Все файлы одного и того же
информационного блока имеют вид Xijkl.lsi, где X - буква,
со\-от\-вет\-ству\-ю\-щая номеру блока; ijkl - восьмеричный номер
файла в блоке. Нумерация файлов сплошная и начинается с 0000.
Указатель-каталог в информационном блоке может быть лишь корневым;
он занимает полностью файл X0000.lsi. Буквенная кодировка
инфор\-ма\-ционных блоков (кроме уже указанных 1-го и 4-го)
такова: E - 2; H - 3; Q - 5; M - 6; W - 7; P - 8; T - 9; A - 10; B
- 11; C - 12; D -13. Каждый из файлов информационного блока имеет
менее 512 Кбайт; по мере увеличения размеров этих файлов
происходит автоматическое разрезание их на две приблизительно
одинаковые по размеру части, со сдвигом нумерации последующих за
разрезаемым файлов. Все объекты, достижимые из корневого
ка\-та\-лога по заданному логическому символу (т.е. "ветвь" этого
логического символа в информационном блоке), размещаются в одном и
том же файле, так что переходы через указатель - список возможны
только в рамках одного файла.

Для работы с информационными блоками используются операторы
"файл($M \: t_1$ $\ldots t_n$)" и "указатель($M \: t_1 \ldots
t_n$)". Здесь M - логический символ, определяющий тип выполняемой
операции; $t_1, \ldots ,t_n$ - набор входных данных либо выходных
переменных. Операции применяются к заранее выделенному "активному"
информационному бло\-ку. Выделение информационного блока с номером
$t_1$ (номер - в символьном пред\-став\-лении) вместо ранее
выделенного осуществляется при помощи операции "файл(ак\-тив
$t_1$)". Если информационного блока с таким номером еще не было,
то он при этом будет введен (пока без корневого объекта). Проверка
наличия информационного блока с номером $t_1$ выполняется
оператором "файл(проверка $t_1$)". Операция "файл\\ (число $t_1$)"
\ присваивает выходной переменной $t_1$ номер активного
информационного блока.

Для ссылок на объекты активного информационного блока в ЛОСе
служат набо\-ры $(a_1,a_2)$, образованные двумя логическими
символами $a_1,a_2$. Эти символы коди\-ру\-ют некоторым образом
(подробнее см. в описании интерпретатора ЛОСа) но\-мер файла
информационного блока и смещение в данном файле начала
рассматриваемого объекта. Ссылкой на корневой объект произвольного
информационного блока слу\-жит пара ("0","3").

Для перехода по заданной метке в корневом указателе - каталоге
служит операция "указа\-тель(логсимвол $t_1 \: t_2 \: t_3$)", где
$t_1$ - ссылка на каталог (т.е. набор ("0","3")); $t_2$ -
логический символ, представляющий собой метку перехода. Если
переход по данной метке в каталоге не определен, то оператор
ложен. Иначе - выходной переменной $t_3$ присваивается ссылка на
объект, к которому имеет место переход по метке $t_2$.

Для перехода по заданной метке в указателе - списке служит
операция "указа\-тель(список $t_1 \: t_2 \: t_3$)". Здесь $t_1$ -
ссылка на рассматриваемый указатель-список; $t_2$ - метка перехода
(логический символ либо неоднобуквенный терм). Если в данном
указателе-списке не предусмотрен переход по метке $t_2$, то
оператор ложен. Иначе выходной переменной $t_3$ присваивается
набор ссылок на объекты, переход к которым осуществляется по
данной метке. Заметим, что порядок ссылок в наборе - обратный,
т.е. первой идет ссылка, которая была зарегистрирована (с помощью
указываемых далее операций) последней.

Чтобы определить множество всех меток перехода, используемых в
указателе- списке, применяется операция "указатель(область $t_1 \:
t_2$)". У нее $t_1$ - ссылка на ука\-за\-тель; выходной переменной
$t_2$ присваивается набор всех меток перехода в данном указателе.
Ввод нового указателя (каталога либо списка) осуществляется
операцией "указатель(новый $t_1 \: t_2 \: t_3 \: t_4 \: t_5$)".
Здесь $t_1$ - логический символ "логсимвол" \ (если вводит\-ся
корневой каталог - в случае пустого информационного блока) либо
"спи\-сок" (если вводится указатель - список). Если вводится
корневой указатель, то $t_2 = t_3 =$ "0"; иначе $t_2$ - ссылка на
внешний указатель, а $t_3$ - метка перехода, по которой в нем
регистрируется новый указатель. В случае ввода каталога $t_4$
игнорируется, а в случае указателя - списка $t_4$ есть длина в
байтах поля, зарезервированного для нового пустого указателя. При
превышении данной длины регистрация в указателе новых ссылок
связана с переписыванием в файле всего указателя на новой позиции,
а до этого регистрация выполняется без переписывания указателя.
Для оценки величины $t_4$ уточним, что хранение $n$ ссылок по
одной метке $M$ требует $3n + 3m + 2$ байт, где $m$ - число
логических символов и "самостоятельных" (не идущих непосредственно
за логическим символом либо символом переменной) закрывающих
скобок в $M$. Выходной переменной $t_5$ присваивается ссылка на
новый указатель.

Исключение объекта, на который имеется ссылка из некоторого
указателя (ка\-та\-лога либо списка), осуществляется операцией
"указатель(исключение $t_1 \: t_2 \: t_3$)". Здесь $t_1$ - ссылка
на данный указатель; $t_2$ - метка, по которой из него достижим
исключаемый объект. Если указатель является каталогом, то $t_3$
несущественно, иначе $t_3$ - ссылка на исключаемый объект.
Происходит удаление ссылки из указателя по метке $t_2$ на
исключаемый объект. Если этот объект предствлял собой
указатель-список, то вся его ветвь автоматически удаляется из
информационного блока. Со\-хра\-няются лишь те ее терминалы, на
которые имеются ссылки из указателей, не относящихся к данной
ветви. Если исключаемый объект - терминал, то он удаляется из
информационного блока лишь при условии, что на него не было других
ссылок.

Ссылка на объект может быть извлечена из одного указателя и
перенесена в другой указатель. Это выполняется операцией
"указатель(перестановка $t_1 \: t_2 \: t_3 \: t_4 \: t_5$)". Здесь
$t_1$ - ссылка на первый указатель (каталог либо список); $t_2$ -
метка, по которой из него имеется ссылка на переносимый объект.
Если первый указатель является каталогом, то $t_3$ несущественно,
иначе $t_3$ - ссылка на переносимый объект. $t_4$ есть ссылка на
второй указатель (заметим, что он может совпадать с первым); $t_5$
- метка, по которой переносимый объект требуется зарегистрировать
во втором указателе. Если указатели и метки совпадают, то просто
происходит изменение порядка ссылок по рассматриваемой метке
(новая ссылка заносится в начало списка ссылок). Важно заметить,
что оператор применим лишь тогда, когда оба указателя относятся к
одному и тому же файлу информационного блока (это гарантируется
для блоков с номерами, отличными от 1 и 4, лишь при условии, что
оба они относятся к ветви одного и того же логического символа в
корневом каталоге). Если это не так, то для перенесения объекта
(фактически - ветви информационного блока) требуется создать его
копию и удалить оригинал.

Если некоторый терминал информационного блока уже создан и
необходимо соз\-дать дополнительную ссылку на него, то применяется
операция "указатель(терминал $t_1 \: t_2 \: t_3$)". Здесь $t_1$ -
ссылка на указатель, из которого создается дополнительная ссылка;
$t_2$ - метка этой ссылки; $t_3$ - ссылка на терминал. Как и в
предыдущем случае, новый указатель должен быть расположен в том же
файле информационного блока, что и терминал.

Для определения типа объекта информационного блока служит операция
"ука\-за\-тель(тип $t_1 \: t_2$)". Здесь $t_1$ - ссылка на объект.
Выходной переменной $t_2$ присваивается логический символ,
указывающий тип объекта: "логсимвол" \ - каталог; "список" \ -
указатель-список; "терминал" \ - текстовый терминал; "терм" \ -
логический терминал.

Если все метки некоторого указателя - списка суть логические
символы (как правило, номера в символьном представлении), то для
одновременного увеличения либо уменьшения на заданную величину
всех его меток, больших или равных за\-дан\-ной, служит операция
"указатель(плюссимв $t_1 \: t_2 \: t_3$)".  Здесь $t_1$ - ссылка
на указатель; $t_2$ - метка, начиная с которой происходит смещение
номеров; $t_3$ - логический символ, определяющий константу сдвига.
Если он больше "0" (т.е. его номер больше 260), то номера
увеличиваются, иначе - уменьшаются. Эта операция позволяет
моди\-фи\-ци\-ро\-вать указатель без переписывания его в файле.

Перечислим операции, используемые для чтения хранящихся в файле
терминалов. Операция "файл(терм $t_1 \: t_2$)" \ по ссылке $t_1$
на логический терминал присваивает вы\-ход\-ной переменной $t_2$
набор записанных в этом терминале логических символов, символов
переменных и неоднобуквенных термов. Если $t_1$ - ссылка на
текстовый терминал, в котором хранится текст с пропущенными
цветовыми атрибутами, то операция "файл(набор $t_1 \: t_2 \: t_3
\: t_4 \: t_5$)" \ переносит этот текст в буфер текстов начиная с
ячейки данного буфера, имеющей номер (в символьном представлении)
$t_4$. При этом все символы получают одинаковые цвет фона $t_2$ и
цвет символов $t_3$. Выходной переменной $t_5$ присваивается номер
последней использованной при чтении ячейки буфера текстов. Если же
текстовый терминал хранит текст с явно указанными цве\-то\-выми
атрибутами, то для его чтения используется операция "файл(слово
$t_1 \: t_2 \: t_3$)", где $t_2$ - номер начальной ячейки буфера
текстов; $t_3$ - выходная переменная, которой присваивается номер
последней использованной ячейки. Если текстовый терминал по ссылке
$t_1$ хранит таблицу видеокассы, то для загрузки ее в видеокассу
используется операция "файл(видео $t_1$)".

Ввод нового терминала осуществляется операцией "файл(запись $t_1
\: t_2 \: t_3 \: t_4 \: t_5$)". Здесь $t_1$ - логический символ,
определяющий тип вводимого объекта: "терм" \ - логи\-чес\-кий
терминал; "слово" \ - текстовый терминал с явно указанными
цветовыми атри\-бутами; "набор" \ - текстовый терминал с
пропущенными цветовыми атрибутами; "видео" \ - текстовый терминал,
хранящий таблицу видеокассы. Если создается логи\-ческий терминал,
то $t_2$ - набор логических символов, символов переменных и термов
(допускаются и однобуквенные термы, однако в терминал они
записываются как символы, и при чтении из терминала
восстанавливаются как символы). В остальных случаях значение $t_2$
несущественно. Содержимое нового текстового терминала
из\-вле\-кается из буфера текстов начиная с нулевой ячейки и
кончая указателем кон\-ца текста ("машинный нуль") либо концом
буфера. $t_3$ - ссылка на указатель (каталог либо список), в
котором регистрируется новый терминал; $t_4$ - метка, по которой
он регистрируется. Выходной переменной $t_5$ присваивается ссылка
на новый терминал.

Изменение содержимого терминала выполняется при помощи операции
"файл (изменение $t_1 \: t_2 \: t_3 \: t_4$)". Здесь $t_1$ -
логический символ, определяющий тип терминала таким же образом,
как в операции "файл(запись \ldots)"; если изменяется логический
терминал, то $t_2$ задает новый набор символов и термов, иначе
$t_2$ несущественно. Как и при вводе терминала, информация для
изменения текстовых терминалов берется из начального отрезка
буфера текстов. $t_3$ - ссылка на изменяемый терминал. Выходной
переменной $t_4$ присваивается ссылка на измененный терминал. Так
как изменение терминала связано с переписыванием его новой версии
в конце файла (старая версия снабжается специальной пометкой,
причем ее поле "портится" \ - используется для хранения ссылки на
новую версию), то при последующей работе с терминалом следу\-ет
использовать только ссылку $t_4$.

При изменении указателей и терминалов, хранящихся в информационном
блоке, старые их версии (снабженные специальными пометками)
накапливаются и приводят к дополнительному увеличению размеров
файла. Кроме того, так как переход к новой версии объекта
осуществляется по цепочке ссылок, хранящихся в старых его версиях,
может несколько замедляться работа программ. Поэтому предусмотрена
процедура "уплотнения" информационного блока, переписывающая
измененные его файлы без старых версий объектов и выполняюшая
необходимую коррекцию всех ссылок (смещений в фале) из указателей.
Эта же процедура, при усмотрении пре\-вы\-шающего 450 Кбайт файла
информационного блока (кроме блоков 1 и 4), осущест\-вля\-ет
разрезание его на две примерно равные части, с увеличением на 1
номеров последующих файлов данного блока. Обращение к указанной
процедуре выполняется операцией "файл(уплотнение)". После
выполнения ее информационный блок пере\-ста\-ет быть активным.
Если $t_1$ - ссылка на некоторый объект информационного блока
(кроме корневого каталога), который был изменен, и таким образом
содержит ссылку на новую его версию, та - ссылку на ее новую
версию, и т.д., то ссылка на концевой объект данной цепочки (т.е.
на "реальную" текущую версию объекта) присваивается операцией
"файл(ссылка $t_1 \: t_2$)" выходной переменной $t_2$. Операция
"файл(выписка $t_1$)" присваивает выходной переменной $t_1$ набор
номеров всех информационных блоков, для которых, возможно,
требуется уплотнение (т.е. в некотором файле блока имеется хотя бы
одна "отключенная" версия объекта).

\subsubsection{Блок программ ЛОСа}

Программа решателя, записанная на ЛОСе, хранится в группе файлов,
называемой далее блоком программ. Эти файлы имеют вид Lijkm, где
i,j,k,m - восьмеричные цифры. Файл L0000 хранит каталог программ -
в нем для каждого логического символа, имеющего свою программу,
указана ссылка на корневой фрагмент данной программы. Такая ссылка
состоит из номера файла Lijkm (отличного от L0000) и смещения в
этом файле начала фрагмента (более подробно формат данных в файлах
блока программ приведен в описании интерпретатора ЛОСа). Все
фрагменты программы одного и того же логического символа хранятся
в одном файле блока программ. Так как программы языка ЛОС
реализуются интерпретатором, то су\-щест\-венно облегчено
изменение программой своих собственных фрагментов
непосред\-ствен\-но в процессе работы решателя. Разумеется, здесь
должны соблюдаться опре\-де\-ленные ограничения на изменение тех
фрагментов программ, которые на текущий момент "активизированы",
т.е. начато их выполнение и в стэках интерпретатора хранятся
значения программных переменных, связанных с этими фрагментами.
Од\-нако, эти фрагменты продублированы в оперативной памяти, так
что даже их при определенных условиях можно изменить. Например,
реализованный на ЛОСе прог\-рам\-мный редактор позволяет изменять
все без исключения фрагменты программ, в том числе свои
собственные (последние изменения требуют особой аккуратности, во
избежание необратимой порчи блока программ). Для обеспечения
возможности восстановления файлов решателя при аварийных ситуациях
в его интерфейсе пре\-ду\-смот\-рена возможность копирования
полного комплекта его файлов в резервную директорию. Перед
копированием выполняется проверка корректности структур дан\-ных в
этих файлах (как в блоке программ, так и в информационных блоках);
при обнаружении нарушений происходит выход в операционную систему,
а копирование не выполняется.

Для работы с фрагментами программ в ЛОСе используется оператор
"прогфайл ($M \: t_1 \ldots t_n$)". Здесь M - логический символ,
определяющий тип выполняемой опера\-ции; $t_1, \ldots ,t_n$ -
набор входных данных либо выходных переменных. Ссылка на
фраг\-мент программы в блоке программ представляет собой пару
логических символов. Более подробно структура таких ссылок будет
указана ниже, при описании интер\-пре\-татора (она несущественна
при использовании приводимых далее операций). Опера\-ция
"прогфайл(логсимвол $t_1 \: t_2 \: t_3$)" позволяет по заданному
логическому символу $t_1$ находить ссылку $(t_2,t_3)$ на начало
корневого фрагмента программы символа $t_1$; если такой программы
нет, то оператор ложен. Операция "прогфайл(значение $t_1 \: t_2 \:
t_3$)" по ссылке $(t_1,t_2)$ на фрагмент в блоке программ
присваивает выходной переменной $t_3$ набор операторов этого
фрагмента (каждый оператор, в том числе односимвольный,
представляется термом). Операторы "ветвь $N$" и "иначе $N$" в
данном наборе пред\-став\-лены как "ветвь($a_1 a_2$)"; "иначе($a_1
a_2$)", где $(a_1,a_2)$ - ссылка на тот фрагмент, переход к
которому определяется оператором.

Изменение ранее введенного фрагмента программы либо ввод нового
фрагмента выполняются операцией "прогфайл(запись $t_1 \: t_2 \:
t_3 \: t_4 \: t_5 \: t_6$)". Здесь $t_4$ - набор операторов
(термов), образующих новый фрагмент. В нем могут встречаться в
указанном выше формате ссылки на другие фрагменты программы
(напомним, что повторные ссылки на один и тот же фрагмент
программы не разрешаются, так что те фрагменты, на которые имеются
ссылки из нового фрагмента, либо должны быть непосредствен\-нымии
подфрагментами заменяемого фрагмента ,либо должны быть заранее
"от\-клю\-чены" при помощи операции "прогфайл(вычеркивание
\ldots)"; см. ниже). Кроме того, допускаются термы вида
"ветвь(m)"; "иначе(m)", у которых m - логическиий символ,
представляющий собой метку недоопределенного перехода из
фрагмента. Такие недоопределенные переходы, после записи их в блок
программ, восстанав\-ли\-ва\-ются в том же виде операцией
"прогфайл(значение \ldots)". Если новый фрагмент заносится в
качестве корня программы некоторого логического символа f
(возможно, уже имевшейся до этого), то $t_1$ есть символ "0"; $t_2
= f$; значение $t_3$ несущественно. Иначе $t_1$ равно "1";
$(t_2,t_3)$ есть ссылка на вхождение оператора "ветвь" \ либо
"иначе" \ в тот внешний фрагмент, который через данный оператор
должен ссылаться на новый фрагмент. Под ссылкой на вхождение
оператора перехода "ветвь" \ либо "иначе" \ в некоторый фрагмент
здесь понимается пара $(A_1,A_2)$, у которой $A_1$ - ссылка на
фрагмент (пара логических символов); $A_2$ - номер (начиная с 1)
данного оператора перехода в фрагменте. Если новый фрагмент $F$
заносится вместо некоторого другого фрагмента $G$, то $G$ и все
ветви фрагмента $G$, не упомянутые в $F$, удаляются. По окончании
регистрации в блоке программ нового фрагмента выходным переменным
$t_5,t_6$ присваивается ссылка на этот фрагмент.

Если фрагмент $F$ и всю его ветвь требуется временно отключить для
последую\-ще\-го использования в другом месте программы, то
применяется операция "прогфайл\\ (вычеркивание $t_1 \: t_2 \: t_3
\: t_4$)". Если указанный фрагмент $F$ является корнем программы
некоторого логического символа $f$, то  $t_1$ есть "0"; $t_2 = f$;
$t_3$ - несущественно. Иначе $t_1$ равно "1"; $(t_2,t_3)$ - ссылка
на вхождение оператора "ветвь" либо "иначе" во внешний фрагмент,
по которому происходит переход к фрагменту $F$. Если $t_1$ есть
"0", то из каталога программ исключается ссылка по символу $f$;
иначе - ссылка из внешнего фрагмента на $F$ заменяется меткой
$t_4$ недоопределенного перехода (логическим сим\-волом). В обоих
случаях исключаются только ссылки на фрагмент  $F$, а сам он и вся
его ветвь сохраняются в блоке программ без изменений.

Для удаления ветви ранее отключенного фрагмента программы
используется операция "прогфайл(исключение $t_1 \: t_2$)". Здесь
$(t_1,t_2)$ - ссылка на данный фрагмент. Этот фрагмент и все
достижимые из него фрагменты снабжаются в блоке программ
специальными пометками. Аналогичным образом, операция
"прогфайл(сброс $t_1$)" \\ уничтожает всю программу логического
символа $t_1$. Операция "прогфайл(корень $t_1 \: t_2 \: t_3$)"
подключает ранее отключенную ветвь фрагмента, ссылкой на который
яв\-ля\-ется пара $(t_2,t_3)$, в качестве программы логического
символа $t_1$ (ранее имевшаяся программа этого символа удаляется).

При замене фрагмента программы на новую его версию старая версия
снабжается специальной пометкой, но сохраняется в файле блока
программ. Для того, чтобы периодически "расчищать" \ блок программ
от накапливающихся в нем неисполь\-зу\-емых отрезков, используется
операция "прогфайл(уплотнение)". Она инициирует перезапись
фрагментов программ без сохранения указанных отрезков, с
соответс\-тву\-ющей коррекцией ссылок между фрагментами. Так как
при этом полностью нарушается корректность "старых" ссылок из
регистров интерпретатора и из хра\-ня\-щихся в оперативной памяти
копий фрагментов программы на фрагменты в блоке программ, то после
указанного уплотнения блока программ происходит автома\-ти\-ческий
перезапуск решателя (это выглядит как возвращение к исходному
меню). Заметим, что процедуре уплотнения подвергаются не все файлы
блока программ, а лишь те из них, которые были изменены после
последнего уплотнения. Как и при уплотнении информационных блоков,
происходит разрезание пополам тех файлов, которые превысили 450
Кбайт. Заметим, что процедура уплотнения сначала пред\-при\-нимает
проверку корректности блока программ, и лишь после этого начинает
собственно уплотнение. При обнаружении ошибки эта процедура выдает
значение "истина" \ (в отличие от процедуры уплотнения
информационных блоков), а в случае успешного уплотнения - значение
"ложь".

Если произошло изменение программы некоторого логического символа,
причем перезапуск решателя нежелателен (например, в цикле
логического вывода и ав\-то\-ма\-тической генерации приемов), то
для устранения рассогласования между копиями фрагментов программы,
хранящимися в оперативной памяти, и измененными фраг\-ментами в
блоке программ, используется операция "прогфайл (компонента
$t_1$)". Эта операция удаляет из оперативной памяти все копии
фрагментов программы логи\-чес\-кого символа $t_1$ и
восстанавливает в копии каталога программ, хранящейся в
оперативной памяти, ссылку на корневой фрагмент этой программы по
блоку прог\-рамм. Операция "прогфайл(пересмотр)" уничтожает вообще
все хранящиеся в опе\-ра\-тивной памяти решателя копии фрагментов
программ и реализует его перезапуск.

Приведем в заключение ряд достаточно редко используемых операций
над блоком программ. Операция "прогфайл(позиция $t_1 \: t_2 \: t_3
\: t_4 \: t_5 \: t_6$)" по ссылке $(t_1,t_2)$ на фрагмент
программы; набору $t_3$ операторов этого фрагмента и вхождению
$t_4$ в этот набор оператора "ветвь" \ либо "иначе" \ присваивает
выходным переменным $t_5, t_6$ ссылку на вхождение данного
оператора в рассматриваемый фрагмент (см. выше формат таких ссылок
при описании операции "прогфайл(запись \ldots)"). Эта операция
сохранилась от старой версии интерпретатора, в которой формат
ссылок был иным; требуемую ссылку теперь легко получить простым
подсчетом количества операторов перехода, предшествующих данному.
Операция "прогфайл(продолжение $t_1 \: t_2 \: t_3$)" используется
для поиска недоопределенных переходов. У нее $t_1$ - логический
символ, в программе которого ищутся такие переходы. Находится
первый такой переход "ветвь А" \ либо "иначе А"; здесь А -
логический символ, являющийся меткой недоопределенного перехода.
Определяется путь $(F_1, \ldots ,F_s)$ от корневого фрагмента
$F_s$ программы символа $t_1$ к тому фрагменту $F_1$, в котором
найден указанный переход (т.е. каждый фрагмент $F_{i+1}$ имеет
ссылку на $F_i$; $i=s-1, \ldots , 1$). Выходной переменной $t_2$
при\-сва\-ивается метка А; переменной $t_3$ - набор $(a_1, \ldots,
a_s)$ пар логических символов - ссылок на фрагменты $F_1, \ldots
,F_s$. Операция "прогфайл(имя $t_1 \: t_2 \: t_3$)" позволяет по
заданным логическому символу $t_1$ и оператору $t_2$ (терму)
находить первый фрагмент программы символа $t_1$, содержащий
данный оператор. При этом выходной перемен\-ной $t_3$
присваивается такой же набор ссылок, определяющих путь к
найденному фрагменту, как и для предыдущей операции.

\subsubsection{Операции трассировки}

Для отладки программ языка ЛОС используется программа логического
символа "прерывание", написанная на ЛОСе. Эта программа
реализована как программа фиктивного операторного выражения
(именно, однобуквенного терма "прерыва\-ние"), причем данное
операторное выражение в явном виде в программах ЛОСа не
встре\-ча\-ется, а обращение к указанной программе выполняется
интерпретатором автома\-ти\-чески - при обнаружении тех или иных
ошибочных действий либо при выполнении условий обрыва, заданных
используемым режимом трассировки. Программа символа "прерывание" \
реализует обычные операции отладчика - позволяет устанавливать
тре\-буемый режим трассировки, просматривать программу текущего и
внешних опера\-торов, определять значения программных переменных,
и т.п. Более подробно об этой программе будет рассказано в
специальном разделе данного описания. Для использования в
отладчике был введен ряд базисных операций ЛОСа, объединенных в
операторе "трассировка($M \: t_1 \ldots t_n$)". Эти операции
существенным образом исполь\-зуют специфику применяемого
интерпретатора ЛОСа, поэтому их описание будет приведено в
разделе, посвященном программе отладчика ЛОСа.

\chapter{Библиотека вспомогательных операторов ЛОСа}

В этой главе мы приведем перечень реализованных в логической
системе вспомо\-га\-тельных операторов, применение которых
существенно упрощает программирование на ЛОСе. Эти операторы
разбиваются на группы, аналогичные тем, на которые были разбиты
базисные операторы ЛОСа: операторы для работы с наборами и
вхождени\-ями в наборы; операторы для работы с логическими
структурами данных; операторы для работы с задачами;
арифметические операторы и операторы интерфейса. Особо крупные
либо узкоспециализированные операторы вынесены в другие разделы, в
которых описывается программная реализация основных блоков
логической системы.

К числу простейших реализованных на ЛОСе операторов общего
характера отно\-сится перечисляющая версия оператора присвоения -
"Равно($x t$)". Этот опера\-тор присваивает переменной $x$
значение $t$, при этом формально является перечисляющим. Он
применяется в тех случаях, когда для подсчета количества
сбрасываемых внеш\-них перечислений нужно добиться определенности
в режиме работы некоторого сме\-шан\-ного
проверочно-перечисляющего оператора. Например, оператор
"альтернати\-ва($P$ Равно($x t$) $A$)", если $A$ реализуется в
режиме перечисления, оказывается пере\-числяющим вне зависимости
от истинности условия $P$.

\section{Операторы для работы с наборами и вхожде\-ния\-ми в на\-бо\-ры}

Чтобы получить набор, полученный из заданного набора наборов $A$
переупорядоче\-нием элементов по невозрастанию либо неубыванию их
длины (под длиной набора понимается число его разрядов),
применяются операторные выражения "убывание\-длин($A$)" и
"возрастаниедлин($A$)". Результат циклического сдвига набора $A$
на за\-дан\-ное число $n$ разрядов вправо ($n$ - в формате
символьного числа) дается операторным выражением "сдвигнабора($A$
$n$)".

При замене переменных в некотором терме часто приходится прибегать
к преобра\-зованию списка $A$ "новых" переменных к виду списка
однобуквенных слов (термов), образованных этими переменными. Такое
преобразование позволяет далее восполь\-зоваться оператором
"результподст($\ldots$)". Чтобы получить указанный список слов,
используется операторное выражение "наборслов($A$)".

При накоплении списка объектов в некотором вычислительном цикле
может ока\-заться полезным операторное выражение "Суффикс($A$
$t$)", которое присоединяет элемент $t$ к концу накопителя $A$
только в том случае, если он отсутствует в накопителе.

Если из набора $A$ нужно исключить элементы, список вхождений
которых в $A$ есть $s$, причем эти вхождения не обязательно
упорядочены слева направо, то применять базисное операторное
выражение "исключение($A$ $s$)" нельзя. В этом случае используется
выражение "Исключение($A$ $s$)".

Если нужно получить набор, возни\-ка\-ющий при замене в наборе $A$
объекта, распо\-ложенного по вхождению $v$, на объект $t$, то это
можно делать без ссылки на набор $A$ (как того требует выражение
"заменараз\-ряда($\ldots$)" - достаточно воспользоваться
вы\-ра\-жением "измпозиции($v$ $t$)".

Для получения набора объектов из набора $A$ вхождений этих
объектов применя\-ет\-ся операторное выражение
"объектывхождений($A$)".

Если $A$ - набор наборов, то выражение "Конкатенация($A$)" имеет
своим значением конкатенацию всех наборов набора $A$ (в порядке их
расположения в наборе $A$).

В тех случаях, когда нужно вставить перед заданной позицией набора
не отдель\-ный элемент, а сразу набор элементов, применяется
выражение "вставканабора($A$ $v$ $B$)". Здесь $v$ - вхождение в
набор $A$, перед которым выполняется вставка набора $B$.

Для получения номера разряда набора, для которого указано его
вхождение $a$ в набор, используется операторное выражение
"номервхождения($a$)". Его значением служит символьное число,
равное числу вхождений, предшествующих $a$ (не включая самого
$a$). Для определения номера первого вхождения элемента $b$ в
набор $a$ (ну\-ме\-ра\-ция начинается с 1) служит операторное
выражение "номерэлемента($b$ $a$)". В том случае, когда $b$ не
входит в $a$, выдается 0.

В дополнение к описанным ранее операторам перечисления элементов
набора, вводится оператор "четпозиция($a$ $b$)", перечисляющий
вхождения $a$ в набор $b$ раз\-ря\-дов с четными номерами
(нумерация начинается с 1; перечисление ведется по возрастанию
номеров).

Если нужно найти первый элемент $x$ набора $A$, имеющий своим
заголовком ло\-ги\-ческий символ $s$ либо совпадающий с $s$, не
перечисляя все такие элементы набора, то применяется оператор
"первыйключ($A$ $s$ $x$)".

Число разрядов набора $A$ определяется с помощью операторных
выражений "дли\-нанабора($A$)" и "Длинанабора($A$)". Первое из них
выражает длину набора в формате десятичного числа, второе - в виде
символьного числа.

Для проверки того, что набор $A$ имеет элемент, равный логическому
символу либо символу переменной $a$, либо начинающийся с этого
символа, используется оператор "Входит($a$ $A$)". Для проверки
того, что набор состоит из символов переменных, служит оператор
"Переменные($A$)".

Иногда бывает нужно не просто скопировать некоторый набор $A$, но
скопировать также и все наборы и термы, достижимые из него по
цепочкам ссылок. В этом случае применяется операторное выражение
"Копия($A$)". Такое копирование рекомендуется применять, например,
при создании вспомогательной задачи, чтобы изменения ее
комментариев в процессе решения не приводили к изменениям в той
задаче, из которой она возникла.


\section{Операторы для работы с логическими струк\-ту\-ра\-ми дан\-ных}

Логические символы, встречающиеся в формулировках задач,
распределены по раз\-делам, причем названия разделов тоже суть
некоторые логические символы. Спра\-вочник "содержание" позволяет
получать по названию раздела список всех относя\-щихся к нему
логических символов и названий его подразделов; справочник
"раздел" \\ позволяет получать по логическому символу название
раздела, к которому тот от\-но\-сится. Если нужно получить список
всех относящихся к разделу $a$ либо (по тран\-зи\-тивности) его
подразделам, используется операторное выражение "Содержание($a$)".

В списке символов раздела обычно принимается такое их
упорядочение, при котором более "простые" в эвристическом смысле
понятия и подразделы размещают\-ся ближе к началу списка. Это
упорядочение можно использовать при выборе того логического
символа, за которым закрепляется некоторый прием либо теорема (в
базе приемов либо теорем) - как наименее простого из встречающихся
в нем символов. Здесь полезно операторное выражение
"разделысимволов($a$)", которое по набору логических символов $a$
выбирает наименее простой (согласно упорядочению разделов и
логических символов в разделах) символ $A1$. Значением данного
выражения ста\-но\-вится набор ($A_n \ldots A_1$), где $A_{i+1}$ -
раздел, к которому относится $A_i$; $A_n$ - раздел, не имеющий
надраздела. Если ни один из символов списка $a$ не имеет
надраздела, то значение выражения равно 0.

Все рассматриваемые в задачах объекты отнесены к некоторым типам,
обо\-зна\-ченным специальными логическими символами (например,
"число", "точка", "мно\-жество", "функция", и т.п.). Объекты типа
$A$ могут разбиваться на подмножества (не обязательно
непересекающиеся) объектов типов $B_1, \ldots, B_n$, которые
считаются подтипами типа $A$. Например, для типа "число" имеются
подтипы "целое", "раци\-о\-нальное", "двоичное", и т.п. Список
типов логического символа $A$ определяется с помощью справочника
"тип" ( обращение к нему имеет вид "справка(тип $A$)"). Эти типы в
списке упорядочены по принципу расширения класса объектов при
движении слева направо. Справочник "род" позволяет получать список
всех надтипов заданного типа (при отсутствии таковых выдается 0).
Справочник "типданных" позволяет по вхождению $a$ заголовка $f$
операции $f(A_1 \ldots A_n)$ и вхождению $b$ операнда $A_i$
находить тип объектов, допустимых в качестве значения этого
операнда. Он используется при автоматической обработке
формулировки новой задачи, для пополнения ее огра\-ничениями на
область допустимых значений; обращение к нему имеет вид
"справка\\(типданных $f$ $a$ $b$)".

\subsection{Перечисляющие операторы}

С каждым вхождением в задачу некоторого терма $t$ связана область
этого вхождения - совокупность всех утверждений задачи, в
контексте истинности которых рас\-смат\-ривается данный терм. Если
терм входит в условие задачи, то к такой области относятся все
посылки задачи и все остальные ее условия; если он входит в
посылку задачи, то к ней относятся все остальные посылки задачи.
Кроме того, к области вхождения могут относиться подутверждения из
того же условия (посылки), что и рассматриваемый терм $t$. Это
бывает в следующих случаях:

а) $t$ расположено внутри утверждения $A_i$ конъюнкции "и($A_1
\ldots A_n$)". Тогда к области вхождения относятся $A_1, \ldots,
A_{i-1},A_{i+1}, \ldots, A_n$.

б) $t$ расположено внутри утверждения $A_i$ из квантора общности
"длялюбого($x_1 \\ \ldots x_m$ если $A_1 \ldots A_n$ то $A_0$)";
$i=0,\ldots,n$. Тогда к области вхождения относятся утверждения
$A_j$ при всех $j=1,\ldots,n$, отличных от $i$.

в) $t$ расположено внутри выражения вида "$F$($x_1 \ldots x_m$
и($A_1 \ldots A_n$) $T$)", где F - один из символов "отображение",
"выписка", "перечисление", "суммавсех". Тогда к области вхождения
относятся все $A_i$ при $i=1,\ldots, n$, кроме того (если такое
есть), внутри которого расположено рассматриваемое вхождение $t$.

г) $t$ расположено внутри выражения "вариант($A$ $P$ $Q$)" -
внутри $P$ либо $Q$. В первом случае к области вхождения относятся
все конъюнктивные члены утверждения $A$, во втором случае -
отрицание утверждения $A$.

Оператор "обл($t_1$ $t_2$ $t_3$ $t_4$ $t_5$)" позволяет
перечислять утверждения, относящиеся к заданной области вхождения.
У него $t_1$,$t_2$,$t_3$ - координата вхождения в задачу $t_4$
(т.е. вхождение подтерма в терм задачи, вхождение терма задачи во
внешний набор и указатель посылки (0) - условия (1)). Выходная
переменная $t_5$ перечисляет указанные утверждения. Возможны
специальные случаи обращения: если $t_4$ равно 0, то перечисляются
только относящиеся к тому же терму, что и $t_1$, вхождения первых
символов утверждений из области вхождения $t_1$. Если $t_4$ равно
1, вместо вхождений здесь перечисляются сами утверждения. В обоих
случаях при обращении полагается $t_2 = t_3 = 0$. Заметим, что
фактически оператор "обл($\ldots$)"  может включать в
перечисление, кроме указанных выше, еще ряд подутверждений
содержащего $t$ терма задачи. Эти ситуации (часть из них связана с
работой текстового анализатора) весьма редкие; информация о них
без труда извлекается из текста программы данного оператора.

Чтобы перечислять вхождения переменных из связывающей приставки
квантора либо описателя, используется оператор "связка($a$ $b$)".
У него $a$ - вхождение первого символа подтерма $f(t_1 \ldots
t_n)$, представляющего собой квантор либо описатель. Вы\-ход\-ная
переменная $b$ перечисляет слева направо вхождения операндов $t_i$
до тех пор, пока эти операнды суть символы переменных.

Для перечисления конъюнктивных членов некоторой (возможно,
вырожденной) конъюнкции используется оператор "конъюнктчлен($a$
$b$)". Здесь $a$ - вхождение пер\-вого символа утверждения $A$.
Выходная переменная $b$ перечисляет: если заголовок утверждения
$A$ отличен от символа "и", то - единственное значение, равное
$a$, иначе - вхождения первых символов операндов утверждения $A$.
Аналогичным образом, для перечисления дизъюнктивных членов
некоторой дизъюнкции служит оператор "дизъюнктчлен($a$ $b$)".
Отличием здесь является то, что формат входного данного $a$ и
значения выходной переменной $b$ - не вхождение, а терм. Выходная
переменная $b$ перечисляет: если заголовком терма $a$ служит
логический символ "или", то - все термы, являющиеся операндами
этого "или", иначе - единственное значение , равное терму $a$.

Если нужно перечислить все максимальные (имеющие вхождение, не
рас\-по\-ло\-женное внутри другого подвыражения) подвыражения
некоторого терма, то при\-ме\-ня\-ется оператор
"корневоевхождение($a$ $b$)". У него $a$ - вхождение первого
символа того подтерма, в котором расположены искомые подвыражения;
$b$ - выходная пе\-ре\-мен\-ная.

Антецеденты $A_i$ ($i=1, \ldots, n$) квантора общности
"длялюбого($x_1 \ldots x_m$ если $A_1 \\ \ldots A_n$ то $A_0$)"
можно менять местами с консеквентом $A_0$, переходя при этом к их
отрицаниям. При идентификации этого квантора может возникнуть
необходимость учитывать такие возможные перестановки, а также
возможное преобразование кван\-тора общности в отрицание квантора
существования. Для этого используется опе\-ра\-тор "импликант($a$
$b$ $c$)". У него $a$ - вхождение первого символа квантора
общности либо существования; $b$ - 0 либо 1. Выходная переменная
$c$ перечисляет вхождения первых символов $f$ утверждений $A_i$
вида "$f(\ldots)$" \ либо "не($f(\ldots)$)", которые при $b=0$
можно рассматривать (с точностью до указанных перестановок) как
антецедент, а при $b=1$ - как консеквент указанного квантора
общности (в случае квантора существования, соответственно,
рассматривать как конъюнктивный член под\-кван\-торного
утверждения либо как его отрицание).

Чтобы упростить идентификацию операндов двуместной коммутативной
опе\-ра\-ции либо отношения, используется оператор "Операнды($a$
$b$ $c$)". Здесь $a$ - вхождение указанной операции. Выходные
переменные $b$,$c$ поочередно становятся равны: сна\-ча\-ла
вхождениям первого и второго операндов $a$, затем - вхождениям
второго и первого. При идентификации операций со специальной
симметрией может понадобиться более сильная возможность
перечисления перестановок набора операндов, обеспечиваемая
оператором "сдвиг($a$ $b$ $c$ $d$)". У него $a$ - вхождение
подтерма $f(A_1 \ldots A_n$); $b$ - набор номеров операндов этого
подтерма. Выходная переменная $c$ перечисляет наборы вхождений
операндов, полученные из набора вхождений ($A_1 \ldots A_n$)
циклическими перестановками внутри подмножества операндов $b$ (на
очередном шаге первый эле\-мент подсписка операндов переносится в
конец подсписка). $d$ - величина сдвига в текущей перестановке
(символьное число).

Для перечисления вхождений надтермов заданного терма имеется
базисный опе\-ратор "подчинено($\ldots$)". Однако, он исключает из
перечисления вхождение самого терма. Если это вхождение нужно
включать в перечисление, берется оператор "Под\-чинено($a$ $b$)".
У него $a$ - вхождение терма; $b$ - выходная переменная.

Если имеется набор термов либо логических символов, то для
перечисления его элементов, преобразованных к формату терма,
используется оператор "термнабора($a$ $b$)". Здесь $a$ - заданный
набор, $b$ - выходная переменная.

В процедурах логического вывода теорем используется процедура
унификации термов. Она получает в качестве входного данного набор
пар термов ($(p_1,q_1), \ldots (p_n,\\ q_n)$) и набор переменных
($x_1, \ldots, x_m$), входящих в эти термы. Процедура пытается
найти такой набор термов ($r_1, \ldots, r_m$), что подстановка
этих термов вместо пе\-ре\-мен\-ных $x_1, \ldots, x_m$ в термы
$p_i,q_i$ ($i=1,\ldots,n$) отождествляет последние. Под
отож\-дест\-вле\-нием понимается возможность преобразовать один
терм в другой путем изменения порядка операндов коммутативных
операций, а также, быть может, некоторых других простых
тождественных (либо эквивалентных) преобразований, уточняемых при
об\-ра\-щении к процедуре унификации. Например, здесь может
использоваться ас\-со\-циа\-тивность операции либо тождество
$f(f(x))=x$. Допущение такого рода пре\-об\-ра\-зований делает
унификацию, вообще говоря, неоднозначной ( в отличие от
клас\-си\-ческого случая "без преобразований"); более того, при
унификации могут возникать дополнительные переменные. Например,
при унификации двух произведений $ab$,$cd$, где $a,b,c,d$ -
переменные, нужно рассмотреть возможность "разбиения" каждого из
множителей $c,d$ на две подгруппы множителей $c_1,c_2$ и
$d_1,d_2$, с группировкой $c_1,d_1$ в $a$, а $c_2,d_2$ - в $b$.
Здесь и возникают вспомогательные переменные $c_1,d_1,c_2,d_2$.
Более подробное описание процедуры унификации, ис\-пользуемой в
решателе, мы приведем в разделе, посвященном логическому выводу в
базе теорем. Фактически, эта процеду\-ра представляет собой
небольшую базу приемов и имеет до некоторой степени
эв\-рис\-тический характер (так как некоторые результаты
унификации могут оказаться чрезмерно громоздкими, а число их -
весьма большим, приходится вводить правила обрыва при рассмотрении
подслучаев). Реализуется она оператором "унификация($a$ $b$ $c$)".
Здесь $a$ - набор установок на унификацию; $b$ - набор переменных
$x_1, \ldots, x_m$; выходная переменная $c$ перечисляет наборы
термов $r_1, \ldots, r_m$. Мы при\-ве\-дем здесь лишь основные
типы установок на унификацию, которые могут быть заданы при
исходном обращении к процедуре (процедура имеет рекурсивный
харак\-тер, и часть установок используется при внутренних
обращениях):

а) Набор (унификация $p_i q_i K_i$) - указание пары унифицируемых
термов $p_i,q_i$, сопровождаемых набором комментариев $K_i$. При
исходном обращении к процедуре этот набор пуст и изменяется самой
процедурой;

б) Набор (переменные $X$), где $X$ - список всех переменных
термов, вовлеченных в унификацию. Эта установка обычно создается
самой процедурой и служит для того, чтобы новые параметры
вводились не из списка $X$;

в) Набор (единица $A$) - при унификации допускается подстановка
"единиц" вместо переменных списка $A$ (используется тождество для
единицы соответствующей опе\-рации, устраняющее ее из
унифицируемого терма).

г) "приведение" \ - блокировка упрощений промежуточных
унифицируемых термов, выполняемых специальной процедурой.

д) "новаяпеременная" \ - блокируется введение новых переменных.

Некоторые перечисляющие операторы связаны со специальными
предметны\-ми областями. Так, в элементарной алгебре при
формулировке решающих правил при\-емов, работающих с суммами
дробных выражений, бывает полезен оператор "внеш\-знаменатель($a$
$b$)", перечисляющий по заданному вхождению $a$ основания степени
сомножителя знаменателя некоторой дроби всевозможные вхождения $b$
знаменателей других дробей - слагаемых той же внешней суммы, что и
указанная дробь, а также вхождение числителя данной дроби. Если
при обращении в качестве $a$ взять вхож\-де\-ние основания степени
сомножителя числителя дроби, то $b$ выдает (в режиме перечисления)
вхождение знаменателя той же дроби. Другой оператор такого типа -
"Слагаемое($a$ $b$ $c$ $d$)", у которого $a$ - вхождение первого
символа алгебраического выражения. Перечисляются слагаемые этого
выражения, каждое из которых пред\-став\-ляется в виде
произведения коэффициента - простой числовой дроби - на
не\-ко\-то\-рое выражение $A$. Выходная переменная $b$ при этом
выдает числитель коэффициента, выходная переменная $c$ -
знаменатель (оба - представленные не в виде термов, а в виде
десятичных чисел), выходная переменная $d$ - выражение $A$.

Оператор "слагаемое($a$ $b$)" получает в качестве значения $a$
вхождение некоторого алгебраического выражения и перечисляет
вхождения $b$ всех его слагаемых с отбро\-шенными знаками "минус".

Оператор "сомножитель($a$ $b$)" перечисляет вхождения $b$
сомножителей выражения, расположенного по вхождению $a$.

Оператор "обобщслагаемое($a$ $b$)" перечисляет вхождения $b$,
достижимые из вхож\-дения $a$ переходами к его подтермам через
операции "минус", "плюс", "умножение" \\ (сами перечисляемые
подтермы не имеют своим заголовком указанные операции).

Оператор "обобщмножитель($a$ $b$)" перечисляет вхождения $b$,
достижимые из вхож\-дения $a$ переходами к его подтермам через
операции "минус", "умножение", "дробь", "степень" (только через
основание степени), "модуль". Здесь и далее перечисляемые подтермы
могут иметь своим заголовком указанные операции.

Оператор "алгебрвхождение($a$ $b$)" перечисляет вхождения $b$,
достижимые из вхож\-дения $a$ переходами к его подтермам через
операции "плюс","минус","умножение",\\ "дробь","степень" (через
основание степени), "модуль".

Оператор "числовойатом($a$ $b$ $c$)" перечисляет все неконстантные
атомарные чис\-ловые подвыражения $c$ терма $a$ (все надвыражения
некоторого вхождения $c$ имеют числовое значение, а некоторый
операнд $c$ - нечисловой). $b$ - список утверждений, в контексте
которого распознаются числовые значения.

Обычно реализованные на ЛОСе операторы, связанные с конкретной
предметной областью, используются компилятором ГЕНОЛОГа в качестве
стандартных блоков; при программировании на ЛОСе вручную они
практически не используются.


\subsection{Вхождения в терм}

Чтобы получить по заданному вхождению $a$ подтерма $f(A_1 \ldots
A_n)$ набор вхождений подтермов $A_1, \ldots, A_n$, используется
операторное выражение "операнды($a$)". Набор заголовков подтермов
$A_1, \ldots, A_n$ определяется выражением "наборсимволов($a$)".
Чис\-ло $n$ операндов $A_i$ определяется операторным выражением
"числооперандов($a$)" (в формате десятичного числа) либо
"Числооперандов($a$)" (в формате символьного чис\-ла). Чтобы
получить номер $i$ операнда $A_i$ по его вхождению $v$ и вхождению
подтерма $a$, служит операторное выражение "номероперанда($a$
$v$)" Этот номер выдается в фор\-мате символьного числа.

Если нужно проверить, что подтерм не находится в области действия
квантора либо описателя по его свободной (без учета внешнего
контекста) переменной, то применяется оператор "свобоперанд($a$)";
$a$ - вхождение первого символа этого под\-терма. Для получения
вхождения первого операнда $A$ квантора либо описателя $F(x_1
\ldots x_n A \ldots)$, следующего за кванторной приставкой $x_1
\ldots x_n$, используется опе\-ратор "конецприставки($a$ $b$)". У
него $a$ - вхождение первого символа данного квантора либо
описателя; выходной переменной $b$ присваивается вхождение $A$.

Для сохранения ссылки на вхождение в терм $T$ (например, при
записи его в файле) используется специальный код вхождения,
называемый указателем вхожде\-ния. Этот код представляет собой
терм "фикс($i_0 i_1 \ldots i_p$)", у которого $i_0,i_1, \ldots,
i_p$ - символьные номера, определяющие выбор операндов при
перемещении внутри $T$ от заголовка к требуемому вхождению. Если
$T$ имеет вид "длялюбого($x_1 \ldots x_n$ если $A_1 \ldots A_m$ то
$A_0$)", то $i_0$ равно номеру того $A_j$, внутри которого
находится вхождение ($i_0 = 0,1,\ldots,m$). Далее очередное $i_k$
($k=1,\ldots,p$) является просто номером того операнда (нумерация
начинается с 1), внутрь которого следует переходить. Если же $T$
не имело вида квантора общности, то указанное правило выполняется
сразу, начиная с $i_0$. Операторное выражение
"указательвхождения($a$ $b$)" позволяет получать указатель
вхождения $b$ в терм $a$, а операторное выражение
"вхождениеуказателя($a$ $b$)" - находить вхождение в терм $a$ по
указателю $b$.

Чтобы проверять, что вхождение $a$ располагается внутри подтерма с
заголовком $b$, служит оператор "внешзнак($a$ $b$)".

Если кванторная импликация "длялюбого($x_1 \ldots x_n$ если $A_1
\ldots A_m$ то $A_0$)" иден\-ти\-фицируется начиная не с корня, а
с некоторого внутреннего вхождения, то может оказаться необходимым
оператор, осуществляющий переход от вхождения некоторо\-го $A_i$ к
вхождению корня этой импликации. При таком переходе одновременно
учиты\-вается возможность перестановки антецедента с консеквентом
(которые заменяются на свои отрицания), а также возможность
преобразования квантора существования в отрицание квантора
общности. Этот оператор, называемый "внешнийквантор($a$ $b$ $c$)",
получает вхождение $a$ некоторого подутверждения, а также
указатель $b$ на то, ожидается ли, что $a$ окажется вхождением
антецедента ($b=0$) либо консеквента ($b=1$). Если, с точностью до
указанных выше преобразований, $a$ действительно оказывается таким
вхождением, то выходной переменной $c$ присваивается вхождение
внешнего квантора общности либо существования. Ослабленная версия
указанного оператора относится только к случаю квантора общности
(без преобразования кванто\-ра существования к виду отрицания
квантора общности) и имеет вид "внешдлялюбо\-го($a$ $b$ $c$)".

Можно получить вхождение антецедента $A_i$ кванторной импликации
"длялюбого\\ ($x_1 \ldots x_n$ если $A_1 \ldots A_m$ то $A_0$)" по
его номеру $i$, используя операторное выражение
"антецедентномер($a$ $b$)". Здесь $a$ - вхождение корня указанной
импликации либо она сама; $b$ - символьный номер $i,
i=1,\ldots,m$.

Операторное выражение "циклоперанд($a$)" позволяет находить
вхождение операн\-да $A_j$ операции $F(A_1 \ldots A_n)$,
циклически следующего за вхождением $a$ операнда $A_i$: при $i<n$
здесь $j=i+1$, а при $i=n$ - $j=1$. Операторное выражение
"Циклоперанд($a$ $b$)" аналогично предыдущему; при $b=0$ его
значение совпадает со значением предыдущего, а при $b=1$ - берется
не циклически следующее, а циклически предшествующее вхождение.

Для логических символов со специальной симметрией предусмотрена
характери\-зация допустимых перестановок операндов с помощью
справочника "схемаоперан\-дов". Если текущий логический символ $f$
некоммутативен, но допускает некоторые пере\-становки операндов,
то указанный справочник возвращает древовидную струк\-туру данных,
неконцевые вершины которой соответствуют подгруппам операндов
операции $f$ и являются наборами вида $(A B_1 \ldots B_n)$. Здесь
$A$ - указатель возможности перестановки подгрупп операндов,
определяемых ссылками $B_1, \ldots, B_n$ ($A=0$ - пе\-ре\-становка
недопустима, $A=1$ - допустима). Каждая ссылка $B_i$ - либо набор
аналогич\-ного указанному выше вида для подгруппы операндов, либо
номер единственного операнда (символьное число). Для удобства
использования данного справочника введено операторное выражение
"схемаоперандов($a$ $b$ $c$)". У него $a$ - вхождение опе\-ра\-ции
$f$ со специальной симметрией; $b$ - результат обращения к
справочнику "схемаопе\-рандов" для $f$; $c$ - 0 либо набор
вхождений операндов операции $a$. Значением вы\-ра\-жения является
результат замены в древовидной структуре данных $b$ номеров
операндов операции $a$ на их вхождения. Значение переменной $c$
можно брать равным 0; набор вхождений операндов операции $a$
создается в этом случае программой само\-стоятельно и используется
далее для рекурсивных обращений.

Иногда бывает нужно проверить наличие внешней операции заданного
типа и перейти к ее рассмотрению, а если ее нет - сохранить ссылку
на текущее вхождение. Например, при работе с алгебраическими
выражениями часто приходится переходить от вхождения подвыражения
к вхождению его знака "минус", если такой знак име\-ет\-ся. В этом
случае полезным оказывается операторное выражение "внешсимвол($a$
$b$)". У него $b$ - текущее вхождение в терм; $a$ - логический
символ. Если внешняя операция для $b$ есть $a$, то значением
выражения служит ее вхождение, иначе - сохраняется значение $b$.

\subsection{Построение нового терма}

Для получения утверждения, являющегося отрицанием данного,
 служит операторное выражение "отрицание($t_1$)". Если значением
$t_1$ служит утверждение $F$, заголовок которого отличен от "не",
то значением указанного выражения является утверждение "не($F$)".
Если же значением $t_1$ служит утверждение вида "не($F$)", то
выражение имеет значение $F$. Аналогичное операторное выражение
"заменазнака($t_1$)" позволяет изменять знак у алгебраического
выражения, являющегося значением $t_1$ (при от\-сут\-ствии внешней
операции "минус" вводит ее; при наличии - отбрасывает). Еще одно
операторное выражение такого типа - "измзнака($t_1 \: t_2 \:
t_3$)". Если значением $t_3$ является логический символ "0", то
значением выражения является терм - значение $t_1$. Если же $t_3$
есть "1", то значением выражения является терм, получаемый из
$t_1$ вводом внешней операции $t_2$ при ее отсутствии и
отбрасыванием - при ее наличии.

Если требуется построить терм с помощью заданной операции из
заданного набо\-ра операндов, причем в случае одноэлементного
набора эта операция вырождается, то используется операторное
выражение "унисборка($t_1 \: t_2$)". Если значением $t_1$ здесь
является логический символ $f$, а значением $t_2$  - набор термов
$(A_1, \ldots ,A_n)$, то зна\-че\-нием выражения является терм,
совпадающий с $A_1$ в случае $n=1$ и имеющий вид $f(A_1 \ldots
A_n)$ при $n>1$.

Если требуется построить терм, получаемый применением к двум
заданным тер\-мам некоторой ассоциативной операции, причем
операнды сами могут иметь эту операцию своим заголовком, то для
устранения ее вложенных вхождений ис\-поль\-зуется операторное
выражение "соединение($t_1 \: t_2 \: t_3$)". Здесь $t_1$ -
логический символ, обозначающий операцию $f$; $t_2$,$t_3$ - термы,
к которым ее требуется применить. Каждый из этих термов, имеющий
своим заголовком указанную операцию, сначала заменяется на набор
ее операндов, а затем по объединенному (с сохранением порядка)
набору термов  $(A_1, \ldots , A_n)$ строится терм $f(A_1 \ldots
A_n)$ - значение рассматриваемого вы\-ра\-жения. Для устранения
вложенных вхождений операций часто применяется также операторное
выражение "спускоперандов($t_1 \: t_2$)". Здесь $t_1$ - вхождение
первого сим\-во\-ла терма $f(A_1 \ldots A_n)$; $t_2$ - вхождение
первого символа операнда $A_i$, имеющего вид $g(B_1 \ldots B_k)$.
Значением выражения служит терм $f(A_1 \ldots A_{i-1} \: B_1
\ldots B_k \: A_{i+1} \ldots A_n)$. Преобразования по типу
дистрибутивности выполняются при помощи операторного выражения
"дистрибразвертка($t_1 \: t_2 \: t_3$)". Здесь $t_1$ - логический
символ $f$; $t_2$ - вхождение первого символа терма $g(A_1 \ldots
A_n)$; $t_3$- вхождение первого символа операнда $A_i$, имеющего
вид $h(B_1 \ldots B_m)$. Значением выражения является терм
$f(g(A_1 \ldots A_{i-1} \: B_1 \\ \: A_{i+1} \ldots A_n) \ldots
g(A_1 \ldots A_{i-1} \: B_m \: A_{i+1} \ldots A_n))$.

Для замены операнда некоторой операции используется выражение
"заме\-на\-опе\-ранда ($t_1 \: t_2 \: t_3$)". Если $t_1$ -
вхождение первого символа терма $f(A_1 \ldots A_n)$; $t_2$ -
вхождение первого символа операнда $A_i$; $t_3$ - терм $B$, то
значением данного выражения служит терм $f(A_1 \ldots A_{i-1} \: B
\: A_{i+1} \ldots A_n)$. В случае замены двух операндов на один
новый терм применяется выражение "склейкаоперандов($t_1 \: t_2 \:
t_3 \: t_4$)". Здесь $t_1$ - вхождение первого символа терма
$f(A_1 \ldots A_n)$; $t_2,t_3$ - вхождения первых символов
операндов $A_i,A_j$; $i \ne j$; $t_4$ - терм $B$. Значением
выражения служит: при $n=2$ - терм $B$, а при $n > 2$ - терм
$f(A_1 \ldots A_{i-1} \: A_{i+1} \ldots A_{j-1} A_{j+1} \ldots A_n
\: B)$. Выражение "внутрзамена($t_1 \: t_2 \: t_3$)" аналогично
выражению "заменаоперанда(\ldots )".Если $t_1$ - вхождение первого
символа некоторого подтерма $A$; $t_2$ - вхождение первого символа
подтерма $B$ подтерма $A$ и $t_3$ - терм $C$, то значением
указанного выражения является терм, полученный заменой вхождения
подтерма $B$ в подтерм $A$ на терм $C$.

Ранее было приведено базисное операторное выражение
"заменатермов(\ldots)", по\-зволяющее заменять набор вхождений
подтермов в заданный терм на новые термы. Его существенной
особенностью являлось то, что заменяемые вхождения должны были
располагаться в терме строго по порядку - слева направо.
Операторное выра\-жение "замещение($t_1 \: t_2 \: t_3$)" выполняет
то же самое преобразование, но без указанного ограничения. У него
$t_1$ - терм; $t_2$ - набор заменяемых вхождений в этот терм;
$t_3$ - набор заменяющих термов, имеющий ту же длину, что и $t_2$.
В отличие от операторного выражения "заменатермов(\ldots)", у
которого значением $t_2$ мог быть не набор вхож\-дений, а
единственное заменяемое вхождение, здесь значение $t_2$ -
обязательно набор. Заметим, что хотя выражение "замещение(\ldots)"
свободно от ограничения на упоря\-доченность заменяемых вхождений,
оно реализуется существенно более трудоемким образом, чем
выражение "заменатермов(\ldots)", так что применение его
целесообразно лишь в случаях крайней необходимости.

Для переобозначения переменных связыващей приставки служит
операторное выражение "переобозначениесвязок($a$ $b$)". У него $a$
- терм вид $F(x_1 \ldots x_n t_1 \ldots t_m)$; $x_1, \ldots, x_n$
- переменные, а $t_1$ - не переменная. $b$ - некоторый набор
переменных. Значением этого операторного выражения является
результат переобозначения в $a$ переменных $x_1, \ldots, x_n$ на
попарно различные переменные, не входящие в набор $b$ и не имеющие
вхождений в $a$. Усиленный вариант переобозначения связанных
переменных дает выражение "новыесвязки($a$ $b$)". Здесь $a$ - терм
(произвольного вида); $b$ - набор термов. Значением выражения
является результат переобозначения в $a$ связанных переменных на
переменные, не встречающиеся в термах из $b$.

Чтобы получить отрицание квантора общности либо существования $a$
(знак кван\-тора заменяется на противоположный и соответственно
корректируются подкван\-торные утверждения), применяется
операторное выражение "отрицаниеквантора($a$)". Для преобразования
утверждения $a$ к виду "или($A_1 \ldots A_n$)", где каждое $A_i$
имеет вид "и($B_{i1} \ldots B_{im_i}$)" \ ;$1 \le m_i$; $1\le n$,
применяется операторное выражение "днф($a$)". Это преобразование
использует только дистрибутивность, коммутативность и
ас\-со\-ци\-а\-тив\-ность логических связок "и","или".

Если нужно осуществить одновременную замену в терме $a$ согласно
некоторому списку $b$ пар термов (заменяемый образец - заменяющий
образец), то может быть использовано операторное выражение
"мультизамена($a$ $b$)". Предпринимается вы\-де\-ление в $a$
непересекающихся друг с другом вхождений первых элементов пар из
$b$ и замена их на вторые элементы этих пар. Предпочтения при
выделении вхождений - согласно порядку следования пар в $b$.

Для лексикографического упорядочения операндов коммутативных
операций и отношений в терме $a$, а также операций и отношений со
специальной симметрией (например, квантора общности с его
антецедентами) служат несколько отличающихся друг от друга во
второстепенных деталях операторных выражений:
"стандупоря\-до\-чение($a$)", "станд($a$)", "стандтерм($a$)". В
приемах решателя обычно используется первое из них; в логическом
выводе теорем - второе и третье. Для перехода к стан\-дар\-тной
перегруппировке операндов при прорисовке формулы на экране
используется еще одно выражение аналогичного типа -
"нормформ($a$)".

Операторное выражение "метатерм($t_1$)" имеет своим значением
операторное кон\-стантное выражение, имеющее своим значением терм
- значение операторного выра\-жения $t_1$. Это выражение
применяется при автоматическом формировании программ на ЛОСе.


\subsection{Свойства терма и отношения между термами}

Оператор "элементарно($t_1$)" истинен, если $t_1$ - терм, не
содержащий кванторов, опи\-сателей "класс", "отображение", а также
логических связок "и", "или", "эквивалент\-но" (допускаются
вхождения этих символов, после которых не идет открывающая
скобка). Оператор "простаяимпликация($t_1$)" истинен, если
значением $t_1$ служит ут\-вер\-ждение вида "длялюбого($x_1 \ldots
x_k$ если $A_1 \ldots A_n$ то $A_0$)", где $k>0,n \ge 0$, причем
все утверждения $A_0,A_1, \ldots , A_n$ - элементарны в смысле
оператора "элементарно(\ldots)". Оператор "константа($t_1$)"
истинен, если терм $t_1$ не имеет переменных.

Оператор "бесповторно($a$)" проверяет отсутствие в терме $a$
повторных вхождений одной и той же переменной. Операторное
выражение "числоповторений($a$)" дает чис\-ло повторных вхождений
переменных в терм $a$ (равное разности числа вхождений переменных
в этот терм и числом переменных терма).

Операторное выражение "длинанабора($a$)" выдает число символов в
записи терма $a$ либо длину набора $a$ (десятичное число).
Выражение "глубина($a$)" имеет своим значением глубину терма $a$
(десятичное число); глубина переменной либо константы здесь
полагается равной 0. Выражение "глуб($p$ $b$)" дает наибольшую
глубину вхож\-дений переменной $p$ в терм $a$. При определении
глубины не учитываются одноместные операции, которые могут быть
перегруппированы внутрь многоместной операции таким образом, чтобы
они не лежали на путях от вхождений переменной $p$ к корню терма
(например, "минус" перед произведением может быть отнесен к
сомножителю без $p$). Выражение "числочленов($a$ $f$)" равно: если
$a$ имеет вид $f(A_1 \ldots A_n)$, то числу (десятичному) $n$,
иначе оно равно 1. Выражение "числоконстант($a$)" имеет своим
значением число вхождений в терм $a$ логических символов, после
которых не идет открывающая скобка.

Операторное выражение "симметричныепары($a$)" определяет по терму
$a$ набор лексикографически упорядоченных пар его переменных,
перестановка которых не изменяет терма (с точностью до изменения
порядка операндов коммутативных опе\-ра\-ций и отношений).

Ответы задач на описание часто предствляют собой
дизъюнктивно-конъюнктив\-ные логические конструкции $a$, в которых
значения неизвестных определяются с разбором подслучаев. Чтобы
определить, что во всех таких подслучаях значение некоторой
переменной $x$ определяется через значения переменных списка $p$
при по\-мо\-щи явного равенства, служит оператор
"опредзначение($a$ $x$ $p$)".

Список связанных переменных квантора либо описателя $A$ опре
деляется с по\-мо\-щью операторного выражения
"связприставка($A$)". Здесь $A$ - вхождение первого символа этого
квантора либо описателя.

Оператор "внутрзаголовок($a$ $b$ $c$)" получает в качестве
входного данного вхождение $a$ первого символа некоторого терма.
Этот терм представляется в виде $f_1(f_2(\ldots f_n(t)\\
\ldots))$, где $f_1, \ldots, f_n$ - одноместные операции; $t$ -
терм, заголовком которого служит более чем одноместная операция
(при отсутствии такого предствления оператор ло\-жен). Значением
выходной переменной $b$ становится список операций $f_1, \ldots,
f_n$ (без повторений), значением выходной переменной $c$ -
заголовок терма $t$.

Оператор "подобныетермы($a$ $b$)" истинен, если термы $a$ и $b$
получаются друг из друга переобозначением без отождествлений
переменных и перестановкой операндов коммутативных операций и
отношений. Оператор "подобныеимпликации($a$ $b$)" про\-веряет, что
кванторные импликации $a$ и $b$, не имеющие внутри своих
антецедентов и консеквента связывающих символов, могут быть
получены друг из друга пере\-обо\-значением без отождествлений
связанных переменных, а также изменением порядка операндов в
коммутативных операциях и операциях со специальной симметрией.
Если требуется не только установить подобие импликаций указанного
вида, но и найти соответствующее переобозначение связанных
переменных, используется опе\-ратор "Подобныеимпликации($a$ $b$
$c$ $d$)". Здесь $a$,$b$ - две кванторных импликации без свободных
переменных; $c$ - набор переменных первой из них. Если $b$ может
быть получено из $a$ переобозначением без отождествлений
переменных списка $c$, а также изменением порядка операндов в
коммутативных операциях, то переменной $d$ присваивается (без
перечисления) набор однобуквенных термов, определяющих новые
переменные для $c$.

Чтобы определить подстановку, переводящую один терм в другой, с
точностью до изменения порядка операндов в коммутативных
операциях, используется оператор "усмподст($a$ $b$ $c$ $d$)". У
него $a$,$b$ - термы; $c$ - набор переменных, вместо которых
делается подстановка в терм $a$. Выходной переменной $d$
присваивается набор термов, подставляемых вместо переменных набора
$c$. Так как результат определен, вообще говоря, неоднозначно,
оператор работает в режиме перечисления.

Оператор "вычерк($a$ $b$)" проверяет, что терм $b$ получен из
терма $a$ вычеркиванием части операндов некоторых операций.

Оператор "сравнтермов($a$ $b$ $c$ $d$)" сравнивает два терма
$a$,$b$ начиная с их корней и определяет в каждом из них такой
наименьший подтерм, что $a$,$b$ отличаются только внутри этого
подтерма. Выходным переменным $c$,$d$ присваиваются вхождения
корней этих подтермов (в соответствующем порядке).

Ряд операторов был реализован на ЛОСе с целью упростить описание
вида стан\-дартных теорем, по которым происходит синтез приемов
того или иного типа.

Оператор "квазипеременная($a$ $b$)" проверяет, что по вхождению
$a$ располагается символ переменной $b$ либо одноместная операция
от этой переменной; если значение $b$ на момент обращения не
определено, то ему присваивается указанная переменная. Оператор
"унитерм($a$ $b$)" проверяет, что терм $a$ имеет единственное
вхождение пе\-ре\-менной; эта переменная присваивается выходному
значению $b$.

 Оператор "бинарнаяоперация($a$ $b$ $c$ $d$)" проверяет, что по
вхождению $a$ расположе\-на бинарная операция. Если это так, то
переменной $b$ присваивается символ данной опе\-рации, а
переменные $c$,$d$ перечисляют вхождения различных операндов этой
опе\-рации: сначала в прямом порядке, а затем в обратном. Оператор
"Бинарнаяоперация\\ ($a$ $b$ $c$ $d$ $e$ $f$)" проверяет, что по
вхождению $a$ располагается бинарная операция, быть может, внутри
одноместной операции. Переменной $b$ присваивается символ бинарной
операции, переменной $c$ - символ одноместной операции (если ее
нет, то 0), переменной $d$ - указатель перестановки операндов
двуместной операции : 0 - без перестановки, 1 - с перестановкой.
Переменные $e$,$f$ перечисляют вхождения самих операндов (сначала
без перестановки, затем с перестановкой). Оператор
"двойнаяопе\-рация($a$ $b$ $c$ $d$)" про\-ве\-ряет, что по
вхождению $a$ расположена одноместная операция, примененная к
двуместной. Переменной $b$ присваивается символ двуместной
опера\-ции, а $c$,$d$ перечисляют вхождения ее операндов: сначала
- без перестановки, затем с перестановкой.

Оператор "унарноеотношение($a$ $b$)" проверяет, что утверждение,
вхождением пер\-вого символа которого служит $a$, имеет вид $P(A)$
либо $P(A c)$, где $c$ - логический символ. Переменной $b$
присваивается вхождение первого символа выражения $A$. Опе\-ратор
"простоеусловие($a$ $b$)" проверяет, что утверждение $a$ имеет вид
$P(y)$, либо "не\\ ($P(y)$)", либо $Q(y a)$, либо "не($Q(y a)$)",
где $a$ - логический символ, $y$ - переменная (быть может, под
знаком одноместной операции). В этих случаях $b$ присваивается
переменная $y$.

Оператор "простоеотношение($a$ $b$ $c$)" проверяет, что
утверждение $a$ имеет один из видов: $P(A B)$, "не($P(A B)$)",
$P(f(A B) d)$, "не($P(f(A B) d)$)", где $d$ - логический символ;
$A,B$ - различные переменные $x,y$, быть может, находящиеся под
знаком одноместных операций. $b,c$ присваиваются значения $x,y$.
Оператор "Простоеотноше\-ние($a$ $b$ $c$)" аналогичен предыдущему,
но $A,B$ могут быть только переменными. Опе\-ратор
"бинарноеотношение($a$ $b$ $c$)" проверяет, что утверждение,
вхождение первого символа которого есть $a$, с точностью до
отбрасывания внешнего отрицания, имеет вид $P(A B)$ либо $P(f(A
B)d)$; $d$ - логический символ. Переменным $b$,$c$ присваиваются
вхождения первых символов выражений $A,B$ - сначала без
перестановки, затем с перестановкой.



\subsection{Списки термов}

Для лексикографического упорядочения термов набора $a$
используется оператор "ле\-ксупорядочение($a$ $b$)". Если набор
$a$ уже был лексикографически упорядочен, то выходной переменной
$b$ присваивается логический символ 1, иначе ей присваивается
результат лексикографического упорядочения данного набора.
Оператор "циклупо\-рядочение($a$ $b$)" находит такую циклическую
перестановку $b$ термов набора $a$, быть может, сопровождаемую
изменением порядка термов на противоположный, которая является
наименьшей в лексикографическом порядке.

Операторное выражение "компонента($a$ $b$ $c$)" используется для
нахождения наи\-боль\-шего подмножества множества термов $b$,
зависящих от переменных пересечения списков $a$,$c$ либо
достижимых из них путем переходов от одного терма списка $b$ к
другому, имеющему с ним общую переменную из $c$. Оно обычно
используется при разбиении списка условий задачи на описание на
независимые компоненты либо при разбиении подкванторных
утверждений на независимые подгруппы.

Оператор "симметрично($a$ $b$ $c$)" проверяет, что термы $a$,$b$
входят в термы набора $c$ симметричным образом (с точностью до
допустимых перестановок операндов).

Оператор "подборзначений($a$ $b$ $c$ $d$ $e$)" позволяет находить
такой набор термов $d$, подстановка которого вместо переменных
списка $c$ в термы набора $a$ переводит последние в некоторые
термы набора $b$ ( с точностью до допустимых перестановок
операндов). Выходной переменной $e$ присваивается набор тех термов
списка $b$, в которые были переведены термы списка $a$. Оператор
работает в режиме перечисления. При обращении к нему требуется,
чтобы переменные списка $c$ не входили в термы списка $b$.
Оператор "подборнеизвестных($a$ $b$ $c$ $d$ $e$)" несколько
усиливает предыдущий оператор. У него $a,b$ - списки утверждений
(рассматриваемые, соответственно, как посылки и условия); $c$ -
список переменных ("неизвестных"), не встречающихся в посылках.
Оператор перечисляет всевозможные наборы $d$ значений неизвестных,
при которых все условия оказываются истинными, сопровождая каждый
такой набор списком $e$ использованных посылок. Отличие от
оператора "подборзначений" заклю\-чается в том, что
непосредственно в списке посылок реализуется лишь часть условий, а
остальные условия, по мере того, как оказываются определены
значения входящих в них неизвестных, проверяются путем решения
вспомогательных задач на дока\-зательство. Оператор
"Реализация($a$ $b$ $c$ $d$)" совпадает с оператором
"подборзначений\\ ($a$ $b$ $c$ $d$)", но не требует невхождения
переменных списка $c$ в термы набора $b$.

Операторное выражение "выражения($a$)" выдает набор максимальных
по вклю\-чению выражений, содержащихся в терме $a$. Операторное
выражение "утверждения\\ ($a$)" выдает набор атомарных
утверждений, из которых утверждение $a$ построено при помощи
логических связок "не", "и", "или", "эквивалентно".

Если терм $b$ имеет своим заголовком логический символ $a$, то
значением выраже\-ния "наборчленов($a$ $b$)" является набор
корневых операндов терма $b$, иначе этим значением является
одноэлементный набор, состоящий из $b$. Набор антецедентов $A_1,
\ldots, A_n$ кванторной импликации "длялюбого($x_1 \ldots x_m$
если $A_1 \ldots A_n$ то $A_0$" дается операторным выражением
"наборантецедентов($a$)". Здесь $a$ - сама кванторная имп\-ликация
либо вхождение ее первого символа.

 \section{Операторы для работы с задачами}

 \subsection{Элементы задачи и связи ее с дру\-ги\-ми за\-да\-ча\-ми}

 Если нужно преобразовать терм, встречающийся в задаче, то для
 обоснования кор\-ректности этого действий приходится создавать список $A$
 всех утверждений, от\-но\-сящихся к области рассматриваемого вхождения,
 и решать вспомогательные задачи на проверку условий корректности
 относительно $A$ как списка посылок. Для полу\-чения $A$  используется
 операторное выражение "облвхожд($a$ $b$ $c$ $d$)", у которого
 ($a,b,c$) - координата вхождения в задачу $d$. Если замена
 затрагивает не один, а несколько термов задачи (например, несколько
 условий заменяются на одно новое условие), то при обосновании
 корректности все эти термы должны исключаться из списков посылок
 вспомогательных задач. Здесь бывает полезно операторное выражение
 "Обл\-вхожд($a$ $b$ $c$ $d$ $e$)", отличающееся от предыдущего тем,
 что из результирующего списка исключаются все утверждения,
 указанные в списке $e$. Еще один вариант выражения такого типа -
 "конъюнктконтекст($a$ $b$ $c$ $d$ $e$)". У него ($a,b,c$) -
 координата вхождения в задачу $d$ конъюнкции либо кванторной
 импликации; $e$ - набор вхождений в конъ\-юнк\-тивные члены либо в
 антецеденты и консеквент терма $T$ по вхождению $a$. Значением
 выражения служит область вхождения ($a,b,c$), пополненная
 не содержащими вхож\-дений из $e$ конъюнктивными членами либо
 антецедентами терма $T$. Это выражение используется при проверке
 корректности одновременной замены группы утвержде\-ний из
 конъюнкции либо кванторной импликации. Если рассматриваемое
 вхождение в терм задачи - корневое либо не расположено внутри
 таких логических конструкций, которые могут добавить что-либо
 к его области, то можно применять упрощенную версию операторного
 выражения "областьвхождения" \ - выражение "подобл($a$ $b$ $c$)".
 У него $a$ - вхождение в список условий задачи $c$ при $b=1$ и
 в список посылок при $b=0$ некоторого терма. Значением выражения
 является: при $b=0$ - набор всех отличных от $a$ посылок задачи,
 а при $b=1$ - набор всех посылок задачи и всех ее условий, отличных
 от $a$.

 Для проверки того, что терм $a$ не содержит неизвестных задачи
 $b$, используется оператор "известно($a$ $b$)". Строго говоря,
 его следует применять только для задач на описание и
 исследование, либо для редко втречающихся задач на
 преобразование, снабженных целью "неизвестные $x_1 \ldots$".
 Однако, предусмотрено его использование и в случае задач на
 доказательство - терм считается "известным" в контексте такой
 задачи, если он либо не содержит переменных, либо задача на
 доказательство имеет комментарий "известно $a_1 \ldots a_n$",
 среди переменных $a_1, \ldots, a_n$ которого содержатся все
 переменные данного терма. Оператор "известны($a$ $b$)" проверяет,
 что ни один из термов набора $a$ не содержит неизвестных задачи
 $b$.

 Оператор "независит($a$ $b$)" проверяет, что терм $a$ не имеет
 свободных переменных, встречающихся в цели "независит $x_1
 \ldots x_n$" задачи на описание $b$. Напомним, что такая цель
 вводится в тех случаях, когда ответ не должен зависеть от ряда
 парамет\-ров, встречающихся в списке посылок. Оператор
 "параметр($a$ $b$)" проверяет, что пе\-ре\-менная $a$ встречается в
 цели "параметры $x_1 \ldots x_n$" задачи на описание $b$ (т.е.
 $a$ - несущественная неизвестная задачи, для которой достаточно
 установить сущест\-во\-вание значения, не указывая его в ответе явным
 образом).

 Оператор "родобъекта($a$ $b$ $c$ $Z$ $v$ $t$ $K$)" позволяет
 находить список $t$ типов значения выражения по вхождению $v$,
 усматриваемых в контексте вхождения в задачу $Z$, имеющего координату
 ($a$,$b$,$c$). Выходной переменной $K$ при этом присваивается
 спи\-сок утверждений данного контекста, использованных при
 определении типа.

 Оператор "контрольвывода($a$ $b$)" проверяет, что каждое
 атомарное выражение, встречающееся в утверждении $b$, уже имеется
 в посылках либо условиях задачи $a$. Этот оператор бывает полезен
 для решающих правил приемов, оценивающих целесообразность
 добавления нового утверждения $b$ к посылкам либо условиям
 зада\-чи.

 Оператор "зона($a$ $b$ $c$ $Z$ $T$ $d$ $e$)" получает координату
 ($a,b,c$) вхождения в задачу $Z$. Если это вхождение - в условие $U$,
 то он перечисляет все отличные от $U$ условия $T$ задачи, а если
 в посылку $U$ - то также и все отличные от $U$ посылки $T$. При
 этом $d$,$e$ - второй и третий разряды координаты вхождения первого
 символа утверждения $T$ в задачу. Если $U$ - посылка, то перечисление
 начинается со списка посылок. Данный оператор фактически
 перечисляет все термы задачи, к области вхождений которых относится тот
 терм, в котором выделено вхождение ($a,b,c$).

 Если в посылках задачи имеется некоторое множество утверждений
 $F(A B)$ для транзитивного, рефлексивного и симметричного
 отношения $F$, то может понадо\-бить\-ся перечисление с помощью
 этих утверждений всех термов, $F$ - эквивалентных заданному терму
 $T$. В этом случае используется оператор "транзитопе\-ранд($a$ $b$ $c$)".
 У него $a$ - вхождение операнда $A_i$ утверждения
 вида $F(A_1 A_2)$; $b$ - список посылок. $c$
 перечисляет следующие вхождения: а) вхождение операнда,
 противопо\-ложного операнду $A_i$; б) если $i=1$, то - вхождения
 всех операндов $A_3$ утверждений $F(A_3 A_2)$ из списка $b$.
 Здесь используется тот факт, что перед перечислением решатель
 стандарти\-зирует группу относящихся к одному и тому же "классу
 эквивалентности"  утверж\-дений вида $F(A B)$ так, что все они имеют
 одинаковые вторые операнды $B$. Оператор используется в
 идентифицирующей части приемов, где при $i=2$ бывает достаточно
 ограничиться лишь указанием на противоположный операнд $A_1$.

 Оператор "внешусловие($a$ $b$)" перечисляет все условия $b$ той
 задачи на описание, блоком анализа которой служит задача на
 исследование $a$. Операторное выражение "внешописать($a$)" выдает
 ту задачу на описание, блоком анализа которой является задача на
 исследование $a$. Операторное выражение "внешняязадача($a$)"
 выдает зада\-чу, предшествующую в цепи задач текущей задаче. Его
 входная переменная $a$ - фиктивная, ее значение несущественно.

 Оператор "вхождениевзадачу($a$ $b$ $c$ $d$)" проверяет, является
 ли терм $b$ условием либо посылкой задачи $a$. Если является, то
 переменной $c$ присваивается вхождение этого терма в
 соответствующий список задачи; переменной $d$ - 0  случае посылки
 и 1 в случае условия.

 Связанные переменные встречающихся в задаче кванторов и
 описателей пере\-обозначаются специальными приемами так, чтобы они
 не имели свободных вхожде\-ний во внешних по отношению к данному
 квантору либо описателю термах. Нару\-шение этого требования может
 повлечь логические ошибки. Для данного пере\-обо\-значения
 используется оператор "нормализациясвязок($a$ $b$ $c$ $d$ $e$)",
 у которого $(a,b,c)$ - координата вхождения первого символа квантора
 либо описателя $F(x_1 \ldots x_k a_1 \ldots a_n)$ в задачу $d$.
 Если использование связанных переменных $x_1 \ldots x_n$ в данной
 ситуации допустимо, то выходной переменной $e$ присваивается 1,
 иначе ей присваивается ре\-зуль\-тат необходимого переобозначения
 связанных переменных в рассматриваемом кванторе либо описателе.

 \subsection{Преобразования задачи}

 Преобразования условий и посылок задачи выполняются приемами при
 помощи не\-большого числа стандартных операторов. Это позволяет
 вводить дополнительный общий контроль за ходом решения задачи,
 локализуя его в указанных нескольких операторах. Операторы
 преобразования задачи, кроме собственно изменения условий и
 посылок, выполняют большое число сопутствующих действий.
 Они корректируют сопровождение термов задачи условиями на
 область допустимых значений при их преобразованиях; учитывают
 общие установки на блокировку срабатываний приемов; корректируют
 комментарии задачи; изменяют веса условий и посылок;
 обнаруживают зацикливание, и т.д. Подробное описание устройства
 этих операторов будет приведено впоследствии; здесь мы ограничимся
 их перечислением и общей характеризацией.

 Наиболее часто используемый и наиболее сложный оператор
 преобразования за\-дачи - "заменавхождения($t_1 t_2 t_3 t_4 t_5
 t_6$)", используемый для тождественных и экви\-валентных замен.
 У него $(t_1,t_2,t_3)$ - координата вхождения в задачу $t_4$ заменяемого
 подтерма; $t_5$ - заменяющий терм либо логический символ. $t_6$ -
 набор информационных элементов, определяющих сопутствующие
 действия. Перечислим основные типы этих элементов. Прежде всего,
 к их числу относится ссылка на примененный прием. Она вводится
 только в случае приемов, реализованных на ГЕНОЛОГе, и представляет
 собой набор (прием $a$ $b$ $c$), формат которого будет описан
 в разделах, посвященных ГЕНОЛОГу. Наличие такой ссылки позволяет
 реагировать заданным образом на срабатывание приема (например,
 регистрировать статистику срабатываний по при\-емам; блокировать
 применение избранных приемов, и т.п.). Информационный эле\-мент
 (выводимо $A$) используется для учета списка $A$ утверждений,
 использованных для обоснования корректности замены. Таких элементов
 в наборе $t_6$ может быть несколько. Список $A$ может содержать
 нулевые разряды; если само $A$ есть 0, то замена блокируется.
 Информационный элемент (замечание $A$) указывает, что при
 выполнении замены вводится комментарий (для задачи на
 исследование - коммен\-тарий посылок) $A$. Элемент
 (комментариипосылок $A$) указывает, что при выполнении замены
 вводится комментарий посылок $A$. Элемент (примечание $A$)
 перечисляет в наборе $A$ все комментарии, которыми сопровождается
 изменяемый терм задачи. Ввод новых комментариев можно было
 бы выполнять и до обращения к оператору "заменавхождения($\ldots$)".
 Однако, этот оператор может отменить срабатывание при\-ема, и тогда
 произошло бы рассогласование между комментариями, указывающими
 (прямо либо косвенно), что срабатывание произошло, и фактическим
 состоянием задачи. Элементы (удалениеусловия $A$) и
 (удалениепосылки $A$) указывают на удаля\-емое после выполнения
 замены условие (посылку) $A$, если только она не используется как
 утверждение, указывающее область допустимых значений для
 некоторого терма задачи. Элемент (посылка $A B$) указывает на
 новую посылку $A$, заносимую в список посылок при условии, что
 все утверждения, использованные при обосновании кор\-рек\-тности
 замены, являлись посылками; $B$ - список комментариев, которыми
 сопро\-вож\-дается эта посылка.

 Иногда применяется групповая замена - сразу все вхождения в задачу
 некоторого терма заменяются на новый терм. Это позволяет
 ускорять действия решателя в тех случаях, когда правдоподобным
 является многократное появление в задаче одного и того же терма.
 Разумеется, выполнение замены в каждом конкретном случае требует
 дополнительной проверки того, что все использованные при
 обосновании коррект\-нос\-ти замены утверждения попадают в область
 заменяемого вхождения. Для групповой замены служит оператор
 "заменавхождений($a$ $b$ $c$ $d$)". У него $a$ - задача; $b$ -
 вхождение первого символа заменяемого терма $T$; $c$ - заменяющий
 терм; $d$ - набор информа\-ци\-онных элементов, определяющих
 сопутствующие действия. Типы этих элементов - те же, что у
 оператора "заменавхождения($\ldots$)" (их подробный список можно
 найти в справочной информации для логического символа
"заменавхождения"). Оператор находит все вхождения в задачу терма
$T$, замена которых на $c$ является допустимой согласно элементам
(выводимо $\ldots$) из $d$, и осуществляет для них одновременную
замену. Если не было произведено ни одной замены, то оператор
ложен.

Для вывода следствий в списке посылок служит оператор "вывод($a$
$b$ $c$)". У него $a$ - задача; $b$ - утверждение, присоединяемое
к ее списку посылок; $c$ - набор информационных элементов,
определяющих сопутствующие действия (типы их - те же, что и выше).
При регистрации новой посылки выполняется лексикографическое
упорядочение операндов для коммутативных операций (либо операций
со специаль\-ной симметрией). Если результат уже содержался в
списке посылок, либо являлся константой "истина", либо представлял
собой кванторную импликацию, полученную из уже имеющейся в
посылках переобозначением без отождествлений связанных переменных,
то преобразование блокируется. При блокировке преобразования
опе\-ра\-тор оказывается ложным, если $c$ не содержит логического
символа "выход", и истинным в противном случае. В случае вывода
следствий для условий задачи на описание применяется оператор
"выводусловия($a$ $b$ $c$)", аналогичный вышеуказанно\-му.

Если нужно заменить сразу несколько посылок либо несколько условий
на одно новое утверждение, применяется оператор "заменагруппы($a$
$b$ $c$ $d$)". Здесь $a$ - набор посылок при $b=0$ или набор
условий при $b=1$; $c$ - задача; $d$ - заменяющее утверждение. $e$
- набор информационных элементов, определяющих сопутствующие
действия (типы их те же, что и выше).

Удаление условий либо посылок задачи практически никогда не
выполняется как основное преобразование приема; обычно оно
сопровождает другие действия. Тем не менее, для этих целей также
возникли специальные операторы. В первую очередь, это оператор
"удалениепосылок($a$ $b$)", позволяющий исключать все посылки
задачи $a$, упоминаемые в наборе $b$. При удалении корректируются
некоторые структуры данных. Оператор "исключениеусловия($a$ $b$
$c$)" позволяет удалить условие задачи $a$ на описание либо
доказательство, вхождение которого есть $b$. $c$ - набор
информационных элементов для сопутствующих действий. Если
удаляемое условие было единственным, оно заменяется на константу
"истина".

Этим, по существу, и исчерпываются основные типовые блоки
преобразования задач, используемые в приемах. Приведем далее ряд
операторов, используемых для вспомогательных преобразований
задачи.

Оператор "учетнеизвестных($a$ $b$)" позволяет пополнить список
неизвестных задачи на описание либо исследование $a$ переменными,
входящими в список $b$.

Оператор "одз($a$)" используется в самом начале решения задачи
$a$. Он выполняет расширение ее списков условий и посылок,
добавляя к ним необходимые для указания на область допустимых
значений встречающихся в задаче операций и отношений утверждения.
Такие утверждения могут заноситься не только в виде новых посылок
и условий, но и вставляться внутрь сложных логических конструкций
(например, в качестве антецедентов кванторных импликаций).

Оператор "внимание($a$ $b$)" используется для переключения
внимания, связанного с некоторым термом либо логическим символом
$b$. Он находит все условия и посылки задачи $a$, содержащие $b$,
и заменяет их веса на 0. Впрочем, этот оператор фактически
используется редко - обычно указания на переключение внимания
(путем определе\-ния специальных условий и посылок и уменьшения их
веса до заданной величины), имеющиеся в описании приема на
ГЕНОЛОГе, компилируются в кванторные операто\-ры ЛОСа,
непосредственно просматривающие списки посылок и условий.

Комментарии задачи часто имеют вид ($s A$), где логический символ
$s$ указывает тип комментария, $A$ - накопитель объектов,
пополняемый по ходу решения задачи. Для удобства занесения в этот
накопитель новых элементов введены операторы "Примечание($Z$ $s$
$t$)", "Замечание($Z$ $s$ $t$)", "Примечпосылки($Z$ $v$ $s$ $t$)".
Каждый из них проверяет наличие комментария вида ($s A$): в первом
случае - к посылкам задачи $Z$, во втором случае - к самой задаче,
и в последнем случае - к посылке задачи, имеющей вхождение $v$.
При наличии данного комментария в накопитель $A$ заносится, если
его там не было, элемент $t$; при отсутствии комментария - он
создается, с накопителем, состоящим из $t$.

\subsection{Создание и решение вспомогательных задач}

Оператор "заменавхождения" осуществляет необратимое преобразование
задачи. В тех случаях, когда есть опасения, что необратимая замена
заведет процесс решения в тупик, используется версия замены с
переходом к вспомогательной задаче - копии текущей задачи. Это
осуществляет оператор "попытказамены($t_1$ $t_2$ $t_3$ $t_4$
$t_5$)". У него $(t_1 t_2 1)$ - координата вхождения в задачу
$t_3$ заменяемого подтерма, $t_4$ - заменяющий терм, $t_5$ - набор
информационных элементов, определяющих сопутствующие действия.
Замена реализуется в копии текущей задачи; эта копия решается до
получения ре\-зуль\-тата. Если получен ответ $A$ , отличный от
символа "отказ", то он передается текущей задаче; для передачи
используется комментарий (ответ $A$) к последней. При получении
отказа оператор ложен, и в этом случае действия по решению текущей
задачи продолжаются независимо от предпринятой попытки замены.
Заметим, что при развитии автоматики принятия решений в предметной
области обычно удается обойтись без использования оператора
"попытказамены"; обращение к нему - исклю\-чи\-тельно редкая
ситуация.

При решении задачи на доказательство либо на описание (если не
нужно получить полного описания для всех допустимых значений
неизвестных) может быть применен прием, заменяющий условие $A$ на
некоторое утверждение $B$, логическим следствием которого является
$A$. Так как эта замена, вообще говоря, не является эквивалентной,
то она не должна необратимым образом изменять текущей задачи
(возможно, при откате придется к ней возвращаться). Поэтому для
дальнейших действий вводится копия текущей задачи, в которой
выполняется указанная замена и осуществлены необходимые коррекции
комментариев. В случае задачи на описание, во избежании
нежелательных склеек, здесь должен быть скопирован также и блок
анализа. Пере\-чис\-ленные действия выполняются операторным
выражением "спуск($Z$ $v$ $A$)", у ко\-то\-рого $v$ - вхождение в
список условий задачи $Z$ (для задачи на доказательство - в саму
эту задачу)заменяемого условия; $A$ - заменяющее утверждение.

Ряд процедур, формирующих вспомогательные задачи и осуществляющих
об\-ра\-щение к их решению, используется компилятором ГЕНОЛОГа в
качестве стандарт\-ных блоков. Перечислим основные такие
процедуры.

Указанная выше попытка решить задачу на доказательство либо на
описание путем замены ее условия $A$ на некоторое (вообще говоря,
не эквивалентное $A$) ут\-вер\-ждение $B$, следствием которого
является $A$, реализуется оператором "попыткаспус\-ка($Z$ $v$ $B$
$d$)". У него $Z$ - задача на доказательство либо на описание; $v$
- вхождение условия $A$ в задачу (если $Z$ - задача на
доказательство) либо в список условий; $d$ - набор информационных
элементов, определяющих сопутствующие преобразования. Типы этих
элементов - такие же, как у оператора "заменавхождения". Оператор
создает, используя операторное выражение "спуск", вспомогательную
задачу, и пред\-принимает попытку ее решить. Если это удается, то
все условия текущей задачи заменяются на ответ вспомогательной
задачи (в случае задачи на описание - на группу конъюнктивных
членов ответа). Иначе - оператор оказывается ложным.


Для решения вспомогательной задачи на преобразование служит
оператор "вс\-помпреобразование($t_1$ $t_2$ $t_3$ $t_4$ $t_5$)", у
которого $t_1$ - преобразуемое выражение, $t_2$ - список посылок,
относительно которых должно выполняться преобразование; $t_3$ -
список целей вспомогательной задачи на преобразование. Выходной
переменной $t_4$ присваивается ответ задачи на преобразование,
выходной переменной $t_5$ - список использованных при решении
посылок из $t_2$. Если в $t_3$ не входит логический символ
"смпосылка", то веса посылок вспомогательной задачи полагаются
равными 20 - сканирование посылок блокируется для ускорения
вычислений. Ряд элементов списка $t_3$ в действительности не
становятся целями вспомогательной задачи, а лишь ис\-поль\-зуются
для уточнения способа ее построения. Так, элементы (комментарий
$A$) используются для указания комментариев $A$ к вспомогательной
задаче; элемент (уро\-веньобращения $A$) устанавливает
максимальный уровень $A$ для ее решения. Заметим, что при
отсутствии такого элемента непосредственно до обращения к
оператору должен быть применен оператор "уровеньобращения($A$)" -
иначе вспомогательная за\-да\-ча будет решаться лишь до текущего
уровня текущей задачи. Результаты обра\-ще\-ния к данному
оператору сохраняются в специальном буфере (длина его равна 20), и
при повторном идентичном обращении извлекаются непосредственно из
буфера. Роль такого буфера играет комментарий (вспомпреобразование
$A_1 A_2 A_3$) к посылкам исходной задачи. У него $A_1$ - набор
троек ($t_1 t_2 t_3$) для входных данных обращений; $A_2$ - набор
такой же длины, что и $A_1$, сохраняющий результаты обращений;
$A_3$ - текущая (очередная изменяемая) позиция в наборе $A_1$. Эта
текущая позиция перемещается циклически; в исходной ситуации
наборы $A_1,A_2$ заполнены нулями.

Оператор "вспомпреобразование($\ldots$)" обычно используется
внутри другой вспо\-мо\-гательной процедуры (как правило, внутри
так называемого пакетного оператора, см. описание ГЕНОЛОГа). Для
обращения к вспомогательной задаче на прео\-бра\-зование из
приема, инициированного при сканировании задачи, служит оператор
"преобразование($A$ $t_1$ $t_2$ $t_3$ $t_4$ $t_5$ $Z$)". У него
$A$ - базовая задача (обычно, текущая решаемая задача), из которой
извлекается дополнительная информация, необходи\-мая для
формирования вспомогательной задачи на преобразование выражения
$t_1$ отно\-си\-тельно списка посылок $t_2$ со списком целей
$t_3$. Выходные переменные $t_4,t_5$ - такие же, как у оператора
"вспомпреобразование". Выходной переменной $Z$ присва\-ивается
сама вспомогательная задача. В дополнение к решению задачи $Z$,
оператор "прео\-бра\-зование" \ обеспечивает обратную передачу
задаче $A$ целого ряда коммента\-риев задачи $Z$ (их отбор и
модификация обеспечиваются справочником "преобра\-зо\-вание").
Отбираются комментарии, содержащие полезную для последующего
ин\-фор\-мацию о новых термах, возникших в ответе вспомогательной
задачи. При обращении к задаче $Z$ может быть установлено
ограничение на трудо\-емкость ее решения, по превышении которого
оператор обрывается как ложный. Это ограниче\-ние задается
элементом "лимит($N$)" в наборе $t_3$; $N$ - допустимая
трудоем\-кость в числе шагов интерпретатора ЛОСа. Как и для
оператора" вспомпреобра\-зование", предусмотрен буфер. Однако, он
используется и пополняется лишь при наличии в $t_3$ элемента
"буфер". Технически буфер представляет собой комментарий
(преобразование $B$) к посылкам исходной задачи, у которого $B$ -
набор троек (версия задачи $Z$ до решения - версия задачи $Z$
после ее решения - ответ на задачу $Z$). В буфере хранятся 5
последних результатов.

Для проверки истинности утверждения в заданном контексте имеется
целый ряд вспомогательных операторов, отличающихся глубиной
предпринимаемых ими по\-пы\-ток. Выбор конкретной версии оператора
предпринимается из соображений целе\-со\-образности тех или иных
затрат трудоемкости на проверку. Первый из таких операторов -
"извлекается($a$ $b$ $c$)". У него $a$ - проверяемое утверждение;
$b$ - список посылок, относительно которых выполняется проверка.
Вспомогательная задача на доказательство решается здесь до
максимального уровня 4, причем веса ее посылок изначально
полагаются равными 20 - это означает отключение сканирования
посылок. Оператор истинен, если удается усмотреть истинность $a$,
причем в этом случае пере\-менной $c$ присваивается список
фактически использованных посылок. Реже исполь\-зуется оператор
"сильноизвлекается($a$ $b$ $c$)", отличие которого от предыдущего
состо\-ит только в более высоком максимальном уровне
вспомогательной задачи - 7 вместо 4. Оператор "выводимо($a$ $b$
$c$)" отличается от оператора "извлекается" тем, что ис\-ход\-ные
веса его посылок равны 0, а максимальный уровень обращения $N$
должен устанавливаться заранее с помощью оператора
"уровеньобращения($N$)" (иначе вспо\-могательная задача будет
решаться до текущего уровня текущей задачи). Наиболее
употребительным для вспомогательных проверок при отсутствии
сильных огра\-ни\-чений на привлекаемые средства оказался оператор
"следствие($a$ $b$ $c$ $d$)". У него $a,b$ - проверяемое
утверждение и список посылок; $c$ - набор комментариев,
передаваемых вспомогательной задаче. Если требуется указать также
комментарий $K$ к конкретной посылке $P$ из $b$, то в $c$
заносится элемент (комментарийпосылки $P$ $K$) (сам он не
включается в список комментариев формируемой вспомогательной
задачи). Как и в остальных случаях, выходной переменной
присваивается список использованных при проверке посылок.
Максимальный уровень вспомогательной задачи у этого операто\-ра,
как и у предыдущего, должен устанавливаться заблаговременно с
помощью опе\-ра\-тора "уровеньобращения".

Заметим, что обращение к вспомогательной задаче на доказательство
для провер\-ки истинности утверждения обычно является значительно
более трудоемким, чем использование специализированной проверочной
процедуры для утверждений за\-данного вида. Такие процедуры,
называемые проверочными операторами, легко реа\-лизуются на
ГЕНОЛОГе, и стандартом при компиляции приема является обращение
для проверки истинности условий именно к ним. Существует способ
обратиться к пакетному оператору, не зная его заголовка - для
этого служит оператор "легкови\-деть($a$ $b$ $c$ $d$)". Здесь $a$
- проверяемое утверждение, $b$ - список посылок, $c$ - набор
комментариев, передаваемый проверочному оператору. Выходной
переменной $d$ при\-сваивается список использованных посылок. При
отсутствии специализированного проверочного оператора для
утверждения $a$ оператор "легковидеть" оказывается лож\-ным.

Если прием, реализуемый в контексте некоторой текущей задачи $Z$,
должен об\-ра\-титься к решению вспомогательной задачи на
описание, то используется оператор "вспомописание($Z$ $a$ $b$ $c$
$x$ $y$ $z$)". Здесь $a$ - утверждение, представляющее собой
конъ\-юнкцию условий вспомогательной задачи на описание $A$; $b$ -
список утверждений, из которых извлекаются необходимые для
сопровождения $a$ дополнительные условия этой задачи; $c$ - список
целей. Посылками задачи $A$ становятся все не зависящие от ее
неизвестных утверждения набора $b$. Комментарии к вспомогательной
задаче извлекаются (быть может, модифицированные с помощью
специального справочника) из задачи $Z$. Максимальный уровень $N$
задачи $A$ устанавливается при помощи эле\-мен\-та
(уровеньобращения $N$) из $c$. Выходной переменной $x$
присваивается ответ задачи $A$; $y$ - список использованных
утверждений из $b$; переменной $z$ присваивается сама задача $A$
(версия ее, возникшая по окончании решения). Как и в случае задач
на преобразование, можно сохранить результат решения в буфере для
извлечения его оттуда в случае повторного обращения. Для
подключения буфера в $c$ должен быть занесен элемент "буфер". Роль
буфера играет комментарий (вспомописание $B$) к посылкам исходной
задачи; у него $B$ - набор троек (исходная версия задачи -
результирующая ее версия - ответ). Длина этого набора не более 5.

Если нужно решить вспомогательную задачу на описание
безотносительно к кон\-тексту какой-либо внешней задачи, можно
использовать оператор "быстрописание($a$ $b$ $c$ $x$)". Здесь $a$
- конъюнкция условий вспомогательной задачи; $b$ - список посылок;
$c$ - список целей. Переменной $x$ присваивается ответ задачи.
Веса посылок здесь полагаются равными 20 (блокировка сканирования
посылок); элементы (уро\-вень\-обращения $N$) и (комментарий $K$)
из $c$ определяют максимальный уровень задачи и ее комментарии
$K$.

\section{Арифметические операторы}

\subsection{Десятичные числа}

Напомним, что под десятичным числом в ЛОСе понимается либо цифра
(логический символ от 0 до 9), либо не начинающийся с 0 набор
цифр, возможно, с запятой (логический символ ",") внутри. Для
отрицательных чисел первым элементом набора служит логический
символ "минус". Базисные арифметические операторы ЛОСа позволяют
работать с десятичными записями вплоть до 1000 знаков; в основном,
реализованные на ЛОСе вспомогательные арфметические процедуры не
используют такой возможности и ориентированы на меньшее (хотя тоже
значительное) число знаков.

Кроме уже упоминавшихся ранее базисных операторных выражений ЛОСа,
для работы с десятичными числами созданы операторные выражения
"модуль($a$)", "ми\-нимум($a$ $b$)", "максимум($a$ $b$)",
"целаячасть($a$)". Для возведения числа $a$ в целую
неотрицательную степень $b$ служит выражение
"возведениевстепень($a$ $b$)". Для про\-верки того, что число $a$
больше числа $b$, имеется оператор "больше($a$ $b$)". Заметим, что
для проверки нестрогих неравенств операторы не созданы (быстрее
реализуется отрицание строгого неравенства).

Выражение "неполноечастное($a$ $b$)" позволяет находить целую
часть от деления неотрицательного числа $a$ на положительное число
$b$.

Для перечисления в порядке возрастания всех целых чисел $x$, не
меньших целого числа $m$ и не больших целого числа $n$, служит
оператор "Номера($m$ $n$ $x$)". Бесконеч\-ное перечисление всех
целых чисел $x$ в порядке возрастания их модуля: $0,1,-1,2,\\ -2,
\ldots$ - реализуется оператором "Целое($x$)". Перечисление
обрывается, например, с помо\-щью оператора "сброс" либо "обрыв".

Для усмотрения целых, натуральных и четных чисел созданы операторы
"це\-лое($a$)", "натуральное($a$)", "четное($a$)".

Деление с остатком целого числа $a$ на отличное от нуля целое $b$
выполняется оператором "деление($a$ $b$ $m$ $n$)"; здесь $m$ -
неполное частное, $n$ - неотрицательный остаток. Оператор
"частное($m$ $n$ $k$)" проверяет делимость целого числа $m$ на
ненуле\-вое целое $n$ и выдает частное $k$.

Выражение "нок($m$ $n$)" дает наименьшее общее кратное двух
натуральных чисел $m,n$; выражение "нод($m$ $n$)" - наибольший
общий делитель целых чисел $m,n$.

Оператор "извлечениекорня($a$ $n$ $x$)" перечисляет результаты $x$
извлечения из це\-ло\-го числа $a$ корня степени $n$. Если корень
не извлекается, то оператор ложен; для четного $n$ выдаются два
значения, отличающиеся знаком, для нечетного - одно.

Разложение натурального числа $a$ в произведение степеней простых
чисел выпол\-ня\-ется оператором "множители($a$ $b$ $c$)".
Переменной $b$ присваивается набор простых чисел, переменной $c$ -
набор той же длины, у которого на соответствующих местах находятся
показатели степени данных простых чисел в разложении $a$ на
множители.

Оператор "простыеделители($a$ $b$)" перечисляет все простые
делители $b$ натураль\-но\-го числа $a$. Оператор "делители($a$
$b$)" перечисляет все целочисленные (положи\-тель\-ные и
отрицательные) делители $b$ целого отличного от нуля числа $a$.
Оператор "делитель($a$ $b$ $c$)" получает в качестве входной
информации набор простых чисел $a$ и набор $b$ показателей
степеней этих чисел. Переменная $c$ перечисляет все натуральные
делители произведения данных степеней.

Операторное выражение "числоделителей($a$)" выдает число
натуральных дели\-те\-лей целого числа $a$.

Оператор "степеньделителя($a$ $b$ $c$ $d$)" определяет для целого
$a$ и целого не равного по модулю единице $b$ такое наибольшее
натуральное $c$, что $a$ делится на $b$ в степени $c$ (если $a$ не
делится на $b$, то оператор ложен). Переменной $d$ присваивается
частное от деления $a$ на указанную степень $b$.

Ряд операторов обеспечивают приближенные вычисления с десятичными
чис\-лами. Эти операторы реализованы так, чтобы получать
гарантированные оценки снизу либо сверху - нужное направление
указывается при обращении. В качестве меры точности задается число
знаков после запятой, к которому приводится резуль\-тат (сами эти
знаки, в отличие от направления оценки, не гарантируются; при
необхо\-ди\-мо\-сти получить заданное число точных знаков следует
использовать последова\-тель\-ность встречных оценок с
увеличивающейся точностью).

Для приближенного деления десятичных чисел используется оператор
"десде\-ление($a$ $b$ $c$ $d$ $e$)". У него $a,b$ - делимое и
делитель; $c$ - число знаков после запятой, к которому приводится
результат. $d$ - результат деления; $e=0$, если этот результат
точный, иначе $e=1$. Результат берется с недостатком в смысле
модуля. Альтер\-на\-тивный способ деления - применение
операторного выражения "десчастное($a$ $b$ $c$ $d$)". Здесь $a,b$
- делимое и делитель; $c$ - число знаков после запятой в
результате; $d$ - указатель направления округления. Логический
символ "меньше" означает округле\-ние в сторону уменьшения
значения; логический символ "не" - в сторону увеличения.
Округление к ближайшему выполняется при указателе, равном 0. Эти
же соглашения об округлении используются и в последующих
операторах.

Для округления числа $a$ применяется операторное выражение
"округление($a$ $b$ $c$)", у которого $b$ - число знаков после
запятой, до которого происходит округление; $c$ - указатель
направления округления.

Для извлечения квадратного корня из числа $a$ служит операторное
выражение "квадркорень($a$ $b$ $c$)". Здесь $b$ - указатель
направления округления; $c$ - число знаков после запятой.
Аналогичного вида выражение "экспонента($a$ $b$ $c$)" дает
значение экс\-по\-нен\-ты.

Операторное выражение "натурлог($a$ $b$ $c$)" позволяет вычислять
натуральный ло\-га\-рифм $a$. Указатель направления округления $c$
и число знаков после запятой $b$ здесь переставлены местами.

Для вычисления значений тригонометрических операций (синус,
косинус, тангенс, котангенс, арксинус, арккосинус, арктангенс)
используется оператор "тригоценка($a$ $b$ $c$ $d$ $e$)". Здесь $a$
- значение аргумента; $b$ - логический символ для
тригонометрической операции; $c$ - число знаков после запятой; $d$
- указатель направления округления. Переменной $e$ присваивается
результат.

Объединяет отдельные процедуры для приближенных вычислений с
десятичными числами оператор "числоценка($a$ $b$ $c$ $d$)". Он
позволяет находить приближенное зна\-чение константного числового
терма, вхождение первого символа которого есть $a$. Этот терм
построен из числовых констант, символов "е" и "пи" с помощью
арифме\-тических операций, возведения в степень, логарифмов,
модулей и указанных в опе\-ра\-торе "тригоценка"
тригонометрических функций. $b$ - число знаков после запятой; $c$
- указатель направления округления. Результат присваивается
переменной $d$.

\subsection{Термы, представляющие числовые константы}

Ряд операторов выполняют арифметические вычисления, получая
входные данные в виде термов для числовых констант и возвращая
результат в том же формате. Напомним, что для представления
неотрицательного десятичного числа в виде терма имеются две
возможности: однобуквенный терм, состоящий из логического
символа-цифры, и терм вида "величина($a_1 \ldots a_n$)". где $a_1,
\ldots, a_n$ - цифры, быть может, с единственным символом ",". Для
представления отрицательного числа используется терм вида
"минус($A$)", где $A$ - одного из указанных выше типов. Термы,
представ\-ляющие указанным образом десятичные числа, называем
десятичными записями.

Операторное выражение "сложить($a$)" получает выражение
"плюс($t_1$$t_2$)" для де\-ся\-тичных записей $t_1,t_2$ и выдает
десятичную запись (терм), значением которого служит сумма
$t_1,t_2$. Операторное выражение "сложитьдроби($a$)" получает
выражение ана\-логичного вида, но каждое слагаемое - либо
десятичная запись, либо (с точностью до знака) отношение
десятичных записей натуральных чисел. Значением служит терм -
десятичная запись либо простая дробь, полученная в результате
сложения $t_1,t_2$. Операторное выражение "умножить($a$)" получает
выражение "умножить($t_1$ $t_2$)" для десятичных записей
$t_1,t_2$. Значением его является десятичная запись произведения.
Операторное выражение "натурстепень($a$)" получает выражение
"степень($t_1$$t_2$)", где $t_1$ - десятичная запись, $t_2$ -
десятичная запись целого неотрицательного числа. Зна\-чением
выражения является десятичная запись результата возведения $t_1$ в
степень $t_2$.

Для проверки того, что $v$ - вхождение первого символа десятичной
записи, исполь\-зуется оператор "десзапись($v$)".  Чтобы перейти
от вхождения $v$ первого симво\-ла десятичной записи к десятичному
числу, служит операторное выражение "числзна\-чение($v$)". Для
получения десятичной записи десятичного числа $a$ служит
оператор\-ное выражение "десзапись($a$)".

Оператор "деспорядок($a$ $b$ $c$)" позволяет по вхождению $a$
первого символа деся\-тичной записи положительного числа получать
десятичную запись $b$ натурального числа, полученного из $a$
домножением на наименьшую неотрицательную целую сте\-пень десяти,
и показатель $c$ этой степени (в формате десятичного числа).
Операторное выражение "сдвигзапятой($a$ $b$)" получает вхождение
$a$ первого символа десятичной записи и натуральное десятичное
число $b$. В $a$ предпринимается сдвиг запятой на $b$ разрядов
влево; значением выражения служит десятичная запись результата
сдвига.

Оператор "стандстепень($a$ $b$ $c$ $x$)" получает выражение $a$,
имеющее вид дробной степени натурального числа. $b,c$ - числитель
и знаменатель показателя этой степени (в формате десятичных
чисел). Переменной $x$ присваивается набор выражений -
сомножителей стандартного представления $a$ в виде произведения
дробных степеней различных простых чисел.


Для усмотрения возможности представления числа в виде простой
дроби служит оператор "простаядробь($a$ $b$ $c$)". У него $a$ -
вхождение первого символа выражения $T$. Если это выражение
является десятичной записью либо имеет вид "дробь($A$ $B$)";
"минус(дробь($A$ $B$))", где $A$,$B$ - десятичные записи
натуральных чисел, то находятся целое $b$ и натуральное $c$,
такие, что дробь $b/c$ несократима и равна $T$. В противном случае
оператор ложен. Здесь $b,c$ выдаются в формате десятичных чисел.
Операторное выражение "десдробь($a$ $b$)" получает целое и
натуральное десятичные числа $a,b$. Осуществляется сокращение
дроби $a/b$; если знаменатель результата есть степень десяти, то
выполняется переход к десятичной дроби. Значением выражения служит
терм для результата сокращения дроби. Операторное выражение
"сокращ\-дроби($a$)" получает терм $a$ вида $A/B$, где $A,B$ -
десятичные записи. Его значением является выражение - результат
приведения $a$ к виду простой несократимой дроби (возможно, со
знаком минус).

Операторное выражение "дробнаязапись($a$)" получает десятичную
запись $a$, име\-ющую символ запятой. Значением его служит терм -
результат преобразования $a$ к виду простой несократимой дроби
(возможно, со знаком "минус"). Операторное выражение
"составнаядробь($a$)" получает выражение $a$ вида "дробь($A$
$B$)", где $A,B$ - десятичные записи натуральных чисел, первое из
которых не меньше второго. Значением его служит терм - результат
представления $a$ в виде суммы натурального числа и простой
несократимой дроби, числитель которой меньше знаменателя.

Оператор "констцелое($a$)" получает терм либо вхождение первого
символа терма $a$. Он истинен, если этот терм является десятичной
записью целого числа. Оператор "констдробь($a$)" получает
аналогичную ссылку $a$ на терм и является истинным, если этот терм
имеет вид дроби с натуральными числителем и знаменателем либо
получен из такой дроби добавлением внешнего знака "минус".
Оператор "дробнаявеличи\-на($a$)" получает вхождение $a$ первого
символа некоторого выражения. Он истинен, если данное выражение
является десятичной записью либо (с точностью до знака "минус")
отношением десятичных записей.

\subsection{Вычисления с плавающей запятой}

Для ускоренного вычисления значения выражения в формате с
плавающей запятой предусмотрен базисный оператор "Выч(программа
$A$)", реализующий микропро\-грам\-му $A$. Оператор "вычпрог($a$
$b$ $c$)" позволяет создавать такую микропрограмму $b$ для
вычисления значения выражения $a$. Выходной переменной $c$
присваивается набор вспомогательных констант, используемых данной
микропрограммой. Вход-выходной набор микропрограммы $b$ состоит из
набора значений свободных переменных вы\-ра\-же\-ния $a$,
упорядоченных по возрастанию их номеров (именно так эти переменные
упорядочиваются операторами "параметры", "списокпеременных");
далее идет набор констант $c$, и в конце размещается
результирующее значение.

Операторное выражение "вычконст($a$)" позволяет определять в
формате с плава\-ющей запятой приближенное значение константного
терма $a$. Этот способ вычислений несколько более медленный, чем с
использованием микропрограммы - здесь исполь\-зу\-ется рекурсия по
построению выражения $a$. Впрочем, он на порядки быстрее
вычис\-лений с десятичными числами.

Оператор "вычпроизв($a$ $b$ $c$)" представляет собой усиленный
вариант оператора "вычпрог". Он создает микропрограмму $b$ для
одновременного нахождения значения выражения $a$ и всех первых
частных производных этого выражения по его парамет\-рам. При
обращении к ней данные располагаются так же, как у оператора
"вычпрог", однако после найденного значения $a$ добавляются
значения частных производных по параметрам $a$.

\section{Общие процедуры интерфейса}

Роль интерфейса в логической системе, обучаемой путем интенсивного
интер\-актив\-ного диалога, чрезвычайно велика. Чтобы сделать
легко воспринимаемой информа\-цию, объясняющую процесс решения
задачи, упростить процесс программирования приемов, организовать
работу с базой теорем, развивать комплекс средств
автома\-тического синтеза приемов, и т.п. - приходится постоянно
пополнять интерфейс сис\-темы новыми элементами. Здесь мы
перечислим ряд наиболее часто используемых операторов интерфейса,
указывая сведения, достаточные для их использования, но не приводя
сколь-нибудь детального описания внутреннего устройства оператора.
В наиболее значительных случаях (например, формульный и текстовый
редакторы) такое описание будет приведено отдельно.

\subsection{Клавиатура, мышь и меню}

Обычная организация диалогового режима заключается в обращении к
некоторо\-му оператору ввода информации (например, базисному
оператору ЛОСа "клавиатура\\ ($a$)" ) и последующей обработке
поступившего логического символа $a$ с помощью цепочки проверок
"равно($a$ $S_i$) иначе $j$". После каждого такого оператора
проверки размещается программа процедуры $P_i$, выполняющей те или
иные действия по нажа\-тию клавиши с кодом $S_i$. Чтобы можно было
обратиться к процедуре $P_i$ из другой точки программы, имеется
две возможности - либо создать для этой процедуры отдельный
оператор, к которому и обращаться независимо из разных точек
про\-грам\-мы, либо обеспечить возможность автоматического
переключения из другой точки про\-грам\-мы (например, из другого
диалогового режима) в данный диалоговый режим, и далее - устроить
фиктивный ввод с клавиатуры символа $S_i$. В логической системе,
как правило, реализуется именно вторая возможность, хотя для нее
приш\-лось создать некоторую специальную технику, обеспечивающую
"прыжки" из одного диалогового режима в другой через общую
корневую точку интерфейса (ее роль играет обработчик команд от
главного меню).

Прежде всего, для этого используется оператор
"автоклавиатура($a$)". Он прове\-ряет наличие комментария
(автоклавиатура $A$) к посылкам исходной задачи. Если такой
комментарий имеется, то $A$ - набор логических символов. Из этого
набора извлекается первый символ $s$ и передается выходной
переменной $a$. Набор $A$ укора\-чивается на единицу, и если
становится пустым, то комментарий (автоклавиатура $A$) удаляется.
Если данного комментария нет, то оператор работает так же, как
оператор "клавиатура". Если организовать диалоговый режим с
помощью оператора "автоклавиатура", то появляется возможность
автоматически запускать отдельные его процедуры - для этого
достаточно заблаговременно ввести комментарий (авто\-кла\-виатура
$\ldots$) к посылкам исходной задачи и обеспечить вход в начальную
точку диалогового режима. Если перед оператором "автоклавиатура"
поместить оператор "повторение" (что обычно и делается), то можно
программировать указанным обра\-зом выполнение заданных
последовательностей операций диалогового режима.

Усиленный вариант оператора "автоклавиатура($a$)" \ - оператор
"автоменю($a$)". Он позволяет вводить символ $a$ одновременно с
клавиатуры, от мыши и от меню в верхней части экрана.
Использование им комментария (автоклавиатура $\ldots$) - такое же,
как выше.

Для создания нового меню в верхней части экрана либо изменения
ранее создан\-ного меню предусмотрен специальный интерфейс. Чтобы
войти в него, следует пе\-ре\-йти к главному меню логической
системы и либо нажать клавишу "м" (кир.), либо выбрать пункт
"Ресурсы и установки", а затем - подпункт "Изменение меню". Тогда
появится раздел оглавления, перечисляющего различные используемые
в логической системе меню (тот, который рассматривался при
предыдущем обращении к оглав\-лению). Это оглавление устроено
таким образом, что каждое меню соответствует некоторой его ветви:
в корне ветви находится пункт с текстом, объясняющим
предназ\-начение меню, а внутри ветви - выводимые на экран при
прорисовке меню тексты. Непосредственно к корню ветви примыкает
подраздел ог\-лав\-ления, тексты пунктов которого (как правило,
состоящие из одного слова) вы\-водятся в верхней части экрана.
Неконцевым пунктам этого подраздела соответству\-ет "выпадающее"
подменю (в свою очередь, они тоже могут иметь подменю). Чтобы
указать, на какую клавишу должен реагировать концевой пункт меню,
следует выб\-рать соответствующий концевой пункт оглавления и
нажать "курсор вправо". Тогда в верхней части экрана
перерисовыва\-ет\-ся текст выбранного пункта, а под ним
раз\-ме\-щается (отделенный горизонтальной чертой) логический
символ - код нужной клавиши. Для изменения этого кода (а при его
отсутствии - ввода нового), далее нажимается "Enter" \ -
появляется курсор текстового редактора. Чтобы найти логический
символ - код нужной клавиши, здесь достаточно нажать F8 и сразу за
этим - данную клавишу. По окончании набора символа снова
нажимается "Enter". Если буква, при нажатии на клавишу которой
срабатывает пункт меню, встречается в его тексте, то ее можно
выделить под\-чер\-киванием - для этого в тексте пункта оглавления
перед буквой помещается знак \&. Каждое представленное в
оглавлении меню имеет свой адрес - набор номеров пунктов
оглавления, перемещаясь по которым от корня оглавления, приходим к
корню ветви меню. Номера здесь имеются в виду символьные (т.е. 10
- логический символ "десять", и т.д.). Эти адреса жестко
закрепляются за меню для всех после\-дующих обращений к ним из
различных точек программы. Поэтому переставлять местами пункты
оглавления меню (кроме пунктов внутри отдельного меню) нельзя.

Для вызова (прорисовка в верхней части экрана и активизация) меню,
имеющего адрес $a$, используется оператор "сборкаменю($a$)". Этот
оператор создает комментарий (сборкаменю $a$) к посылкам исходной
задачи, обеспечивающий возможность узнать впоследствии тип
активизированного меню. При обращении к вспомогательным
про\-цедурам иногда приходится менять используемое меню. Для
удобства восстановления меню при выходе из процедуры введены
операторы "сохранениеменю($b$)", "восста\-новлениеменю($b$)".
Первый из них находит комментарий (сборкаменю $a$) и создает на
его основе комментарий (сохранениеменю $a$), а второй - находит
такой комментарий и восстанавливает указанное в нем меню. Входная
переменная $b$ у обоих операторов - фиктивная (например, можно
полагать ее равной 0).

\subsection{Текстовый редактор}

В системе используется текстовый редактор, интерфейс которого был
описан выше (см. "Интерфейс ввода задач"). Он реализуется
оператором "текстредактор($t_1$ $t_2$ $t_3$ $t_4$ $t_5$ $t_6$
$t_7$ $t_8$)". Текстовый редактор использует для работы некоторый
отрезок буфера текстов (массив, хранящий символы с указаним их
цвета и цвета фона; см. описание базисного оператора
"видео($\ldots$)"\ ). $t_1$ есть номер первой ячейки этого отрезка
(нумерация ячеек буфера текстов начинается с 0). $t_2,t_3,t_4,t_5$
суть координаты прямоугольной рамки, в которой осуществляется
редактирование. Здесь $t_2,t_3$ - сим\-вольные номера столбца и
строки для левого верхнего угла рамки, $t_3,t_4$ - символьные
номера столбца и строки правого нижнего угла. Как и обычно, отсчет
строк ведется сверху вниз; нумерация строк и столбцов начинается с
0. $t_6,t_7$ - коды цвета фона и символов, изначально
устанавливаемых при редактировании (как уже отмечалось, они могут
изменяться в процессе редактирования). Выходной переменной $t_8$
при\-сва\-ивается номер последней занятой ячейки буфера текстов
(пустая часть экрана в конце текста автоматически отбрасывается).
Перед началом редактирования проис\-ходит расчистка используемой
области. Чтобы сохранить для редактирования старое изображение,
вместо указания на цвет символов $t_7$ берется равным 0. В этом
случае изначальный цвет символов будет черным. В обоих случаях
буфер текстов перед редактированием не расчищается. Если его
специально не расчистить, то при пере\-ме\-щении курсора по
пустому пространству рамки будут "проявляться" сохраненные в
буфере символы. Поэтому перед обращением к текстовому редактору
рекомендуется расчищать буфер, например, обращением к "видео(0)"
(кроме случаев, когда внут\-ри рамки и в буфере уже имеются
согласованные изображения и редактирование вы\-пол\-няется с целью
их коррекции). В действительности процедура "текст\-редактор"
пред\-ставляет собой нечто большее, чем просто текстовый редактор
- в нее встроена часть интерфейса других блоков логической
системы.

Текстовый редактор достаточно часто используется для набора
логических сим\-волов, термов либо списков логических символов и
термов. В этом случае после набора применяется базовый оператор
"кодтекста($a$ $b$ $c$)", который анализирует со\-держимое буфера
текстов и либо выдает результат $b$ - при $c=0$, либо, при $c \ne
0$, выдает информацию ($b$,$c$) о допущенной ошибке. Чтобы
прорисовать сообщение о такой ошибке в нижней правой части экрана,
используется оператор "указатель\-ошибки($b$ $c$
$t_1$$t_2$$t_3$$t_4$)". Здесь $t_1,t_2,t_3,t_4$ - координаты рамки
оператора "текстредак\-тор", используемые для определения места
ошибки в этой рамке. Данные об этом месте пересылаются в
комментарий (теквхожд $A$ $B$) к посылкам исходной задачи. Если
после обнаружения ошибки реализуется откат к повторному
редактированию (с сохранением ранее набранного текста), то в
начале его текстовый редактор авто\-ма\-тически переместит курсор
к месту ошибки.

Для сравнения двух фрагментов буфера текстов, расположенных между
пози\-циями $a,b$ и $c,d$, служит оператор "равнтекст($a$ $b$ $c$
$d$)". Оператор "большиебуквы($a$ $b$)" заменяет все маленькие
русские буквы, расположенные в буфере текстов начиная с позиции
$a$ и кончая позицией $b$, на большие русские буквы. Операторное
выражение "малбуква($a$)" по коду $a$ большой буквы (латинской
либо кириллической) выдает код соответствующей малой буквы.
Операторное выражение "болбуква($a$)" выполняет обратный переход.
Если логический символ $a$ в двух последних случаях не
удовлет\-воряет указанным условиям, то возвращается значение $a$.

\subsection{Формульный редактор}

Интерфейс формульного редактора был описан выше ("интерфейс ввода
задач"). Этот редактор реализуется оператором
"формредактор($t_1$$t_2$$t_3$$t_4$$t_5$$t_6$$t_7$$t_8$$t_9$$t_{10}$)".
Данный оператор используется в двух различных режимах - либо для
ввода нового терма, либо для создания структуры данных,
позволяющей прорисовать на экране уже имеющийся терм. У него
$t_1,t_2,t_3,t_4$ - координаты рамки редактирования (в таком же
формате, как у текстового редактора); $t_5$ - код цвета фона;
$t_6$ - либо код цвета символов (при ручном вводе нового терма),
либо ранее созданный терм, который нужно прорисовать на экране.
Выходной переменной $t_7$ присваивается так называемое дерево
указателей - структура данных, позволяющая непосредственно
прорисовать терм на экране; выходной переменной $t_8$ - введенный
при редактировании терм; $t_9$ - символьный номер для правого
столбца собственной рамки набранного терма; $t_{10}$ присваивается
пара ($N_1 N_2$) символьных номеров верхней и нижней строк
собственной рамки терма. Если оператор реализуется во втором
режиме (то есть $t_6$ - терм), то он ничего не прорисовывает на
экране, а лишь создает структуру данных $t_7$.

Для прорисовки терма по заданному дереву указателей, а также для
выполнения ряда других действий с этим деревом используется
оператор "блокредактора($n$ $a_1\\ \ldots a_m$)". Фактически он
представляет собой семейство независимых подоператоров, причем $n$
- номер (символьный) подоператора этого семейства. Не уточняя
здесь формата самого дерева указателей (это будет сделано в
разделе, специально по\-свя\-щенном программной реализации
формульного редактора), приведем краткое описание некоторых из
подоператоров оператора "блокредактора".

При $n=2$ подоператор позволяет корректировать дерево указателей
для па\-рал\-лельного сдвига изображения. У него $a_1$ - пара
($d_1 d_2$), указывающая направление $d_1$ (0 - влево, 1 - вправо)
и величину $d_2$ (число пикселей, символьный номер) сдвига по
горизонтали; $a_2$ - пара ($e_1 e_2$), указываюшая направление
$e_1$ (0 - вверх, 1 - вниз)и величину $e_2$ сдвига по вертикали.
$a_3$ есть максимально допустимая при сдвиге вели\-чи\-на номера
строки изображения (при превышении ее оператор ложен), $a_4$ -
коррек\-ти\-руемое дерево указателей.

При $n=3$ подоператор осуществляет прорисовку терма по его дереву
указателей. В этом случае $a_1,a_2$ - цвет фона и символов; $a_3$
- дерево указателей. $a_4$ - либо 1 (обычная прорисовка), либо 0
(виртуальная прорисовка, при которой на экране ничего не
изменяется и которая служит для определения позиции курсора после
прорисовки терма), либо символьный номер $n+1$, где $n$ - номер
строки, начиная с которой происходит явная прорисовка (вышележащая
часть терма на экран не выводится). Последние две возможности
являются техническими и используются внутри программы формульного
редактора. Выходным переменным $a_5,a_6$ при\-сва\-иваются
символьные номера столбца и строки, на которых размещается курсор
по окончании прорисовки терма.

При $n=8$ подоператор осуществляет перевод дерева указателей,
полученного при ручном вводе терма, в терм. Здесь $a_1$ - дерево
указателей; выходной переменной $a_2$ присваивается терм. При
обнаружении ошибки в наборе терма оператор ложен.

При $n=9$ подоператор осуществляет определение самой верхней из
строк, заня\-той символами подтерма. У него $a_1$ - дерево
указателей; $a_2$ - выходная переменная, которой присваивается
символьный номер указанной строки.

Формульный редактор использует некоторое фиксированное
сопоставление пе\-ре\-менным их обозначений. Переменные от первой
до двадцать пятой обозначаются последовательными малыми латинскими
буквами; начиная с двадцать шестой идут большие латинские буквы;
далее - те же латинские буквы с индексами. Оператор
"видпеременной($a$ $b$ $c$)" позволяет находить по переменной ее
обозначение и обратно. Если $b=0$, то он определяет по переменной
$a$ пару $c$, первый элемент которой есть логический символ - код
латинской буквы, второй элемент - 0 либо индекс в формате
десятичного числа. Если $b=1$, то он по паре $c$ указанного вида
выдает соответствующую переменную $a$. Чтобы прорисовать заданную
переменную в за\-данном месте экрана так, как это делает
формульный редактор, служит оператор "записьпеременной($t_1$ $t_2$
$t_3$ $t_4$ $t_5$ $t_6$ $t_7$)". У него $t_1,t_2$ - символьные
номера столбца и строки для прорисовки; $t_3$ - переменная;
$t_4,t_5$ - цвет фона и символов. Выходным переменным $t_6,t_7$
присваиваются символьные номера столбца и строки позиции,
рас\-положенной после прорисованной переменной. В некоторых
ситуациях (например, в редакторе приемов ГЕНОЛОГа) приходится
одновременно работать с формульным и текстовым редактором, где
переменные обозначаются как х$i$, и тогда возникает необходимость
в таблице-подсказке, указывающей соответствие между разными
обо\-значениями одной и той же переменной. Такая таблица
прорисовывается оператором "обозначпеременных($a$ $b$ $c$)". У
него $a$ - терм либо набор термов; $b$ - номер первой строки на
экране, начиная с которой будет прорисовываться соответствие между
формульными и текстовыми обозначениями. Таблица представляет собой
список разделенных запятыми пар "формульное обозначение переменной
- текстовое ее обо\-значение"; она прорисовывается голубым цветом.
Выходной переменной $c$ присваи\-вается символьный номер первой
строки под таблицей.

Чтобы можно было выделять подтермы прорисованного терма,
перекрашивая их в другой цвет, нужно определять соответствие между
вхождениями в терм и поддеревьями дерева указателей. Для этого
используется оператор "формподтерм($a$ $b$ $c$ $d$)". Здесь $a$ -
терм; $b$ - его дерево указателей; $c$ - вхождение подтерма в $a$.
Выходной переменной $d$ присваивается поддерево дерева $b$,
необходимое для перекраски $c$. Пере\-краска выполняется
оператором "блокредактора(3 $\ldots$)", в котором выбран требуемый
цвет символов. Заметим, что не для всех вхождений в терм такое
выделение поддерева указателя возможно; если оно невозможно, то
оператор ложен. Приведем еще один оператор аналогичного типа (он
используется оператором "формподтерм") - "форм\-операнды($a$ $b$
$c$)". Здесь $a$ - дерево указателей; $b$ - вхождение терма,
которому соответ\-ствует $a$. Переменная $c$ перечисляет пары
"дерево указателей для максимального допускающего отдельную
прорисовку подтерма терма $b$ - вхождение корня этого подтерма".

При решении задач иногда приходится вводить новые переменные.
Чтобы при прорисовке этих переменных формульным редактором
придерживаться обычных соглашений, принятых для обозначения
объектов заданного типа (целые числа - буквы $m,n,k,\ldots$; точки
плоскости - $A,B,C, \ldots$; функции - $f,g,h, \ldots$, и т.п.),
можно использовать оператор "обозначения($a$ $b$ $c$)". У него $a$
- указатель способа выбора новой переменной; $b$ - набор
информационных элементов, уточняющих этот способ. Выходной
переменной $c$ присваивается новая переменная. Рассматриваются
сле\-ду\-ющие способы выбора новой переменной:

1. $a$ = "задача". В этом случае $b$ - тройка (задача $Z$ -
переменная $x$ - набор переменных $A$). Выбирается такая новая
переменная $y$, которая будет замещать в задаче $Z$ переменную
$x$, и при этом не входит в набор $A$. Здесь оператор применяется
в ситуации, когда обозначение переменной, быть может, неудачное,
уже было введено, и требуется выполнить его коррекцию.

2. $a$ = "неизвестная". В этом случае $b$ - список переменных, от
которых должна отличаться новая неизвестная.

3. $a$ = "теорема". В этом случае $b$ - тройка (терм $T$ -
переменная $x$ - набор переменных $A$). Выбирается такая новая
переменная $y$, которая будет замещать в терме $T$ переменную $x$,
и при этом не входит в набор $A$. Как и в случае 1), здесь имеет
место коррекция уже введенного, быть может, неудачного,
обозначения для переменной $x$ теоремы $T$ из базы теорем.

4. $a$ = "целое". В этом случае $b$ - список переменных, от
которых должен отличать\-ся новый целочисленный параметр.

5. $a$ = "функция". В этом случае $b$ - задача, для которой
выбирается новый символ функциональной переменной.

6. $a$ = "точка". В этом случае $b$ - список переменных, от
которых должно отличать\-ся обозначение новой точки.

При обучении системы и расширении ее логического языка приходится
постоянно расширять формульный редактор. Для тех случаев, когда
достаточно использовать в "формульной" записи слово, обозначающее
новый логический символ, эта операция автоматизирована - см.
разделы, посвященные языку ГЕНОЛОГ. Если же нужно вводить новую
символику, то для расширения формульного редактора может
пона\-до\-биться более глубокое знакомство с его архитектурой. Эта
архитектура описывается далее в специальном разделе.

\subsection{Геометрический редактор}

Интерфейс геометрического редактора был описан в разделе,
посвященном редак\-ти\-рованию задач. Этот редактор предназначен
для построения простейших чертежей в задачах по планиметрии. Он
реализуется оператором "геомредактор($t_1$ $t_2$ $t_3$ $t_4$ $t_5$
$t_6$ $t_7$ $t_8$)". Здесь $t_1,t_2,t_3,t_4$ - координаты рамки
редактирования (столбец и строка верхнего левого угла; столбец и
строка правого нижнего угла); $t_5,t_6$ - цвет фона и цвет линий.
$t_7$ - структура данных чертежа, представляющая собой пару
($A_1,A_2$). $A_1$ есть набор пятерок ($x a_1 a_2 b_1 b_2$),
указывающих координаты ($a_1,a_2$) различных точек $x$ чертежа и
координаты ($b_1,b_2$) позиций, на которых размещаются
обозначающие точки переменные. $x$ - переменная, обозначающая
точку; $a_1,a_2,b_1,b_2$ - символьные номера. В координате сначала
идет номер столбца, затем - номер строки. $A_2$ есть набор
информационных элементов, определяющих прорисовку. Типы этих
элементов таковы: (точка $x$) - прорисовка точки $x$; (отрезок
$x_1$ $x_j$) - прорисовка отрезка с концами $x_i,x_j$; (прямая
$x_i$ $x_j$) - прорисовка прямой, проходящей через точки $x_i,x_j$
(до границ рамки); (окружность $x_i$ $a$) - прорисовка окружности
с центром в точке $x_i$ и радиусом $a$. Здесь $a$ - символьный
номер, определяющий величину радиуса в пикселях. Оператор
"геомредактор" сначала выполняет прорисовку чертежа; если $t_8 =
0$, то на этом его работа завершается. Если же $t_8 = 1$, то после
прорисовки реализуется интерфейс редактирования чертежа. При
создании нового чертежа вво\-дится структура данных с пустыми
списками $A_1,A_2$.

Оператор "блокчертежа($n a_1 \ldots a_m$)" представляет собой
семейство вспомо\-га\-тель\-ных подоператоров для работы со
структурой данных чертежа. Приведем здесь несколько наиболее
важных подоператоров.

При $n=1$ значением $a_1$ служит структура данных чертежа;
выходная переменная $a_2$ выдает номер нижней строки, занятой
чертежом.

При $n=2$ реализуется коррекция структуры данных чертежа,
соответствующая его параллельному переносу. Значением $a_1$ здесь
служит набор (геомредактор $A_1$ $A_2$ $A_3$), обычно используемый
в качестве комментария к посылкам задачи, указывающе\-го на
сопровождающий задачу чертеж. $A_1$ - структура данных чертежа;
$A_2,A_3$ - символьные номера верхней и нижней строк чертежа.
Сдвиг чертежа по горизонтали определяется парой $a_2 = (b_1,b_2)$;
в случае $b_1=0$ происходит сдвиг влево, при $b_1 = 1$ - сдвиг
вправо; $b_2$ - величина сдвига (символьное число). Сдвиг по
вертикали определяется парой $a_3 = (c_1,c_2)$. $c_1=0$ - сдвиг
вверх, $c_1=1$ - вниз; $c_2$ - величина сдвига.

При $n=5$ значением $a_1$ является структура данных чертежа;
переменной $a_2$ присваивается символьный номер верхней строки
чертежа.

Чтобы выбирать на чертеже позицию для размещения буквенного
обозначения заданной точки, служит оператор "выборпозиции($t_1$
$t_2$ $t_3$ $t_4$ $t_5$ $t_6$)". У него $t_1$ - струк\-тура данных
чертежа; $t_2,t_3$ - столбец и строка для положения новой точки на
чертеже. Позиция для прорисовки обозначения этой точки выбирается
исходя из соображений наименьшего наложения этого обозначения на
другие элементы чертежа. Перемен\-ным $t_4,t_5$ присваиваются
столбец и строка для прорисовки; $t_6$ - оценка степени наложения.
При определении последней используется оператор
"оценкапозиции($t_1$ $t_2$ $t_3$ $t_4$ $t_5$ $t_6$)". У него $t_1$
- структура данных чертежа; $t_2,t_3$ - координаты для прорисовки
обозначения точки; $t_4,t_5$ - координаты точки. Переменной $t_6$
присваивается оценка степени наложения.

Для сохранения чертежа в информационном блоке он перекодируется в
набор термов, который и заносится в некоторый логический терминал.
Используются термы следующих типов: "переменная($x$
$a_1$$a_2$$b_1$$b_2$)" \ - код пятерки ($x a_1 a_2 b_1 b_2$) из
$A_1$; "точ\-ка($x$)"; "отрезок($x_i x_j$)"; "прямая($x_i x_j$)";
"окружность($x_i r$)" \ - коды элементов $A_2$;
"на\-ча\-ло($n_1$)"; "конец($n_2$)"; "левыйкрай($n_3$)";
"правыйкрай($n_4$)" \ - указатели на верхнюю, нижнюю, левую и
правую границы рамки чертежа. $n_1,n_2,n_3,n_4$ суть символьные
номера; ука\-затели левой и правой границ могут отсутствовать.
Кроме того, могут использоваться некоторые дополнительные пометки
(например, логический символ "чертеж" \ - ука\-за\-тель на то, что
чертеж был построен решателем самостоятельно).

Оператор "регистрациячертежа($a$ $b$ $c$ $d$)" выполняет запись
чертежа в активый информационный блок. У него $a$ -
указатель-список данного блока; $b$ - структура данных чертежа;
$c$ - пара (верхняя строка рамки чертежа - нижняя строка рамки);
$d$ - метка, по которой описание чертежа заносится в указатель
$a$. Оператор "чтениечер\-тежа($a$ $b$ $c$ $d$)" получает в
качестве входных данных указатель-список $a$ активного
информационного блока и метку $b$, по которой от $a$ имеется
переход к логическому терминалу с описанием чертежа. Переменной
$c$ присваивается структура данных чертежа, переменной $d$ - пара
(верхняя строка рамки - нижняя строка рамки) либо (если в
логическом терминале имелись элементы "левыйкрай($\ldots$)",
"правый\-край($\ldots$\\ )") четверка (верхняя строка - левый
столбец - правый столбец - нижняя строка).


\subsection{Просмотр термов и списков}

Оператор "просмотртерма($a$ $b$ $c$ $d$)" реализует интерфейс
выбора подтерма в терме, прорисованном текстовым редактором (то
есть в скобочной записи). Перед обра\-щением к этому оператору
терм уже должен быть прорисован на экране. $a$,$b$ -
сим\-воль\-ные номера столбца и строки для первой буквы терма, $c$
- исходная позиция в буфере текстов, начиная с которой был
размещен при прорисовке этот терм, $d$ - пара (терм - указатель
заранее выделенного подтерма). Последний указатель при отсутствии
выделения равен 0, иначе он представляет собой вхождение первого
сим\-вола выделенного подтерма. Прежде всего оператор
перекрашивает фон терма в светло-голубой, меняет цвет символов
выделенного подтерма (если он имелся) в светло-пурпурный, и
выделяет желтым цветом фона первый корневой операнд всего терма.
Далее включается интерфейс выбора подтерма: нажатия клавиш "курсор
влево - курсор вправо" позволяют перемещаться в группе операндов
одной и той же операции. Для исходной ситуации это означает
возможность выбора, путем пере\-крас\-ки фона в желтый цвет, нужно
корневого операнда терма. Если нужно выбрать операнд текущей
выбранной операции, то нажимается клавиша "курсор вниз" - это
приводит к перекраске в особый цвет фона первого операнда этой
операции; далее клавишами "курсор влево-курсор вправо" выбирается
нужный ее операнд. Цвета фо\-на при перемещении вглубь терма
изменяются циклически: светло-голубой, желтый, светло-зеленый,
светло-пурпурный, светло-серый. Если нужно вернуться от
операн\-дов к внешней операции, то нажимается клавиша "курсор
вверх". Нажатие ее для уровня корневых операндов означает выход из
процедуры (оператор при этом будет истинным). Для немедленного
выхода из процедуры нажимается "Esc" (оператор в этом случае
истинен). Можно передавать указатель выбранного вхождения (терм
вида "фикс($\ldots$)" внешним процедурам. Для этого перед
обращением к оператору следует ввести комментарий
(указательвхождения 0) к посылкам исходной задачи. Нажатие любой
клавиши, отличной от перечисленных выше, вызовет (при наличии
такого комментария) обрыв просмотра и замену последнего разряда
комментария на указатель "фикс($\ldots$)". Оператор в этом случае
будет ложен. При отсутствии комментария (указательвхождения $A$)
оператор выполняет ряд дополнительных дей\-ствий. В частности,
выбор подтерма может быть выполнен однократным нажатием левой
клавиши мыши при размещении ее курсора на начальной позиции
подтерма. Нажатие правой клавиши мыши вызовет переход к просмотру
справочной инфор\-мации о выделенном (мышью либо клавиатурой)
логическом символе. Такой же переход вызывает нажатие клавиши F3.
Наконец, ряд специальных функций опера\-то\-ра "просмотртерма"
связан с конкретными блоками системы, использующими этот оператор
(например, с отладчиком ЛОСа). Оператор "просмотртерма" можно
исполь\-зовать для прорисовки на экране всей многоцветной схемы
выделения заданного подтерма (помимо одноцветного выделения через
$d$) - для этого перед обращения к нему достаточно создать
комментарий (автоклавиатура $A$), у которого $A$ -
последо\-ва\-тельность нажатий клавиш, необходимых для входа в
указанный подтерм. Если после прорисовки нужно сразу выйти из
оператора, то в конце $A$ добавляется нажатие клавиши "Esc".
Создавать комментарий (автоклавиатура $A$) в указанной ситуации
можно с помощью оператора "входвтерм($a$ $b$ $c$)". У него $b$ -
то вхождение в терм $a$, которое нужно выделить. Если $c=0$, то в
конце $A$ добавляется код клавиши "Esc".

Чтобы определять вхождение того подтерма, который выделяется
курсором мы\-ши, можно применять оператор "вхождениемыши($t_1$
$t_2$ $t_3$ $t_4$ $t_5$ $t_6$ $t_7$)". У него $t_1,t_2$ -
символьные номера столбца и строки для начальной позиции терма
$t_4$, выданного на экран в скобочной записи; $t_3$ - исходная
позиция в буфере текстов для этого терма; $t_5,t_6$ - символьные
номера столбца и строки для текущей позиции курсора мыши. Если
этот курсор расположен в области прорисовки терма, то $t_7$
присваивается соответствующее вхождение в терм, иначе оператор
ложен.

Для просмотра заданного списка термов и выбора нужного терма
служит опера\-тор "просмотртермов($a$ $b$ $c$ $d$ $e$)". У него
$a$ - набор термов; $b$ - символьный номер изначально выделенного
терма в наборе $a$ (нумерация начинается с 1); $c$ - 0 либо
структура данных для прорисовки списка термов, которая создается
самим операто\-ром. Если при просмотре был выбран некоторый терм
(курсор вправо на выделенном терме), то выходной переменной $d$
присваивается символьный номер выбранного терма, выходной
переменной $e$ - результирующая структура данных для прорисовки
списка термов. Эта структура данных при повторном обращении к
оператору может использоваться как входной параметр $c$ и ускорить
очередную прорисовку. Если выход из просмотра терма произошел по
нажатии клавиши "Esc", либо "курсор влево", либо по нажатии правой
клавиши мыши, то оператор ложен. При прорисовке термы нумеруются;
если это возможно, происходит их выдача в формульном виде, иначе -
в скобочном. Номер выделенного терма перекрашен в голубой цвет.
Смена выбранного пункта - либо клавиши "курсор вверх", "курсор
вниз", либо постранич\-ный шаг - "Page Up", "Page Down".

Для просмотра и (частично) редактирования списка объекта
произвольных типов используется оператор "просмотрсписка($a$)". У
него $a$ - структура данных просмотра - набор информационных
элементов, определяющих просматриваемый список и ре\-жим
просмотра; типы этих элементов приводятся ниже. Интерфейс данного
опе\-ра\-тора развит в значительно большей степени, чем у
оператора просмотра списка термов. Помимо прорисовки термов (в
формульной либо скобочной записи), проис\-хо\-дит прорисовка
отдельных логических символов, наборов, вхождений в наборы и
термы, чисел в формате с плавающей запятой. Каждый элемент
просматриваемого списка выдается после своего номера начиная с
отдельной строки. Если элемент - логический символ, после номера
идет закрывающая скобка, иначе - точка. При прорисовке набора те
его элементы, которые суть логические символы и символы
переменных, изображаются непосредственно; прочие элементы
обозначаются одной из букв: "т" \ - терм, "в" \ - вхождение, "н" \
- набор. При прорисовке вхождения в набор либо терм происходит
выделение разряда набора либо подтерма по заданному вхождению
голубым цветом. Число в формате с плавающей запятой выдается как
терм "набор($M$ $P$)"; $M,P$ - десятичные записи, где обычно $P$
равно 0. Число, опре\-де\-ляемое таким термом, есть произведение
$M$ на десять в степени $P$. Номер текущего просматри\-ва\-емого
элемента выделен голубым цветом; смена этого элемента
проис\-хо\-дит с помощью клавиш "курсор вверх" \ - "курсор вниз" и
(постраничная прокрутка) "Page Up" \ - "Page Down". Переход к
первому либо последнему пункту части списка, прорисован\-ной на
экране - "Ctr-курсор вверх" и "Ctr-курсор вниз". Оператор имеет
два буфера - для единичного выбранного элемента либо группы
элементов. Занесение текущего элемента в первый буфер
(информа\-ци\-он\-ный элемент (терм $T$)в структуре данных
просмотра) с исключением из него ранее имевшегося элемента
происходит при нажа\-тии "Ctr - ы"; занесение текущего элемента во
второй буфер (инфор\-ма\-ци\-онный элемент (буфер $B$)) либо
исключение из него - при нажа\-тии "б". Номера элементов,
занесенных во второй буфер, выделяются красным цветом. Для
перехода к общему формульному режиму просмотра (выбран по
умолчанию) нажимается "м", для перехода к скобочному режиму - "с".
Выход из просмотра осуществляется следующими способами: (а)
нажатием клавиши "курсор вправо" на текущем пункте - в этом случае
оператор истинен; (б) нажатием клавиш "Esc" либо "пробел" либо
"курсор влево" - в этом случае оператор ложен. Оператор
предоставляет возможность изменять просматриваемый список. Если
нужно добавить в конце списка новый терм формульным редактором,
нажимается клавиша "Enter"; если это нужно сделать текстовым
редактором, клавиша "т". При добавлении в конце списка набора
логи\-ческих символов и термов также используется текстовый
редактор, но здесь должна быть нажата клавиша "н". Чтобы добавить
в конце списка элемент $T$ из буфера (терм $T$), служит клавиша
"ы". Аналогичные операции, выполняемые не в конце списка, а перед
текущим его элементом, инициируются клавишами "Ф", "Т", "Н", "Ы".
Если нужно изменить текущий элемент, используются клавиши "Ctr-ф"
(формульный ре\-дактор), "Ctr-т", "Ctr-н" (текстовый редактор для
термов и наборов). Исключение текущего элемента списка -
"Ctr-Del". Для просмотра соответствия обозначений использованных в
списке переменных при прорисовке их формульным и текстовым
редакторами нажимается клавиша "х". По завершении просмотра и
редактирования, информация о выбранных элементах (в том числе о
последней текущей позиции списка) и об имевших место изменениях
извлекается из соответствующих информа\-ци\-онных элементов
структуры данных просмотра. Перечислим типы этих элементов:

1.(набор $A$) - $A$ есть просматриваемый набор;

2.(позиция $N$) - $N$ есть символьный номер текущего
просматриваемого разряда набора $A$ (нумерация начинается с 1);

3.(область $h_1$ $h_2$) - $h_1,h_2$ суть символьные номера верхней
и нижней строк полосы, отведенной для просмотра списка;

4."текстредактор" \ - термы и переменные выдаются на экран при
помощи текс\-то\-вого редактора;

5."сквознойпросмотр" \ - выход по нажатии клавиши "курсор вправо"
осущест\-вля\-ется только на позициях списка, являющихся наборами
либо вхождениями в наборы;

6."выход" \ - немедленный выход после прорисовки начала списка,
без обращения к клавиатуре;

7."номера" \ - блокировка прорисовки номеров пунктов;

8.(терм $T$) - буфер для сохранения выбранного терма; при нажатии
клавиши "курсор вправо" на текущем терме происходит замена $T$ на
этот терм.

9."обл" \ - при нажатии клавиши "пробел" выход из процедуры
происходит по зна\-чению "истина".

10."текстоваязадача" \ - выход по нажатии клавиши "Enter";

11. (примечание $K$) - $K$ есть набор примечаний к
просматриваемому набору;

12. (cм $S$) - $S$ есть набор сопровождающих термы основного
набора объектов. При удалении элемента основного набора такое же
удаление выполняются в наборе $S$. Если элемент набора $S$ -
набор, содержащий логический символ "плюс", то при прорисовке на
экране после номера соответствующего пункта ставится знак $+$;
если элемент набора $S$ - набор, содержащий логический символ
"минус", то после этого номера ставится знак $-$. Если элемент
набора $S$ - набор, содержащий логический символ "см", то после
номера ставится знак вопроса; если элемент набора $S$ - набор,
содержащий логический символ "См", то после номера ставится
восклицательный знак.

13. (буфер $B$) -  в накопителе $B$ содержится список номеров
выделенных при просмотре списка элементов.

Обязательными при обращении к оператору являются элементы типов
1-3, к которым должен быть добавлен также набор (видео \
пустоеслово).

Оператор "просмотрсписка" не позволяет просматривать компоненты
наборов сво\-его списка. Чтобы такой просмотр стал возможен,
применяется оператор "сквозной\-просмотр($a$)". У него $a$ - та же
структура данных просмотра, что и у оператора "просмотрсписка".
Интерфейс отличается от интерфейса последнего оператора лишь тем,
что по нажатии на текущем пункте клавиши "курсор вправо" , если
этот пункт представлял собой набор либо вхождение в набор,
происходит переход к просмотру этого набора. Если текущий пункт не
являлся набором, то нажатие клавиши "курсор вправо" игнорируется.
Для возвращения в просмотр внешнего набора нажимается любая из
клавиш "курсор влево" , "Esc", "пробел", "End".

\subsection{Текстформульный редактор}

Для создания и просмотра форматированных текстов с вставленными в
них фор\-му\-лами и чертежами применяется текстформульный
редактор. В системе с его помощью реализованы общий справочник и
(частично) интерфейс просмотра задач, в том числе интерфейс
редактирования задач на текстовый анализ. Текст составляется из
элементов, создаваемых текстовым, формульным и геометрическим
редакторами. Между этими элементами могут вставляться указатели
абзаца, пустой строки и пропуска заданного числа позиций (без
перехода на новую строку). Реализуется текстформульный редактор
оператором "текстформ($a$ $b$)", который получает в ка\-чес\-тве
входного данного текстформульную структуру $a$ и набор $b$
информационных элементов, определяющих режим редактирования.
Текстформульная структура со\-держит полное описание
редактируемого текстформульного массива, причем это описание
хранится не в файлах, а в оперативной памяти. Поэтому после
применения оператора "текстформ" необходимо сохранить в файлах
имевшие место изменения - такие действия предусматриваются особо в
тех блоках интерфейса, которые об\-ра\-ща\-ются к текстформульному
редактору.

Начнем с описания интерфейса текстформульного редактора.
Завершение ре\-дак\-тирования происходит единственным способом -
по нажатии клавиши "End"; в этом случае результаты редактирования
будут сохранены. Для отмены редактирования можно использовать
клавишу "курсор влево" либо "Esc" - естественно, без сохранения
результатов редактирования. При просмотре текстформульного массива
можно при\-менять обычную прокрутку с помощью клавиш "курсор
вверх", "курсор вниз" и клавиш "PageUp", "PageDown".

В различных операциях используется выделение элемента
текстформульного мас\-сива. Такое выделение осуществляется мышью:
ее курсор подводится в поле рас\-смат\-риваемого элемента, и
нажимается левая клавиша мыши. Выделенный элемент перекрашивается
в синий цвет. Повторное нажатие левой клавиши мыши отменяет
выделение элемента. При выделении нового элемента старое выделение
автоматичес\-ки сбрасывается. Выделение элементов требует
осторожности, так как оно подготав\-ливает выполнение различных
операций, и случайное нажатие клавиши может при\-вести к
нежелательным последствиям.

Для ввода нового текста, формулы либо чертежа используются,
соответственно, уже описанные ранее текстовый, формульный либо
геометрический редакторы. Если добавление нового элемента
происходит в конце текстформульного массива, то нужно с помощью
прокрутки освободить в нижней части экрана достаточное место и
нажать одну из следующих клавиш:

а) Ввод нового текста - либо нажать "Enter", либо нажать "т".

б) Ввод новой формулы формульным редактором - нажать "ф" \
маленькое.

в) Ввод новой формулы текстовым редактором - нажать "Ф" \ большое.

г) Ввод чертежа - нажать "ч".

Это обеспечивает вход в необходимый редактор; по завершении
редактирования элемент добавляется непосредственно после
предыдущего (если оставалось место в строке, занятой предыдущим
элементом, то - начиная с первой свободной позиции этой строки;
исключение составляет лишь чертеж, который всегда помещается
на\-чи\-ная с новой строки). Возможна отмена редактирования (Esc).

Если нужно вставить новый элемент перед ранее созданным элементом,
то этот элемент сначала выделяется, и затем выполняются указанные
выше действия а) - г).

Если нужно, чтобы новый элемент начинался с новой строки, то перед
его вводом нажимается клавиша "а" (абзац). Если элемент уже был
введен, и требуется сделать его начинающимся с новой строки, то
этот элемент выделяется левой клавишей мыши и нажимается "а".
Аналогичным образом вводится пропуск строки - перед набором нового
элемента нажимается "с" либо после выделения ранее набранного
элемента нажимается "с".

Для вставки пробелов перед выделенным элементом следует выбрать
пункт меню "Пробелы" либо нажать клавишу пробела, после чего
нажать левую клавишу мыши на той позиции, до которой следует
сдвинуть начало выделенного элемента. Сдвиг осуществляется только
в рамках одной строки, без перехода на следующую строку.

Для удаление введенных перед выделенным элементом пробела, абзаца
либо про\-пуска строки следует нажать клавишу "Ctr-п".

Для изменения текста, формулы либо чертежа предпринимается нажатие
правой клавиши мыши в области данного элемента. Если нужно
изменить формулу фор\-мульным редактором, то предварительно эта
формула выделяется. Иначе ее измене\-ние будет выполняться
текстовым редактором.

Для удаления элемента он сначала выделяется, а затем нажимается
"Ctr-Del". Пробелы, абзацы и пропуски перед удаленным элементом
сохраняются. Поэтому перед удалением концевого элемента
целесообразно сначала удалить предшествую\-щие ему пробелы и
пропуски.

Для перестановки выделенного элемента на новую позицию курсор мыши
подво\-дится в область того элемента, перед которым требуется
расположить выделенный элемент. Затем нажимается правая клавиша
мыши. Если правая клавиша нажимает\-ся вне областей элементов
массива, то выделенный элемент переносится в конец массива.

Текстформульный редактор использует для временного хранения в
оперативной памяти текстовых фрагментов так называемый массив
текстов (см. выше базисные операторы ЛОСа  "видео(начало)",
"видео(конец)", "видео(образ $\ldots$)", "видео(про\-образ
$\ldots$), "видео(сброс $\ldots$)", "видео(заменавхождения
$\ldots$)", "видео(см $\ldots$)", "видео\\ (посылка $\ldots$)",
"видео(вычеркивание $\ldots$)"). Этот массив позволяет сохранять
до 56000 букв; текстовые фрагменты в него заносятся из буфера
текстов и возвращаются тоже в буфер текстов.

 Как уже отмечалось выше, входными данными оператора
"текстформ($a$ $b$)" яв\-ля\-ются текстформульная структура $a$ и
набор информационных элементов $b$. Текст\-фор\-мульная структура
представляет собой набор ($S$) длины 1, состоящий из набора $S$
элементов, определяющих последовательно расположенные
текстформульные фраг\-менты. Типы этих элементов таковы:

 1) (слово $A_1$ $A_2$) - $A_1$ и $A_2$ суть символьные номера
 начала и конца текстового фрагмента в массиве текстов;

 2) (терм $A$) - $A$ есть терм;

 3) (позиция $A$) - $A$ есть указатель форматирования. Если
 $A=1$, то следующий фрагмент прорисовывается с новой строки.
 Если $A=2$, то выполняется пропуск строки. Если $A=(3 B)$, то
 перед следующим фрагментом создается пробел в $B$ пикселей без
 перехода на следующую строку; $B$ - символьное число.

 4) (геомредактор $A_1$ $A_2$ $A_3$) - $A_1$ есть описание
 чертежа в формате оператора "геомредактор"; $A_2,A_3$ - верхняя
 и нижняя строки рамки чертежа.

 Информационные элементы набора $b$, определяющего режим работы
 текстфор\-мульного редактора, бывают следующих типов:

 1) (начало $A$) - $A$ есть символьный номер первой строки для
 прорисовки (по умолчанию 0).

 2) (изменение $A$) - $A$ есть индикатор изменений
 текстформульной структуры: $A=1$ - были изменения, $A=0$ - не
 было изменений (анализируется после выхода из оператора
 "текстформ" для принятия решения о сохранении изменений в
 файлах).

 3) (высотаполосы $A$) - прорисовки не происходит; $A$
 становится равно высоте полосы, необходимой для прорисовки.

 4) "выход" \ - выход из процедуры сразу после прорисовки.

 5) (конец $A$) - $A$ есть нижняя строка полосы прорисовки (для
 аналиаз после выхода из оператора).

 6) (цветпункта $A$) - $A$ есть цвет символов для прорисовки.

 7) "решение" - выход из оператора при нажатии любой клавиши,
 кроме клавиш прокрутки.

 8) (видео $A_1$ $A_2$ $A_3$) - указатель на экранную структуру
 $A_1$ (см. ниже), символьный номер $A_2$ первой свободной
 строки для прорисовки и номер $A_3$ полосы экранной структуры
 $A_1$, с которой начинается прорисовка. Экранная структура
 определяет размещение на экране фактически прорисовываемой
 части текстформульного мас\-сива. Она создается автоматически
 самим текстформульным редактором, однако ее можно сохранить и
 использовать, для ускорения повторной прорисовки, при следу\-ющем
 обращении к текстформульному редактору. Экранная структура
 представляет собой набор ($P_1 \ldots P_n$) наборов $P_i$,
 представляющих собой экранные полосы. Каждое $P_i$ имеет вид
 ($B_1$ $B_2$ $B_3$ $B_4$), где $B_1$ - символьный номер первой
 строки полосы, $B_2$ - высота полосы в пикселях (символьное
 число), $B_3$ - символьный номер несущей строки полосы (на ней
 размещаются буквы, если из-за выступающих вверх частей формул,
 расположенных на той же строке, приходится смещать текстовую
 часть вниз); $B_4$ - набор ($C_1 \ldots C_k$) элементов полосы.
 Каждое $C_i$ имеет один из следующих видов:

 а) Текстовый элемент - набор (слово $D_1$ $D_2$ $D_3$ $D_4$
 $D_5$), где $D_1,D_2$ - ссылки на начало и конец в массиве
 текстов, $D_3$,$D_4$ - символьные номера левого и правого
 столбцов элемента; $D_5$ - вхождение левого края
 соответствующего элемента текстфор\-мульной структуры (к одному и
 тому же элементу текстформульной структуры может относиться
 несколько информационных элементов экранной структуры,
 раз\-мещенных на соседних строках).

 б) Скобочный элемент - набор (терм $D_1$ $D_2$ $D_3$ $D_4$),
 где $D_1$ - терм, прорисовывае\-мый в скобочной записи; $D_2,D_3$
 - левый и правый столбцы элемента; $D_4$ - вхождение левого
 края соответствующего информационного элемента текстформульной
 струк\-ту\-ры.

 в) Формульный элемент - набор (формредактор $D_1$ $D_2$ $D_3$
 $D_4$ $D_5$), где $D_1$ - терм, прорисовываемый формульным
 редактором; $D_2$ - дерево указателей формульно\-го редактора для
 $D_1$; $D_3,D_4$ - левый и правый столбцы элемента; $D_5$ -
 вхождение левого края соответствующего элемента текстформульной
 структуры.

 г) Элемент форматирования - набор (пусто $D_1$ $D_2$ $D_3$),
 где $D_1,D_2$ - левый и правый столбцы пустой зоны полосы;
 $D_3$ - вхождение левого края соответствующего элемента
 текстформульной структуры.

 д) Геометрический элемент - набор (геомредактор $D_1$ $D_2$
 $D_3$ $D_4$), где $D_1$ - структу\-ра данных описания чертежа;
 $D_2,D_3$ - левый и правый столбцы чертежа; $D_4$ - вхож\-дение
 левого края соответствующего элемента текстформульной
 структуры.

 В информационном блоке текстформульная структура сохраняется в
 виде текст\-формульной ветви - цепочки указателей - списков,
 переходы между которыми осу\-ществляются по метке "продолжение".
 Каждый такой указатель - список хранит несколько последовательных
 элементов текстформульной структуры. Переходы от него к логическим
 либо текстовым терминалам с этими элементами происходят по меткам
 "1","2", $\ldots$. Если логический терминал хранит единственный
 терм, не начи\-нающийся с логического символа "фикс", то этот
 терм определяет элемент (терм $\ldots$) текстформульной
 структуры; если он хранит терм "фикс($\ldots$)", то операнды
 данного терма образуют установку на форматирование текста
 - элемент (позиция $\ldots$). Если логический терминал хранит
 более одного терма, то он содержит описание чертежа.

 Оператор "записьтекста($a$ $b$ $c$)" позволяет записывать
 текстформульную структу\-ру $c$ в виде текстформульной ветви
 активного информационного блока, к которой от указателя -списка $a$
 имеется переход по метке $b$. Если из $a$ по метке $b$ ранее
 выходила другая ветвь, то она удаляется. Оператор
 "чтениетекста($a$ $b$ $c$)" получает ссылку на указатель-список
 $a$ активного информационного блока и метку $b$, по которой от
 него имеется переход к текстформульной ветви. Переменной $c$
 присваивается соответствующая текстформульная структура. Используемые
 к этому моменту фраг\-менты массива текстов сохраняются.

\subsection{Оглавления}

Оглавления чрезвычайно важны в интерфейсе логической систе\-мы.
Задачник систе\-мы, база приемов, база теорем, справочник по
системе, комментарии к ЛОС-програм\-мам основных блоков, различные
вспомогательные справочники - организованы с помощью оглавлений.
Фактически оглавления играют не просто роль древовидного
классификатора для быстрого поиска объектов того или иного типа,
но и роль функ\-ционального интерфейса, позволяющего инициировать
различные процедуры.

Структура данных оглавления представляет собой древовидную систему
указа\-те\-лей-списков в каком-либо информационном блоке. Эти
указатели-списки далее называем меню оглавления. Каждое меню имеет
метки следующих типов:

1) Номера пунктов меню - логические символы $1,2, \ldots$. По
такой метке $i$ имеется переход к паре объектов. Первый элемент
данной пары - текстовый терминал, опреде\-ляющий текст $i$ - го
пункта меню. Второй элемент пары - либо соответствующее $i$ -му
пункту подменю оглавления, либо логический терминал. В последнем
случае данный логический терминал может содержать косвенную ссылку
на подменю оглавления - терм "логсимвол($A_1 A_2$)", где $A_1$ -
логический символ, по которому требуется осу\-щест\-вить переход в
корневом каталоге текущего информационного блока к некото\-ро\-му
указателю - списку $S$; $A_2$ - логический символ, по которому
нужно перейти далее из $S$ к корню искомого подменю оглавления.
Если логический терминал не содержит терма вида
"логсимвол($\ldots$)", то он соответствует концевому пункту
оглавления. Косвенные ссылки нужны в очень больших оглавлениях,
которые целиком не уме\-ща\-ются в одном файле информационного
блока. Заметим, что в отсутствии косвенных ссылок все переходы
внутри оглавления (как переходы между указателями - спис\-ка\-ми)
происходят внутри одного такого файла. Чтобы можно было
использовать другой файл того же информационного блока, нужно
выбрать логический символ $A_1$, отличный от того, к ветви
которого относится оглавление (все объекты ветви одного и того же
логического символа размещаются в одном файле), и организовать
косвенную ссылку на ветвь оглавления, выносимую таким образом в
отдельный файл. Обычно в качестве символа $A_2$ при этом
выбирается логический символ "оглав\-ление". Для "разрезания"
оглавления с применением косвенных ссылок в интерфейсе оглавлений
предусмотрена специальная операция (см. ниже).

2) По метке "позиция" \ - переход к логическому терминалу,
хранящему терм "число($i$ $j$)". Здесь $i$ - номер пункта
оглавления, выбранного в последний раз при работе с данным меню
(либо 0); $j$ - номер первого пункта, с которого будет
про\-ис\-хо\-дить выдача меню на экран. Информация, сохраняющаяся
в терминалах "позиция", поз\-воляет прослеживать в оглавлении
"текущий путь" от корня, и при повторном входе в оглавление сразу
попадать в ту его точку, из которой имел место последний выход.
Изменяя с помощью специального оператора текущий путь в
оглавлении, можно обеспечивать автоматические переходы к различным
его пунктам.

3) По метке "замечание" \ - переход к логическому терминалу,
хранящему допол\-ни\-тель\-ную информацию о ветви оглавления. Эти
терминалы фактически относятся к структуре данных использующей
оглавление внешней процедуры. Например, в случае базы теорем они
содержат информацию о разделах, к которым относятся ветви
оглавления, позволяющую логической системе самостоятельно
ориентиро\-вать\-ся в оглавлении, изначально предназначенном для
работы с ним человека - оператора.

4) По метке "примечание" \ - переход к текстовому терминалу,
хранящему со\-про\-води\-тель\-ный текст для ветви оглавления.

Корни оглавлений размещаются в информационных блоках с
использовани\-ем следующего соглашения. Берется указатель-список,
достижимый из корневого ка\-та\-лога по метке "оглавление". Из
этого указателя по меткам - логическим символам, рассматриваемым
далее как названия типов оглавлений, и выполняются переходы к
корням оглавлений. Типы используемых в системе оглавлений и
дополнительные их особенности будем указывать в описании тех
блоков, которые используют эти оглавления (кроме того, см.
перечень типов оглавлений в справочной информации для логического
символа "вид").


Для работы с оглавлениями используется оператор "оглавление($a$
$b$)". У него $a$ - ссылка на корневой указатель - список
оглавления. Оператор реализует интерфейс выбора концевого пункта
оглавления и изменения самого оглавления. При обращении к нему
сразу осуществляется переход к последнему ранее рассматривавшемуся
при работе с данным оглавлением пункту (концевому либо
промежуточному). Выходной переменной $b$ присваивается пара
(ссылка на текстовый терминал выбранного кон\-це\-вого пункта -
ссылка на его логический терминал). Если концевой пункт выбран не
был (выход из оглавления по "Esc" и т.п.), то оператор ложен.

Хотя вкратце интерфейс оглавлений уже был описан выше
(применительно к оглавлению задачника), приведем эдесь более
полное его описание.

При прорисовке меню оглавления пункты нумеруются последовательными
нату\-раль\-ными числами. Если пункт является концевым, то после
его номера идет точка. Если же пункт оглавления сам является меню,
то после его номера идет правая скобка.

Текущий пункт меню оглавления выделен синим цветом. Для смены
этого пункта используются клавиши "курсор вверх" и "курсор вниз".
В случае большого меню, не умещающегося целиком на экране, можно
использовать также клавиши "PageUp" и "PageDown".

Для входа в подменю либо в интерфейс, обслуживающий выбранный
концевой пункт оглавления, нажимается клавиша "курсор вправо" либо
(что менее предпочти\-тельно, так как более мобильным является
перемещение с помощью четырех клавиш курсора) "Enter".

Для возвращения в надменю нажимается клавиша "курсор влево" \ либо
"Esc". Нажатие "Esc" \ в корневом меню выводит из оглавления во
внешнюю процедуру, обратившуюся к его просмотру; нажатие "курсор
влево" \ в корневом меню игно\-ри\-ру\-ет\-ся.

Для одношагового выхода из оглавления (в главное меню либо в
другую внешнюю процедуру интерфейса), минуя все промежуточные
надменю, используется клавиша "End".

Для одношагового перехода к нижнему из прорисованных на экране
пункту меню используется клавиша "Ctr-курсор вниз" (одношаговый
переход вверх не предус\-мот\-рен).

При нажатии клавиши для одной из цифр $0,1, \ldots, 9$ происходит
переход к первому из прорисованных на экране пунктов меню,
имеющему данную последнюю цифру.

Возможно перемещение по оглавлению с помощью мыши. Если подвести
курсор мыши к нужному пункту меню и нажать левую клавишу мыши, то
происходит переход к подменю (либо концевому интерфейсу) этого
пункта. При нажатии правой клавиши мыши происходит возвращение в
надменю.

Оглавление можно изменять непосредственно в процессе работы с ним.
Если нужно создать новый пункт оглавления для подменю, то
нажимается клавиша "м" ли\-бо "М". В первом случае пункт будет
создан в конце меню, и для него необходимо сначала расчистить
место прокруткой оглавления вверх. Во втором случае новый пункт
будет создан непосредственно перед текущим (выделенным синим
цветом) пунктом оглавления, и окно текстового редактора, в котором
следует набирать текст для нового пункта, разместится
непосредственно поверх текста текущего и следую\-щих за ним
пунктов. После нажатия указанной клавиши появляется окно
текстово\-го редактора, с помощью которого вводится текст пункта.
По завершении вво\-да (клавиша "Enter") прорисовывается
модифицированное меню. Если во время ввода нажать "Esc", то будет
восстановлен исходный вид меню.

Если нужно создать новый концевой пункт оглавления, то нажимается
клави\-ша "к" либо "К". В первом случае пунтк будет создан в конце
меню, во втором случае - непосредственно перед текущим пунктом
оглавления. В остальном действия те же, что и при вводе нового
пункта для подменю.

Для перенесения группы пунктов одного или нескольких меню на
другое место используется буфер оглавления. Для отбора текущего
пункта в этот буфер нажи\-ма\-ет\-ся клавиша "б". В результате
цвет пункта становится красным (если переместить указатель
текущего пункта в другое место, то отобранный в буфер пункт
сохраняет малиновую окраску). Чтобы исключить из буфера ранее
занесенный в него текущий пункт, снова нажимается клавиша "б".

Чтобы перенести отобранные в буфер пункты на новое место, либо
нажимается клавиша "и" \ - тогда отобранные пункты будут исключены
со своих исходных позиций и занесены в конец теку\-щего меню в том
же порядке, в каком они заносились в буфер, либо нажимается
клавиша "И" \ - тогда отобранные пункты после исключения с
исходных позиций регистрируются непосредственно перед текущим
пунктом текуще\-го меню.

В особых случаях перенесение пункта оглавления на другое место
оказывается невозможным. Это происходит, если при разрезании
оглавления на фрагменты, от\-не\-сенные к различным логическим
символам, старая и новая позиции пункта оказались относящимися к
различным файлам информационного блока.

Для удаления текущего пункта меню следует нажать клавишу
"Ctr-Del". Если этот пункт представлял собой подменю, то удаление
его произойдет только в случае пустого подменю.

Для изменения текста текущего пункта следует нажать клавишу "р"
(кир.). Тогда цвет текста становится черным и возникает курсор
текстового редактора. По окон\-чании редактирования (клавиша
"Enter" в текстовом редакторе) текст пункта моди\-фицируется. Если
в текстовом редакторе нажать "Esc", то восстановится исходный вид
пункта.

В процессе развития оглавления его ветвь может оказаться чрезмерно
большой для сохранения ее в одном файле информационного блока
(размеры таких файлов ограничены, ввиду особенностей двоичного
кодирования адресов в используемой версии интерпретатора ЛОСа, 512
килобайтами). Тогда к данной ветви применяется операция разрезания
оглавления. Выбирается некоторый логический символ "$A$" - по
возможности, не чрезмерно загруженный в рассматриваемом
информационном блоке, и данная ветвь закрепляется за этим
символом. Фактически выполняются следующие действия: выбирается
текущий пункт, определяющий переход к отре\-за\-емой ветви;
нажимается "Ctr-F6"; в появляющемся диалоговом окне (после слов
"Косвенная ссылка:") текстовым редактором набирается терм
"логсимвол($A$ оглав\-ление)", и нажимается "Enter". Не
рекомендуется применять данную операцию без крайней необходимости.

Кроме перечисленных выше, процедура "оглавление($\ldots$)"
реализует ряд других операций, тесно связанных с внешними
процедурами, обращающимися к оглавлени\-ям. Эти операции будут
указаны далее в разделах, посвященным таким процедурам.

Приведем ряд операторов, часто используемых при работе с
оглавлениями. Ис\-поль\-зо\-вание их предполагает, что содержащий
оглавление информационный блок является активным.

Чтобы получить последовательность ссылок на пункты текущего пути
оглавления, используется оператор "узлыоглавления($a$ $b$)". У
него $a$ - тип оглавления; выходной переменной $b$ присваивается
набор ссылок. Каждая такая ссылка - пара (ссылка на текстовый
терминал пункта - ссылка на сам пункт,т.е. на указатель либо
терминал). Начало набора $b$ соответствует корню оглавления,
причем вместо ссылки на тексто\-вый терминал (отсутствующий у
корня) берется 0.

Если нужно получить последовательность ссылок на пункты
произвольного (не обязательно текущего) пути оглавления,
применяется оператор "пунктыоглавления($a$ $b$ $c$)". У него $a$ -
тип оглавления; $b$ - набор меток перехода (символьных номеров
пунктов) вдоль требуемого пути. Выходной переменной $c$
присваивается набор ссылок (текстовый терминал пункта - пункт),
аналогичный выходному набору оператора "узлыоглавления".
Единственное отличие - в наборе $c$ ссылка на корень оглавления
отброшена. Иногда нужно получить ссылки не на все пункты пути, а
только на последний пункт. Тогда можно применять оператор
"пунктоглавления($a$ $b$ $c$)". Вход\-ные данные у него те же, что
у оператора "пунктыоглавления", но выходной перемен\-ной $c$
присваивается пара ссылок (текстовый терминал последнего пункта
пути - последний пункт).

Чтобы сделать текущим путем оглавления путь, определяемый заданной
по\-сле\-довательностью $b$ символьных номеров пунктов,
используется оператор "путьвог\-лавлении($a$ $b$ $c$)". Здесь $a$
- тип олгавления. Выходной переменной $c$ присваивается пара
ссылок (текстовый терминал концевого пункта пути $b$ - концевой
пункт этого пути). Чтобы получить набор символьный номеров
пунктов, определяющих текущий путь в оглавлении, применяется
оператор "цепьвоглавлении($a$ $b$)". У него $a$ - тип оглавления;
выходной переменной $b$ присваивается искомый набор.

Чтобы перечислить ссылки на все пункты заданного меню оглавления,
исполь\-зу\-ется оператор "подпункт($a$ $b$ $c$ $d$)". У него $a$
- ссылка на представляющий меню указатель - список. Выходной
переменной $b$ присваивается метка перехода к очеред\-ному пункту
меню; $c$ - ссылка на текстовый терминал этого пункта; $d$ -
ссылка на сам пункт.

Оператор "смоглавление($a$ $b$)" перечисляет ссылки на все пункты
оглавления (кон\-цевые и неконцевые), достижимые из заданного
пункта. $a$ - ссылка на исходный пункт (указатель либо логический
терминал). $b$ - пара (ссылка на текстовый терминал пункта -
пункт) для текущего перечисляемого пункта. Исходный пункт $a$ из
пе\-ре\-чис\-ления исключается.

Чтобы просмотреть все концевые пункты оглавления, расположенные в
некоторой его ветви, может быть полезен оператор "следтерминал($a$
$b$ $c$ $d$ $e$)". Он осуществляет переход к очередному концевому
пункту внутри заданной ветви. $a$ - тип оглавления; $b$ - путь
(набор символьных номеров выбираемых пунктов) от корня оглавления
к корню его ветви; $c$ - путь от корня оглавления к его
логическому терминалу, расположенному внутри ветви. Если удается
найти логический терминал, рас\-по\-ло\-женный в ветви после
заданного, то переменной $d$ присваивается путь к этому терминалу
от корня оглавления; переменной $e$ - пара (ссылка на текстовый
терминал, сопровождающий найденный логический терминал - ссылка на
логический терми\-нал). Иначе оператор ложен.

Оператор "ветвьоглавления($a$ $b$ $c$ $d$)" перечисляет все
концевые пункты оглавле\-ния, достижимые из некоторого его меню,
причем через пункты этого меню с номе\-рами, не меньшими
заданного. У него $a$ - ссылка на указатель- список,
представ\-ля\-ющий данное меню; $b$ - путь к меню от корня
оглавления; $c$ - символьный номер того пункта меню, с которого
начинается перечисление. Выходная переменная $d$ перечисляет
тройки (содержимое логического терминала очередного концевого
пунк\-та - пара (ссылка на текстовый терминал, сопровождающий
логический терминал - ссылка на логический терминал) - путь к
концевому пункту от корня оглавления). Заметим, что этот оператор
обслуживает интерфейс оглавлений для коррекции его структур данных
при перестановках, вставках и удалениях пунктов; поэтому, кроме
указанных выше, им выполняются также некоторые дополнительные
действия (об\-ра\-ботка комментария (оглавление $A$) к посылкам
исходной задачи - буфера оглавления, который нужно корректировать
при указанных выше операциях).

\subsection{Информационные блоки}

Если информационный блок имеет корневой указатель-каталог, то
обычно он ор\-га\-низуется по следующей схеме. По меткам -
логическим символам $A$ из его кор\-не\-вого каталога происходят
переходы к указателям-спискам. Ветвь такого указателя-списка
называется статьей логического символа $A$, а сам указатель -
корнем статьи. С ним связывается некоторая древовидная система
указателей, переходы в которой осуществляются по меткам - цифрам.
Концевые вершины данной древовидной сис\-темы указателей
называются узлами статьи символа $A$; последовательность цифр на
пути от корня к узлу образует десятичную запись номера узла.
Сохраняемые в информационном блоке объекты (приемы, теоремы и
т.п.) распределяются между узлами статей логических символов, и
ссылка на узел - пара (логический символ - номер узла) так или
иначе включается в ссылку на этот объект.

Последовательность цифр, образующая номер узла, может начинаться с
одного или нескольких нулей, но должна иметь хотя бы один
ненулевой элемент. Из корня статьи логического символа по метке
"длина" имеется переход к логическому тер\-ми\-налу, хранящему
длину этой последовательности (одну и ту же для всех узлов).
Номера узлов, представленные в дереве, не обязательно образуют
сплошной отрезок натуральных чисел; между ними допустимы разрывы.
Для ускоренного поиска не\-ис\-пользуемого номера при вводе нового
узла в дереве предусмотрена специальная разметка. Если вершина $A$
дерева номеров узлов относится не к последнему и не к
предпоследнему ярусам этого дерева, причем некоторые из ветвей
этой вершины имеют неиспользуемые номера, то логический терминал,
достижимый из $A$ по метке "новыйузел", хранит все корневые метки
указанных ветвей.

Для ввода нового узла статьи логического символа $S$ служит
оператор "новый\-узел($a$ $b$ $c$)". У него $a$ - ссылка на корень
статьи логического символа $S$. Выходной переменной $b$
присваивается ссылка на новый узел, а переменной $c$ - номер этого
узла (десятичное число). Для удаления узла применяется оператор
"удалениеузла($a$ $b$)". Здесь $a$ - ссылка на корень статьи
логического символа; $b$ - номер удаляемого узла. Для получения
ссылки $c$ на узел статьи логического символа $a$, имеющий номер
(десятичному числу) $b$, служит оператор "адресузла($a$ $b$ $c$)".

Оператор "узелстатьи($a$ $b$ $c$)" перечисляет все узлы статьи
логического символа $a$. Переменной $b$ при этом присваивается
ссылка на узел, $c$ - номер этого узла. Чтобы просматривать узлы
статьи некоторого логического символа, можно использовать также
оператор "следузел($a$ $b$ $c$ $d$)", который позволяет находить
первый узел, номер которого больше заданного числа $b$. Здесь $a$
- корень статьи рассматриваемого логи\-ческого символа. Переменной
$c$ присваивается ссылка на найденный узел, переменной $d$ - номер
этого узла. Если узла с номером, большим $b$, не существует,
оператор ложен.

Если нужно скопировать целую ветвь активного информационного
блока, не вы\-ходя за рамки этого блока (но, быть может, в другом
его файле), то применяется оператор "новаяветвь($a$ $b$)". У него
$a$ - ссылка на указатель-список, являющийся корнем ко\-пи\-руемой
ветви; $b$ - указатель-список, начиная с которого будет
добавляться копия. Если в $b$ уже имелись переходы по тем же
меткам, что в $a$, то происходит добавление ссылок на подключаемые
копии объектов из $a$. Предполагается, что в копируемой ветви
имеются только указатели-списки, логические терминалы и
тек\-стовые тер\-ми\-налы без указателей цвета. При копировании
кратные ссылки на тер\-ми\-налы не воспроизводятся, и по каждой
такой ссылке создается новая копия термина\-ла.


\subsection{Диалоговые блоки}

Для организации специализированных диалогов, в том числе с
использованием ло\-ги\-ческих структур данных, можно создавать
диалоговые блоки. Эти блоки служат для отображения различной
статистической информации, выбора параметров, про\-ри\-сов\-ки и
редактирования термов и логических символов. Ввиду специфических
функциональных особенностей, они реализованы внутренними
средствами логичес\-кой системы и не используют стандартных
диалоговых средств. Диалоговый блок обычно занимает весь экран и
состоит из группы прямоугольников, называемых элементами блока
диалога. Каждый элемент блока диалога сопровождается группой
информационных элементов, уточняющих списоб его использования.
Активизация элемента диалога предпринимается нажатием левой
клавиши мыши в его области либо нажатием клавиши клавиатуры, код
которой является меткой элемента (обычно название такой клавиши
указывается в прямоугольнике элемента либо в примыка\-ющих к нему
прямоугольниках). Предусмотрен простой интерфейс, позволяющий
создавать и редактировать блоки диалога. При обращении к
диалоговому блоку создается структура данных диалога - набор
информационных элементов для запол\-нения его окон при
первоначальной прорисовке и для сохранения введенной в про\-цессе
диалога информации.

Прежде всего, перечислим типы информационных элементов,
характеризующих использование элемента блока диалога (каждый такой
элемент - логический символ либо терм):

1) "метка($A$)" \- логический символ $A$ является меткой элемента.

2) "См($A$)" \- прямоугольная рамка элемента прорисовывается в
цвете $A$. В случае белого цвета ($A$ = "шестнадцать") рамка не
видна.

3) "формблок" \- при активизации элемента инициируется набор терма
формульным редактором. По окончании набора в структуре данных
диалога находится инфор\-ма\-ционный элемент "формблок $A$ $B$",
где $A$ - метка элемента диалога, у которого $B$ заменяется на
набранный терм.

4) "текстредактор" \- при активизации элемента инициируется вход в
текстовый редактор. Начало $B$ используемого отрезка буфера
текстов при этом берется из информационного элемента
"текстредактор $A$ $B$" структуры данных диалога; $A$ - метка
элемента диалога.

5) "терм" \- при активизации элемента инициируется набор терма
текстовым ре\-дак\-тором. По окончании набора в структуре данных
диалога находится информацион\-ный элемент "терм $A$ $B$", где $A$
- метка элемента диалога, у которого $B$ заменяется на набранный
терм.

6) "логсимвол" \- при активизации элемента инициируется набор
логического сим\-во\-ла текстовым редактором. По окончании набора
в структуре данных диалога на\-хо\-дится информационный элемент
"логсимвол $A$ $B$", где $A$ - метка элемента диалога, у которого
$B$ заменяется на набранный логический символ.

7) "новыйсимвол" \- при активизации элемента инициируется набор
логического символа текстовым редактором. Если символа с таким
названием не было, то он вводится. По окончании набора в структуре
данных диалога находится инфор\-ма\-ци\-онный элемент "новыйсимвол
$A$ $B$", где $A$ - метка элемента диалога, у которого $B$
заменяется на набранный логический символ.

8) "серия" \- при активизации элемента инициируется набор группы
термов тек\-сто\-вым редактором. По окончании набора в структуре
данных диалога находится информационный элемент "серия $A$ $B$",
где $A$ - метка элемента диалога, у которого $B$ заменяется на
список набранных термов.

Шаблоны используемых в системе диалоговых блоков хранятся в 5-м
инфор\-ма\-ционном блоке. Для хранения отдельного шаблона
используется узел $A$ статьи какого-либо логического символа, так
что пара (логический символ - номер узла) является ссылкой на этот
шаблон. Из узла $A$ по меткам "команды" и "нормистина"
\\ (первоначально - логический символ "блокдиалога", который
впоследствии был пе\-ре\-именован в название вспомогательной
процедуры) имеется переход к указателю - списку $B$, из которого
по меткам $1,2,\ldots$ - переходы к указателям-спискам $C_1, C_2,
\ldots$, представляющим элементы блока диалога. Из $C_i$ по метке
"область" - переход к логи\-чес\-кому терминалу, хранящему
четверку логических символов $D_1,D_2,D_3,D_4$. $D_1,D_2$ суть
символьные номера столбца и строки верхнего левого угла
прямоугольника, занимаемого на экране элементом; $D_3,D_4$ -
символьные номера столбца и строки правого нижнего угла. По метке
"слово" (может отсутствовать) из $C_i$ - переход к текстовому
терминалу, содержимое которого выводится в области элемента. По
метке "нормистина" из $C_i$ - переход к логическому терминалу,
содержащему информа\-цион\-ные элементы, характеризующие
использование элемента диалога (типы их приве\-де\-ны выше).

В том же 5-м информационном блоке содержится оглавление шаблонов
диало\-го\-вых блоков; переход к его корню от корневого каталога
5-го информационно\-го блока осуществляется по меткам
"оглавление", "нормистина"). Концевые логические терминалы данного
оглавления хранят термы "прием($A_1$$A_2$ нормистина)", где $A_2$
- номер узла статьи символа $A_1$, хранящего описание шаблона.

Для инициализации диалога по уже имеющемуся шаблону диалогового
блока используется оператор "началодиалога($a$ $b$ $c$)". У него
$b$ - номер узла статьи логическо\-го символа $a$, хранящего
описание шаблона блока. Оператор осуществляет прорисов\-ку
диалогового блока с незаполненными (кроме текстов, введенных
непосредственно при создании блока) элементами и возвращает
структуру данных диалога $c$, исполь\-зу\-емую, в частности, как
накопитель результатов диалога. Приведем перечень типов элементов
в этой структуре данных:

1) (формблок $A$ $B$) - $B$ есть терм, прорисованный формульным
редактором внутри элемента диалога с меткой $A$.

2) (терм $A$ $B$) - $B$ есть терм, прорисованный текстовым
редактором внутри элемен\-та с меткой $A$.

3) (логсимвол $A$ $B$) - $B$ есть логический символ, прорисованный
внутри элемента с меткой $A$.

4) (текстредактор $A$ $B$) - $B$ есть исходная позиция в буфере
текстов, начиная с которой размещается текст, вводимый внутри
элемента с меткой $A$.

5) (прямоугольник $A$ $B$) - $B$ есть четверка символьных номеров,
определяю\-щая границы прямоугольника для элемента диалога с
меткой $A$.

6) (новыйсимвол $A$ $B$) - $B$ есть новый логический символ,
введенный в элементе с меткой $A$.

7) (серия $A$ $B$) - $B$ есть набор термов, введенных с помощью
текстового редактора в элементе диалога с меткой $A$.

В тех случаях, когда параметр $B$ изменяется при диалоге, он
изначально инициа\-ли\-зи\-руется какой-либо переменной.

После того, как оператор "началодиалога" прорисовал бланк блока
диалога, про\-исходит заполнение необходимым содержимым
прямоугольников его элементов. Для этого служит оператор "рис($a$
$b$ $c$)". У него $a$ - структура данных диалога; $b$ - метка
элемента диалога. Осуществляется прорисовка внутри прямоугольника
этого элемента информации, определяемой указателем прорисовки $c$.
Используются ука\-затели прорисовки следующих типов:

1) (формблок $A$) - прорисовка терма $A$ формульным редактором;

2) (терм $A$) - прорисовка терма $A$ в скобочной записи;

3) (логсимвол $A$) - прорисовка логического символа $A$;

4) (текстредактор $A$ $B$ $C$) - прорисовка содержимого буфера
текстов начиная с позиции $A$ до позиции $B$. $C$ - символьный
номер строки, с которой начинается прорисовка (относительно
верхней части прямоугольника элемента диалога);

5) "пустоеслово" - расчистка прямоугольника элемента;

6) (серия $A$) - прорисовка набора термов $A$ в скобочной записи.

Для создания нового шаблона блока диалога служит оператор
"новыйдиалог\\ ($a$ $b$)". Перед обращением к нему должен быть
создан узел статьи некоторого логичес\-кого символа $a$ в 5-м
информационном блоке, в котором предполагается сохранить шаблон, и
из этого узла должен быть создан переход по метке "команды" к
новому указателю - списку. $b$ - номер данного узла. Оператор
реализует интерфейс редакти\-рования шаблона; обращение к нему
возможно из редактора программ ЛОСа (см. следующий раздел), так
что выбор $a,b$ и создание узла выполняетя автоматически.

Перечислим операции, применяемые при редактировании шаблона.

Для создания нового элемента диалога нажимается "с" (кир.), либо
курсор мыши подводится к пункту меню "Создание" и нажимается левая
клавиша мыши. Затем левая клавиша мыши нажимается сначала в
позиции левого верхнего угла прямоу\-голь\-ника, затем - в позиции
правого нижнего угла.

Для удаления элемента диалога сначала активизируется пункт меню
"Удаление", и затем левая клавиша мыши нажимается в области
удаляемого элемента.

Для ввода текста внутри прямоугольника элемента активизируется
пункт меню "Текст", и левая клавиша мыши нажимается в области
элемента. Тогда появляется курсор текстового редактора,
позволяющий ввести текст. По завершении редакти\-рования ("Enter")
текст сохраняется, иначе, по "Esc" \ - редактирование отменяется.

Для редактирования списка сопровождающих элемент диалога
информационных элементов, уточняющих его использование, выбирается
пункт меню "Поведение", и левая клавиша мыши нажимается в поле
элемента. Тогда шаблон диалога исчезает, а в верхнем левом угла
экрана появляется курсор текстового редактора (если уже имелись
сопровождающие информационные элементы, то они прорисовываются).
По завершении редактирование изображение шаблона
восстанавливается.

Чтобы получить ссылку $a,b$ (логический символ - номер узла) на
редактируемый шаблон, выбирается пункт меню "Информация" \ - тогда
в верхнем левом углу про\-ри\-совываются $a$ и $b$. По нажатии
любой клавиши далее восстанавливается изображение шаблона.

Чтобы передвинуть рамку прямоугольника элемента, левая клавиша
мыши на\-жи\-ма\-ется на одной из его сторон, и далее удерживанием
клавиши курсора можно добиться медленного перемещения этой стороны
(для вертикальных сторон на\-жи\-ма\-ются клавиши "курсор вправо -
влево", для горизонтальных - "курсор вверх- вниз"). Пока выбранная
сторона не будет сдвинута хотя бы на один пиксел, прочие команды
редактором игнорируются.

Для перемещения всего элемента нужно нажать левую клавишу мыши в
области этого элемента и выбрать пункт меню "Сдвиг", после чего
использовать клавиши курсора.

Выход из редактирования - по "Esc"; при этом результаты
редактирования со\-хра\-няются.

\subsection{Разное}

Если нужно сохранить в текстовом терминале последовательность
букв, опре\-де\-лен\-ных кодирующими их (т.е. являющихся кодами
соответствующих клавиш) логи\-чес\-кими символами, то используется
оператор "текстовыйтерминал($a$ $b$ $c$ $d$)". У него $a$ -
последовательность кодирующих логических символов; $b$ - ссылка на
указатель активного информационного блока, в котором по метке $c$
регистрируется текстовый терминал. Переменной $d$ присваивается
ссылка на созданный терминал.

Справочная информация о логических символах хранится в 3-м
информационном блоке. Из корневого каталога этого блока по метке -
логическому символу $S$ про\-ис\-ходит переход к указателю, из
которого по метке "оператор" - переход к группе текстовых
терминалов, образующих справочную информацию для $S$. Каждый
тер\-минал этой группы соответствует одной странице; упорядочение
страниц - от конца набора терминалов к началу (так как каждый
новый объект по заданной метке добавляется в начало списка
достижимых по этой метке объектов). Некоторые спра\-вочные тексты
общего характера размещены в 1-м информационном блоке. Для
просмотра и редактирования справочных текстов перечисленных типов
используется оператор "помощь($a$ $b$)". У него $a$ - либо
логический символ 0, либо логический символ 1, либо ссылка на
указатель-список 1-го информационного блока; $b$ - логи\-ческий
символ. Если $a=0$, то при обращении к оператору возникает окно
диалога - под текстом "Логический символ:" появляется курсор
текстового редактора, и далее вводится тот логический символ, для
которого нужна справка. Если $a=1$, то просматривается и
редактируется информация о логическом символе $b$. В остальных
случаях просматриваются и редактируются текстовые терминалы,
достижимые из указателя $a$ по метке $b$. После обращения к
оператору активным остается тот инфор\-ма\-ционный блок (1 либо
3), из которого извлекалась справочная информация.

Интерфейс просмотра справочной информации состоит из следующих
операций. Для смены страницы служат клавиши "Page Up" \- "Page
Down" либо нажатие левой клавиши мыши на стрелках в меню. Чтобы
внести изменения в текст страницы, достаточно нажать "Enter" -
тогда появляется курсор текстового редактора, и пред\-принимается
редактирование текста (по завершении редактирования через "Enter"
из\-менения сохраняются, по завершении редактирования через "Esc"
\ - сохраняется пер\-воначальный текст). Для удаления текущей
страницы нажимается "Ctr-Del". Если нужно ввести новую страницу
непосредственно после последней, нажимается "Ctr-Enter". Нажатие
любых других клавиш (в том числе клавиш курсора) приводит к выходу
из просмотра информации.

Общий справочник по логической системе размещается в 7-м
информацион\-ном блоке. Он организован с помощью оглавления,
корень которого достижим из корне\-вого каталога по меткам
"оглавление", "текстформ". Каждый концевой логический терминал
данного оглавления содержит терм "прием($A_1 A_2$)", ссылающийся
на узел статьи логического символа $A_1$, имеющий номер $A_2$. По
метке "текстформ" из этого узла выходит текстформульная ветвь,
соответствующая концевому пункту оглав\-ле\-ния. Для просмотра и
редактирования общего справочника по решателю служит оператор
"Помощь($a$)". Здесь $a$ указывает на режим использования массива
текстов: если $a=0$, то при выходе из оператора этот массив
полностью расчищается. Интер\-фейс работы со справочником, по
существу, распадается на интерфейс оглавлений и интерфейс
текстформульного редактора.

Для работы с графиками функций одной переменной используется
оператор "гра\-фик($a$ $b$)". У него $a$ - набор выражений; $b$ -
набор информационных элементов, испоьзуемых для вычисления
значений набора $a$. Реализуется интерфейс графи\-чес\-кого
анализа выражений набора $a$ - выбор варьируемого параметра и
границ его изменения, с построением на общем чертеже кривых для
выражений данного набора. Набор $b$ называем блоком графика; он
имеет информационные элементы следующих типов:

1) (выч $i$ $A_1$ $A_2$) - $A_1$ есть микропрограмма для оператора
"Выч", позволяю\-щая вычислять значение $i$ - го выражения набора
$a$; $A_2$ - набор вспомога\-тельных констант для этой
микропрограммы. Нумерация элементов набора $a$ начи\-нается с 1.

2) (переменная $x$) - $x$ есть варьируемая переменная, для которой
строится график.

3) (от $t_1$) - $t_1$ есть минимальное значение варьируемой
переменной.

4) (до $t_2$) - $t_2$ есть максимальное значение варьируемой
переменной.

5) (значение $y$ $r$) - $r$ есть численное значение параметра $y$,
отличного от варьируе\-мой переменной.

6) (отрезок $A_1$ $A_2$) - $A_1$ есть нижняя граница
устанавливаемого вручную диапазона значений для отображения на
экране; $A_2$ - верхняя граница этого диапазона. $A_1,A_2$ -
десятичные числа.

7) (левыйкрай $A$) - $A$ есть символьный номер столбца, по
которому проходит вертикальная шкала.

8) (конец $A$) - $A$ есть символьный номер строки для прорисовки
горизонтальной шкалы.

9) (прямоугольник $A_1$ $A_2$ $A_3$ $A_4$) - указатель на верхнюю
левую ($A_1,A_2$) и пра\-вую нижнюю ($A_3,A_4$) вершины
прямоугольника для выделенного фрагмента графика.

10) (откат $B$) - $B$ есть набор четверок ($A_1 A_2 A_3 A_4$),
указывающих границы пря\-мо\-угольников просмотра графика,
предшествовавшие выбору текущего прямоугольни\-ка. Начало набора
$B$ - последний из таких надпрямоугольников (наименьший).

11) (точка $A_1$ $A_2$) - $A_1$ есть символьный номер столбца для
выделенной точ\-ки графика; $A_2$ - символьный номер кривой
графика.

Интерфейс работы с графиками был описан в разделе "Диалоговые
задачи"\ (за\-метим, что пока в этом интерфейсе используются лишь
возмож\-ности оператора "график($\ldots$)", связанные с
рассмотрением единственного выраже\-ния).

\chapter{Редактор программ ЛОСа}

\section{Названия логических символов}

При программировании на ЛОСе необходимо знать названия логических
символов, используемых в логическом языке системы либо являющихся
заголовками операто\-ров ЛОСа. Иногда приходится вводить названия
новых логических символов либо изменять названия уже введенных
символов. Для просмотра имеющихся на текущий момент символов и
простейших операций с ними предусмотрены следующие
воз\-мож\-ности.

\subsection{Просмотр названий логических символов}

Чтобы просмотреть все используемые в системе названия логических
символов, сле\-дует в главном меню системы выбрать нажатием левой
кнопки мыши пункт "Ло\-ги\-ческие символы" либо нажать клавишу "с"
(кир.). Тогда на экране появляются расположенные в два столбца
названия первых 46 логических символов (первая страница словаря).
Для перелистывания страниц используются клавиши "PgDown" и "PgUp".
Перед названием логического символа помещен его номер. На текущей
странице синим цветом выделяется текущий логический символ. Смена
этого символа осуществляется (только в рамках страницы) клавишами
"курсор вверх" \ - "курсор вниз". Кроме того, клавиши "курсор
вправо" \- курсор влево позволяют менять столбец.

Для просмотра справочной информации, связанной с текущим
логическим сим\-во\-лом, следует нажать клавишу "и" - тогда
появляется первая страница такой инфор\-ма\-ции. Перелистывание
этих страниц (если их несколько) - при помощи клавиш "PageDown",
"PageUp". Если нужно внести дополнения либо изменения в справочную
страницу, то нажимается "Enter" \ - появляется курсор текстового
редактора. По завершении редактирования нажимается "Enter", что
приводит к немедленному из\-ме\-нению страницы. Если во время
редактирования нажать "Esc", то изменение стра\-ницы отменяется.
Новая страница (после последней) вводится нажатием клавиши "Ctr -
Enter". Для удаления текущей страницы используется "Ctr - Del".
Возвращение в списки логических символов - по нажатию любой не
используемой для специальных целей клавише (например, по клавише
"пробел" либо "Esc").

Если после названия логического символа помещен знак "?", то
отсутствует про\-грам\-ма этого символа. Если после него помещен
знак "$\&$", то отсутствует связанная с символом справочная
информация. Наконец, если вместо названия символа помещен знак
"!", то само название символа вообще не введено (логический символ
с соот\-вет\-ствующим номером все же существует, но фактически не
используется).

\subsection{Изменение словаря и получе\-ние до\-пол\-ни\-тель\-ной
ин\-фор\-ма\-ции о сим\-во\-ле}

Операции по изменению словаря и получению информации, связанной с
номером символа, вынесены в пункт "Ресурсы и установки" \ главного
меню системы. После выбора этого пункта (левой кнопкой мыши либо
нажатием клавиши "р") появляется меню операций с ресурсами и
установками. Левая часть этого меню (кроме нижнего пункта)
относится к операциям со словарем логических символов. Здесь
пред\-ус\-мотрены следующие действия:

1) Ввод названия нового логического символа (клавиша "н", которую
можно нажимать не только из данного меню, но и непосредственно из
главного меню). После выбора пункта появляется диалогове окно, в
котором вводится необходимое название. В качестве названия может
выступать произвольная последовательность букв, цифр и других
прорисовываемых текстовым редактором на экране знаков, имеющая
длину не более 24. Большие и маленькие буквы различаются. Если
введенное название уже было использовано, то выдается сообщение
"Логический символ с таким названием уже имеется", после чего
нажатие любой клавиши возвращает в меню, и попытку ввода нового
символа следует повторить, скорректировав название. Если название
было новым, то находится первый неиспользуемый (не имеющий
названия) номер логического символа, и ему присваивается данное
название.

2) Изменение названия логического символа (клавиша "Ctr-н",
которую можно нажимать непосредственно из главного меню). После
выбора пункта появляется диалоговое окно, в котором вводится
старое название логического символа. После того, как оно было
введено и нажата клавиша "Enter", появляется предложение ввести
новое название символа. При вводе нового названия может оказаться,
что это название уже было использовано. Тогда выдается
соответствующее сообщение, и происходит откат к повторному вводу
нового названия. Если в этом случае отказаться от ввода нового
названия, то старое будет сохранено. Следует учесть (!), что если
имелся логический символ без названия, номер которого меньше
номера изменяемого символа, то при указанном выше откате символ
потеряет название, а его старое название будет присвоено первому
не имевшему названия символу.

 3) Определение номера логического символа по его названию
(клавиша "с"). После выбора пункта возникает диалоговое окно, в
котором вводится название ло\-ги\-ческого символа. По нажатии
клавиши "Enter" под введенным названием появляется номер символа.

4) Определение логического символа по его номеру (клавиша
"Ctr-c"). После выбора пункта возникает диалоговое окно, в котором
набирается номер логического символа. По нажатии клавиши "Enter"
под введенным номером появляется название символа. Заметим, что
данный и предыдущий пункты практически не используются собственно
при программировании на ЛОСе, а бывают нужны лишь при отладке
интерпретатора ЛОСа, периодически возникающей в связи с различными
рас\-ши\-ре\-ниями ЛОСа.

5) Удаление названия логического символа (клавиша "Ctr - у",
кириллица). После выбора пункта возникает диалоговое окно, в
котором набирается удаляемое название символа. Следует заметить
(!), что удаление названия логического символа, ис\-поль\-зуемого
в программах ЛОСа. нежелательно: при выдаче на экран текстов таких
программ название символа не будет прорисовываться, и при попытке
редактировать программу она будет искажена.

\subsection{Перечень названий операторов ЛОСа}

Для поиска нужного оператора ЛОСа создано оглавление, в котором
базисные и основные реализованные на ЛОСе операторы и операторные
выражения ЛОСа упоря\-до\-чены по своему назначению. Это
оглавление достижимо из главного меню ЛОСа при нажатии клавиши "о"
(кир.); соответствующий пункт находится в правом нижнем углу. В
него также можно войти из редактора программ ЛОСа (см. ниже).
Через концевой пункт оглавления осуществляется выход (нажатием
клавиши "курсор впра\-во") в справочную информацию о логическом
символе, являющемся заголовком со\-от\-ветствующего оператора либо
операторного выражения. Интерфейс работы с такой справочной
информацией уже был описан выше. Заметим, что в данном случае
появляется возможность перехода к просмотру корневого фрагмента
программы текущего логического символа - для этого достаточно
нажать клавишу "Home". Для возвращения из просмотра программы
нажимается "End".

Оглавление операторов ЛОСа можно пополнять самостоятельно,
используя для этого следующие действия. После создания программы
для нового оператора либо операторного выражения следует найти
подходящий раздел оглавления либо ввести новый такой раздел; в нем
создать концевой пункт с краткой характеристикой дей\-ствий,
выполняемых новой программой. Далее - нажать клавишу "Enter".
Текст пункта окажется перерисованным в верхней части экрана; под
ним будет проведена горизонтальная линия. После повторного нажатия
"Enter" под данной линией воз\-ник\-нет курсор текстового
редактора, с помощью которого следует ввести название нового
оператора (операторного выражения). После завершения ввода (еще
одно "Enter") нажимается "курсор влево", и новый концевой пункт
создан.

\section{Интерфейс редактора программ}

Как уже говорилось выше, программа на ЛОСе представляет собой
дерево фраг\-мен\-тов, переходы между которыми выполняются с
помощью операторов перехода "ветвь $N$", "иначе $N$". Каждый
фрагмент является последовательностью операторов ЛОСа. Редактор
программ ЛОСа осуществляет постраничный показ фрагментов
программы, так что каждый фрагмент целиком умещается на экране.
Никаких про\-кру\-ток изображения на экране при этом не
предусмотрено. Если фрагмент слишком большой и целиком на экране
не помещается, то он разрезается на части, между которыми имеются
линейные переходы: в конце очередной части помещаются
опе\-ра\-торы "ветвь $N$", "продолжение", где $N$ - номер перехода
к следующей части. Операторы размещаются в программе, отделенные
друг от друга пробелами; никаких других разделяющих знаков быть не
должно. Их последовательность не фор\-ма\-ти\-руется; при
автоматической перерисовке операторы идут друг за другом с
про\-ме\-жут\-ками ровно в один пробел. Если строка заканчивается,
то текст продолжается с начала следующей строки без каких-либо
пробелов и знаков переноса. Разумеется, такой стиль изображения
программы отличается от общепринятого. Однако, плотный режим
размещения операторов имеет свои достоинства: удается размес\-тить
боль\-ший объем информации на меньшем пространстве, что упрощает
анализ контекста при написании программы и ее чтении. Решающим
фактором, сделавшим плотный режим размещения операторов
практически приемлемым и даже удобным, оказалась специальная
многоцветная указка, которая, по существу, заменяет
форма\-ти\-ро\-вание, позволяя концентрировать внимание на нужном
участке текста и опре\-де\-ляя архи\-тек\-туру его включения в
целый текст. Разумеется, возможно создать более традицион\-ные
способы изображения ЛОС-программы на экране - если они обеспечат
большую эффективность программирования, чем настоящая версия.
Впрочем, уже сейчас по\-дав\-ляющее большинство приемов
записывается не на ЛОСе, а на языке значительно более высокого
уровня - ГЕНОЛОГе. Поэтому более перспективным направлением, чем
совершенствование интерфейса редактора программ ЛОСа,
пред\-став\-ляется (ест\-ественное для логической системы)
развитие средств автоматического создания ЛОС - программ.

\subsection{Вход в редактор программ ЛОСа}

Вход в редактор программ ЛОСа через главное меню обычно
осуществляется одним из двух способов - с помощью явного указания
логического символа, программу которого нужно просматривать либо
редактировать, либо через оглавление программ ЛОСа, в котором
представлены основные блоки системы или большие
вспомо\-га\-тель\-ные процедуры общего назначения.

Для входа в корневой фрагмент программы логического символа $A$
нужно либо нажать клавишу "п", либо нажать левую клавишу мыши,
переведя ее курсор в окно главного меню "Просмотр программы
логического символа". В обоих случаях в синей рамке, расположенной
внутри этого окна, появится курсор текстового редактора. Далее
нужно набрать название символа $A$ и нажать "Enter". При наборе
последова\-тельности букв, не являющейся названием логического
символа, синяя рамка снова становится пустой, и набор следует
повторить либо нажать "Esc". При правильном наборе символа на
экране появится изображение корневого фрагмента программы символа
$A$. Если такой программы еще не было создано, то в верхней части
экрана будет перерисовано название символа $A$, а остальная часть
экрана будет пустой.

Для входа в оглавление основных программ ЛОСа из главного меню
нужно либо нажать клавишу "л", либо переместить курсор мыши в окно
"Оглавление программ" и нажать левую клавишу мыши. После этого на
экране возникает подменю оглавления программ, которое
рассматривалось перед последним выходом из этого оглавления.
Неконцевые пункты оглавления программ соответствуют основным
бло\-кам либо вспомогательным процедурам системы, или подблокам
таких блоков и процедур. Фактически ветвь оглавления программ
является вынесенной в отдельную структуру данных иерархической
системой комментариев к программе. Концевые пункты этой ветви
жестко связаны с конкретными точками в программе; выйдя на такой
пункт и нажав клавишу "курсор вправо", можно оказаться в
соответствующей контрольной точке программы. Эта точка будет
обозначена в прорисованном на экране фрагменте программы
выделенным синим цветом фиктивным оператором "прием($N$)"; $N$ -
последовательность цифр, образующая номер контрольной точки.
Нумерация контрольных точек - своя для каждого логического
символа. Для воз\-вра\-щения в оглавление из просмотра фрагмента
программы следует нажать "End". Для перехода к просмотру
надфрагмента либо подфрагментов, либо для изменения фрагмента
нужно выйти из режима просмотра подтермов операторов фрагмента, в
котором мы оказываемся после нажатия "курсор вправо", нажав
клавишу "о". Заметим, что возвращение в оглавление может быть
осуществлено из любого фраг\-мен\-та просматриваемой программы
(причем в тот концевой пункт оглавления, из которого был сделан
переход к рассмотрению программы). Однако, для такого
воз\-вра\-щения нужно сначала восстановить режим просмотра
подтермов операторов (сно\-ва нажатием клавиши "о"). Способ
регистрации в оглавлении программ ЛОСа новых контрольных точек
описывается ниже.

В принципе, возможен еще один способ входа в просмотр фрагментов
программы - через оглавление операторов ЛОСа. Это оглавление (как
уже говорилось выше) достижимо из главного меню по клавише "о"
(выбор пункта в правом нижнем углу экрана). После перехода в
концевой пункт такого оглавления и нажатия клавиши "курсор вправо"
появляется справочная информация о логическом символе -
заго\-лов\-ке оператора. При нажатии "Home" здесь осуществляется
переход к просмотру корневого фрагмента программы данного
логического символа (но уже не в режим просмотра подтермов
операторов, а в обычный режим просмотра). После просмотра и
редактирования этого либо других фрагментов той же программы
возможно воз\-вра\-щение в оглавление операторов - по нажатии
клавиши "End".

Наконец, имеется возможность входа в просмотр программы приема,
заданного на ГЕНОЛ\'ОГе - об этом будет сказано в разделе,
посвященном редактору ГЕНОЛОГа.

\subsection{Просмотр фрагментов программы}

\subsubsection{Перемещение по дереву фрагментов программы}

При просмотре фрагмента программы переходы из этого фрагмента в
подфрагменты занумерованы числами $1,2, \ldots $. Каждый такой
переход представляет собой оператор "ветвь $N$" либо "иначе $N$",
где $N$ - номер перехода. Один из этих переходов ("теку\-щий")
выделен желтым цветом. Используя клавиши "курсор вправо" \ (к
следующему переходу) и "курсор влево" \ (к предыдущему переходу),
можно выбрать нужный текущий переход. После этого нажатие клавиши
"курсор вниз" \ переводит в просмотр подфрагмента, к которому
ведет данный переход. Последующее нажатие клавиши "курсор вверх" \
вызовет возвращение к исходному фрагменту.

Если клавиша "курсор вверх" \ нажимается в корневом фрагменте, то
происходит возвращение в главное меню (именно, в режим ввода
логического символа, программу которого требуется просмотреть).
Нажатие клавиши "PageUp" \ из произвольного фрагмента программы
логического символа также позволяет (причем за один шаг) попасть в
указанный режим главного меню. Обычно эти возможности используются
для перехода к просмотру программы другого логического символа.

Если вход в редактор программ ЛОСа имел место через указание
логического символа в главном меню, а не из какого-либо оглавления
или из редактора ГЕНОЛО\-Га, то нажатие клавиши "End" при
просмотре любого фрагмента программы перево\-дит в корневой
фрагмент этой программы.

Для перемещения по дереву фрагментов программы с помощью мыши
следует подвести курсор мыши к нужному оператору перехода в
подфрагмент и нажать правую кнопку (нажатие левой кнопки переведет
в режим просмотра подтермов). Чтобы вернуться из подфрагмента в
надфрагмент, следует перевести курсор мыши в зону под текстом
программы и также нажать правую кнопку.

\subsubsection{Режим просмотра подтермов операторов фрагмента
программы}

Многие операторы ЛОСа представляют собой сложные многоэтажные
логические конструкции, текст которых занимает иногда значительную
часть экрана. Для того, чтобы облегчить концентрацию внимания на
отдельном фрагменте такого оператора и, более того, сделать
видимой его "архитектуру", используется специальная
мно\-го\-цвет\-ная указка - режим просмотра подтермов операторов.
Вход в режим просмотра подтермов обеспечивается нажатием клавиши
"о" (кириллица). При этом пропадает выделение желтым цветом
текущего перехода к подфрагменту, но первый оператор фрагмента
программы окрашивается в голубой цвет. Используя клавиши "курсор
вправо" и "курсор влево", можно последовательно выделять все
операторы текущего фрагмента.

После выбора отдельного, представляющего интерес, оператора, можно
выделить новым (отличным от голубого) цветом один из его корневых
операндов. Для этого достаточно нажать сначала на клавишу "курсор
вниз", и далее клавишами "курсор вправо" и "курсор влево"
обеспечить выбор требуемого корневого операнда. Повторяя эту
операцию для уже выделенного на некотором уровне операнда (снова
нажимая клавишу "курсор вниз", и т.д.), можно войти в просмотр
подоперандов этого операн\-да. Чтобы избежать смешения цветов, они
чередуются в соответствии с некоторым фик\-си\-ро\-ванным списком
цветов (по достижении последнего в списке цвета снова используется
первый).

Нажатие клавиши "курсор вверх" возвращает из просмотра
подоперандов к внеш\-ней операции. Если уже достигнут уровень
просмотра всего оператора в целом, то нажатие данной клавиши
игнорируется.

Для возвращения из режима просмотра подтермов операторов к
обычному режи\-му просмотра фрагмента программы достаточно
повторно нажать клавишу "о".

Можно войти в режим просмотра подтермов, переведя курсор мыши к
корню представляющего интерес подтерма и нажав левую кнопку мыши.
Если нужно пе\-рей\-ти к выделению другого подтерма - операция
повторяется. Для выхода из режим просмотра подтермов можно
перевести курсор мыши в зону под текстом программы и нажать левую
кнопку.

Если при выделенном текущем подтерме, заголовком которого служит
логический символ, нажать клавишу F3, то на экране появится
справочная информация об этом логическом символе (интерфейс работы
с ней уже был описан). Выход из просмотра этой информации - по
любой клавише, кроме используемых для перелистывания и
редактирования справочных текстов (например, по нажатию пробела).

Если нужно перейти к программе логического символа, выделенного
при про\-смот\-ре подтермов в текущем фрагменте программы, то
нажимается клавиша "с". После этого появляется корневой фрагмент
программы данного логического символа. Из этого фрагмента, далее,
можно повторно перейти указанным образом к новому фраг\-мен\-ту, и
т.д. По этой цепочке переходов можно возвращаться, нажимая клавишу
"End" \ (при каждом возвращении устанавливается корневой фрагмент
программы, а не тот, из которого имел место переход;
восстановлению исходного фрагмента для первого элемента цепочки
здесь иногда помогает нажатие клавиши F8 - например, если переход
к нему был из оглавления программ ЛОСа либо из редактора
ГЕНОЛО\-Га).

\subsubsection{Справочная информация о логических символах}

 Чтобы при просмотре программы получить информацию о том,
 что делает тот или иной оператор, или что означает некоторое
 понятие, с которым работает прием, можно пользоваться
 справочной информацией о логических символах. Она раз\-ме\-ще\-на в
 3-м информационном блоке, и фактически представляет собой
 записную книжку, в которой собрана вся необходимая техническая
 информация о логических символах - описания операторов, смысл
 применяемых в задачах обозначений, пояс\-не\-ния к использованию
 целей и комментариев задач, заголовком которых является данный
 логический символ, и т.п. По мере ввода новых символов и новых
 операторов, эту записную книжку следует регулярно пополнять новыми
 данными. Интерфейс просмотра и редактирования справочной
 информации о логическом символе уже описан выше в подразделе
 "Разное" раздела "Общие операторы интерфейса". Пере\-числим
 возможные способы обращения к этой информации из просмотра
 фрагмента программы.

 Если требуется получить информацию о логическом символе,
 являющемся за\-го\-лов\-ком данной программы, то нажимается клавиша F3.
 Если нужна информация о каком-либо другом логическом символе, то
 следует нажать клавишу F2. Далее возникает окно диалога, в котором
 следует набрать название нужного символа и нажать "Enter".

 Для получения справочной информации о логическом символе,
 встречающемся в текущем фрагменте программы, можно подвести
 курсор мыши к этому символу и нажать левую кнопку мыши. Тогда
 произойдет переход в режим просмотра подтер\-мов операторов, в
 котором текущим окажется подтерм с корнем в выбранном
 логи\-чес\-ком символе. Далее нажимается правая кнопка мыши, и на
 экране возникает справочная информация о символе. Для выхода из
 ее просмотра достаточно нажать любую кнопку мыши (кроме нажатия
 этой кнопки на пунктах меню $\rightarrow, \leftarrow$, которое
 вызовет перелистывание справочной информации). После этого
 можно либо убрать режим просмотра подтермов, выведя курсор мыши
 за рамки текста программы и нажав левую кнопку, либо перевести
 курсор к другому представляющему интерес логическому символу и
 нажать левую кнопку, чтобы соответствующий подтерм стал
 текущим.

 Кроме справочной информации о логических символах, при
 просмотре фрагмента программы можно войти в оглавление
 операторов ЛОСа. Для этого достаточно на\-жать "Ctr-л".
 Напомним, что из главного меню к этому же оглавлению переход
 происходил по нажатию клавиши "о".

 \subsubsection{Поиск заданного терма в ветви программы
 логического символа}

 Для того, чтобы найти все вхождения в операторы текущей ветви
 программы за\-дан\-но\-го терма либо логического символа, следует
 нажать клавишу F4 и далее набрать в окне диалога текстовым
 редактором требуемый терм либо логический символ. После нажатия
 "Enter" будет либо прорисовано многоцветной указкой первое
 найденное вхождение, либо (если таких вхождений в ветви вообще
 нет) возникнет пустой экран; по нажатию любой клавиши от него -
 возвращение в просмотр фраг\-мен\-та. При поиске вхождений, кроме
 текущего фрагмента программы, просматри\-ва\-ются все достижимые из
 него фрагменты. Здесь используется принцип "сначала вглубь",
 причем непосредственные подфрагменты любого фрагмента
 упорядочи\-ва\-ются "от начала к концу"\ (т.е. по убыванию
 локальных номеров).

 Для перехода к следующему вхождению искомого терма (символа)
 повторно на\-жи\-ма\-ется F4. Если найдено представляющее интерес
 вхождение, то можно (как обычно, нажатием клавиши "о") выйти из
 режима просмотра подтермов, автомати\-чески установленного при
 поиске, и выполнить необходимые операции (например, по
 редактированию программы). При этом установка на поиск заданного
 терма (символа) сохраняется, однако при повторном нажатии F4
 будет выполняться поиск только в той ветви, в которой это
 нажатие (первое в возобновленном цикле поиска) было
 осуществлено. Поэтому перед возобновлением цикла поиска следует
 сначала выйти на корень необходимой ветви программы.

 Если после очередного нажатия F4 возникает пустой экран, то
 поиск завершен. Только после этого установка на заданный терм
 (символ) сбрасывается. Далее при нажатии любой клавиши -
 переход в обычный режим просмотра фрагментов про\-грам\-мы.

\subsubsection{Последовательный просмотр программ логических
символов}

 Можно последовательно просматривать программы всех логических
 символов, на\-чиная с заданного - в соответствии с нумерацией
 логических символов. Для перехода к корню программы очередного
 логического символа (первого после текущего, для которого
 создана программа) нажимается клавиша "ш". Кроме этого
 простейшего средства полного просмотра программ "вручную",
 имеется возможность автома\-ти\-ческого просмотра всех программ
 системы, связанная с использованием специального оператора
 "смпрог". При полном просмотре всех программ и входящих в них
 опера\-то\-ров, ему передается информация о каждом
 текущем подоператоре. В зависимости от того, как будет
 запрограммирован оператор "смпрог", при этом может происходить
 поиск всех мест в программе, удовлетворяющих заданному
 ус\-ло\-вию, и изменение их по заданному принципу. Кроме того,
 будет выполняться фоновый (не зависящий от оператора "смпрог")
 поиск типовых ошибок в программах. Наличие такого режима
 автоматического просмотра сделало пока излишним разви\-тие других
 средств поиска и контроля в программах ЛОСа; оно позволило
 обращаться со всем многообразием программ системы как с единым
 целым и вводить в них при необходимости любые изменения
 (в том числе, связанные с развитием языка ЛОС). Подробнее о
 режиме автоматического просмотра программы будет сказано ниже,
 после изложения не\-об\-хо\-димой для изменения оператора "смпрог"
 техники редак\-ти\-рования программ.

 \subsection{Редактирование текущего фрагмента программы}

 Для начала редактирования текущего просматриваемого (в обычном
 режиме) фраг\-мента программы следует нажать клавишу "р" (кир.).
 При этом в правом верхнем углу экрана появляется красный
 прямоугольник, предупреждающий о том, что в случае нажатия
 клавиши "Enter" новая версия текста фрагмента будет немедленно
 записана в файлы блока программ, а старая пропадет (в этом
 случае, все же, при необходимости можно будет извлечь из
 резервной директории SLCOPY все файлы ранее сохраненной в ней
 версии решателя). Редактирование осуществляется текс\-то\-вым
 редактором.

 Для завершения редактирования нажимается клавиша "Enter"; для
 отмены из\-ме\-нений фрагмента - "Esc". Чтобы изменения фрагмента
 были сохранены, в тексте не должно иметься незавершенных или
 неправильно набранных операторов. Попытка сохранить такой
 некорректный текст приводит обычно к появлению сообщения об
 ошибке, прорисовываемого внутри красного прямоугольника в
 правом верхнем углу. Курсор текстового редактора при этом
 перемещается либо в начало текста, либо к той точке, около
 которой произошла ошибка. После устранения ошибки попытка
 сохранения текста фрагмента может быть повторена.
 Предусмотрены следующие типы сообщений об ошибках:

 1) "Незакрытая левая скобка" \ - число левых скобок в тексте
 больше числа правых. Курсор перемещается в начало текста.

 2) "Избыточная правая скобка" \ - число правых скобок в
 некоторой точке превыси\-ло число предшествующих левых. Курсор
 перемещается к этой точке.

 3) "Ошибка в логическом символе" \ - при наборе логического
 символа допуще\-на ошибка либо произошла склейка идущих подряд
 названий символов или переменных. Курсор пере\-ме\-щается к началу
 неправильно набранного символа.

 4) "Одинаковые метки" \ - несколько различных операторов
 перехода из фрагмента имеют один и тот же номер перехода.
 Курсор пере\-ме\-щается в начало текста.

 5) "Недопустимая переменная" \ - номер переменной больше 512.
 Курсор пере\-ме\-ща\-ется в начало записи этой переменной.

 Ссылки из фрагмента на подфрагменты нумеруются при
 редактировании произ\-вольным образом натуральными числами.
 Впоследствии, при перерисовках фрагмен\-та, они будут
 автоматически переобозначены на $1,2,3,\ldots$. Если изменяется
 старая версия фрагмента, то исключение оператора перехода,
 ссылающегося на подфраг\-мент, либо изменение номера его ссылки
 на новый, не использовавшийся ранее в фрагменте, приведут к
 полной потере всей ветви этого оператора.

 Если в редактируемом фрагменте возникли новые номера перехода,
 то после на\-жа\-тия клавиши "Enter" \ и регистрации в файлах блока
 программ новой версии фрагмен\-та на экране появляется в верхнем
 левом углу один из новых номеров пере\-хо\-да (первый при движении
 от конца фрагмента к началу), а остальная часть экрана
 расчищается (остается только курсор текстового редактора). Это
 - приглашение к вводу подфрагмента с указанным номером. От него
 можно отказаться нажатием клавиши "Esc", а можно
 воспользоваться, введя новый подфрагмент. Этот подфраг\-мент, в
 свою очередь, может содержать ссылки на подфрагменты, и тогда
 снова появится приглашение к вводу последнего из них, и т.п. В
 результате, если не нажи\-мать "Esc", будут по принципу "сначала
 вглубь" \ перечислены все ссылки на новые подфрагменты. Здесь
 важно не использовать дважды одного и того же номера ссыл\-ки (в
 процессе перечисления новых подфрагментов нумерация ссылок -
 глобальная, но по завершении перечисления эти номера теряются и
 вводится локальная нумера\-ция).

 Если при наборе подфрагментов нажималась клавиша "Esc", то
 останутся недо\-опре\-деленные переходы. Лучше всего доопределить
 их сразу, по завершении ука\-зан\-ного выше перечисления
 подфрагментов. Для создания фрагмента по недо\-опре\-де\-ленному
 переходу, следует нажать на этом переходе клавишу "курсор вниз" (экран
 расчистится) и войти в его редактирование повторным нажатием "р".
 Вообще, пред\-почтительнее не нажимать при перечислении
 подфрагментов клавишу "Esc", а вво\-дить какой-либо простой
 оператор для последующего возвращения к этому под\-фраг\-менту и
 фактического его набора (например, оператор "продолжение").

 Исходный фрагмент программы любого оператора, справочника либо
 опера\-тор\-ного выражения должен начинаться с оператора
 "метка(икс($N$))", где $N$ - символь\-ный номер первой
 программной переменной, не определенной при обращении и не
 явля\-ющейся выходной переменной. Этот оператор должен
 размещаться сразу после операторов "программа" либо
 "обращение($t$)", указывающих тип обращения к про\-грамме. В
 случае сканирования задачи (т.е. после оператора "решить")
 оператор "метка(икс($\ldots$))" \ не используется.

 Чтобы получить справочную информацию о логическом символе
 непосредственно в процессе редактирования, нажимается клавиша
 F4 и в диалоговом окне вводится название этого символа. После
 просмотра информации восстанавливается изобра\-же\-ние на момент
 прерывания редактирования. Если при наборе текста нужно ввести
 некоторый символьный номер $N$, больший двадцати (номера от 0 до 20
 обозначены логическими символами "0", $\ldots$, "9", "десять",
 $\ldots$, "двадцать"), то вводится запись "логсимвол($N$)". По
 окончании набора текста, после нажатия "Enter", эта запись будет
 автоматически переведена в требуемый символьный номер, и впоследствии
 в данном месте программы он будет прорисовываться в явном виде.
 Если нужно вставить в программу логический символ - код
 клавиатуры, то нажимается клавиша F8, после чего нажимается та
 клавиша, для которой нужен код. Этот код будет прорисован
 автоматически, начиная с текущей позиции курсора. Если нужен
 код для режима латинских букв, то предварительно нажимается
 F12; для возвращения к режиму кириллицы нажимается F11.

 Для копирования части фрагмента программы в другие фрагменты
 можно ис\-поль\-зовать буфер текстового редактора: войти в режим
 редактирования фрагмента, со\-дер\-жащего нужный текст (клавиша
 "р"); занести этот текст в буфер; выйти из режима
 редактирования, не изменяя программы (клавиша "Esc"); войти в
 ре\-дак\-тирование того фрагмента, в котором нужно вставить копию,
 и извлечь ее из буфера текстового редактора. При этом, однако,
 не будут скопированы те фрагменты, к которым из выделенного
 текста имелись переходы - их придется создавать повторно. Чтобы
 скопировать всю ветвь программы, предусмотрена специальная
 операция (см. ниже).

 Если в процессе набора программы возникла необходимость
 получить ин\-фор\-ма\-цию, недоступную из текстового редактора, то
 следует донабрать (произвольным образом, но со строгим соблюдением
 синтаксических правил для операторов со свя\-занными переменными)
 текущий оператор, сохранить набранную часть фрагмента нажатием
 "Enter", выйти в просмотр необходимых данных, а затем
 вернуться в прерванное редактирование.

 При редактировании программы в блоке программ обычно возникают
 "пустоты" \ - неиспользуемые остатки предыдущих версий фрагментов
 программ. Эти пустоты рекомендуется периодически устранять,
 выбирая в главном меню пункт "Уплотне\-ние измененных файлов".
 Кроме исключения неиспользуемых фрагментов, операция уплот\-нения
 осуществляет контроль за корректностью общей структуры программ.
 Если по причине ошибки или машинного сбоя в блоке программ
 обнаруживается дефект, то при выборе указанного пункта либо
 пункта "Сохранение копий файлов" \ (тоже осуществляющего данную
 проверку) произойдет выход из программы в опе\-ра\-ционную систему.
 В этом случае следует воспользоваться сохраненной в резервной
 директории SLCOPY копией программы. Такую копию следует
 постоянно обновлять выбором в главном меню пункта "Сохранение
 копий файлов". Рекомендуемый режим работы - регулярный выбор
 пунктов "Уплотнение...", "Сохранение..." \ после любых изменений
 в программе и информационных блоках.

 \subsection{Сдвиг номеров программных переменных}

 При программировании на ЛОСе следует придерживаться принципа
 последова\-тель\-ной нумерации новых переменных - это связано в
 первую очередь с логикой откатов, при которых сбрасываются
 значения всех переменных, номера которых больше неко\-торого, а
 также с экономией объема глобального стэка интерпретатора ЛОСа.
 Одна\-ко, иногда возникает необходимость при доработке программы
 вставлять внутри нее операторы, вычисляющие те или иные
 дополнительные значения. Чтобы ввести для этих значений
 программные переменные, не нарушая принципа последователь\-ной
 нумерации, приходится выполнять сдвиг (в данной ситуации -
 увеличение) номеров всех программных переменных, определяемых
 после точки вставки оператора, на заданную величину. Это
 осуществляется следующей последовательностью действий:

  а) Войти в режим просмотра подтермов операторов и выделить
  оператор, после которого (включая его самого) требуется
  выполнить сдвиг нумерации переменных.

  б) Нажать клавишу "п". Тогда в левом верхнем углу экрана
  возникает курсор текстового редактора. Если нужно увеличить
  номера переменных, большие или рав\-ные $n$, на величину $m$,
  то набирается терм "плюс(х$n$ $m$)" (буква "х" - кир.). Если
  нужно уменьшить номера переменных, большие или равные $n$, на
  величину $m$, то набирается терм "минус(х$n$ $m$)". В обоих
  случаях после нажатия "Enter" выполняется указанный сдвиг (он
  затрагивает не только данный фрагмент, но и все подфрагменты,
  дости\-жимые из выбранного оператора).

  \subsection{Операции с ветвями программы}

 Чтобы скопировать всю ветвь некоторого фрагмента программы, из
 обычного про\-смотра этого фрагмента нажимается клавиша "Insert"
 - это приводит к регистрации ссылки на фрагмент в специальном
 буфере редактора программ. Затем пред\-при\-нимается переход к тому
 фрагменту программы, всю ветвь которого следует заменить на всю
 ветвь исходного (учтенного в буфере) фрагмента. Эта ветвь НЕ
 ДОЛЖНА находиться внутри заменяющей ветви либо содержать ее.
 Как правило, такую ветвь сначала приходится специально
 создавать - состоящей из единственного фрагмента с единственным
 оператором "продолжение" \ - ответвляя в нужном месте переход к
 ней по "ветвь" \ либо "иначе". Если заменяемая ветвь относится к
 программе другого логического символа, то выход в главное меню
 для перехода к программе этого символа должен происходить
 только по нажатии клавиши "PageUp" \ - иначе ссылка в буфере на
 заменяющую ветвь будет утеряна. После того, как на экране
 возник корневой фрагмент заменяемой ветви, последовательно
 нажимаются клавиши "о" \ (кир.) - для перехода в режим
 просмотра подтермов - и "к" \ (кир.) - собственно для
 копирования ветви.

 Для удаления ветви программы, переход к которой из текущего
 фрагмента про\-граммы определяется выделенным желтым цветом
 оператором перехода, достаточно нажать клавишу "Ctr-Del".
 Эту операцию можно применять лишь однократно; для повторного
 удаления с ее помощью следует сначала выйти из просмотра
 программы текущего логического символа.

 Для удаления всей программы логического символа следует перейти
 в корневой фрагмент этой программы и нажать "Ctr-F7".

 Для удаления сразу нескольких ветвей программы, к которым из
 текущего фраг\-мента имеются переходы, можно войти в режим
 редактирования этого фрагмента и исключить операторы перехода,
 ссылающиеся на указанные ветви. По завершении редактирования
 (клавиша "Enter") эти ветви будут полностью удалены.

 Если ветвь программы была удалена с помощью "Ctr-Del" либо
 "Ctr-F7", то ее можно восстановить в качестве корневой ветви
 всей программы данного логического символа - достаточно в
 корневом фрагменте программы нажать "Ctr-F6". Такое нажатие
 должно быть выполнено до выхода из программы текущего
 логического символа. Впрочем, для удаления части программы,
 находящейся выше некоторого фрагмента, более удобным оказалось
 использовать операцию слияния двух по\-сле\-до\-вательных фрагментов
 (см. ниже).

 Если фрагмент программы оказался чрезмерно большим (например,
 после вставки в него дополнительных операторов), то его можно
 разрезать на две части. Для этого следует войти в режим
 просмотра подтермов, выделить тот оператор, который должен
 стать первым оператором второй части, и нажать клавишу "р"
 (кир.). К концу первой части фрагмента будут добавлены
 оператор "ветвь $N$", ссылающийся на вторую часть, а также
 оператор "продолжение" \ (переход ко второй части будет
 выполнен после "отражения" от этого завершающего оператора).

 Если два фрагмента программы выполняются последовательно - в
 том смысле, что первый из них завершается оператором "ветвь
 $N$", ссылающимся на второй, и оператором "продолжение", - то
 можно выполнить слияние их в один общий фраг\-мент. Эта операция
 в точности обратна описанной выше операции разрезания
 фраг\-мента. Разумеется, применять ее следует так, чтобы
 результат слияния умещался целиком на экране. В принципе,
 появление фрагментов, не помещающихся на экране целиком,
 допустимо (они иногда возникают при работе компилятора
 ГЕНОЛОГа). Однако, для удобства работы их лучше разрезать на
 части. Во всяком случае, это необходимо делать перед
 редактированием такого фрагмента.

 \subsection{Обнаружение ошибок в программе}

 Предусмотрена возможность автоматического контроля правильности
 программы логического символа, включающего обнаружение
 простейших ошибок - несоот\-вет\-ст\-вия числа операндов операторов и
 операторных выражений их арности, использо\-ва\-ние значения
 переменной, которое еще не было определено, попытка повторно
 определить уже определенное значение, и т.п. Для выполнения
 такого контроля следует войти в просмотр корневого фрагмента
 программы и нажать клавишу "п". При наличии ошибок будут выданы
 соответствующие сообщения (при этом прои\-зой\-дет переход в режим
 просмотра подтермов и будет выделена точка ошибки - для
 последующего ее исправления нужно будет сначала нажатием
 клавиши "о" (кир.) перейти в обычный просмотр фрагмента). При
 отсутствии ошибок, по окончании анализа программы, произойдет
 перерисовка корневого фрагмента.

 Если контролируется программа нового оператора либо
 операторного выражения, причем после первого оператора ее
 корневого фрагмента, уточняющего тип обра\-ще\-ния, не идет
 "иначе", то процедура контроля автоматически вводит программу
 справочника "арность", указывающую на число операндов этого
 оператора либо операторного выражения. Для перечисляющих
 операторов вводится также про\-грам\-ма справочника
 "комментпосылок". При определении арности здесь используется
 оператор "метка(икс($N$))", размещаемый в начале контролируемой
 программы.

 Возможна серийная проверка программ логических символов,
 начиная с текущего логического символа. Для запуска этой
 проверки нажимается клавиша "П". Останов\-ка серийной проверки
 осуществляется нажатием любой клавиши. Для просмотра всех
 программ системы следует начинать с логического символа
 "метка", имеющего номер 1. При просмотре перерисовки фрагмента
 программы на экране не происходит; меняются только заголовки
 просматриваемых программ в верхней части экрана.

 При контроле программы одного логического символа (клавиша "п")
 либо при серийном контроле (клавиша "П") возможно выполнение
 дополнительных действий, определяемых программой оператора
 "смпрог($a$ $b$ $c$ $d$ $e$)". К этому оператору про\-ис\-хо\-дят
 обращения для каждого текущего просматриваемого вхождения в
 операторы фрагментов программ. При этом значением переменной
 $a$ становится логический символ, к которому относится фрагмент
 программы; значением переменной $b$ - набор $(F_1, \ldots, F_n)$,
 определяющий путь от корня программы символа $a$ к текущему
 про\-смат\-ри\-ва\-емому фрагменту программы. Каждое $F_i$ есть тройка
 $(F_{i1},F_{i2},F_{i3})$, у кото\-рой $(F_{i1},F_{i2})$ -
 ссылка на фрагмент программы;$F_{i3}$ - символьный номер
 перехода от этого фрагмента к подфрагменту, соответствующему
 тройке $F_{i-1}$. Последний элемент набора $b$ определяет
 переход от корня программы символа $a$; первый элемент -
 переход к текущему фрагменту. Значением переменной $c$ служит
 набор троек $(G_1,\\  \ldots, G_{n+1})$; $G_i =
 (G_{i1},G_{i2},G_{i3})$. Эти тройки описывают фрагменты программы
 , рас\-положенные на пути, определяемом набором $b$; $G_{n+1}$
 соответствует корню программы символа $a$, а $G_1$ - текущему
 фрагменту. $G_{i1}$ есть сам фрагмент программы, пред\-став\-ленный
 набором термов в зоне задач; $G_{i2}$ - набор дополнительных
 логических условий на программные переменные, встречающиеся в
 операторах фрагмента $G_{i1}$. $G_{i3}$ - набор информационных
 элементов, характеризующих фрагмент $G_{i1}$. Для указания
 корневого фрагмента здесь используется элемент "корень"; для
 указания вхождения $v$ в фрагмент оператора перехода,
 ссылающегося на подфрагмент текущего пути - элемент (позиция
 $v$). Входной переменной $d$ оператора "смпрог($\ldots$)"
 присваивается вхождение текущего оператора в список операторов
 текущего фрагмента; переменной $e$ - вхождение текущего
 логического символа в текущем операторе.

 Если оператор "смпрог" оказывается истинным в некоторой точке
 просмотра, то просмотр обрывается, и многоцветной указкой
 выделяется текущее вхождение в текущий оператор текущего
 фрагмента. Для продолжения просмотра после этого (кроме случаев
 сообщения о найденной ошибке) следует нажать клавишу "ш".
 Сле\-дует учитывать, что при выходе из режима многоцветной указки
 цикл просмотра сбрасывается, и тогда нужно запускать его с
 текущего логического символа заново.

 Оператор "смпрог" можно использовать для поиска точек в
 программе, удовлет\-во\-ряющих заданным условиям. Эти условия,
 с помощью редактора программ, за\-пи\-сы\-ваются в начале программы
 данного оператора (предварительно следует уда\-лить тождественно
 ложный оператор, обычно вставляемый в начало программы "смпрог"
 для предотвращения ее срабатываний в режиме общей проверки;
 обычно таким оператором является "равно(0 1)"). В найденной
 точке можно изменить про\-грам\-му вручную и возобновить поиск,
 начиная с текущего логического символа. Возможна реализация
 цикла автоматического изменения всей программы системы - для
 этого в операторе "смпрог" нужно реализовать процедуру
 модификации фраг\-мен\-та или целой ветви программы, и заменить старый
 фрагмент (ветвь) на новый, используя специальные операторы для
 работы с фрагментами программ, описанные в разделе, посвященном
 программной реализации редактора программ.

\subsection{Сопровождение справочной ин\-фор\-ма\-ци\-ей
из\-бран\-ных\\ то\-чек в про\-грам\-ме}

 Чтобы сопровождать избранные точки программ ЛОСа необходимыми
 пояснениями, а также чтобы быстро можно было находить нужную
 процедуру и находить в этой процедуре конкретную точку, создано
 специальное оглавление, в котором пере\-чис\-ле\-ны основные
 процедуры системы, реализованные на ЛОСе. Об этом оглавлении
 уже говорилось вкратце выше (при описании способов входа в
 просмотр программ); вход в него - через пункт "Оглавление
 программ" \ главного меню. Концевые пункты данного оглавления
 суть комментарии к избранным точкам программы. Для входа в
 просмотр такой точки достаточно нажать в концевом пункте
 клавишу "курсор вправо". После этого возникает текст фрагмента,
 в котором синим цветом выделен оператор "прием($i$)" \ - он
 отмечает нужно место в программе. Здесь имеет место режим
 просмотра подтермов операторов. Далее можно произвольным
 образом пе\-ре\-ме\-щать\-ся по фрагментам программы (не выходя в
 главное меню) и менять режим просмотра; если в произвольной
 точке восстановить режим просмотра подтермов и нажать "End", то
 будет восстановлен исходный концевой пункт оглавления программ.

 Если при просмотре фрагментов программы после перехода к ним из
 оглавления программ (в обычном режиме просмотра) нужно
 вернуться к тому фрагменту, с которого был начат этот просмотр,
 то нажимается F8. Произойдет возвращение к просмотру исходного
 оператора "прием($i$)", причем восстановится режим просмотра
 подтермов.

 Если нужно связать комментарий с какой-либо точкой программы,
 то следует войти в режим просмотра подтермов, выделить тот
 оператор $A$, к которому относится этот комментарий, и нажать
 клавишу "PageDown". После этого на экране возникнет некоторая
 страница оглавления программ ЛОСа. Перемещаясь по этому
 оглавлению, а при необходимости - создавая новые его
 подразделы, следует перейти в то меню, которое связано с
 описанием рассматриваемой части программы. Далее нужно ввести
 новый концевой пункт этого меню (клавиша "к" либо "К"), и
 текстом этого пункта сделать требуемый комментарий. По
 окончании ввода текста (нажатие клавиши "Enter") перед
 оператором $A$ будет вставлен фиктивный оператор "прием($N$)",
 ссы\-ла\-ю\-щий\-ся на введенный концевой пункт оглавления программ.

 Если вход в программу происходил не из оглавления программ, то
 для получения информации оглавления программ, относящейся к
 выбранной ее точке, следует вы\-де\-лить в этой точке многоцветной
 указкой какой-либо оператор и нажать "End". Тогда будет найден
 первый предшествующий выделенной позиции оператор "прием($N$)",
 и осуществится переход к его концевому пункту оглавления
 программ.

 Чтобы удалить концевой пункт оглавления программ и одновременно
 удалить ссылку "прием($i$)" в программе, соответствующую этому
 пункту, достаточно нажать "Ctr-Del" при выделенном концевом
 пункте оглавления программ.

 \subsection{Дополнительные возможности ин\-тер\-фей\-са
 ре\-дак\-то\-ра\\
 про\-грамм}

 Находясь в режиме просмотра фрагмента программы, можно
 выполнить ряд вспо\-мо\-га\-тель\-ных операций. Прежде всего, именно из
 этого режима осуществляется вход в создание и редактирование
 шаблонов диалоговых блоков. При нажатии клавиши "д" \ возникает
 оглавление диалоговых блоков, в котором можно либо выбрать для
 просмотра и редактирования ранее созданный шаблон блока диалога
 ("курсор впра\-во" \ на выбранном пункте; для возвращения в
 оглавление из редактирования шабло\-на - "Esс"), либо создать
 новый шаблон. Последнее осуществляется cозданием
 нового концевого пункта и входом в него - так же, как и для
 ранее созданного пункта. Интерфейс редактирования шаблона блока
 диалога был описан выше. Для удаления шаблона достаточно
 удалить (Ctr-Del) соответствующий концевой пункт оглавления.

 Кроме оглавления шаблонов блоков диалога, из режима просмотра
 фрагмента программы можно перейти в ряд других справочных
 оглавлений, которые бывает нужно использовать при редактировании
 программ: оглавление информационных элементов компилятора
 ГЕНОЛОГа (Ctr-п); оглавление типов комментариев к эле\-мен\-ту
 фразы, используемых анализатором текстов русского языка
 (Ctr-ф); оглавле\-ние типов примечаний к теореме при ее целевой
 характеризации (Ctr-т). Подробнее об этих оглавлениях будет
 сказано в последующих разделах.

 \chapter{Отладчик ЛОСа}

 \section{Семантическая трассировка решения за\-да\-чи}

 Семнатическая трассировка представляет собой пошаговый просмотр
 процесса ре\-шения задачи с отображением на экране сообщений
 о применении приемов, сопро\-вож\-даемых пояснениями. Такая
 трассировка позволяет понять способ решения зада\-чи "в целом"
 и локализовать моменты, требующие специальной доработки.

 Способы запуска решения задачи уже были описаны выше в разделе
 "Общая схема функционирования решателя". Для запуска решения
 без трассировки нажи\-ма\-ется клавиша "о"; для запуска решения с
 семантической трассировкой нажимается "р", причем
 предварительно уточняется режим трассировки. Это делается с
 помощью диалогового блока, активизируемого нажатием клавиши
 "т". Выбор левой кнопкой мыши пунктов этого блока включает либо
 выключает соответствующие установки на трассировку. Для
 обычного просмотра рекомендуется режим с выключенным пунктом
 "ручной выбор входа в подпроцесс"; включение этого пункта
 происходит в тех случаях, когда при решении задачи встречается
 обращение к чрезвычайно трудоемкой вспомогательной задаче,
 не выводимое на экран. Такое включение не обязательно выполнять
 с самого начала трассировки: обращение к диалоговому блоку выбора
 режима трассировки возможно на каждом шаге. Другие пункты этого
 ди\-ало\-го\-вого блока таковы:

  1) "Пропуск обращений к проверочным операторам" \ - обычно
  выключен. Его включение приведет к тому, что перестанут
  появляться сообщения об обращениях к процедурам проверки
  различных вспомогательных утверждений.

  2) "Пропуск шагов удаления посылок и условий" \ - обычно
  включен. Его выклю\-че\-ние приведет к тому, что будут явно
  указываться шаги удаления ненужных условий и посылок задачи.

  3) "Пропуск изменений сопровождающих условий" \ - обычно
  включен. Его вы\-клю\-чение приведет к тому, что будут
  отображаться изменения условий на область допустимых значений,
  сопровождающие основные шаги решения.

  4) "Пропуск входа в любые подпроцессы" \ - обычно выключен.
  Сообщения об обращениях к наиболее существенным для решения задачи
  вспомогательным задачам и процедурам при его выключении
  автоматически выводятся на экран (хотя такие обращения
  означают не срабатывание приема, а только начало попытки его при\-ме\-нения).
  Если этот пункт включен, то данные сообщения пропадут, а останутся
  лишь сообщения о фактически сработавших приемах.

  5) "Просмотр шагов изменения комментариев" \ - обычно
  выключен. Изменения технических пометок - так называемых комментариев
  образуют достаточно ин\-тен\-сивный поток, вывод которого на экран
  существенно замедлит трассировку.

  6) "Пропуск регистрации условий на о.д.з." \ - обычно включен.
  При его вы\-клю\-чении более подробно будет отображен процесс
  первоначального ввода условий на область допустимых значений,
  сопровождающих условия и посылки задачи.

  Чтобы перейти из режима семантической трассировки в просмотр
  текущей си\-ту\-ации с помощью отладчика ЛОСа, достаточно нажать
  клавишу "ф". Тогда на экране появится текст текущего
  исполняемого фрагмента программы, вплоть до текущего оператора
  (пока не реализованного), который будет выделен малиновым
  цветом. Дальнейшие действия - согласно инструкции по отладчику
  ЛОСа (см. ниже). Для возвращения в просмотр текущего кадра
  семантической трассировки и продолжения ее достаточно нажать
  клавишу "р" либо клавишу "з".

 \section{Установка режимов технической трасси\-ров\-ки пе\-ред
 за\-пус\-ком ре\-ше\-ния}

 Если нужно отладить прием, реализованный на ГЕНОЛ\'ОГе,
 то сначала следует создать либо найти в задачнике такую задачу,
 где он должен сработать. После этого можно создать установку на
 прерывание при попытке применения данного приема и запустить
 решение задачи до обнаружения такой попытки. Для этого (из
 просмотра задачи в задачнике) нажимается клавиша "г" или
 выбирается пункт "Генолог" \ меню выбора режима трассировки,
 расположенного в верхней части экрана. Тогда возни\-ка\-ет
 некоторый пункт оглавления базы приемов ГЕНОЛОГа. В этом оглавлении
 находится нужный пункт, и внутри группы приемов этого пункта
 находится нужный прием (для этого служат клавиши "курсор
 вверх" \ - "курсор вниз"). Далее нажима\-ет\-ся клавиша
 "Ctr-Enter", которая одновременно создает установку на
 прерывание и запускает решение задачи.

 Если в процессе решения произойдет выход на начальный отрезок
 программы выбранного приема (именно, на используемый для
 указания этого начала фиктивный оператор "контрольприема($A_1$
 $A_2$ $A_3$)"; \ здесь $A_1,A_2,A_3$ - логические символы и
 тер\-мы, образующие стандартную техническую ссылку на прием),
 то включится отладчик ЛОСа, и на экране будет отображен
 фрагмент программы с выделенным малиновым цветом оператором,
 который должен будет выполняться непосредственно на сле\-ду\-ющем
 шаге (этот оператор следует за оператором
 "контрольприема($A_1$$A_2$$A_3$)"). При этом устанавливается пошаговый
 режим трассировки (см.ниже).

 Если выбранный прием применяется при сканировании задачи либо
 при работе пакетного нормализатора (см. описание ГЕНОЛОГа), то
 можно установить пре\-ры\-вание при фактическом применении этого приема.
 Для этого вместо клавиши "Ctr-Enter" нажимается клавиша "Enter".

 Если нужно проверить, применяется ли при решении задачи
 некоторый оператор либо операторное выражение, реализованные с
 помощью программы на ЛОСе, и проследить по шагам ход выполнения
 этой программы, то перед запуском решения задачи нажимается
 клавиша "Л". Тогда в левой нижней части экрана возникает
 надпись "Логический символ:" \ и появляется курсор текстового
 редактора. Вы\-пол\-няется набор необходимого логического символа и
 нажимается "Enter". Если бы\-ло набрано слово, не являющееся
 названием логического символа, то оно пропадает с экрана и
 курсор возвращается в исходное положение - для повторного
 набора. Иначе - одновременно создается установка на прерывание
 при обращении к программе указанного логического символа и
 запускается процесс решения задачи. По дости\-же\-нии первого
 оператора корневого фрагмента программы выбранного символа
 вклю\-чается отладчик ЛОСа; сам этот оператор прорисован
 малиновым цветом и еще не выполнен. Для дальнейших действий
 автоматически устанавливается пошаговый режим трассировки.

 Если нужно проследить моменты выхода к точкам программы, для
 которых созданы соответствующие концевые пункты оглавления
 программ, то перед запуском решения задачи нажимается клавиша
 "л". Тогда возникает некоторый пункт оглав\-ления программ. Если
 выбрать нужный концевой пункт этого оглавления и нажать на нем
 клавишу "курсор вправо", то одновременно инициируется
 прерывание при выходе на соответствующую контрольную точку программы
 (напомним, что эта точка представляет собой фиктивный оператор
 "прием($N$)"; $N$ - номер контрольной точки внутри программы
 данного логического символа). Как и в предыдущих случа\-ях, по
 достижении контрольной точки включается отладчик ЛОСа и
 устанавливается пошаговый режим трассировки.

 При отладке бывает полезно применение счетчика шагов работы
 интерпретатора ЛОСа. Оно дает возможность при повторных
 запусках решения задачи иден\-ти\-фи\-цировать (например, методом
 деления отрезка пополам) момент ошибочного дейст\-вия. Это
 средство применяется, впрочем, достаточно редко, так как
 подавляющее большинство ошибок обнаруживаются по недопустимым
 типам входных данных опе\-ра\-торов ЛОСа и немедленно выводятся на
 экран. Однако, в некоторых случаях появление заведомо ошибочных
 элементов структуры данных не выявляется сред\-ства\-ми общего
 контроля, и анализ текущей информации не позволяет объяснить их
 происхождение. В этих случаях и используется счетчик шагов. При
 трассировке на уровне отладчика ЛОСа номер текущего шага работы
 интерпретатора выводится на экран в правом верхнем углу. Этот
 номер позволяет примерно определить диапазон, в котором следует
 искать момент появления ошибки. Если при повторном
 запуске решения задачи нажать клавишу "Ш" и ввести текстовым
 редактором в появившемся окне диалога (после надписи "Число
 операторов:") номер шага, соответствующего началу диапазона
 поиска ошибки, то по нажатии "Enter" будет одновременно
 уста\-нов\-лено прерывание по достижении заданного шага и начато
 решение задачи. По достижении нужного шага включается отладчик
 ЛОСа и устанавливается пошаговый режим.

 Кроме установок на автоматическое прерывание процесса решения,
 можно в лю\-бой момент прервать этот процесс вручную. Для этого
 достаточно нажать клавишу "Bre\-ak". В результате появится текст
 текущего исполняемого фрагмента програм\-мы, в котором текущий
 (еще не выполненный) оператор выделен малиновым цветом. Для
 работы в отладчике ЛОСа устанавливается пошаговый режим.
 Заметим, что нажатие клавиши "Break" не позволяет входить в
 просмотр функционирования про\-грамм отладчика.

 Наконец, самый простой (но сравнительно трудоемкий) способ
 вызвать пре\-ры\-ва\-ние работы программы и обращение к отладчику
 ЛОСа в нужной точке программы - вставить в этой точке оператор
 "трассировка(стоп 0)". Этот оператор вызывает немедленный вход
 в отладчик ЛОСа с пошаговым режимом, не выполняя никаких других
 действий (он всегда истинен). По завершении анализа текущего
 шага отлад\-чиком и продолжении трассировки будет выполняться
 следующий за ним оператор. Единственное необходимое условие его
 корректной работы - наличие после него в программе хоть
 какого-либо другого оператора. Заметим, что помещение данного
 оператора внутри процедур интерфейса и даже процедур самого
 отладчика приводит к тому же эффекту, так что он делает
 возможной отладку с помощью отладчика ЛОСа тех участков
 программы отладчика, в которых этот оператор не будет немед\-ленно
 повторно выполняться при попытке обращения к отладчику.

 \section{Просмотр информации о моменте прерыва\-ния}

 Собственно отладчик ЛОСа представляет собой программу
 логического символа "прерывание", которая активизируется на тех
 шагах работы системы, для которых либо оказывается истинным
 заранее установленное условие прерывания, либо нажи\-ма\-ется
 клавиша "Break", либо обнаруживается попытка реализации оператора
 ЛОСа для недопустимых входных данных. Эта программа позволяет
 просмотреть инфор\-ма\-цию о текущем состоянии системы и изменить
 режим трассировки, в том числе ввести новые установки на
 прерывание. При выходе из нее продолжается прерванное реше\-ние
 задачи. На момент входа в программу "прерывание" счетчик шагов
 интерпре\-та\-тора ЛОСа отключается, так что работа с отладчиком
 никак не сказывается на соответствии номеров шагов действиям
 решателя. В процессе работы с отладчиком ЛОСа можно восстановить
 исходное изображение, возникшее на момент обращения к нему при
 прерывании, нажав клавишу "р" (кир.).


 \subsection{Просмотр программы}

 При входе в отладчик ЛОСа на экране прорисовывается некоторый
 фрагмент прог\-раммы, в котором малиновым цветом выделен текущий
 (пока не выполненный) опе\-ра\-тор. Этот фрагмент, вообще говоря,
 не является корневым; можно просмотреть все его надфрагменты в
 дереве программы текущего логического символа, используя
 клавиши "Home" \ (шаг по направлению к корню программы) и "End"
 \ (шаг от корня программы к фрагменту с текущим оператором).
 С указанными фрагментами связан общий набор значений программных
 переменных текущей ситуации, возникшей при выполнении текущей
 программы; эти значения сохраняются в некотором кадре гло\-бального
 стэка интерпретатора ЛОСа. Заметим, что из режима трассировки
 воз\-мо\-жен просмотр только линейной цепочки фрагментов, от корня
 программы до фрагмента с текущим оператором; выход на боковые
 ветви программы не предус\-мот\-рен.

 При просмотре фрагментов программы выдается только начальный
 отрезок фраг\-мен\-та до оператора, выделенного малиновым цветом
 (это либо текущий оператор, либо оператор перехода к
 подфрагменту). Чтобы просмотреть все операторы фраг\-мента,
 нажимается клавиша "ф". Чтобы убрать с экрана лишние (идущие
 после выделенного малиновым цветом) операторы, нажимается
 клавиша "о". В левой верх\-ней части экрана размещен текст
 "Программа $A$", где $A$ - заголовок программы (выделяется
 синим цветом). В правой верхней части экрана размещен текст
 "шаг № $N$", где $N$ - номер текущего шага работы
 интерпретатора ЛОСа. Этот шаг не является абсолютным; он
 отсчитывается только с момента запуска решения из\-вле\-чен\-ной из
 задачника задачи, что делает его неизменным при повторных
 запусках и позволяет использовать для локализации событий,
 происходящих при решении. Под текстом фрагмента программы
 проведена горизонтальная черта, отделяющая область экрана,
 в которой можно получать дополнительную информацию о текущем
 шаге.

 Кадр глобального стэка интерпретатора ЛОСа сохраняет информацию
 о текущих значениях программных переменных, возникающих при реализации
 программы не\-ко\-торого оператора либо операторного выражения,
 либо при сканировании некоторой задачи. При обращении от программы к
 подпрограмме создается новый стэковый кадр, для сохранения значений
 программных переменных этой подпрограммы. Таким образом,
 возникает цепочка стэковых кадров, в которых сохраняются
 значения про\-грам\-мных переменных как для текущей программы, так
 и для всех ее надпрограмм. Самая "верхняя" программа в этой цепочке -
 сканирование исходной фиктивной за\-да\-чи на исследование; от нее
 имело место обращение к сканированию задачи, извле\-ченной из
 задачника; далее - к некоторой вспомогательной задаче либо
 оператору, и т.д. Возможен просмотр всей цепочки "надпрограмм"
 \ текущей реализуемой про\-грам\-мы с помощью отладчкиа ЛОСа. Для
 этого служат клавиши "PageUp" \ и "PageDown". Первая из них
 переводит от просмотра программы к ее надпрограмме; вторая -
 от программы к подпрограмме (все это - вдоль линейной цепочки
 обращений, сложившейся на текущий момент). При переходах
 прорисовываются отрезки со\-от\-вет\-ствующих фрагментов программы
 вплоть до того оператора, от которого имело место обращение к
 подпрограмме. На каждом уровне цепочки обращений возможен
 просмотр значений программных переменных данного уровня. Так
 как значения этих переменных при выполнении программы на ЛОСе
 часто сохраняются неизменными (значение однажды определенной переменной
 обычно меняется только при откатах), то становится возможен
 анализ значительной части "предыстории" \ текущей ситу\-а\-ции.

 Использование пар клавиш "Page Up - Page Down" и "Home - End"
 делает просмотр текущей ситуации двумерным: можно варьировать
 фрагмент программы по цепочке переходов внутри программы одного
 логического символа, а также варьировать саму рассматриваемую
 программу по цепочке обращений от одной программы к другой.

 При просмотре программы отладчиком, как и при просмотре ее
 редактором про\-грамм, возможен вход в режим просмотра подтермов
 операторов (многоцветная указ\-ка). Этот режим упрощает чтение и
 понимание сложных логических операторов, а также используется
 при установке прерываний (см. ниже). Для входа в режим
 просмотра подтермов операторов следует нажать клавишу "курсор
 вниз" \ - первый из операторов текущего фрагмента выделяется
 синим цветом. Далее клавиши "курсор вправо" \ - "курсор влево"
 \ позволяют выбрать нужный оператор фрагмента; клавиша "курсор
 вниз" \ - войти в просмотр операндов выделенной операции;
 клавиши "курсор вправо" \ - "курсор влево" \ - выбрать нужный
 операнд. Для возвращения от операнда к внешней операции и
 выхода из режима просмотра подтермов нажимается клавиша "курсор
 вверх".

 Для получения информации о логическом символе, выделенном при
 просмотре подтермов оператора, нажимается клавиша F3.

 В режиме просмотра фрагмента программы (без выделения подтермов
 опера\-то\-ров) возможен обычный доступ к справочной информации о
 логических символах: нажатие клавиши F3 приводит к выдаче
 информации о логическом символе - заго\-лов\-ке текущей программы;
 нажатие клавиши F2 - к появлению курсора текстового редактора,
 с помощью которого набирается название логического символа, о
 котором требуется получить информацию.

 \subsection{Просмотр цепи задач}

 Для входа в просмотр цепи задач (текущей задачи и всех ее
 надзадач) нажимается клавиша "з". При просмотре применяются
 клавиши "курсор вверх" \ - "курсор вниз"; "PageUp" \ -
 "PageDown"; "Ctr-PageUp" \ (начало цепи задач); "Ctr -
 PageDown" \ (конец цепи задач, т.е. текущая задача); "Ctr -
 курсор вверх" \ (к началу предыдущей задачи); "Ctr - курсор
 вниз" \ (к началу следующей задачи). Заметим, что хотя внешне
 прос\-мотр цепи задач из отладчика ЛОСа ничем не отличается от
 просмотра ее при трассировке по шагам решения задачи, нажатие
 клавиши "Enter" \ в первом случае не приводит к продолжению
 процесса решения задачи.

 Для возвращения в основной интерфейс отладчика ЛОСа из
 интерфейса прос\-мот\-ра цепи задач нажимается клавиша "ф".

 \subsection{Просмотр значений программных переменных}

 Для просмотра различной информации о текущей ситуации
 используется область экрана, расположенная под горизонтальной
 чертой, отделяющей текст фрагмента программы. Если эта область
 недостаточна, то можно вообще убрать с экрана текст
 фрагмента программы, нажав клавишу "Delete" \ (этот текст
 восстанавливается на\-жа\-тием клавиш "о" \ - до текущего
 оператора, либо "ф" \ - полный текст фрагмента). Если нужно
 убрать текст программы, сохранив информацию, размещенную в нижней
 части экрана, то вместо "Delete" \ нажимается F5. В нижней части
 экрана данные выдаются в режиме автоматической прокрутки вверх
 (обратная прокрутка не\-воз\-можна, и для повторного просмотра
 удаленных с экрана объектов их следует вос\-тре\-бовать заново).
 Возможна ручная прокрутка вверх содержимого нижней части экрана
 (при сохраняющемся в верхней части тексте фрагмента программы)
 с по\-мощью клавиши "курсор вниз".

 Для просмотра значения программной переменной "х$i$" следует
 нажать клавишу "х" \ (кириллица) - появятся буква "х" \ и
 курсор текстового редактора, и далее набрать номер $i$ в
 обычной десятичной записи.

 Если значением программной переменной "х$i$" является терм, то
 он будет выдан в стандартной либо в скобочной записи в
 зависимости от ранее установленного режима просмотра термов.
 Клавиша "с" \ переводит в скобочный режим, клавиша "м" \ (кир.)
 - в режим стандартной математической записи.

 Если значением переменной "х$i$" \ служит набор, не являющийся
 термом, то будут последовательно выданы все его разряды. Здесь
 логические символы и символы переменных указываются явно
 (последние - в виде, согласованном либо со скобочной записью,
 т.е как буква "х" с номером, либо в виде, согласованном со
 стандартной математической записью - как латинская буква, быть
 может, с индексом). Элемент набора, пред\-став\-ля\-ющий собой терм,
 обозначается посредством записи "т$j$", где $j$ - номер,
 закрепляемый за данным термом на период просмотра элементов
 текущей структуры данных (эти номера сбрасываются при смене
 текущего просматриваемого фрагмента клавишами PageUp,PageDown,
 Home,End). Элемент набора, пред\-став\-ля\-ющий собой набор, отличный
 от терма, обозначается посредством записи "н$j$", где $j$ -
 номер, закрепляемый за указанным набором на период просмотра
 структуры данных. Элемент набора, представляющий собой
 вхождение в некоторый набор либо в терм, обозначается
 посредством "в$j$", где $j$ - номер, закрепляемый за данным
 вхождением на период просмотра. Нумерация объектов всех
 указанных типов - общая.

 Если значением переменной "х$i$" служит вхождение в терм либо в
 набор, то будет прорисован, соответственно, этот терм либо
 набор, в котором подтерм либо разряд, находящийся по
 рассматриваемому вхождению, выделен синим цветом.

 Объекты "н$j$", "т$j$", "в$j$", введенные при просмотре набора,
 сами могут быть отображены на экране в одном из указанных выше
 видов. Для этого следует лишь нажать, соответственно, клавишу
 "н", \ "т" \ либо "в" \ и после этого набрать номер $j$ объекта
 (набор номера завершается нажатием клавиши "Enter").

 Для большей наглядности можно изображать набор в виде
 последовательности строк, каждая из которых в указанном выше формате
 представляет один разряд набора. При этом предусмотрена выдача
 лишь тех элементов набора, которые не являются логическими
 символами либо переменными (символьные элементы доступ\-ны при
 обычном просмотре набора, и здесь они пропускаются). Если
 рассматри\-ва\-емый набор является значением переменной "х$i$", то
 нажимается клавиша "Х" \ (кир.) и вводится номер $i$; если же
 набор обозначен как "н$i$", то нажимается клавиша "Н" \ (кир.) и
 вводится номер $i$. Возможно отображение в указанном виде лишь
 тех элементов набора, которые начинаются с заданного
 логического символа $S$. Для этого после набора номера $i$ в
 окне текстового редактора помещается название сим\-во\-ла $S$
 (отделенное от номера пробелом).

 Если требуется одновременно выдать на экран в скобочной записи
 все элементы набора термов "н$i$", то нажимается клавиша "а"
 (кир.), после чего вводится текстовым редактором номер $i$.

 По-видимому, для просмотра сложных структур данных наиболее
 удобным яв\-ля\-ется использование "сквозного режима". В этом режиме
 используется все прост\-ран\-ство экрана (текст фрагмента программы
 временно удаляется); каждый раз\-ряд набора прорисовывается,
 после указания его номера, на отдельной строке либо груп\-пе строк,
 причем возможна обычная прокрутка (клавиши "курсор вверх-вниз" \ и
 "PageUp - PageDown"). Синим цветом выделяется номер текущего
 разряда набора (смена этого номера - клавишами "курсор вверх -
 вниз"). Если текущий разряд сам является набором, то для его
 просмотра нажимается клавиша "курсор вправо", после чего он
 прорисовывается на экране в указанном поразрядном виде. Таким
 образом можно дойти до атомарных объектов, не являющихся
 наборами. Возвращение от элемента к внешнему набору, а также
 выход из указанного режима обеспечиваются нажатиями клавиши
 "курсор влево". Номера атомарных (не являющихся наборами)
 разрядов завершаются круглой скобкой; номера разрядов,
 являющихся наборами - точкой. При отображении разряда,
 являющегося набором, используются обычные сокращения: "т"
 \ означает терм, "н" \ - набор, "в" \ - вхождение. Эти
 сокращения, однако, не сопровождаются номерами, излишними при
 возможности выбора объекта для просмотра с помощью курсора.
 Чтобы просмотреть в сквозном режиме набор, являющийся значением
 переменной "х$i$", нажимается клавиша "К" (кир.) и вводится
 номер $i$. Если просматривается набор "н$i$", то нажимается "к"
 (кир.) и вводится $i$.

 Если задача сопровождается чертежом, то возможна его прорисовка
 в отладчике ЛОСа. Нажатие клавиши "ч" приводит к его прорисовке
 в верхней части экрана; клавиши "Ч" - к прорисовке чертежа под
 ранее выведенной в нижней части экрана информацией. После
 вывода чертежа возможен обычный просмотр элементов те\-ку\-щей
 структуры данных, размещаемых под чертежом.

 Если используются как стандартная математическая, так и
 скобочная записи термов, то для установления связи между
 обозачениями переменных в этих способах записи используется
 переходная таблица (она перечисляет пары "обозначение
 пе\-ре\-мен\-ной задачи в стандартной записи - обозначение этой
 переменной в скобочной записи"). Для вызова на экран переходной
 таблицы нажимается клавиша "п".

 \subsection{Сообщение об ошибке в программе}

 Если интерпретатор ЛОСа обнаруживает попытку реализации
 некоторого оператора с недопустимыми для него типами входных
 данных, то он инициирует вход в отладчик ЛОСа и выдачу
 сообщения об ошибке: в верхней левой части пустого экрана
 возника\-ет сообщение "Некорректное обращение к оператору".
 При входе в просмотр текуще\-го фрагмента программы (нажатие
 клавиши "ф") будет прорисована часть этого фраг\-мента,
 предшествующая текущему оператору (выделенному малиновым
 цве\-том). Ана\-лиз окрестности этого оператора обычно позволяет
 выявить описку в про\-грамме. Возможны также обращения к
 отладчику ЛОСа при обнаружении ин\-тер\-пре\-татором переполнения
 различных ресурсов. В этих случаях выдаются следующие сообщения
 об ошибке:

 1) "Переполнение глобального стэка" \ - означает, что имеется
 чрезмерно длинная цепочка обращений от программы к подпрограмме,
 так что суммарный объем кадров глобального стэка, описывающих
 значения программных переменных всех этих прог\-рамм, превысил
 предельно допустимую величину. Часто это происходит при
 "за\-цик\-ливании" \ в рекурсивных обращениях.

 2) "Переполнение буфера текстов" \ - означает, что предпринята
 попытка создать настолько большой терм или набор, что он
 превысил предельно допустимую величи\-ну.

 3) "Переполнение зоны задач" \ - означает, что вся зона задач
 заполнена объектами, введенными решателем, и места для
 дальнейшей его работы не хватает. Так как величина зоны задач
 достаточно велика, и обычный (нормальный) режим работы системы
 - при практически пустой зоне задач, появление этого сообщения
 обычно связано с каким-либо зацикливанием программы. Появляется
 это сообщение чрез\-вы\-чайно редко.

 4) "Исчерпание переменных либо переполнение при арифметическом
 действии" \ - обычно означает, что ведено слишком много символов
 переменных и запрос на ввод нового такого символа не может быть
 удовлетворен.

 5) "Превышение допустимого сброса" \ - означает попытку применения
 оператора сброса, выводящую за рамки действия текущей программы (число
 указанных для сброса перечисляющих операторов в рамках программы больше
 фактически име\-ю\-ще\-гося).

 Кроме перечисленных сообщений, может появиться сообщение "Нет
 программы логического символа $S$" \ - если предпринята попытка
 обратиться к выполнению от\-сут\-ствующей программы этого символа.


 \subsection{Выход в базу приемов, реализованных на ГЕНОЛОГе}

 Если выход в отладчик ЛОСа произошел при семантической
 трассировке после сра\-ба\-ты\-вания некоторого приема, то нажатие
 клавиши "б" приводит к просмотру опи\-са\-ния примененного приема
 на ГЕНОЛОГе - если был применен прием, запро\-грам\-мированный на
 ГЕНОЛОГе, либо к просмотру концевого пункта оглавления
 про\-грамм ЛОСа, -  если прием запрограммирован непосредственно на
 ЛОСе, и данному концевому пункту соответствует последняя пройденная
 перед срабатыванием кон\-троль\-ная точка "прием($N$)". При
 технической трассировке, если просматривается некоторый
 фрагмент программы (текущий либо некоторый его надфрагмент,
 до\-сти\-жимый из текущего с помощью клавиши "PageUp"), то нажатие
 клавиши "б" \ также приводит к просмотру описания
 соответствующего этому фрагменту приема ГЕНОЛОГа либо концевого
 пункта оглавления программ ЛОСа - однако, лишь при условии, что
 текущий оператор рассматриваемого фрагмента расположен после
 опе\-ра\-тора "контрольприема($\ldots$)", указывающего на прием
 ГЕНОЛОГа, либо опе\-ратора "прием($N$)", указывающего на концевой
 пункт оглавления ЛОСа.

 Выйти в оглавление ГЕНОЛОГа из отладчика ЛОСа можно и
 безотносительно к срабатыванию текущего приема. Для это следует
 нажать клавишу "г", после чего появляется некоторый пункт
 оглавления базы приемов. По этом оглавлению можно перемещаться
 без каких-либо ограничений, входя в просмотр любых приемов
 ГЕ\-НО\-ЛОГа - так же, как и при просмотре этих приемов из главного
 меню. Заблокированы лишь те операции просмотра приемов, которые
 приводят к изменению приемов.

 Если в оглавлении базы приемов был выбран некоторый концевой
 пункт и про\-изо\-шел вход в просмотр приема, закрепленного за
 данным пунктом (смена таких приемов, если их несколько,
 обеспечивается клавишами "курсор вверх - курсор вниз"), то
 возможна установка прерывания при попытке применить данный
 прием. Для ее ввода достаточно нажать клавишу "Ctr-Enter".
 Автоматически будет возобновлен процесс решения задачи, и выход
 в отладчик произойдет при обращении к оператору
 "контрольприема($\ldots$)", с которого начинается программа
 данного приема. Здесь ус\-та\-навливается режим пошаговой
 трассировки и прорисовывается текущий фрагмент программы с
 выделенным малиновым цветом оператором, непосредственно
 сле\-ду\-ю\-щим за оператором "контрольприема($\ldots$)". Для
 выявления собственно момента применения данного приема далее
 можно установить прерывание при выполнении завершающей части
 его программы (выбрав один из заключительных ее операторов,
 например, оператор "пересмотр").

 \subsection{Техническая трассировка}

 При отладке программы обычно используются такие режимы ее
 выполнения (на\-зы\-ваемые технической трассировкой), при которых процесс
 дробится на отдельные небольшие фрагменты, после каждого из которых
 осуществляется выход в отладчик ЛОСа. Принцип дробления можно либо
 задать один раз на весь период трассировки, переходя после этого к
 очередному шагу нажатием клавиши "Enter", либо каждый раз
 устанавливать очередное прерывание процесса специально.

 Перечислим используемые в отладчике ЛОСа режимы технической
 трассировки и способы установки прерываний процесса. Сразу
 заметим, что для отмены любых установок на прерывания служит
 клавиша "0". После нажатия на нее, если не создать новых
 установок на прерывания и нажать "Enter", то решение задачи
 будет про\-дол\-же\-но без выдачи каких-либо пояснений на экране
 вплоть до завершения (ответа либо отказа).

 1) Трассировка с самым мелким дроблением процесса - так называемая
 пошаговая трассировка. Для установки этого режима из отладчика
 ЛОСа достаточно нажать клавишу "1" (кроме того, пошаговый режим
 устанавливается автоматически после целого ряда прерываний,
 выводящих в отладчик). После этого каждое нажатие кла\-виши
 "Enter" \ будет вызывать выполнение единственного шага -
 реализацию операто\-ра (корневого либо расположенного внутри
 некоторого составного оператора) либо вычисление невырожденного
 операторного выражения. При пошаговом режиме трас\-си\-ров\-ки
 можно входить в просмотр шагов выполнения составных операторов
 (дизъ\-юнкций, конъюнкций, кванторов и т.п.).

 2) Следующий режим - пооператорная трассировка. В этом режиме
 за один шаг выполняется один корневой оператор программы
 - как простой, так и составной. Для установки режима следует
 выбрать, используя клавиши "PageUp - PageDown", ту программу,
 в которой предполагается выполнять трассировку, и нажать
 клавишу "2". Будут отслеживаться только корневые операторы,
 которые выполняются в "кад\-ре" \ этой программы, без выхода в
 выполнение подоператоров и вспомогательных задач. По окончании
 выполнения программы трассировка должна быть переуста\-нов\-ле\-на -
 иначе следующее прерывание произойдет в каком-то достаточно
 случайном месте. Эта трассировка при отладке является наиболее
 употребительной.

 3) Иногда бывает нужно отслеживать моменты обращения к
 программе заданного логического символа $A$. Чтобы установить
 прерывание при обращении к этой про\-грам\-ме, следует сначала
 нажать клавишу "л" \ - в результате появится курсор тек\-сто\-вого
 редактора, - а затем набрать текстовым редактором название
 символа $A$. После этого, при нажатии "Enter", установка
 оказывается введенной, хотя продолжение процесса реализации программы
 еще не включается. При запуске программы (снова нажатием
 "Enter") отладчик обеспечит выход в просмотр первого оператора
 началь\-ного фрагмента программы символа $A$, как только
 произойдет обращение к этой программе. Установка на данное
 прерывание сохраняется до установки другого пре\-рывания либо
 отмены прерываний, так что последовательные нажатия "Enter" \
 поз\-во\-лят проследить цепочку указанных обращений.

 4) При просмотре отладчиком некоторого фрагмента программы
 (текущего фраг\-мента либо его надфрагмента, достигнутого при
 помощи "Home" \ либо "PageUp") возможен ввод установки на
 прерывание при переходе к его подфрагменту. Для этого следует
 войти в режим просмотра операторов фрагмента (нажатием клавиши
 "курсор вниз"; выбрать требуемый оператор перехода к
 подфрагменту (клавиши "курсор вправо - курсор влево") и нажать
 клавишу "Ctr-Enter". Нажатие этой кла\-ви\-ши автоматически
 запускает процесс продолжения выполнения программы; при выходе
 на указанный подфрагмент произойдет прерывание. Заметим, что
 прерывание будет иметь место, даже если выход на подфрагмент
 произошел не из того "кадра" \ ре\-али\-зации программы,
 где была введена установка на прерывание, а из какого-либо
 совсем другого "кадра" \ реализации той же программы. Если
 требуется, чтобы прерывание произошло лишь при условии, что
 обращение к подфрагменту имело место в текущем "кадре"
 реализации программы, то после выбора оператора перехода
 нажимается "Enter". В этом случае завершение выполнения
 программы без выхода на выбранный ее подфрагмент приведет к
 прерыванию по ее завершении.

 5) При просмотре отладчиком некоторого фрагмента программы
 (текущего фраг\-мента либо какого-либо его надфрагмента,
 достигнутого при помощи клавиш "Home" \  либо "PageUp") возможен
 ввод установки на прерывание перед выполнением какого-либо
 оператора этого фрагмента (не обязательно корневого; возможна
 установка прерывания перед выполнением подоператора составного
 оператора). Для этого сле\-дует войти в режим просмотра
 операторов фрагмента ("курсор вниз"); выбрать требуемый
 оператор (сначала клавишами "курсор вправо - курсор влево" \
 выйти на нужный терм фрагмента, а при необходимости
 использовать клавишу "курсор вниз" \ и указанные выше клавиши для
 выделения подтерма) и нажать "Ctr-Enter". При этом
 автоматически запускается продолжение действий по программе, и
 при выходе на указанный оператор (непосредственно перед его
 реализацией) происходит прерывание. Заметим, что прерывание
 произойдет, даже если "кадр" \ реализации программы, в котором
 было установлено прерывание, отличается от "кадра" \ реа\-ли\-за\-ции
 этой же программы, в котором имело место обращение к оператору.
 Чтобы ввести установку на прерывания только в том же самом
 "кадре" \ реализации программы, следует нажать "Enter".

 Использование установок на прерывания из пунктов 3,4,5
 позволяет при отладке свободно перемещаться по программам
 различных логических символов и ана\-ли\-зи\-ровать ситуации, возникающие
 на моменты выхода в различные их точки.

 6) Чтобы использовать при отладке счетчик шагов работы
 интерпретатора ЛОСа, можно установить прерывание по достижении
 заданного числа шагов. Для этого нажимается клавиша "ш" \ -
 появляется курсор текстового редактора, - и набирается номер
 нужного шага. При наборе номера следует учитывать расположенный
 в правом верхнем углу экрана (если просматривается фрагмент
 программы) номер текущего шага. Как уже говорилось выше, при
 обращениях к отладчику счетчик шагов от\-клю\-чается, так что
 процесс отладки не изменяет выраженных в числе шагов
 интер\-пре\-та\-тора "координат" \ событий, происходящих при решении
 задачи. После набора номера требуемого шага (как обычно,
 завершаемого нажатием "Enter") установка на прерывание введена;
 для продолжения цикла выполнения программы еще раз нажимается
 "Enter".

 Если решается задача, извлеченная из задачника, то можо
 сохранить номер те\-ку\-щего шага и при повторных запусках ее
 решения выходить в отладчик по достижении шага с данным
 номером. Для сохранения номера следует нажать клавишу "щ".
 Чтобы повторно запустить задачу с прерыванием по достижении
 данного шага, следует нажать клавишу "а" \ при просмотре условия
 задачи в задачнике - это нажатие одновременно запускает решение
 и вводит установку на прерывание.

7) Если произошло прерывание с выходом в отладчик ЛОСа, отличное
от обычно\-го шага семантической трас\-си\-ровки, то для
возвращения в режим семантической трас\-си\-ровки следует нажать
клавишу "пробел", после чего нажать "Enter". Пре\-ры\-вание
произойдет при первом же применении приема - в режиме сканирования
задачи либо при реализации пакетного оператора ГЕНОЛОГа (только
для особо крупных операторов, выделяемых специальной опцией в
своем описании). Если вместо клави\-ши "пробел" \ нажать клавишу
"й",
 то прерывание произойдет при первом же при\-ме\-нении приема на
 уровне сканирования текущей задачи - выполнение пакетных
 операторов при этом игнорируется.

8) Если нужно ввести прерывание при выходе из текущего "кадра"
реализации программы (выбираемого с помощью "PageUp, PageDown"),
то нажимаются клавиши "4" \ и "Enter". При ликвидации этого кадра
и возвращении во внешнюю программу произойдет выход в отладчик и
установится пошаговый режим трассировки.

9) Для ввода прерывания при изменении оператором "замена" в
текущем кадре реализации программы значения переменной "х$i$",
если этим значением служит терм, нажимается клавиша "7" \ -
появляются буква "з" \ и курсор текстового редактора, - и далее
набирается символьный (!) номер $i$. При каждом изменении
указанной переменной будет возникать текст "значение переменной
х$i$: $A$ заменяется на $B$".

10) Если требуется установить прерывание при изменении разрядов
набора, обо\-значенного при просмотре элементов текущей структуры
данных посредством "н$i$", то нажимается клавиша "и" \ -
появляется курсор текстового редактора, - и вводится номер $i$ в
обычном формате десятичного числа. Прерывание произойдет
непосред\-ствен\-но перед выполнением оператора, изменяющего
указанный набор. Если пред\-став\-ляющий интерес набор является
значением программной переменной "х$i$", для установки прерывания
при изменении его разрядов нажимается клавиша "И" \ и вво\-дится
номер $i$.

11) Из отладчика можно выйти в оглавление программ и установить
прерывание по достижении заданной в этом оглавлении контрольной
точки. Для этого сначала нажимается "Ctr-г" \ - появляется
некоторое меню оглавления программ. После выбора в оглавлении
нужного концевого пункта, следует нажать на нем клавишу "курсор
вправо". Это приведет к установке прерывания по выходу на
соответствующую кон\-трольную точку "прием($N$)" \ и возобновлению
процесса решения задачи.

12) Прерывание перед выполнением заданного оператора фрагмента
программы (см. пункт 5) можно сопровождать списком дополнительных
условий, а также обес\-печивать автоматическую выдачу на экран при
таком прерывании значений заданных программных переменных. Для
входа в просмотр и редактирование списка до\-пол\-нительных
условий следует нажать при просмотре фрагмента программы клавишу
"у" \ (кир.). При этом включается редактор списков, отображающий
ранее введенные условия. Окно его располагается непосредственно
под горизонтальной чертой, за\-вер\-шающей текст фрагмента
программы. Список условий разбивается на группы; первым элементом
каждой группы служит некоторый ключевой терм (см.ниже), после
которого размещаются сопровождающие его информационные элементы.
Ис\-поль\-зуются ключевые термы следующих типов:

 а) "терм($A$)". $A$ есть программное выражение, определяющее
 объект для срав\-не\-ния. Следующий элемент списка есть терм,
 который должен совпадать с этим объектом.

 б) "заголовок(х$i$ $A$)". Значением программной переменной
 "х$i$" \ является ло\-ги\-ческий символ $A$ либо набор или терм,
 начинающийся с логического символа $A$.

 в) "входит($A$ х$i$)". Значением переменной "х$i$" является
 терм либо набор, со\-дер\-жащий логический символ либо символ
 переменной $A$.

 г) "корень". Текущий терм задачи должен совпадать с следующим
 элемен\-том данного списка установок.

 д) "См($A$)". $A$ - программная переменная "х$i$" либо
 выражение "буква(х$i$)". Если значением $A$ служит терм либо
 логический символ, то при прерывании пред\-при\-нимается выдача
 этого значения на экран.

В редакторе списков используется следующий интерфейс. Для набор
очередного элемента списка формульным редактором служит клавиша
"Enter"; для набора эле\-мента текстовым редактором - клавиша "т"
(кир.). Для изменения текущего элемента формульным редактором
нажимается "Ctr-ф"; для изменения его текстовым ре\-дак\-тором -
"Ctr-т". Завершается просмотр и редактирование списка нажатием
клавиши "курсор влево". После этого, как обычно вводится установка
на прерывание при обращении к некоторому оператору текущего
фрагмента программы. Данное пре\-ры\-вание будет происходить
всякий раз перед обращением к выбранному оператору, как только
окажутся выполнены дополнительные ограничения согласно списку. Для
сброса списка дополнительных установок на прерывание нажимается
клавиша "Ctr-у" (кир.).

13) В заключение отметим еще одну исключительно важную
возможность, пре\-до\-став\-ляемую отладчиком ЛОСа. При
автоматическом решении серии задач из за\-дач\-ника используется
так называемый режим "внутреннего перезапуска" \ - после каждой
задачи интерпретатор повторно инициирует выполнение программы
логической си\-стемы, обнулив все ее регистры и массивы в
оперативной памяти. Решение серии задач невозможно отменить, даже
используя предоставляемые операционной си\-сте\-мой возможности по
экстренному выходу из программы - при повторном запуске оно
возобновится с той точки, где было прервано. Единственным способом
отмены этого режима служит выход в отладчик ЛОСа с помощью клавиши
"Break" \ и нажатие в отладчике клавиши "Ctr-з" , которое,
собственно, и отменяет серийное решение задач. Далее можно
вернуться в главное меню, например, нажатием клавиши "Esc" \
(возвращение в главное меню без нажатия "Ctr-з" \ просто вызовет
переход к сле\-ду\-ющей задаче серии).

\section{Тестирование программы операто\-ра, опе\-ра\-тор\-но\-го вы\-ра\-же\-ния
ли\-бо спра\-воч\-ни\-ка}

Для тестирования программы нового оператора, операторного
выражения либо спра\-вочника лучше всего воспользоваться реальным
контекстом, в котором она должна применяться - приемом решения
задачи, либо приемом пакетного оператора, либо блоком интерфейса
системы, и т.п. Однако, можно обратиться к этому оператору и
непосредственно. Для этого служит программа логического символа
"пуск", которую можно запускать из просмотра программы в редакторе
программ ЛОСа нажатием клавиши "Ctr-Enter". Эта программа имеет
единственную входную переменную х1, значением которой служит
исходная задача. Войдя в редактирование программы символа "пуск",
нужно набрать обращение к тестируемому оператору (программному
выражению, справочнику). Сначала программируется построение
входных объектов для тестируемой программе, затем размещается само
обращение, после которого нужно поместить хотя бы один оператор -
чтобы до выхода из программы "пуск" \ иметь возможность просмотра
значений выходных переменных, полученных после об\-ра\-щения. Для
удобства создания входных объектов и просмотра результатов
обра\-щения, если необходимо, в программу "пуск" \ можно включить
упоминавшиеся выше вспомогательные операторы интерфейса. По
завершении редактирования программы "пуск" \ следует нажать
"Ctr-Enter". Тогда инициализируется работа только что
наб\-ран\-ной программы "пуск", причем сразу же включается
отладчик ЛОСа с режимом пошаговой трассировки. Далее с помощью
отладчика ЛОСа можно предпринять анализ выполнения тестируемой
программы. По завершении программы "пуск" \ про\-ис\-ходит
возвращение в главное меню.


\chapter{Примеры и упражения по программированию на ЛОСе}

\section{Примеры программ приемов, применяе\-мых при ска\-ни\-ро\-ва\-нии
за\-да\-чи}

ЛОС создавался для программирования приемов решения задач, и
естественно про\-де\-монстрировать прежде всего несколько примеров
таких программ. Хотя после появления ГЕНОЛОГа практически все
приемы записываются на нем, эти приемы затем компилируются в
программы на ЛОСе, которые и работают при решении задач. Поэтому
представление о том, как устроена типичная программа приема на
ЛОСе, весьма полезно при отладке.

Начнем с приема, выполняющего упрощение выражений по формуле
$a(\sin x)^2 + a(\cos x)^2 =a$. Первый шаг, который следует
сделать при написании программы приема - выбрать логический
символ, с рассмотрения которого при сканировании задачи начинается
выполнение этой программы. При выборе такого символа следует
учи\-тывать, что не каждый символ, встречающийся в записи теоремы,
на которой основан прием, обязательно будет встречаться в
преобразуемом терме задачи. Прием должен иногда усматривать и
"замаскированные" \ возможности срабатывания, ис\-поль\-зуя те или
иные простые преобразования для искусственного представления
встре\-тив\-ше\-го\-ся в задаче терма в том виде, какой указан в
теореме.

В нашем случае выбор, например, символа "умножение" \ нежелателен,
так как это умножение (на $a$) при $a=1$ либо $a=-1$ будет
отсутствовать в задаче. С другой стороны, выбор символа "синус" \
является, по-видимому, вполне приемлемым. При выборе логического
символа (будем называть его символом привязки) следует отдавать
предпочтение из нескольких вариантов тому символу, который реже
встре\-чается в задачах - при этом меньшее время будет
затрачиваться на попытки при\-ме\-нения приема в ситуациях, когда
его срабатывание заведомо невозможно.

Следующий важный шаг - выбор значения либо нескольких значений
текущего уровня сканирования, при которых будет предприниматься
попытка при\-ме\-нения приема. Здесь следует исходить из
соображений о приоритетности попыток при\-ме\-нения приемов и
учитывать ранее введенные уровни срабатывания конкурирующих
приемов (находя эти приемы, например, по оглавлению базы приемов
ГЕНОЛОГа либо анализируя процессы решения задач, в которых
желательно либо нежелательно срабатывание нового приема).

Несколько различных уровней срабатывания приема используются в
следующих случаях:

 а) Выделяются несколько качественно различных ситуаций, с
 различными при\-ори\-те\-тами срабатывания; для каждой из этих
 ситуаций (распознаваемых до\-пол\-нительно внутри программы приема)
 предусматривается свой уровень срабатывания;

 б) Вводится дополнительный контроль возможных изменений в
 задаче, при ко\-то\-рых ранее невозможное либо нежелательное
 применение приема (заблокированное при выходе на программу с
 малым значением текущего уровня) впоследствии (при выходе на
 программу с б\'ольшим значением текущего уровня) становится
 возможным и целесообразным. Например, если для срабатывания
 приема необходимо наличие какой-либо дополнительной посылки задачи,
 отсутствовавшей изначально (при ма\-лом значении текущего уровня),
 но выведенной впоследствии, то дополнительная попытка применения
 приема на большем текущем уровне приведет к необходимому срабатыванию.
 Альтернативой такому средству контроля является уменьшение весов термов,
 содержащих символ привязки данного приема, как только текущие
 пре\-об\-ра\-зо\-вания задачи (например, вывод следствий) делают вероятной
 целесообразность его применения.

 В нашем примере выберем уровень срабатывания приема равным 1 -
 на этом уровне обычно применяются преобразования типа "общей
 стандартизации" \ термов задачи.

 Следующий шаг при программировании на ЛОСе приема сканирования
 задачи - поиск в программе логического символа привязки той
 точки, в которой следует вставить оператор перехода ("ветвь
 $N$" \ либо "иначе $N$") для ветви, содержащей собственно новую
 программу. Здесь следует попытаться использовать как можно
 большее число операторов, уже введенных для программ других
 приемов, и выбрать точку ответвления как можно "глубже".
 Впрочем, выбор этой точки должен про\-ис\-ходить таким образом,
 чтобы одна из программ не "портила" \ значений программных
 переменных, используемых другой программой - как правило,
 весьма необре\-ме\-ни\-тель\-ное ограничение, так как приемы на ЛОСе
 крайне редко прибегают к "пере\-опре\-делению" \ значений ранее
 определенных переменных. При вставке оператора "ветвь $N$"
 следует учитывать, что этот оператор является перечисляющим, и
 если после него в программе находились операторы сброса
 заданного числа внешних перечислений ("обрыв", "сброс($n$)"), в
 "интервал перехода" которых попадает точка вставки, то
 необходимо увеличить на 1 константу сброса этих операторов.
 В приемах сканирования задач операторы сброса практически не
 используются, и здесь ука\-зан\-ная ситуация не возникает.

 Мы опустим здесь шаг поиска в уже существующей программе
 символа "синус" \ точки ответвления для нашего приема и
 приведем (в учебных целях) программу приема начиная с самого
 первого ее оператора.

 Стандартное начало программы приема сканирования задачи имеет
 вид "решить стандарт(х2)". Оператор "решить" является истинным
 , если обращение к программе символа произошло из сканирования
 задачи; оператор "стандарт(х2)" проверяет, что вхождение х2
 этого символа сопровождается открывающей скобкой (этот оператор
 используется только в тех случаях, когда рассматриваемый
 логический символ яв\-ля\-ется символом операции либо предиката;
 вхождение такого символа без открывающей скобки может
 использоваться в построениях структурного уровня, описывающих
 вид термов).

 Далее размещается фиксирующий уровень обращения к приему
 оператор "уро\-вень(1)".

 После выполнения указанных выше трех предварительных операторов
 начинается основная часть приема - идентификация ситуации, в
 которой возможно его при\-ме\-нение. Мы имеем на текущий момент
 следующие определенные значения програм\-мных переменных: х1 -
 текущая задача; х2 - вхождение в некоторый ее терм ло\-ги\-чес\-кого
 символа "синус"; х3 - вхождение этого терма (называем его
 текущим) в соответствующий список задачи (в список условий либо
 список посылок либо в саму задачу); х4 - равно 0, если текущий
 терм является посылкой, и 1, если он является условием; х5 -
 значение текущего уровня сканирования (в нашем случае равно 1).
 Значение переменной х6 пока не определено. Начнем идентификацию
 указанной в теореме ситуации с того, что перейдем от х2 к
 вхождению х6 внешней для синуса операции: "операнд(х6 х2)". Эта
 операция должна быть степенью: "символ(х6 сте\-пень)". Показатель
 данной степени равен 2: "второйсимвол(х6 2)".

 Далее возникает необходимость идентифицировать коэффициент $a$
 перед квад\-ратом синуса. Снова рассматриваем внешнюю для х6
 операцию х7: "операнд(х7 х6)". Эта операция, однако, не
 обязательно должна быть умножением. Приходится использовать
 выражение "вариант", определяющее значение х8 коэффициента $a$
 в зависимости от символа по вхождению х7: "равно(х8
 вариант(символ(х7 умножение)\ исключениеоперанда(х7
 х6)набор(1)))". Заметим, что если $a=1$, то х8 имеет своим
 значением не сам символ 1, а одноэлементный набор из 1 (т.е.
 однобуквенный терм). Если же по вхождению х7 расположен символ
 "умножение", то $a$ получается из данного произведения
 вычеркиванием сомножителя - квадрата синуса.

 В действительности только что определенное значение х8 - это
 еще не коэффици\-ент $a$, так как необходимо учесть знак
 слагаемого с квадратом синуса. Поэтому рассматриваем вхождение
 х9 внешней операции при умножении. Здесь, однако, удоб\-но
 применить оператор "альтернатива": "альтернатива(символ(х7
 умножение)опе\-ранд(х9 х7)равно(х9 х7))". Если по вхождению х7 не
 была расположена операция "умножение", то х7 уже является тем
 вхождением, на котором может быть располо\-жен "минус". Наконец,
 определяем значение х10 \ коэффициента $a$ с учетом знака:
 "равно(х10 вариант(символ(х9 минус)запись(минус х8)х8))".

 Теперь переходим к внешней операции, которая должна оказаться
 суммой: "опе\-ранд(х11 х9) символ(х11 плюс)". Далее просматриваем
 слагаемые найденной суммы, отличные от слагаемого с квадратом
 синуса: "операнд(х11 х12) не(равно(х12 х9))". х12 - вхождение,
 которое следует идентифицировать с $a(\cos x)^2$. Прежде всего
 убеж\-даемся в том, что знак этого слагаемого совпадает со знаком
 исходного слагаемого: "альтернатива(символ(х9 минус)символ(х12
 минус)не(символ(х12 минус)))". Здесь можно было бы использовать
 более экономное "символ(х12 буква(х9))", так как не просто
 знаки, но и заголовки двух слагаемых должны совпадать.

 Далее определяем вхождение х13 второго слагаемого с отброшенным
 знаком "ми\-нус" (если он есть): "равно(х13 вариант(символ(х12
 минус)первыйоперанд(х12)х12))". Определяем вхождение х14 во
 второе слагаемое, которое будет идентифицироваться с квадратом
 косинуса: "альтернатива(символ(х13 умножение)операнд(х13
 х14)рав\-но(х14 х13))". Проводим идентификацию для квадрата
 косинуса: "символ(х14 сте\-пень)\ первыйсимвол(х14 косинус)\
 второйсимвол(х14 2)\ равныетермы(первыйоперанд\ (первыйоперанд(х14))
 первыйоперанд(х2))". Последний оператор здесь проверяет
 совпадение аргументов синуса и косинуса. Проверяем совпадение
 коэффициентов (с отброшенными знаками) при квадратах синуса и
 косинуса: "равно(х8 вариант(сим\-вол(х13 умножение)исключениеоперанда
 (х13 х14)набор(1)))".

 Теперь переходим к программированию завершающей части приема,
 выполня\-ющей необходимую замену. Прежде всего, заметим, что
 необходимо найти все слага\-емые, отличные от двух выделенных, и
 учесть их в заменяющем терме, на который будет заменена сумма,
 расположенная по вхождению х11. Список этих слагаемых равен
 "выписка(х15 и(операнд(х11 х15)не(равно(х15 х9))не(равно(х15
 х12)))подтерм\ (х15))". Соответственно, определяем заменяющий
 терм х15: "равно(х15 унисборка(\ плюс префикс(х10 выписка(х16
 и(операнд(х11 х16)не(равно(х16 х9))не(равно(х16
 х12\ )))подтерм(х16)))))". Операторное выражение "унисборка"
 применяется здесь из-за того, что число слагаемых в
 результирующем терме может оказаться равным 1, и тогда внешняя
 операция "плюс" будет опущена. Возможно альтернативное
 определе\-ние заменяющего терма при помощи операторного выражения
 "склейкаоперандов": "равно(х15 склейкаоперандов(х11 х9 х12
 х10))".

 Наконец, собственно оператор, выполняющий замену суммы по
 вхождению х11 на выражение х15: "заменавхождения(х11 х3 х4 х1
 х15 пустоеслово)". Далее располагаем завершающий программу
 оператор "пересмотр", инициирующий повторное рассмот\-рение
 задачи с текущим уровнем, равным 0.

 Основная часть приведенной программы выполняла усмотрение ситуации
 для применения заданного тождества - идентификацию его переменных
 с термами задачи. Программы такого типа, а их подавляющее большинство,
 создаются в решателе с помощью компилятора ГЕНОЛОГа на основе теорем
 предметной области, снаб\-жен\-ных определенной технической разметкой.
 Непосредственно на ЛОСе обычно реализуются лишь приемы общелогического
 характера, не укладывающиеся в рамки стандартных алгоритмических
 построений ГЕНОЛОГа. В оставшейся части раздела мы рассмотрим несколько
 простых примеров таких программ, оставляя рассмотрение программ
 приемов, основанных на теоремах, до разделов, посвященных
 ГЕНОЛ\'ОГу.

 Первый пример - программа приема, исключающего переменную
 связывающей приставки квантора общности, для которой в
 антецедентах этого квантора указано ее явное выражение.
 Заменяемое утверждение здесь имеет вид $$\forall_{x_1 \ldots
 x_n}(x_i = t \ \& \ A_1(x_i)\\ \& \ldots \& \ A_m(x_i) \Rightarrow
 A_0(x_i)),$$ где выражение $t$ не содержит переменной $x_i$;
 заменяющее - вид $$\forall_{x_1 \ldots x_{i-1}x_{i+1} \ldots
 x_n}(A_1(t) \& \ldots \& A_m(t) \Rightarrow A_0(t))$$.

 В качестве символа привязки выбираем "длялюбого" \ (равенство также
 могло бы претендовать на эту роль, но квантор общности встречается в
 задачах реже).

 Так как прием выполняет вполне естественную общелогическую
 стандартизацию, его можно применять уже на нулевом уровне.
 Поэтому первые операторы программы имеют вид "решить
 стандарт(х2) уровень(0)". Так как возможность применения приема
 никак не связана с измененем его внешнего контекста, то далее
 размещается оператор "новый", который блокирует попытки
 повторного применения к терму задачи данного приема, если текущий
 уровень сканирования, после некоторой паузы, вновь поднялся до
 значения веса этого терма, возвратив его из теневой области в
 поле зрения.

 Далее определяем список х6 переменных, относящихся к кванторной
 приставке квантора, и проверяем, что все они различны:
 "равно(х6 связприставка(х2)) раз\-личны(х6)". Находим список х7
 антецедентов квантора (утверждения слева от стрел\-ки
 $\Rightarrow$) и консеквент х8 этого квантора (утверждение
 справа от стрелки): "равно(х7 выписка(х8 антецедент(х2
 х8)подтерм(х8))) равно(х8 последнийтерм(х2))".

 Чтобы проверить, имеется ли среди антецедентов равенство,
 определяющее зна\-чение переменной кванторной приставки,
 просматриваем элементы х9 списка анте\-цедентов: "входит(х9 х7)".

 Начинаем идентификацию антецедента х9 с равенством требуемого вида:
 "за\-го\-ло\-вок(х9 равно) операнд(левыйкрай(х9)х10) символ(х10 х11)
 входит(х11 х6)". Здесь х10 - вхождение того операнда равенства,
 который оказался переменной х11, входя\-щей в список х6. Эта переменная
 идентифицирована с $x_i$. Чтобы определить другой операнд равенства,
 используем операторы: "операнд(левыйкрай(х9)\ х12)\ \ не(равно\\ (х10 х12))
 \ равно(х13 подтерм(х12))". Здесь мы применяем перечисляющий
 оператор "опе\-ранд", выдающий последовательно вхождения каждого
 из двух операндов, и далее отбираем то вхождение х12, которое
 отлично от вхождения х10 уже рассмот\-рен\-но\-го операнда. х13 -
 переписанное в виде отдельного терма выражение, иден\-ти\-фи\-ци\-рованное с
 $t$. Используя оператор "Операнды", можно было бы выполнить
 идентификацию равенства несколько короче:
 "заголовок(х9 равно) Операнды(ле\-вый\-край(х9)х10 х11) символ(х10 х12)
 входит(х12 х6) равно(х13 подтерм(х11))" (здесь $x_i$
 идентифицируется с х12, $t$ - c х13). Далее мы продолжаем
 программу для первого варианта идентификации.

 После того, как найдены $x_i$ и $t$, определяем набор
 утверждений $A_1(t), \ldots, A_m(t)$. Так как внутри выражения
 $t$ могли встречаться связанные переменные, то после подстановки
 его вместо $x_i$ в какое-либо $A_j(x_i)$, также имевшее связанные
 переменные, может оказаться, что некоторое вхождение переменной
 в $A(t)$ имеет два вложенных друг в друга внешних квантора либо
 описателя по этой переменной. Такое двойное связывание одной и
 той же переменной может повлечь за собой логические ошибки, так как
 для ускорения ряда процедур решателя делается допущение о невозможности
 двойного связывания либо одновременного использования в общем контексте
 пере\-менной как свободной и как связанной. Это допущение
 обеспечивается своевременной нормализацией обозначений, и в данном
 случае лучше сразу же пе\-ре\-обозначить связанные переменные в
 $A_j(x_i)$, сделав их отличными от переменных выражения $t$.
 Например, для этого можно использовать операторное выражение
 "новыесвязки($T \\ S$)", значением которого служит результат
 переобозначения в терме $T$ связанных переменных на переменные,
 не встречающиеся в термах списка $S$. Таким образом, для нахождения
 списка х14 утверждений $A_1(t), \ldots, A_m(t)$ имеем оператор
 "равно(х14 выписка(х15 х16 и(входит(х15 х7)не(равно(х15
 х9))результподст\ (набор(х11)набор(\\ х13)новыесвязки(х15
 набор(х13))\ х16))\ х16))". Он просматривает ан\-тецеденты х15,
 отличные от уже выделенного равенства х9, и применяет к
 ре\-зуль\-тату указанного выше переобозначения связанных переменных
 в х15 подстановку х13 (т.е $t$) вместо х11 (т.е. $x_i$).

 Аналогичную подстановку применяем к консеквенту, получая в
 качестве значения переменной х15 утверждение $A_0(t)$:
 "результподст(набор(х11)набор(х13)новыесвяз\-ки(х8
 набор(х13))х15)".

 Далее нужно найти остаток х16 связывающей приставки квантора
 общности после исключения из него переменной $x_i$: "равно(х16
 вычеркивание(х6 набор(х11)))".

 Теперь остается построить заменяющее утверждение из найденных
 списка его антецедентов х14, консеквента х15 и новой
 связывающей приставки х16. Однако, здесь следует учитывать
 вырожденный случай: если исходный квантор имел лишь одну
 переменную в связывающей приставке, то заменяющее утверждение
 нужно строить без использования квантора общности, как дизъюнкцию
 консеквента и от\-ри\-ца\-ний всех антецедентов. Учитывая это,
 получаем следующий оператор для фор\-ми\-ро\-вания заменяющего
 утверждения х17: "равно(х17 вариант(равно(х16
 пустоеслово)\ унисборка(или суффикс(выписка(х18 \ входит(х18
 х14)\ отрицание(х18))х15))сборка\ (длялюбого конкатенация(х16
 вариант(равно(х14 пустоеслово)набор(х15)кон\-ка\-те\-на\-ция(если х14
 то набор(х15)))))))". Если связывающая приставка х16 пустая,
 то для получения х17 соединяем связкой "или" отрицания
 утверждений набора х14, к кото\-рым в конце добавляем х15. Если
 она непустая, то в случае пустого списка новых антецедентов х14
 сразу после связывающей приставки помещаем консеквент х15,
 иначе - сначала вставляется логический символ "если", затем
 идут антецеденты, затем логический символ "то", и в конце -
 консеквент х15. В конце программы приема размещаются операторы
 "заменавхождения(х2 х3 х4 х1 х17 пустоеслово)" \ (фактическая замена
 утверждений) и "пересмотр".

 Второй пример простого общелогического приема, реализованного
 на ЛОСе, свя\-зан с решением задачи на доказательство $Z$, условие
 которой имеет вид кванторной импликации: $$\forall_{x_1 \ldots
 x_n}(A_1 \ \& \ldots \& \ A_m \Rightarrow A_0).$$
 Для решения такой задачи создается вспомогательная задача $Z'$ на
 доказательство, посылки которой суть все посылки задачи $Z$,
 а также антецеденты $A_1, \ldots, A_m$. Усло\-вием новой задачи
 на доказательство служит консеквент $A_0$. Так как задачи $Z$
 и $Z'$ эквивалентны, то после решения второй сразу выдается
 ответ (либо отказ) на первую. Попутно выполняется коррекция
 тех структур данных задачи $Z$, в которых регистрируется, какие
 из ее посылок в действительности были использованы при
 доказательстве.

 В данном приеме символом привязки естественно выбрать "длялюбого";
 уровень срабатывания будет равен 3 (чтобы успели сработать
 приемы общей стандартизации, которые могли бы существенно упростить
 кванторную импликацию или вовсе ис\-клю\-чить ее квантор).

 Первые операторы программы приема нам уже знакомы: "решить
 стандарт(х2) уровень(3) новый". Чтобы указать на то, что
 кванторная импликация размещается в условиях задачи и имеет
 корневое вхождение, далее добавляем операторы "равно(х4 1)
 корень(х2)". Следующий оператор усматривает задачу на
 доказательство: "тип(х1 доказать)".

 Определяем список х6 антецедентов кванторной импликации и
 находим результат х7 добавления к нему всех посылок текущей
 задачи: "равно(х6 выписка(х7 анте\-це\-дент(х2 х7)подтерм(х7))) \
 равно(х7 конкатенация(х6 списокпосылок(х1)))".

 Теперь можно формировать новую задачу $Z'$. Ее можно было бы
 создать без какого-либо использования комментариев задачи $Z$ -
 с пустыми списками коммен\-та\-риев. Однако, комментарии задачи
 $Z$, возможно хранят какую-то ценную информа\-цию, для повторного
 получения которой потребовались бы дополнительные затраты
 вычислительной трудоемкости. Перенесение всех ее комментариев в
 задачу $Z'$ не\-це\-ле\-сообразно, так как она все же отличается от $Z$,
 и какие-то комментарии могут в ней утратить свою ценность либо
 оказаться ложными (хотя такая ложность обычно не сказывается
 на корректности действий с посылками и условиями задачи,
 она может существенно исказить логику принятия решений при управлении
 логическим процессом). Поэтому при создании задачи $Z'$ следует
 проанализировать старые ком\-мен\-тарии с помощью какой-то
 процедуры и отобрать либо модифицировать их для использования
 в $Z'$. Обычно здесь используются справочники, которые
 распадаются на множество мелких подпроцедур, каждая из которых
 анализирует и при необ\-хо\-ди\-мости модифицирует комментарии с
 заданным заголовком. В данном приеме введены два таких
 справочника, названия которых суть "новаяпосылка" и длялюбого".
 Пер\-вый из них обрабатывает комментарии к посылкам задачи, второй -
 комментарии к самой задаче. Справочник "новаяпосылка" имеет входные
 переменные х1 - задачу $Z$; х2 - либо 0 (если анализируется общий
 комментарий к посылкам), либо вхождение посылки, к которой относится
 комментарий, в список посылок; х3 - анализируемый комментарий.
 Если перенесение комментария в новую задачу нецелесообразно, то
 справочник выдает значение 1; если комментарий переносится без
 изменения, то выдается 0, в остальных случаях выдается
 модифицированный комментарий х3. Аналогично устроен справочник
 "длялюбого", но у него только две входных пе\-ре\-мен\-ных: х1 -
 задача; х2 - комментарий. Фактическое заполнение двух указанных
 справочников процедурами обработки комментариев выходит за
 рамки нашего при\-мера. Оно может быть продолжено по мере
 обучения решателя и появления ком\-мен\-тариев новых типов.
 Так как случаи обязательного отбрасывания или коррекции комментариев
 довольно редки, число реально написанных процедур этих двух и
 аналогичных им справочников обработки комментариев, используемых в
 других при\-емах, невелико.

 Оператор, формирующий новую задачу х8 (т.е. $Z'$), достаточно
 громоздок; в отсутствии многоцветной указки решателя, будем здесь и
 далее в таких случаях использовать разбиение записи оператора на
 блоки. Прежде всего, нам понадобится операторное подвыражение
 $A_1$, определяющее список списков комментариев к по\-сыл\-кам новой
 задачи. Так как новый список посылок получился присоединением к
 началу старого набора антецедентов х6, которые пока не сопровождаются
 ком\-мен\-та\-риями, то $A_1$ представляем в виде конкатенации набора
 пустых слов, имеющего ту же длину, что и х6, и набора,
 составленного из модифицированных списков комментариев задачи
 $Z$: "конкатенация(бланк(х6 пустоеслово 0)выписка(х9 позиция(х9
 левпозиция\ (х1 3))$A_2$))". Подвыражение $A_2$ здесь определяет
 модификацию текущего (рас\-по\-ложенного по вхождению х9) списка
 комментариев к посылке (или посылкам) старой задачи. Эта
 модификация получается при просмотре элементов х10 данного
 списка: "выписка(х10 х11 и(входит(х10 буква(х9))равно(х11
 $A_3$)не(равно(х11 1))вариант(рав\-но(х11 0)х10 х11)))". х11 -
 результат обращения к справочнику "новаяпосылка" для обработки
 комментария х10; он определяется подвыражением $A_3$:
 "справка(новаяпо\-сылка начало(х10)х1
 вариант(равно(правсосед(х9)х9)0 соотвпозиция(х9 левпозиция\ (х1
 3)списокпосылок(х1))) х10)". Условие "равно(правсосед(х9)х9)"
 здесь означает, что вхождение х9 списка комментариев -
 последнее, то есть он является списком общих комментариев к
 посылкам задачи $Z$. Выражение "соотвпозиция(х9 левпози\-ция(х1
 3)списокпосылок(х1))" \ определяет вхождение той посылки, которой
 со\-от\-вет\-ствует вхождение х9 списка комментариев.

 Далее строим подвыражение $A_4$ для списка комментариев к
 задаче $Z'$: "выписка\ (х10 х11 и(входит(х10 комментарии(х1))
 равно(х11 $A_5$)не(равно(х11 1)))вариант(рав\-но(х11 0)х10 х11))".
 Здесь $A_5$ - обращение к справочнику "длялюбого",
 анализи\-ру\-ющему старый комментарий х10: "справка(длялюбого
 начало(х10)х1 х10)".

 Используя блоки $A_1,A_4$ получаем оператор для построения
 задачи $Z'$: "равно(х8 набор(доказать х7 бланк(х7 0 0)$A_1$
 последнийтерм(х2) 0 $A_4$))".

 Далее организуем обращение к решению задачи $Z'$. Прежде всего,
 применяем оператор "подуровень(х1)", который устанавливает
 максимальный уровень новой задачи равным максимальному уровню
 задачи $Z$ (так как она целиком сводится к $Z'$, последнюю
 следует решать с привлечением средств того же уровня, что и
 для $Z$). Далее размещается оператор "равно(ответзадачи(х8)истина)",
 который одновре\-мен\-но решает задачу $Z'$ и проверяет, что ее
 ответом служит логический символ "истина". После него идет
 оператор перехода "иначе 1" \ (в каждом фрагменте переходы из него
 нумеруем начиная с 1), определяющий переход к фрагменту,
 состоящему из единственного оператора "ответ(отказ)". Этот
 отказ на задачу $Z$ будет выдан, если на задачу $Z'$ не был
 получен ответ "истина".

 После оператора перехода "иначе 1" \ остается выдать ответ
 "истина" \ на задачу $Z$, предварительно скорректировав ее
 комментарий "выводимо $A$". В списке $A$ пере\-чис\-ляются все
 посылки задачи $Z$, использованные при ее решении, причем они
 берутся в том виде, какой они имели на начальный момент решения
 задачи $Z$. Оператор, выполняющий коррекцию, имеет вид:
 "длялюбого(х9 если ключ(комментарии(х8)вы\-водимо х9)то
 учетпосылок(х1 конец(х9)0 1))". Он извлекает из задачи $Z'$
 список "конец(х9)" ее исходных посылок, использованных при
 решении, и определяет, из каких именно исходных посылок задачи
 $Z$ они получены. При этом используется несложный вспомогательный
 оператор "учетпосылок($t_1 \ t_2 \ t_3 \ t_4$)". Программу
 приема завершает оператор "ответ(истина)".

 В заключение рассмотрим прием решения задач на описание, в
 которых нужно подобрать какой-нибудь пример значений
 неизвестных, удовлетворяющих условиям. Прием предпринимает
 попытку усмотреть эти значения непосредственно из посылок
 задачи. Если удается найти такие посылку $A$ и условие $B$,
 что $A$ представимо (с точностью до изменения порядка операндов
 коммутативных операций и сим\-мет\-рич\-ных отношений) как результат
 подстановки в условие $B$ вместо всех неизвестных
 $x_1, \ldots, x_n$, имеющихся в $B$, выражений $t_1, \ldots, t_n$,
 то эти выражения фиксируются в качестве значений неизвестных,
 причем найденные значения подставляются в ос\-тав\-шиеся условия.
 Если после подстановки в каком-либо условии не остается неизвест\-ных,
 то его истинность проверяется с помощью решения вспомогательной
 задачи на доказательство; процесс подбора значений и проверки
 продолжается до полной реализации всех условий.

 Данный прием, в отличие от трех предыдущих, не может быть
 закреплен за каким-либо определенным логическим символом,
 встречающимся в условиях и по\-сыл\-ках задач. Поэтому он
 закрепляется за типом задачи - логическим символом "описать".
 Уровень его применения не должен быть ни чрезмерно большим - так
 как тогда слишком поздно будет происходить усмотрение очевидных
 наборов значений, ни чрезмерно маленьким - так как во многих
 случаях имеются более простые средст\-ва получения примера значений
 неизвестных, а действия приема сравнительно тру\-доемки. В
 решателе этот прием имеет уровень срабатывания 4.

 На примере данного приема продемонстрируем, как происходит
 поиск точки от\-вет\-вления к приему от уже имеющихся фрагментов
 программы логического символа. Если войти в корневой фрагмент
 программы символа "описать", то будут видны операторы "решить
 иначе 1 равно(х2 х3) ветвь 2 $\ldots$". Оператор "решить" \
 означает, что обращение к программе символа "описать" \ происходит
 из сканирования задачи - то есть программа нашего приема должна
 быть размещена после этого оператора. Переход "иначе 1" ведет к
 рассмотрению других возможных типов обращения к дан\-ной программе.

 Обычно программа логического символа имеет главный ствол, на котором
 раз\-ме\-щаются операторы, фиксирующие тип обращения; от каждого такого
 оператора к следующему имеется переход через "иначе 1".

 После оператора "решить" расположен оператор "равно(х2 х3)" -
 его роль за\-клю\-чается в отсечении ситуаций, где обращение
 к программе символа "описать" \ про\-изо\-шло из-за появления этого
 символа в условии либо посылке задачи (например, если решается
 задача относительно структур данных самого решателя). В
 указанных ситуациях значением х2 было бы вхождение символа
 "описать" \ в терм задачи, а значением х3 - вхождение терма
 задачи, то есть эти значения различались бы. Сов\-па\-дают они
 только при обращении к программе символа "описать" \ из
 рассмотрения типа текущей задачи - тогда х2 и х3 равны 0.
 При поиске точки ответвления к приему мы проходим данный
 оператор и перемещаемся вдоль программы дальше.

 Затем идет оператор "ветвь 2", после которого располагаются
 операторы, никак не связанные с нашим приемом. Поэтому
 переходим к следующему фрагменту через "ветвь 2".

 Новый фрагмент начинается с двух операторов перехода "ветвь 1",
 "ветвь 2", после которых идет оператор "уровень(0)". Он
 отсекает в нашем случае (т.е. при уровне 4) дальнейшее
 продвижение, так что нужно воспользоваться одним из ука\-занных
 переходов. Сразу заметим, что первый из них группирует приемы,
 для ко\-то\-рых уровень срабатывания либо очень велик, например,
 равен максимальному уровню задачи, либо почти не фиксирован
 (например, попытка применить прием выполняется для каждого
 уровня, начиная с некоторого). Во втором размещаются обычные
 приемы, для срабатывания которых выделены один или два-три
 уровня. Поэтому для дальнейшего продвижения выбираем переход
 "ветвь 2".

 Очередной фрагмент начинается с операторов "ветвь 1 уровень(2
 3)", так что однозначно переходим по оператору "ветвь 1". Далее
 идет фрагмент с началом вида "уровень(1 3)иначе 1", и снова
 однозначно переходим через "иначе 1".

 Наконец, возникает фрагмент с началом "уровень(4)иначе 1 ветвь 2".
 Собственно говоря, этот фрагмент является как раз началом
 той программы, которую мы хотим получить в данном примере. Если
 бы это было не так, то можно было бы продолжить перемещение
 вдоль его операторов, пытаясь максимально использовать уже
 имев\-шиеся ранее операторы (они "бесплатные", так как все равно
 будут выполняться при сканировании). Встретив где-либо
 операторы, использование которых невозможно или нежелательно,
 можно было бы создать ветвь программы нового приема двумя
 способами - либо вставить оператор перехода, ведущий к этой
 ветви, либо сделать так, чтобы старая часть программы
 сама оказалась достижима через оператор "ветвь\\ ($\ldots$)" из
 новой программы. Последнее достигается стандартной опе\-ра\-цией -
 переходя в режим просмотра подтермов операторов, выбираем тот
 оператор, который должен быть началом отдельной ветви "старой"
 \ программы, и нажимаем "р" \ (кир.). После этого конец фрагмента
 отрезается и попадает в отдельную ветвь. Начало фрагмента
 завершается операторами "ветвь($\ldots$)" \ и "продолжение".
 Войдя в режим ре\-дак\-ти\-рования, далее вместо оператора
 "продолжение" \ набираем текст новой программы.

 Возвращаемся к программе нашего приема - приводим ее далее в точности
 такой, как она указана в фрагменте, до которого мы дошли указанным
 выше образом. Следующий ее оператор - "цель(х1 пример)" \ - означает,
 что текущая задача на описание должна иметь цель "пример".
 Расположенный за ним оператор перехо\-да "иначе 3" \ ведет к
 программе некоторого другого приема, тоже относящегося к задачам
 на описание с целью "пример". Далее располагаются операторы
 "не(цель(х1 развертка)) не(цель(х1 редакция)) не(цель(х1
 перечисление)) не(Входит(независит цели(х1)))". Все эти
 операторы отсекают ситуации, в которых применение данного
 приема не нужно (например, при редактировании уже найденного
 ответа) - они появились не при первоначальном создании
 программы приема, а вводились по мере надобности при проработке
 обучающего материала. Они являются эвристическими фильтрами, и
 при развитии системы могут оказаться измененными либо вообще
 удаленными. Для понимания того, зачем нужен тот или иной фильтр,
 необходимо предъявление конкретных контекстов, их создавших, так
 что сейчас мы не будем комментировать перечисленные оперторы.

 Следующий оператор - "лимит(набор(3 0 0 0 0 0))" - выполняет
 роль ограничителя времени, которое будет затрачено на попытку
 непосредственного подбора значений неизвестных. Эта попытка
 будет прервана ровно через 300000 шагов работы интер\-пре\-татора
 после своего начала, и программа вернется к данному оператору
 "лимит", рассматривая его уже как ложный. Константа 300000 тоже
 является эвристической (выбрана из рассмотрения тех задач, в которых
 данный прием должен был сработать), и при развитии решателя может быть
 изменена. Она не очень велика - трудоемкость решения простых и
 средних задач обычно составляет один-два десятка миллионов
 шагов.

 Чтобы определить список х6 всех неизвестных задачи,
 встречающихся в ее усло\-виях, используем оператор "равно(х6
 пересечениесписков(окончание(неизвестные(х1\\ ))параметры
 (списокусловий(х1))))". Напомним, что выражение
 "неизвестные(х1)" \ дает набор (неизвестные $x_1 \ldots
 x_n$), и для выделения собственно списка неизвестных $x_1
 \ldots x_n$, у этого набора нужно отбросить первый элемент,
 что и делается оператор\-ным выражением "окончание($\ldots$)".
 Подбор значений имеет смысл предпринимать лишь в случае непустого
 списка неизвестных, так что далее размещается оператор
 "не(равно(х6 пустоеслово))".

 Прежде, чем переходить к подбору значений переменных списка х6,
 проверяем, что все не содержащие неизвестных условия задачи
 являются следствиями ее посы\-лок, и одновременно создаем список х7
 всех посылок, использованных при проверке истинности таких условий:
 "равно(х7 пустоеслово) длялюбого(х8 если входит(х8 спи\-сокусловий(х1))
 известно(х8 х1)то существует(х9 и(извлекается(х8
 списокпосылок(х1\ )х9) замена(х7 объединениесписков(х7 х9)))))".

 Далее определяем список х8 всех условий задачи, содержащих
 неизвестные, и проверяем, что все они суть элементарные
 (бескванторные, не содержащие связок "и","или") утверждения:
 "равно(х8 \ выписка(х9 \ и(входит(х9\  списокусловий(х1))\
 не(известно(х9 х1)))х9)) \ длялюбого(х9 если входит(х9 х8)то
 элементарно(х9))".

 Наконец, обращаемся к оператору "подборнеизвестных", уже упоминавшемуся
 в главе "Библиотека вспомогательных операторов ЛОСа" \ :
 "подборнеизвестных(спи\-сокпосылок(х1)х8 х6 х9 х10)". Затем регистрируем
 в комментарии "выводимо $A$" \ к задаче использованные на данном шаге
 исходные посылки (для этого имеем списки использованных утверждений
 х7 и х10): "учетпосылок(х1 объединениесписков(х7 х10)0 1)".

 Выходная переменная х9 оператора "подборнеизвестных" имеет
 своим значением набор $t_1 \ldots t_n$ выражений, определяющих
 значения переменных $x_1 \ldots x_n$ списка х6 (расположенных в том
 же порядке). На основе списков х6 и х9 создаем ответ задачи - утверждение
 $x_1 = t_1 \ \& \ldots \ \& \ x_n = t_n$: "равно(х11 унисборка(и
 выписка(х12 х13 серия(х12 х6 х13 х9)запись(равно
 буква(х12)буква(х13)))))"; в конце программы по\-мещаем оператор
 выдачи ответа - "ответ(х11)".

 \section{Примеры программ вспомогательных опе\-ра\-то\-ров и опе\-ра\-тор\-ных вы\-ра\-же\-ний}

 Рассмотрим пример вспомогательного оператора, осуществляющего
 поиск в не\-ко\-тором списке термов всех его элементов $A$, имеющих хотя бы
 одно вхождение за\-дан\-ного терма $T$, и выдающего в качестве
 результата список пар: ($A$ - список всех вхождений в $A$ терма $T$,
 упорядоченных слева направо). Входные данные этого оператора суть:
 х1 - набор термов; х2 - заданный терм $T$. Оператор имеет един\-ствен\-ную
 выходную переменную х3 - ей присваивается указанный выше набор пар.

 Первый шаг при программировании вспомогательного оператора -
 выбор названия для этого оператора. Через главное меню
 осуществляется ввод нового логического символа - названия
 оператора (в отдельных случаях можно использовать ранее
 вве\-денный логический символ, если для него не была создана
 программа вспомога\-тельного оператора; наличие такой программы
 распознается по оператору "про\-грам\-ма" в начале фрагмента). В
 нашем примере введем для названия программы новый логический
 символ "вхождениятерма".

 После выбора названия $A$ оператора следует войти в просмотр
 корня программы логического симвла $A$ и выбрать точку
 ответвления для записи программы оператора $A$. Если программы
 логического символа $A$ вообще не было, то программирование
 начинается прямо с корня; если, например, корневой фрагмент
 имел вид "решить $\ldots $", то он изменяется на "решить иначе
 $N \ldots$", где $N$ - номер перехода к новой программе ($N$
 выбирается произвольно - лишь бы отличалось от номеров других,
 ранее введенных переходов из корневого фрагмента).

 Первые операторы в нашем примере имеют вид: "программа
 метка(икс(4))". Здесь оператор "метка(икс(4))" указывает, что
 номер первой не определенной при обра\-ще\-нии программной
 переменной равен 4. Это оператор является фиктивным и ин\-тер\-пре\-татор
 ЛОСа его игнорирует. Однако, он важен для процедур контроля
 ошибок в программах ЛОСа, так как позволяет распознать уже
 определенные при обращении переменные. Кроме того, при
 наличии оператора "метка(икс($\ldots$))", проверка новой
 программы оператора или операторного выражения приводит к
 автоматическому созданию приема справочника "арность",
 указывающему, сколько операндов должен иметь оператор. Этот
 справочник тоже нужен для контроля ошибок в программах.
 Наконец, система контроля ошибок в программах устроена так,
 что само отсутствие в начале программы оператора или операторного
 выражения фиктивного оператора "метка(икс($ \ldots$))"
 вос\-при\-ни\-мается как ошибка.

 Для получения требуемого списка пар - значения выходной
 переменной нашего оператора - организуем просмотр списка х1.
 Для текущего терма из х1 составим список всех вхождений в него
 терма $T$, и если этот список непуст, то зарегистрируем его в
 накопителе результата. Все эти действия выполняются
 единственным опе\-ра\-тором выдачи результата: "результат(х3
 выписка(х4 х5 и(входит(х4 х1)равно(х5 выписка(х6
 вхождениетерма(х4 х2 х6)х6))не(равно(х5 пустоеслово)))набор(х4
 х5)))". Просмотр списка х1 здесь обеспечивается перечисляющим
 оператором "входит(х4 х1)"; список х5 всех вхождений в х4 терма
 х2 (т.е. $T$) составляется при помощи перечисляющего оператора
 "вхождениетерма".

 После указанного выше оператора "результат($\ldots$)"
 необходимо поставить за\-вер\-шающий программу оператор "выход",
 так как иначе данный оператор "вхожде\-ниятерма" выполнялся бы в
 режиме перечисления (в данном случае по определе\-нию оператора
 может быть выдано лишь одно значение переменной х3, и режим
 перечисления не нужен).

 Если программа вводилась для нового логического символа, то
 после ее набора можно выйти в корневой фрагмент и нажать
 клавишу "п". Тогда (как говорилось выше) будет автоматически
 введена программа справочника "арность", определя\-ющая арность
 (число операндов) у нового оператора - эта программа будет
 ис\-поль\-зоваться при при контроле правильности программ.
 Одновременно будет выполне\-на проверка правильности программы
 (анализ арностей операторов; учет определен\-но\-сти либо
 неопределенности входных и выходных переменных операторов
 программы, и т.п.).

 Следующий пример - программа оператора, работающего в режиме
 перечисления значений своих выходных переменных. Такие
 операторы полезны при программи\-ро\-ва\-нии процедур, осуществляющих
 поиск в сложных структурах данных: собственно просмотр
 необходимых групп объектов осуществляется единственным
 обращением к оператору. Перечисляющие операторы избавляют от
 необходимости создавать спе\-ци\-альные конструкции для организации
 циклов; особенно упрощает программирование их использование при
 перечислениях по рекурсии. Чтобы программа оператора
 за\-ра\-бо\-тала в режиме перечисления, достаточно после оператора
 "результат($\ldots$)", опре\-де\-ля\-ющего значения выходных
 переменных, не ставить оператор "выход". Тогда при откате
 произойдет возвращение в данную программу - в последний из
 ее перечис\-ля\-ю\-щих операторов, который был выполнен перед выдачей
 результата. Хотя формально можно часть выходов из программы делать
 перечисляющими, а часть - неперечис\-ля\-ю\-щими, и интерпретатор ЛОСа
 будет правильным образом обрабатывать такие выходы, этот режим
 программирования на ЛОСе оказался фактически невостре\-бо\-ван\-ным.
 Операторы со смешанным перечислением оказались неудобны из-за труд\-нос\-тей,
 возникающих при подсчете числа сбрасываемых внешних перечислений в явно
 указываемых откатах. Поэтому в операторах, программируемых на
 ЛОСе, ре\-жим смешанного перечисления вообще не используется.
 Процедура контроля прог\-рамм выдает сообщение об ошибке, если
 часть выходов из программы оператора - перечисляющие, а часть -
 не перечисляющие. Среди базисных операторов ЛОСа наиболее часто
 порождает смешанный режим перечисления оператор "альтернатива".

 Рассмотрим в качестве примера программирование следующего простого
 пере\-чис\-ляющего оператора, связанного с одночленами. Входными
 данными нашего операто\-ра будут некоторый набор выражений х1, а
 также набор х2 натуральных чисел, имеющий ту же длину, что и
 х1. Выходная переменная х3 перечисляет произведения целых
 неотрицательных степеней выражений списка х1, показатели
 которых не пре\-вос\-ходят соответствующих этим выражениям разрядов
 набора х2. Одновременно выходная переменная х4 приобретает в
 качестве значения произведение степеней выражений списка х1,
 показатели которых дополняют показатели произведений х3 до
 значений набора х2. Этот пример уже реализован в системе как
 программа опе\-ра\-тора "Де\-ли\-тель".

 Первые операторы программы суть "программа метка(икс(5))". При
 вычислении произведений х3,х4 будем использовать рекурсию по
 длине наборов х1,х2. Поэтому следующие операторы программы суть
 "равно(х5 окончание(х1))"; "равно(х6 окон\-чание(х2))" \ -
 заблаговременно определяем результаты х5,х6 отбрасывания первых
 элементов наборов х1,х2 для рекурсивного обращения к обработке
 укороченных на\-бо\-ров. Далее будем последовательно рассматривать
 возможные значения показателя степени при первом элементе $A$
 набора х1 - от 0 до первого элемента $n$ набора х2. Вводим
 операторы: "равно(х7 0) равно(х8 начало(х2))". Здесь х7 -
 текущее значение показателя степени; х8 - значение, дополняющее
 его до $n$.

 Далее будет организован цикл по х7 с применением оператора
 "повторение" (этот цикл можно было бы не создавать, а использовать
 вместо него перечисляющий оператор "Номера(0 начало(х2)х7)",
 который перечислял бы все целочисленные зна\-чения х7 от нулевого
 до максимального; однако, здесь полезно показать, как на ЛОСе
 происходит организация "явных" \ циклов). После оператора
 "повторение" \ разместим оператор перехода "ветвь 1"; нумерацию
 переходов в этом примере берем сквозную. По этому оператору
 будем переходить в ветвь программы, обеспечивающую очеред\-ное
 изменение х7,х8 и выход из цикла. После оператора "ветвь 1" \
 размещаем оператор "равно(х5 пустоеслово) иначе 2 ", который
 обеспечивает раздельную обработку в случае завершения рекурсии
 (если список х5 пуст) и в случае рекурсивного обраще\-ния к
 укороченным наборам.

 Если рекурсия завершена, то непосредственно выдается результат
 - здесь ис\-поль\-зуется оператор "результат(х3 вариант(равно(х7
 0)набор(1)вариант(равно(х7 1)на\-ча\-ло(х1)запись(степень
 начало(х1)десзапись(х7))))х4 вариант(равно(х8
 0)набор(1)ва\-ри\-ант(равно(х8 1)начало(х1)запись(степень
 начало(х1)десзапись(х8)))))". Как видно, сначала формируется
 вырожденное произведение х3, с разбором случаев: х7 = 0
 \ (выдается константа 1), либо х7 = 1 \ (выдается выражение
 $A$ - начало набора х1), либо х7 > 1 \ (выдается степенное
 выражение). Затем аналогичным образом фор\-ми\-ру\-ется произведение
 х4.

 При рекурсивном обращении к укороченным наборам (переход к
 подфрагменту 2) программа имеет вид: "Делитель(х5 х6 х9 х10)
 результат(х3 вариант(равно(х7 0)х9 соединение(умножение
 вариант(равно(х7 1)начало(х1)запись(степень начало(х1)дес\-запись(х7)))х9))
 \ х4 вариант(равно(х8 0)х10 соединение(умножение
 вариант(равно(х8 1)начало(х1)запись(степень
 начало(х1)десзапись(х8)))х10)))". Здесь х9,х10 - резуль\-тат
 обработки пары укороченных наборов. Далее к х9,х10 добавляются
 необходимые множители, формируемые так же, как и выше.
 Добавление множителей происходит при помощи операторного
 выражения "соединение($\ldots$)", которое устраняет вло\-жен\-ные
 умножения.

 Подфрагмент 1 имеет вид "равно(х8 0) иначе 3 стоп". Это -
 проверка оконча\-ния цикла при х7 = $n$. Наконец, подфрагмент 3
 имеет вид "замена(х7 плюс(х7 1)) замена(х8 вычитание(х8 1))
 продолжение" \ - он обеспечивает увеличение на едини\-цу значения
 переменной х7 и уменьшение на единицу значения переменной х8.
 Напом\-ним, что фактически в программе расположены операторы
 "замена(7 плюс(х7 1))", "замена(8 вычитание(х8 1))", а в
 указанным выше виде они выдаются на экран только для работы в
 редакторе программ. Отладчик ЛОСа, выдавая при трассировке
 на экран записи операторов программы, не выполняет такого
 преобразования для "замен".

 В качестве примера программы операторного выражения рассмотрим
 процедуру, осуществляющую переход от предствления матрицы "по
 строкам" к ее представлению "по столбцам". Пусть х1 - набор
 $(A_1, \ldots, A_n)$ наборов $A_i = (a_{i1}, \ldots , a_{im})$,
 пред\-став\-ля\-ющих строки некоторой матрицы $A$. В качестве значения
 операторного выражения требуется получить набор $(B_1, \ldots,
 B_m)$ столбцов $B_j = (a_{1j}, \ldots, a_{nj})$.

 Выберем прежде всего название для операторного выражения
 (например, "стол\-бцы\-матрицы") и введем его в качестве нового
 логического символа через главное меню.

 Первые два оператора новой программы операторного выражения имеют
 вид "обращение(0) метка(икс(2))". Первый из них указывает, что
 происходит вычисление программного выражения; второй указывает на
 номер 2 первой не определенной при обращении программной
 переменной.

 Собственно вычисление набора столбцов и выдача результата
 выполняются един\-ствен\-ным оператором:

 "ответ(выписка(х2 позиция(х2 начало(х1))выписка(х3 входит(х3
 х1)буква(со\-отв\-по\-зиция(х2 начало(х1)х3)))))".

 Здесь происходит просмотр всех вхождений х2 разрядов в первую
 строку матри\-цы, и для фиксированного такого х2 составляется
 список всех разрядов различных строк матрицы, расположенных
 соответственно разряду х2 первой строки. Значение операторного
 выражения, реализованного программой на ЛОСе, выдается при по\-мо\-щи
 оператора "ответ($\ldots$)". Если бы программа операторного
 выражения была завершена оператором "стоп" либо выход из нее
 произошел при откате, то в качестве значения был бы выдан
 логический символ 0.

 Во многих случаях возникает необходимость в серии программ,
 обеспечивающих однотипные вычисления либо выдачу справочной
 информации для различных ло\-ги\-чес\-ких символов. Такая серия
 программ получает общее название - некоторый логический символ
 $A$ - и называется справочником $A$. Обращение к справочнику $A$
 для обработки логического символа $S$ имеет вид "справка($A$ $S$
 $x_1 \ldots x_n$)", где $x_1, \ldots, x_n$ - дополнительные
 входные данные (как уже говорилось, однотипные для всех программ
 справочника $A$). Это обращение представляет собой операторное
 вы\-ра\-жение, так что справочник всегда возвращает в качестве результата
 некоторый объект (в справочной информации о логическом символе $A$
 этот объект обычно обозначается $R$). Если программа справочника
 $A$ для логического символа $S$ от\-сут\-ствует, либо выход из нее
 осуществляется через оператор "стоп", либо при откате, то в
 качестве зачения возвращается логический символ 0. Одно из
 удобств при использовании справочников заключается в возможности
 независимого про\-грам\-ми\-ро\-вания его процедур, обслуживающих
 различные логические символы. Кроме того, время обращения к
 нужной процедуре справочника практически никак не зависит от
 числа ранее запрограммированных процедур этого справочника.

 В качестве примера рассмотри справочник "одз", обеспечивающий
 получение условий на допустимые значения операндов некоторой
 операции либо некоторого предиката. Логическим символом $S$ здесь
 служит указанная операция либо предикат; дополнительные входные
 данные таковы: х1 - задача, в которой встречается рас\-смат\-ри\-ваемое
 вхождение $S$; (х2,х3,х4) - координата вхождения символа $S$ в
 задачу х1 (х2 - вхождение $S$ в терм задачи; х3 - вхождение этого
 терма в список задачи; х4 - указатель посылки (0) либо условия
 (1)).

 Запрограммируем, например, процедуру справочника "одз",
 обслуживающую ло\-ги\-ческий символ "тангенс". Первые два оператора
 программы (она вставляется в программу символа "тангенс") таковы:
 "обращение(одз) метка(икс(5))". Как обычно, здесь 5 - номер
 первой не определенной при обращении программной переменной.
 Первый оператор указывает название справочника.

 Далее располагаются следующие операторы:

 "равно(х5 первыйтерм(х2)) равно(х6 выписка(х7 или(и(не(существует(х6
 и(равно\ (х6 справка(тип буква(первыйоперанд(х2))))не(равно(х6
 0))входит(число х6))))равно\ (х7 запись(число х5)))равно(х7
 запись(не запись(равно запись(косинус х5)0))))х7)) ответ(х6)".

 Первый из них определяет терм х5 - операнд тангенса. Далее
 используется кон\-струк\-ция с оператором "выписка", в которой
 последовательно (с помощью оператора "или") формируются два
 элемента х7, регистрируемые в результирующем списке условий.
 Первый из этих термов х7 имеет вид "число(х5)"; второй - вид
 "не(равно(ко\-синус(х5)0))". Чтобы избежать перечисления условий,
 очевидным образом уже вы\-пол\-ненных в контексте рассматриваемого
 вхождения, регистрация условия "число\ (х5)" в списке предваряется
 проверкой того, что терм х5 не имеет своим заголовком операцию,
 принимающую только числовые значения. Для этой проверки
 использу\-ет\-ся справочник "тип".

 Подробная информация о справочнике с названием $A$ размещается в
 справочной информации логического символа $A$ и при работе с
 редактором программ ЛОСа доступна, например, через F2. В
 поясняющих текстах информация о справочнике $A$ обычно начинается
 со слов "$A$ - индекс обращения.". При этом результат обращения к
 справочнику обозначается посредством $R$.

 \section{Упражнения по программированию на ЛОСе}

 \subsection{Просмотр программ}

 \begin{enumerate}

 \item Войти из главного меню в корневой фрагмент программы символа
 "синус".

 \item Найти в программе символа "синус" \ фрагмент, содержащий
 оператор "уро\-вень\ (1 3)". Найти фрагменты, содержащие операторы
 "уровень(2)" \ и "уровень(8)".

 \item Найти все вхождения в программу символа "синус" \ оператора
 "символ(х20 косинус)". Сколько таких вхождений ?

 \item Находясь в программе символа "синус", посмотреть справочную
 информацию для символа "синус". Находясь в той же программе,
 посмотреть справочную информацию для символа "степень".

 \item Находясь в корневом фрагменте программы символа "синус" \ и
 используя толь\-ко мышь, посмотреть справочную информацию символа
 "заменавхождения". Про\-смот\-реть все страницы этой информации.

 \item Находясь в корневом фрагменте программы символа "синус" \ и
 не выходя в главное меню, перейти к просмотру корневого фрагмента
 программы символа "заменавхождения". После этого, опять же не
 выходя в главное меню, вернуться к корневому фрагменту программы
 символа "синус".

 \item Находясь в корневом фрагменте программы символа "синус",
 перейти в оглав\-ление операторов ЛОСа; найти в нем цепочку
 подразделов "Операторы для работы с логическими структурами данных" \ -
 "Списки термов" \ - "Лексико\-гра\-фическое упорядочение набора
 термов" \ и просмотреть справочную информа\-цию для логического
 символа "лексупорядочение". Затем вернуться в програм\-му символа
 "синус".

 \item Войти в корневой фрагмент программы символа
 "заменавхождения" и перейти от него к подфрагменту вдоль цепочки
 переходов с номерами: 2, 1, 1, 2. Перейти к пункту оглавления
 программ, соответствующему ссылке "прием(5 9)", име\-ющейся в
 найденном фрагменте.

 \item Войти в корневой фрагмент программы символа "синус" \ и,
 не выходя в главное меню, просмотреть корневые фрагменты программ
 нескольких следующих пос\-ле синуса логических символов.

 \item Войти в корневой фрагмент программы символа "биссектриса",
 перейти в ре\-жим просмотра подтермов операторов и выделить в
 предпоследнем операторе фрагмента многоцветной указкой подтерм
 "списокпосылок(х1)". Далее вер\-нуть\-ся в режим обычного просмотра
 программы. Проделать эту операцию два\-жды - сначала только с
 помощью клавиатуры, затем - только с помощью мыши.

 \item Войти в программу символа "синус" и, используя только
 клавиши курсора, найти фрагмент, содержащий оператор "обращение(тип)".
 Далее вернуться к корневому фрагменту программы "синус",
 используя единственное нажатие клавиши.

 \item Войти из главного меню в оглавление операторов ЛОСа и найти
 в нем опе\-ра\-тор\-ное выражение, определяющее номер вхождения в
 набор. Перейти в просмотр программы этого операторного выражения,
 после чего снова вернуться в ог\-лав\-ле\-ние операторов ЛОСа.

 \item Найти в оглавлении операторов ЛОСа оператор, проверяющий
 отсутствие в терме повторных вхождений одной и той же переменной.

 \item Найти в оглавлении операторов ЛОСа оператор, проверяющий,
 что один терм получается из другого вычеркиванием части операндов
 некоторой операции.

 \item Найти в оглавлении операторов ЛОСа все операторы,
 обращающиеся к реше\-нию вспомогательной задачи на доказательство.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item В главном меню нажать клавишу "п" \ либо нажать левую кнопку
 мыши в окне "Просмотр программы логического символа", затем
 набрать текстовым ре\-дак\-тором слово "синус" \ и нажать "Enter".

 \item Обычно операторы "уровень($\ldots$)" располагаются вдоль
 главного ствола ветви программы логического символа, содержащей
 приемы сканирования задачи. Эта ветвь располагается после оператора
 "решить". В корневом фрагменте видим операторы "уровень(0) иначе
 2", так что для поиска операторов "уро\-вень(1 3)", "уровень(2)" \ и
 "уровень(8)" переходим по указателю перехода "иначе 2". Напомним, что
 клавиши "курсор влево - вправо" \ позволяют выбрать теку\-щий указатель
 перехода, клавиша "курсор вниз" \ - переводит по этому указате\-лю,
 "курсор вверх" \ - возвращает обратно. После перехода видим
 операторы "ветвь 1 уровень(1)". Наши операторы выбора уровня не могут
 размещаться после оператора "уровень(1)", так что перемещаемся по
 указателю "ветвь 1". Это перемещение приводит к фрагменту с
 оператором "уровень(1 3)" \ - один из искомых операторов. Продолжая
 далее перемещаться вдоль главного ствола (переходы до операторов
 "уровень" \ либо непосредственно после них), находим операторы
 "уровень(2)" \ и "уровень(8)". Заметим, что иногда сначала идет
 опе\-ра\-тор "уровень($N_1 \ldots N_m$)", объединяющий несколько
 уровней, а после него размещается ветвь, в которой операторы
 "уровень" \ указывают различные су\-же\-ния исходного списка $N_1,
 \ldots, N_m$.

 \item Чтобы найти в некоторой ветви программы логического символа
 все вхождения заданного логического символа либо терма, следует
 сначала перейти в корень этой ветви, затем нажать клавишу F4 и
 набрать текстовым редактором искомый логический символ либо терм.
 После нажатия "Enter", завершающего набор, начинается поиск
 требуемых вхождений. Если вхождение найдено, то на экране изображается
 содержащий его фрагмент, в котором оно выделено многоцветной
 указкой. Каждое последующее нажатие F4 приводит к поиску
 очередного вхож\-дения. По завершении поиска возникает пустой
 экран, и по нажатии любой клавиши далее восстанавливается
 изображение на момент начала поиска.

 \item Для получения справочной информации о логическом символе,
программа ко\-то\-рого просматривается, достаточно нажать F3. Если
нужно получить ин\-фор\-мацию о каком-либо другом символе, то
нажимается F2 и набирается нужный символ.

 \item Перевести курсор мыши на заголовок оператора
 "заменавхождения($\ldots$)"\ и на\-жать левую клавишу мыши, чтобы
 этот оператор выделить многоцветной указ\-кой. Затем нажать правую
 клавишу мыши. Для перелистывания использовать либо "PageUp-PageDown",
 либо нажатия левой кнопкой мыши на стрелках в меню. Для возвращения
 в просмотр фрагмента программы нажать любую кнопку мыши внутри текста.
 Чтобы убрать мышью выделенный подтерм, на\-жать ее левую кнопку вне
 области операторов программы.

 \item Выделить левой кнопкой мыши вхождение логического символа
 "замена\-вхож\-дения" \ и нажать клавишу "с". Для возвращения в
 программу символа "синус" \ нажать "End".

 \item Нажать клавишу "Ctr-л", переводящую в оглавление
 операторов ЛОСа. Для возвращения в просмотр фрагмента программы
 нажать "End".

 \item Чтобы перейти в пункт оглавления программ ЛОСа,
 соответствующий ука\-за\-телю "прием($N$)", найденному в некотором
 фрагменте программы, нужно выделить многоцветной указкой
 какой-либо оператор, расположенный после данного указателя, и
 нажать "Ctr-End". Возвращение в программу - нажатие "курсор
 вправо" \ на выбранном пункте оглавления. Данная операция
 работает только в случаях, когда просмотр программы был начат
 из главного меню.

 \item Для перехода в корневой фрагмент программы следующего (по
 номеру - первого после текущего, для которого создана программа)
 логического символа до\-ста\-точ\-но нажать клавишу "ш".

 \item Для входа в режим многоцветной указки (режим просмотра
 подтермов опе\-ра\-то\-ров) нажимается клавиша "о" (кир.). Далее
 клавишами "курсор влево - вправо" \ выбирается нужный оператор,
 клавишей "курсор вниз" - осуществляется вход в выделение его
 подоператоров, и т.д. вплоть до нужного подтерма. Этого же можно
 добиться, нажав левую кнопку мыши на заголовке выделяемого
 подтерма. При единичном выделении удобнее пользоваться мышью,
 при по\-сле\-до\-ва\-тельном просмотре операторов и их подтермов удобнее
 пользоваться клавишами курсора.

 \item Указатели типов обращений "решить", "программа",
 "обращение($A$)" \ раз\-ме\-щаются в виде линейной цепочки, начинающейся
 в корневом фрагменте про\-граммы. Начало корневого фрагмента
 программы символа "синус" \ имеет вид "решить иначе 1". Переходим
 по указетлю "иначе 1" \ - появляется фрагмент с началом
 "обращение(блокредактора) иначе 1". Снова переходим по указателю
 "иначе 1", и т.д., пока не найдем фрагмент с началом
 "обращение(тип)". Для возвращения в корневой фрагмент достаточно
 нажать "End". Последняя опе\-ра\-ция работает только в случае, если
 просмотр программы был начат из главного меню.

 \item Для входа в оглавление операторов из главного меню нажимаем
 клавишу "о" \ (кир.). Находим в корневом меню оглавления раздел
 "Операторы и операторные выражения, реализованные на ЛОСе". Далее
 смотрим подраздел "Операторы для работы с наборами и вхождениями
 в наборы". Затем выбираем пункт "Вхождения в набор", и наконец -
 "Номер вхождения в набор". Остальные упражнения на поиск в данном
 оглавлении делаются аналогично.

 \end{enumerate}

 \subsection{Логические символы}

 \begin{enumerate}

 \item Определить номер логического символа "синус".

 \item Определить название логического символа с номером 1000.

 \item Просмотреть названия логических символов с номерами от 290 до
 294. Про\-смо\-треть справочную информацию об этих символах.

 \item Найти логический символ, для которого имеется программа, но
 нет справочной информации.

 \item Найти логический символ, для которого
 имеется справочная ин\-фор\-ма\-ция, но нет программы.

 \item Найти номер логического символа, для которого не введено
 название.

 \item Ввести новый логический символ с названием "рррр".

 \item Изменить название логического символа "рррр" \ на "тттт".

 \item Удалить логический символ "тттт".

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Войти в пункт "Ресурсы и установки" \ главного меню, выбрать
 далее пункт "определение номера символа по его названию", нажав
 клавишу "с" \ либо ис\-поль\-зуя левую кнопку мыши, и ввести текстовым
 редактором слово "синус". Затем нажать "Enter". Для возвращения в
 главное меню нажать любую кла\-ви\-шу.

 \item Войти в пункт "Реcурсы и установки" \ и выбрать подпункт
 "Определение наз\-ва\-ния символа по его номеру". Затем набрать
 номер 1000 и нажать "Enter". Эту же операцию (и все остальные
 операции подменю "Ресурсы и установки", кроме описанной в
 предыдущем пункте)\ можно выполнять непосредственно из главного
 меню - начиная ее сразу с нажатия "Ctr - с").

 \item Для просмотра списка упорядоченных по номерам логических
 символов войти из главного меню в пункт "Логические символы".
 Затем перелистывать стра\-ни\-цы с помощью "PageDown - PageUp" \ до
 нахождения нужного диапазона номеров символов. Выделить нужный
 символ голубым цветом, используя кла\-ви\-ши "курсор вниз-вверх" \
 в рамках одного столбца и "курсор влево - вправо" \ для смены
 столбца. Для просмотра информации о выделенном символе нажать
 "и". Для возвращения в просмотр символов нажать любую клавишу,
 не ис\-поль\-зу\-емую при просмотре справочной информации.

 \item Войти в просмотр списка упорядоченных по номерам логических
 символов и перелистывать страницы до обнаружения символа, после
 которого рас\-по\-ла\-га\-ет\-ся знак "\&" \ и нет знака "!".

 \item Аналогично предыдущему, но искать символ, после которого
 идет "!", но нет "\&".

 \item Перелистывать список символов до номеров, после которых
 идут три знака "!", "?", "\&".

 \item Войти в пункт "Ресурсы и установки" \ главного меню. Выбрать
 подпункт "Ввод названия нового символа". Ввести текстовым
 редактором требуемое слово (если оно уже использовано в качестве
 названия, то об этом появляется сообщение) и нажать "Enter".

 \item Войти в пункт "Ресурсы и установки" \ и выбрать подпункт
 "Изменение названия символа". Затем ввести изменяемое название
 (эту операцию требуется про\-во\-дить осторожно, избегая вводить
 отсутствующее название) и нажать "Enter". После нажатия "Enter" \
 старое название уже уничтожено; далее водится новое название.
 Если новое название уже было использовано, то будет выдано
 соответствующее сообщение, после чего по нажатии любой клавиши
 произойдет выход в главное меню. Чтобы в этом случае завершить
 операцию изменения названия, нужно дальше действовать так же, как
 при вводе нового логического символа - новое название будет
 сопоставлено первому свободному номеру сим\-во\-ла, т.е. (в обычной
 ситуации) номеру, для которого только что было унич\-то\-же\-но старое
 название.

 \item Войти в пункт "Ресурсы и установки" \ и выбрать подпункт
 "Удаление названия символа".  Ввести название удаляемого символа
 (избегая вводить не\-су\-щес\-тву\-ющие названия) и нажать "Enter".

 \end{enumerate}

 \subsection{Редактирование программы}

 \begin{enumerate}

 \item Ввести новый логический символ с названием "включсимв". Войти в
 просмотр программы этого символа. Войти в редактирование
 справочной информации для символа "включсимв" \ и набрать текст:
 "включсимв(х1 х2). х1,х2 - термы. Оператор проверяет, что каждый
 логический символ, встречающийся в тер\-ме х1, встречается также в
 терме х2". Затем вернуться в просмотр программы, войти в
 редактирование программы и набрать текст программы:
 "программа метка(икс(3)) равно(х3 перечисление(х4 и(входит(х4 х1)
 логсимвол(х4))х4)) ра\-вно(х4 перечисление(х5 и(входит(х5
 х2)логсимвол(х5))х5)) включается(х3 х4) выход".

 \item Разрезать программу символа "включсимв", введенную в
 предыдущем упраж\-нении, на два последовательно идущих фрагмента,
 так, чтобы второй начинал\-ся с оператора "равно(х4 $\ldots$)".

 \item Склеить два фрагмента, на которые была разрезана программа
 символа "вклю\-чсимв", в один общий фрагмент.

 \item Вставить в программу символа "включсимв" программу
 справочника "арность", состоящую из операторов
 "обращение(арность) ответ(2)". Затем удалить эту введенную вручную
 программу и осуществить ее автоматический синтез.

 \item Увеличить на 2 номера всех программных переменных,
 начиная с переменной х4, в операторах программы символа "включсимв",
 идущих после оператора "равно(х3 $\ldots$)". Затем восстановить
 исходные номера этих переменных.

 \item Войдя в редактирование программы символа "включсимв",
 выполнить сле\-ду\-ющие стандартные операции текстового редактора:
 а) переставить местами операторы "равно(х3 $\ldots$)" \ и
 "равно(х4 $\ldots$)", после чего восстановить исходное их размещение;
 б) Найти для каких-либо открывающих и закрывающих скобок операторов
 программы двойственные им скобки; в) Перед оператором "равно(х3
 $\ldots$)" \ вставить оператор "равно(х3 0)", а затем удалить этот
 оператор; г) после оператора "равно(х3 $\ldots$)" \ разместить его
 копию, а затем удалить эту копию.

 \item Войдя в редактирование программы символа "включсимв",
 просмотреть спра\-вочную информацию для логического символа
 "включается", после чего вер\-нуться в редактирование.

 \item Найти в программе логического символа "делит" \ ветвь фрагмента,
 на\-чи\-на\-юще\-гося с оператора "обращение(программа)", и скопировать
 эту ветвь в прог\-рам\-му логического символа "включсимв", после чего
 удалить добавленную ветвь.

 \item Найти в программе логического символа "делит" \ фрагмент,
 начинающийся с оператора "обращение(выводсимвола)", и вставить
 копию этого фрагмента в программу оператора "включсимв" \ между
 операторами "равно(х3 $\ldots$)" \ и "равно(х4 $\ldots$)",
 отбросив идущий после "обращение(выводсимвола)" \ оператор
 "иначе 1". Затем удалить вставленные операторы.

 \item Войти в редактирование программы "включсимв" \ и ввести
 несколько ошибок в программу - исказить название какого-либо
 оператора; добавить лишнюю скобку либо удалить имевшуюся. Затем
 нажать "Enter" \ и исправить ошибку, на которую будет указано
 в верхней правой части экрана.

 \item Войти в редактирование программы "включсимв" \ и внести в
 нее ошибку, из\-ме\-нив оператор "включается(х3 х4)" \ на
 "деление(х3 х4)". Затем выйти из ре\-дак\-ти\-рования и предпринять
 автоматическую проверку программы. После по\-лу\-чения указания на
 ошибку исправить эту ошибку.

 \item Аналогично предыдущему, но оператор "включается(х3 х4)"
 \ заменить на "вклю\-чается(х3 х5)".

 \item Удалить программу логического символа "включсимв", удалить
 справочную информацию для этого символа, после чего удалить сам
 символ.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Введя название нового символа, вернуться в главное меню
 и набрать название этого символа в окне "Просмотр программы
 логического символа" \ (набор за\-вер\-шается нажатием "Enter"). После
 появления пустого экрана нажать F3 и набрать требуемый текст
 справочной информации. После этого вернуться в просмотр программы
 (будет восстановлен пустой экран) и нажать клавишу "р". В правом
 верхнем углу экрана появится предупреждающий о режиме
 редактирования программы красный прямоугольник, а в левом верхнем
 углу - курсор текстового редактора. Далее выполняется набор
 текста программы, и по завершении набора нажимается "Enter". Если
 при наборе были допущены ошибки, то в правом верхнем углу
 появится сообщение об ошибке. При этом режим текстового
 редактора сохраняется, так что можно сразу же исправить ошибку и
 снова нажать "Enter". При отсутствии ошибок нажатие "Enter" \
 за\-вер\-шает создание либо изменение фрагмента программы.

 \item Для разрезания фрагмента программы на две части войти в
 режим просмотра подтермов операторов (клавиша "о", кир.),
 выделить тот оператор, с которого должна начинаться вторая
 половина разрезанного фрагмента, и нажать кла\-ви\-шу "р" (кир.).

 \item Если фрагмент программы заканчивается операторами "ветвь
 $N$ продолжение", то нажатие клавиши F6 приводит к тому, что
 текст фрагмента по ссылке "ветвь $N$" \ заносится в конец текущего
 фрагмента вместо двух его последних операторов, а сам этот
 фрагмент исключается.

 \item Нужно войти в редактирование корневого фрагмента программы
 символа "вк\-лючсимв" \ и вставить после оператора "программа" \
 оператор "иначе 1". Затем нажать "Enter". Тогда появится пустой
 экран, в левом верхнем углу которого будет прорисована цифра 1 -
 номер ссылки к редактируемому подфрагменту, а под ней - курсор
 текстового редактора для набора текста этого подфрагмента. После
 набор текста нажимается "Enter", завершающее ввод ветви программы.
 Чтобы удалить ветвь программы, имеются два способа: а) в режиме
 обычного просмотра фрагмента программы выделить оператор
 перехода к удаляемой ветви и нажать "Ctr-Del"; б) войти в
 редактирование фрагмента програм\-мы и исключить оператор перехода
 к удаляемой ветви. Способ а) может быть применен лишь однократно;
 для повторного его применения необходимо снача\-ла выйти в главное
 меню через "Esc". Это объясняется тем, что удаленная ветвь временно
 сохраняется в буфере и может быть восстановлена (до указанного выхода
 в главное меню) в другом месте программы. Способ б) можно применять
 без каких-либо ограничений.

 Для автоматического контроля программы и ввода подфрагментов,
 указыва\-ющих арность оператора либо операторного выражения,
 реализованного этой программой, нужно в корневом фрагменте
 программы нажать клавишу "п". Синтез программы справочника
 "арность" \ (для перечисляющего оператора - также справочника
 "комментпосылок") выполняется только при условии, что после
 начинающего корневой фрагмент оператора "программа" \ либо
 "об\-ра\-ще\-ние(0)" \ не идет оператор перехода "иначе".

 \item Для увеличения либо уменьшения номеров программных
 переменных сначала следует войти в режим просмотра подтермов
 операторов, затем выделить тот оператор, начиная с которого
 должны быть изменены номера переменных, и нажать клавишу "п".
 Тогда в левом верхнем углу появляется курсор текстового
 редактора. Для увеличения на $n$ номеров переменных, начиная
 с переменной х$m$ (включая эту переменную), набирается текст
 "плюс(х$m$ $n$)"; для уменьше\-ния - "минус(х$m$ $n$)". После
 нажатия "Enter" \ происходит коррекция номеров переменных в
 данном фрагменте и всех его подфрагментах, достижимых через
 выделенный оператор.

 \item Напомним используемые в данном упражнении операции
 текстового редактора: а) Для перенесения фрагмента текста на новое
 место курсор подводится к началу этого фрагмента и нажимается F2;
 затем курсор подводится к кон\-цу фрагмента и снова нажимается F2
 (начало и конец фрагмента выделены зе\-ле\-ными маркерами). Наконец,
 курсор подводится к той позиции, начиная с которой должен быть
 размещен фрагмент, и опять нажимается F2; б) Для перехода от
 скобки к двойственной ей курсор устанавливается на скобку и
 нажимается F1; в) Для вставки фрагмента текста курсор подводится
 к тому месту, с которого должна начинаться вставка, и нажимается
 "Insert" \- курсор становится голубым. Каждый набираемый с
 клавиатуры символ вставляется на позицию курсора, а курсор
 перемещается на одну клетку вправо. Выход из режима вставки -
 повторное нажатие "Insert" \ либо (для исправления ошибки)
 "Backspace"; г) Для копирования фрагмент текста курсор подводится
 к его началу и нажимается "PageDown". Затем курсор подводится к
 концу фрагмента и снова нажимается "PageDown" \ - фрагмент таким
 образом записан в буфере. Для извлечения его из буфера (что может
 происходить при повторных об\-ра\-ще\-ниях к текстовому редактору в
 произвольных интерфейсах системы) курсор подводится к тому месту,
 начиная с которого должна быть вставлена копия, и нажимается
 "PageUp".

 Для удаления фрагмента текста следует подвести курсор к началу
 фрагмента и нажать "Delete", затем подвести его к первой позиции
 после конца фрагмента и повторно нажать "Delete".

 \item Для просмотра справочной информации о логических символах
 непосредст\-вен\-но из текстового редактора следует нажать клавишу F4
 и набрать название нуж\-ного логического символа. После просмотра
 будет восстановлена текущая ситуация редактирования.

 \item Сначала следует войти в программу символа "делит"\ и,
 спускаясь вдоль "глав\-но\-го ствола", найти фрагмент, начинающийся с
 оператора "обращение(про\-грам\-ма)". Затем нажимается "Insert" \ -
 ссылка на ветвь этого фрагмента со\-хра\-нена в буфере. После этого
 нужно выйти в главное меню по нажатию клавиши "PageUp" (при
 другом способе выхода ссылка на ветвь будет утеряна) и набрать в
 окне "Просмотр программы логического символа" \ название
 "включсимв". Внутри программы "включсимв" \ следует найти
 фрагмент оператора "об\-ра\-ще\-ние(арность)", войти в его
 редактирование и вставить после первого оператора переход "иначе
 1". Войдя в редактирование подфрагмента по ссылке "иначе 1",
 набрать единственный опера\-тор "продолжение". Наконец, после
 нажатия "Enter" \ вернуться в созданный подфрагмент
 "продолжение", выделить его опера\-тор многоцветной указкой ("о",
 кир.) и нажать клавишу "к" \ для копирования вы\-де\-лен\-ной ветви
 вместо ветви подфрагмента "продолжение".

 \item Эта операция выполняется с помощью буфера текстового
 редактора: сначала в программе символа "делит" \ находим фрагмент
 оператора "обращение(вы\-вод\-сим\-во\-ла)", входим в редактирование этого
 фрагмента и заносим (нажатиями "PageDown") его в буфер. Затем
 переходим в редактирование корневого фраг\-мен\-та программы символа
 "включсимв", устанавливаем курсор перед опе\-ра\-то\-ром "равно(х4
 $\ldots$)" \ и нажимаем "PageUp".

 \item При неправильном наборе логического символа в правой
 верхней части экрана появляется текст "ошибка в логическом
 символе", причем курсор текстового редактора устанавливается на
 начало неправильно набранного символа. Если число закрывающих
 скобок больше числа открывающих, появляется текст "из\-бы\-точная
 правая скобка" \ и курсор устанавливается на первую правую скобку,
 не имеющую двойственной левой. Если число открывающих скобок
 больше числа закрывающих, то появляется текст "незакрытая левая
 скобка" \ и курсор устанавливается в левый верхний угол экрана.
 В этом случае для поиска не\-за\-кры\-той скобки можно последовательно
 устанавливать курсор на все от\-кры\-ва\-ющие скобки, нажимая F1 для
 проверки наличия соответствующей за\-кры\-ва\-ющей скобки.

 \item Для автоматической проверки набранной программы нажимается
 клавиша "п". Если указать неправильное число операндов (у
 оператора "деление" \ оно равно 4), то в правом верхнем углу
 экрана появится текст "ошибка в числе операндов", причем
 ошибочный оператор будет выделен многоцветной указкой. Как
 обычно, для выхода из режима многоцветной указки нажимаем "о" \ и
 переходим в режим редактирования для исправления ошибки. Заметим,
 что такой контроль числа операндов распространяется только на
 операторы и операторные вы\-ра\-же\-ния, запрограммированные на ЛОСе.
 Если допущена ошибка в числе опе\-ран\-дов для базисного оператора
 либо операторного выражения, то скорее всего она будет обнаружена
 немедленно, так как после нажатия "Enter" \ и перерисовки
 набранного текста программы произойдет искажение сразу нескольких
 опе\-ра\-то\-ров, соседних с тем, у которого число операндов не
 соответствует норме.

 \item При автоматическом контроле правильности программы выявляются
 входные переменные, значения которых еще не определены, а также выходные
 пе\-ре\-мен\-ные, значения которых уже были определены.

 \item Для удаления программы логического символа следует войти в
 ее корневой фрагмент и нажать "Ctr-F7". Для удаления справочной
 информации о символе войти в ее просмотр (если она размещена на
 нескольких страницах, то найти последнюю станицу) и далее нажимать
 "Ctr-Del" \ столько раз, сколько по\-на\-до\-бит\-ся для удаления всех ее
 страниц.

 \end{enumerate}

 \subsection{Запуск программы и ее отладочная трассировка}

 Тестирование процедур логической системы обычно предпринимается в
 реальном контексте их функционирования - в рамках приема либо
 блока интерфейса. Поэтому для проверки новой программы обращение
 к ней включается в соответствующие прием либо блок интерфейса, и
 далее либо запускается процесс решения задачи, в которой должен
 сработать рассматриваемый прием, либо выбирается режим
 ин\-тер\-фейса, обращающийся к новой программе.

 Однако, для особых случаев предусмотрена также возможность запуска
 новой программы безотносительно к контексту предполагаемого ее
 применения. Для такого запуска нужно предварительно создать входные
 данные обращения к программе; это удобно делать в рамках некоторой
 другой программы. В качестве такой стандартной программы,
 обращающейся к тестируемой программе, выбрана программа
 ло\-ги\-чес\-ко\-го символа "пуск". Ее первые два оператора "программа
 метка(икс(2))" \ следует оставлять без изменений, а все остальные
 операторы - изменять в соответствии с организацией тестирования.
 Запуск программы "пуск" \ осуществляется не\-по\-сред\-ственно из просмотра
 ее корневого фрагмента нажатием "Ctr-Enter"; после этого
 устанавливается режим пошаговой трассировки в рамках отладчика ЛОСа.
 По за\-вер\-шении программы "пуск" \ происходит возвращение в главное
 меню.

 \begin{enumerate}

 \item Предпринять пошаговое выполнение программы "включсимв(х1
 х2)" \ при вхо\-дных данных - термах "синус(плюс(х1 х2 х3))" и
 "степень(х2 плюс(х1 х3 синус\ (х2)))".

 \item В процессе пошагового выполнения программы "включсимв(х1
 х2)" при ука\-зан\-ных выше входных данных посмотреть значения
 переменных х3 и х4.

 \item В процессе пошагового выполнения программы "включсимв"
 \ посмотреть вне\-шнюю обратившуюся к ней программу "пуск", а также
 внешнюю обратившуюся к программе "пуск" \ программу "вход" \ (она
 является программой общего ин\-тер\-фейса логической системы).
 Посмотреть значения программных переменных х2 и х3 для программы
 "пуск" \ в двух режимах - с обычной и скобочной прорисов\-кой формул.
 Посмотреть значение переменной х1 для программы "вход" \
 (ее зна\-че\-нием служит исходная задача).

 \item Найти в задачнике раздел "Элементарная алгебра - Упрощение
 выражений - Разложение на множители-1" \ и войти в просмотр
 первой задачи этого раздела. Запустить решение этой задачи с
 прерыванием при обращении к оператору "заменавхождения".
 Определить значения программных переменных х1 (за\-ме\-ня\-емое
 вхождение) и х5 (заменяющий терм). Определить значения переменных
 х2, х3, х4 (вхождение текущего терма в список задачи; указатель
 условия либо посылки; текущая задача). Определить текущий уровень
 сканирования, при котором был применен прием, обратившийся к
 оператору "заменавхождения". Используя сквозной просмотр,
 рассмотреть текущую задачу х4.

 \item В контексте предыдущего упражнения (т.е. в начале пошаговой
 трассировки внутри программы оператора "заменавхождения")
 предпринять пооператорную трассировку вплоть до обращения к
 оператору "сопровождение(х4 х1 х2 х3)". Войти в трассировку
 внутри последнего оператора. Затем выйти в главное меню; повторно
 войти в контекст предыдущего упраженения, установить пре\-рывание при
 обращении к программе "сопровождение" и запустить программу до
 данного прерывания.

 \item Войти в трассировку программы "заменавхождения" \ при решении
 указанной выше задачи через оглавление программ ЛОСа. После этого
 выбрать пункт 16 в подразделе оглавления программ, перечисляющем
 действия оператора "заменавхождения", и выйти в трассировку при
 достижении программой этого пункта. Проделать ту же операцию
 непосредственно из запуска задачи, без прерывания в начале
 выполнения программы "заменавхождения".

 \item Запустить решение указанной выше задачи с прерыванием на 14-м
 пункте подраздела оглавления программ для оператора "заменавхождения".
 Далее, используя многоцветную указку, установить прерывание при
 обращении к опе\-ратору "равно(х14 справка(одз $\ldots$))", и
 запустить выполнение программы до этого прерывания.

 \item Войти в прерывание при обращении к оператору "заменавхождения"
 \ в указан\-ной выше задаче и определить результат обращения к
 операторному выраже\-нию "видумножение($\ldots$)", находящемуся в
 программе приема, обратившегося к "за\-ме\-навхождения".

 \item Войти в прерывание при обращении к оператору
 "заменавхождения" \ в указан\-ной выше задаче, определить число на
 счетчике шагов и перезапустить решение задачи с прерыванием по
 достижении этого числа шагов.

 \item Войти в оглавление приемов через главное меню, выбрать
 какой-либо концевой пункт этого оглавления (после номера
 концевого пункта идет не скобка, а точка), и нажать "End".
 Войти через главное меню в корневой фрагмент про\-грам\-мы
 логического симво\-ла "оглавление" \ и вставить перед оператором
 "по\-вто\-ре\-ние" \ в этом фрагменте оператор "трассировка(стоп 0)".
 Затем вернуться в главное меню и войти в оглавление базы
 приемов. После того, как произойдет выход в отладчик ЛОСа по
 установленной контрольной точке (по оператору "трассировка(стоп
 0)"), пошаговой трассировкой дойти до выполнения опе\-ра\-то\-ра
 "файл(терм х10 х12)" \ и посмотреть значение переменной х12.
 Затем вернуться в главное меню и убрать из программы "оглавление"
 \ контрольную точку.

 \item Выбрать в задачнике произвольную задачу на разложение на
 множители, ус\-та\-но\-вить прерывание при обращении к логическому
 символу "заменавхождения" \ и запустить решение до этого
 прерывания. Затем посмотреть текущий кадр семантической
 трассировки, сопровождающий данное обращение.

 \item Для той же задачи запустить ее решение с семантической
 трассировкой и при первом срабатывании приема посмотреть
 текущий фрагмент программы, ре\-а\-ли\-зующей этот прием. Найти в этой
 программе оператор "заменавхождения"; посмотреть текущую точку
 программы "заменавхождения" \ на момент пре\-ры\-ва\-ния.

 \item Найти в задачнике раздел "Элементарная алгебра - Решение
 уравнений - Ло\-га\-рифмические уравнения - Системы уравнений" \ и
 войти в просмотр задачи номер 10. Войти в семантическую
 трассировку решения этой задачи и про\-дол\-жать ее до появления
 кадра "Переходим к основанию логарифмов $a$". Перейти в отладчик
 ЛОСа и посмотреть список комментариев к текущей задаче. Найти в
 нем комментарий "нормлогарифм $a$", определивший новое основание
 логариф\-ма. Найти комментарий "сопровождение $A$" \ и установить
 прерывание до мо\-мен\-та изменения этого комментария, после чего
 продолжить решение до данного прерывания.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Упражнение выполняется после того, как ранее была создана
 программа сим\-во\-ла "включсимв". Нужно войти в программу символа
 "пуск" \ и набрать корневой фрагмент: "программа метка(икс(2))
 равно(х2 запись(синус запись(плюс икс(1) икс(2) икс(3))))
 равно(х3 запись(степень икс(2) запись(плюс икс(1) икс(3)
 за\-пись(синус икс(2))))) включсимв(х2 х3) выход". В этом фрагменте
 сначала вводятся входные данные х2, х3 для обращения к оператору
 "включсимв", затем реализуется такое обращение. Далее нажать
 "Ctr-Enter" \ - начнется по\-ша\-говая трассировка только что набранной
 программы "пуск" \ отладчиком ЛОСа. Здесь удобно сразу нажать
 клавишу "2" \ для установки пооператорного режима вместо слишком
 подробного пошагового, и тремя нажатиями "Enter" \ дойти до
 обращения к оператору "включсимв". Чтобы войти в трассировку
 внутри этого оператора, следует снова установить пошаговый режим
 (нажатием клавиши "1") и нажать "Enter". Далее опять
 устанавливаем пооператорный режим и последовательно проходим
 операторы программы "включсимв" до оператора "выход", после
 которого автоматически происходит возвращение в главное ме\-ню.

 \item Действия аналогичны описанным выше, но после определения
 значений пе\-ре\-мен\-ных х3, х4 в программе "включсимв" \
 предпринимаем просмотр значений этих переменных. Для просмотра
 сначала нажимаем клавишу "х" \ (кир.), и далее набираем номер
 переменной. После нажатия "Enter" \ справа от набранной
 переменной появляется ее значение - в данном случае это будут
 наборы ло\-ги\-чес\-ких символов.

 \item Чтобы посмотреть фрагмент программы, из которого произошло
 обращение к текущему фрагменту программы, нажимаем "PageUp".
 Делаем это дважды - сначала возвращаемся к программе "пуск",
 затем - к программе "вход", обес\-пе\-чи\-вающей интерфейс логической
 системы. Обратные переходы - с помощью "PageDown". Находясь в
 рамках программы "вход", можно с помощью клавиш "Home - End" \
 пройтись по всей текущей цепочке ее фрагментов - от текущего
 фрагмента до корневого. Чтобы перейти к режиму просмотра термов
 х2,х3 в скобочной записи, нажимается клавиша "с"; для возвращения
 в стандартную математическую запись - нажимается "м" \ (кир.).
 При просмотре значения х1 в программе "вход" \ появится строчка
 "исследовать н1 т2 н3 т4". Записи "н1","н3" \ обозначают некоторые
 наборы (в данном случае - списки посылок и ком\-мен\-та\-риев к
 посылкам); записи "т2", "т4" \ - некоторые термы либо наборы из
 единственного символа, отождествляемые с термами. Чтобы
 посмотреть, из чего состоят наборы "н$i$", нажимаем клавишу "н" \
 и набираем $i$; чтобы пос\-мот\-реть термы "т$i$", нажимаем клавишу "т"
 и набираем $i$. Эту операцию можно повторять на любую глубину
 (кроме термов и наборов, могут встречаться ссыл\-ки на вхождения
 "в$i$", для которых принцип просмотра тот же). Если экран
 заполнен просмотренными значениями и нужно его расчистить,
 нажимаем "De\-lete" \ (если этого не делать, то при переполнении
 экрана начинается прокрутка выписанных значений вверх, не
 затрагивающая области фрагмента программы). После нажатия
 "Delete" \ можно восстановить текст фрагмента прогаммы, нажав
 клавишу "ф".

 \item Для входа в задачник из главного меню нажать клавишу "з";
 используя клави\-ши курсора, найти нужный раздел и в нем - пункт с
 номером требуемой задачи. Затем войти в просмотр этой задачи
 (курсор вправо). Для установки прерыва\-ния при обращении к
 программе логического символа "заменавхождения" \ на\-жать клавишу
 "Л" \ и набрать название данного символа. После нажатия "Enter"
 \ инициируется решение задачи с выходом в отладчик ЛОСа при
 первом же обращении к оператору "заменавхождения". Для просмотра
 значения перемен\-ной х1 нажимаем клавиши "х" \ (кир.) и "1",
 "Enter". Голубой цвет всего про\-ри\-со\-ванного после этого терма либо
 его части означает, что значением переменной является не сам терм,
 а выделенное голубым вхождение в него. Точно так же
 просматриваются значения переменных х2,$\ldots$,х5. Чтобы
 определить текущий уровень сканирования, при котором был применен
 прием, обратившийся к опе\-ра\-тору "заменавхождения", нажимаем
 клавишу "PageUp", переводящую в про\-смотр программы, обратившейся
 к программе "заменавхождения". После этого достаточно посмотреть
 значение переменной х5 (напомним, что в програм\-ме приема,
 используемого при сканировании задачи, значения первых 5
 перемен\-ных определены уже при обращении к ней, и значением х5 при
 этом служит текущий уровень сканирования; х1 - текущая задача;
 (х2,х3,х4) - координата текущего вхождения в задачу). В данном
 случае текст программы приема уже достаточно велик; если бы нам
 было нужно найти в нем заданный оператор (например,
 "заменавхождения"), то помогла бы многоцветная указка, для
 пе\-ре\-хода к которой достаточно нажать "курсор вниз" \ либо нажать
 левую клавишу мыши в нужной точке программы. Выход из
 многоцветной указки - нажатие левой клавиши мыши вне области
 программы либо нажатие (в зависимости от глубины просматриваемого
 подтерма - одно или несколько) клавиши "курсор вверх".
 Для входа в сквозной просмотр задачи х4 нужно вернуться (PageDown)
 в программу "заменавхождения", нажать клавишу "К" \ (кир.) и номер
 переменной, затем - "Enter". Тогда появляется список элементов
 про\-смат\-ри\-ва\-емого набора; если после номера элемента стоит круглая
 скобка, то этот элемент - атомарный, и просмотр его элементов
 невозможен. Если после номера стоит точка, то элемент является
 набором, и можно посмотреть его элементы, используя клавишу
 "курсор вправо". Для возвращения к предыдущему уров\-ню просмотра
 служит "курсор влево".

 \item Для перехода от пошаговой трассировки к пооператорной
 нажать клавишу "2". Затем нажимать "Enter" \ до появления
 выделенного малиновым цветом оператора "сопровождение(х4 х1 х2 х3)".
 Чтобы войти в трассировку внутри этого оператора, вернуться к
 пошаговой трассировке (клавиша "1") и нажать "Enter". Для обрыва
 трассировки и выхода в главное меню нажимается "Esc". Повторно
 войдя в начало выполнения оператора "заменавхождения", нажать
 клавишу "л" \ и набрать название оператора "сопровождение". Первым
 нажа\-ти\-ем "Enter" \ завершить набор, вторым нажатием "Enter" \ -
 запустить программу до прерывания при входе в оператор
 "сопровождение".

 \item Войти в просмотр задачи и нажать клавишу "л", переводящую в
 оглавление программ ЛОСа. В корневом меню этого оглавления
 выбрать пункт "Приемы решателя", далее - подпункт "Общие
 процедуры, используемые в приемах", далее - подпункт "Процедура
 ЗАМЕНАВХОЖДЕНИЯ". После этого нажать клавишу "курсор вправо".
 Автоматически запускается решение задачи, и при обращении к
 оператору "заменавхождение" \ организуется выход в отладчик ЛОСа
 с установкой пошагового режима трассировки. Чтобы теперь вернуться
 в оглавление программ ЛОСа, нажимается "Ctr-г". Далее
 выбирается пункт 16 и нажимается "курсор вправо" \ - снова
 организуется прерывание при достижении контрольной точки,
 соответствующей выбранному пункту (в нашем случае этой
 контрольной точкой является оператор "прием(1 0)"). При повторе
 прерывание по достижении пункта 16 устанавливается из первого
 обращения к оглавлению программ.

 \item Войти в прерывание по достижении 14 - го пункта списка
 контрольных точек оператора "заменавхождения". Затем нажать
 "курсор вниз" \ - появляется мно\-го\-цвет\-ная указка, выделяющая
 первый оператор программы. Используя "кур\-сор вправо", дойти до
 выделения оператора "равно(х14 справка(одз $\ldots$))" \ и нажать
 "Enter". После нажатия запускается решение задачи до прерывания
 по достижении выделенного оператора.

 \item Войти в прерывание при обращении к программе
 "заменавхождения" \ и нажать "PageUp" \ для просмотра внешней
 программы приема. Найти в ней (например, с помощью многоцветной указки)
 оператор вида "равно(х$i$ видумножение($\ldots$))" \ - в нашем
 случае $i=11$. Затем посмотреть значение переменной х11.

 \item Войти в прерывание при обращении к программе
 "заменавхождения". В правом верхнем углу экрана имеется текст
 "шаг № $N$", где $N$ - номер текущего шага интерпретатора ЛОСа,
 отсчитываемый с момента запуска задачи. Запомнить этот номер,
 нажать "Esc" \ для обрыва трассировки. Затем вернуться в просмотр
 задачи и нажать клавишу "Ш", после чего набрать номер $N$ и
 нажать "Enter". После нажатия "Enter" \ устанавливается
 прерывание по достижении шага с нужным номером и запускается
 решение задачи. Заметим, что выход в отлад\-чик здесь может произойти
 не в программе "заменавхождения", а непосред\-ствен\-но перед
 обращением к ней.

 \item Подготовить к последующей трассировке оглавление базы
 приемов, как указано в упражнении (выбрать его концевой пункт
 и нажать "End"). Без такой под\-го\-товки выполнение всех
 требований упражнения будет невозможным, так как выполнение
 программы будет происходить без выхода в нужную точку.
 После входа в просмотр корневого фрагмента программы
 "оглавление" \ нажать кла\-ви\-шу "р" \ и поместить курсор перед
 оператором "повторение". Нажать "Insert" \ и набрать оператор
 "трассировка(стоп 0)". Затем снова нажать "Insert" \ (выход из
 режима вставки) и нажать "Enter". Эти действия следует выполнять
 чрезвычайно осторожно, так как ошибка в редактировании и нажатие
 "Enter" \ могут привести к порче программы "оглавление" \
 (например, к удалению каких-либо ее ветвей), после чего нужно
 будет восстанавливать программу логической системы из резервной
 директории "SLCOPY". По завершении редактирования нужно вернуться
 в главное меню (например, через "Esc") и нажать клавишу "г". Это
 приведет к входу в программу "оглавление" \ и немедленной
 остановке по достижении введенной контрольной точки
 "трассировка(стоп 0)". Здесь вой\-ти в пооператорную трасировку
 (клавиша "2") и, нажимая "Enter", дойти до выполнения оператора
 "файл(терм х10 х12)". Длительность трассировки будет зависеть от того,
 сколь длинным является путь до концевого пункта оглавления базы приемов
 от корневого меню. Посмотреть значение переменной х12 лучше с
 помощью процедуры сквозного просмотра (К12; К - кир.). Значением
 этой переменной служит содержимое логического терминала текущего
 концевого пункта оглавления базы приемов. Выйдя из трассировки
 ("Esc"), вернуться в редактирование программы символа
 "оглавление" \ и удалить оператор "трас\-си\-ровка(стоп 0)". Это
 можно делать либо с помощью "Delete" \ (сначала нажатие "Delete"
 \ на первой букве слова "трассировка", затем - на букве,
 расположенной после удаляемой закрывающей скобки), либо с помощью
 клавиши "пробел", используемой как ластик. Данную операцию
 следует выполнять исключительно осторожно, чтобы не удалить
 других операторов (в особенности операторов перехода). Если, все
 же, были искажены или удалены какие - то нужные опе\-ра\-то\-ры,
 следует нажать "Esc" \ для отмены редактирования, затем войти в
 ре\-дак\-ти\-ро\-вание повторно. Удаление контрольной точки
 "трассировка(стоп 0)" \ из программы лучше выполнить не
 откладывая, так как эта контрольная точка блокирует использование
 каких-либо оглавлений логической системы.

 \item Для выхода из технической трассировки в семантическую
 нажать клавишу пробела и затем "Enter". Можно также, не выходя из
 режима технической трассировки, посмотреть текущую цепь задач на
 уровне обычной математи\-чес\-кой записи, нажав клавишу "з" \ и
 используя далее обычные возможности прокрутки (курсоры
 вверх-вниз; PageUp; PageDown; Ctr-курсоры вверх-вниз). Для
 возвращения в просмотр ситуации через отладчик ЛОСа нажимается
 "ф".

 \item Войдя в просмотр задачи, нажать клавишу "р" \ (кир.). После
 появления на экране сообщения о преобразовании задачи нажать
 клавишу "ф". Оператор "заменавхождения" \ расположен в конце
 программы приема. Чтоюы посмотреть текущую точку внутри программы
 этого оператора (не завершенной на момент прерывания), нажать
 "PageDown".

\item Войдя в просмотр указанной задачи, нажать "р", и далее
нажимать "Enter" \ до появления требуемого кадра. Затем нажать
"ф". Для просмотра списка комментариев к текущей задаче х1 можно
либо сразу войти в сквозной просмотр этой задачи (нажатием
"К","1","Enter"), либо сначала посмотреть значение переменной х1
(нажатием "х", "1","Enter") и затем войти в сквозной просмотр
набора комментариев н6 (нажатием "к", "6", "Enter"). В наборе
комментариев сначала идут комментарии к отдельным условиям, а в
конце расположен список общих комментариев к задаче. Найти этот
список (выделить его при помощи "курсор вниз"), и нажать "курсор
вправо". Далее найти комментарий "норм\-ло\-гарифм т"; выделить
его и снова нажать "курсор вправо" \ для просмотра терма "т".

Чтобы устанавливать прерывание на момент изменения разряда набора
(только с помощью оператора "изменение($\ldots$)"; изменения с
помощью специальных операторов списков задачи - посылок, условий,
комментариев, весов, - этой установкой не контролируются), нужно
сначала вызвать этот набор на экран, чтобы он был обозначен
посредством "н$i$". В нашем случае для этого сначала вызываем для
просмотра х1; затем - н6 (список комментариев); затем - н12
(последний элемент списка комментариев - список общих комментариев
к зада\-че); затем - н13 (для проверки того, что это и есть
искомый комментарий "сопровождение $A$"). Далее нужно набрать "и",
"13", "Enter". После этого установка прерывания осуществлена, и
для запуска решения нажимается "Enter". Заметим, что в случае,
когда изменяемый набор является значением про\-граммной переменной
х$i$, можно установить аналогичное прерывание нажатием "И", "$i$",
"Enter".

 \end{enumerate}



 \chapter{Язык для записи приемов ГЕНОЛ\'{O}Г}

 В первых версиях решателя задач все приемы были реализованы на
 языке ЛОС. Анализ этих приемов позволил прийти к выводу, что в
 подавляющем большинстве случаев программа приема основана на
 применении какой-либо одной теоремы пред\-мет\-ной области. Чтобы
 ускорить программирование приемов и сделать программы их достаточно
 наглядными (последнее особенно важно для возможностей быстрой
 коррекции логики принятия решений в процессе обучения), в этой
 ситуации ест\-ест\-вен\-но было разработать язык, в котором прием
 представляется как теорема пред\-мет\-ной области, снабженная
 некоторой алгоритмизирующей разметкой. Таким обра\-зом и возник
 язык, получивший название ГЕНОЛ\'ОГа (ГЕНетический язык
 ЛОГичес\-ко\-го программирования). Алгоритмизирующая разметка теоремы
 здесь играет роль "генотипа" \ приема, из которого компилятор
 создает собственно программу на ЛОСе, реализующую прием.

 Развитие ГЕНОЛОГа означает, фактически, описание и систематизацию
 раз\-лич\-ных алгоритмических "трюков", применение которых позволяет
 преобразовать те\-о\-ре\-му в эффективную программу. Это предполагает
 рассмотрение все новых и новых предметных областей, которые, как
 показывает опыт развития решателей, постоянно вносят новые
 элементы в копилку "алгоритмизаторов" \ и логических режимов,
 ис\-поль\-зу\-е\-мых при решении задач. По этой причине, освоение новой
 предметной об\-лас\-ти, как правило, требует (в основном небольших)
 добавлений к реализованной на ЛОСе программе компилятора для
 ГЕНОЛОГа. Впрочем, эта работа по своей трудоемкости оказывается
 несопоставима с последующей экономией, достигаемой при
 ис\-поль\-зо\-ва\-нии ГЕНОЛОГа - собственно программирование приемов и
 анализ их устройства при коррекциях ускоряется по сравнению с
 ЛОСом на порядок. Следует также добавить, что поток новых
 элементов языка, после проработки значительного обучающего
 материала, явно идет на убыль.

 Помимо соображений экономии трудоемкости программирования и
 придания опи\-са\-ни\-ям приемов возможно большей наглядности, ГЕНОЛОГ
 открывает возмож\-ность автоматизации синтеза новых приемов, так
 как играет роль "связующего звена" \ между логическим языком, на
 котором происходит накопление новых знаний в пред\-мет\-ной области,
 и алгоритмическим языком, заставляющим работать эти знания при
 решении задач.

 В настоящее время подавляющее большинство приемов решателя
 реализованы на ГЕНОЛОГе. Он обеспечивает быстрое преобразование
 логических описаний пред\-мет\-ной области (теорем) в описания для
 логических структур данных, каковыми являются ЛОС - программы.
 Однако, остается небольшая часть приемов, основан\-ных на
 утверждениях, которые уже относятся к структурам данных
 (в основном это приемы "общелогического" \ типа), и для
 них надобность в специальном переходнике от предметного к
 структурному уровню отсутствует. Эти приемы реализованы
 не\-по\-сред\-ст\-вен\-но на ЛОСе. Впрочем, часть реализованных пока на ЛОСе
 приемов имеют в себе невырожденную компоненту знаний в конкретных
 предметных областях и, при некотором развитии ГЕНОЛОГа, могли бы
 также быть переведены на него.

 \section{Основные компоненты описания прие\-ма на язы\-ке ГЕ\-НОЛ\'{О}Г}

 Описание приема на ГЕНОЛОГе состоит из следующих компонент:

 \begin{enumerate}

 \item Теорема предметной области, на которой основан прием. Эта
 теорема вводит\-ся при помощи формульного либо текстового
 редактора, в стандартной ма\-те\-ма\-ти\-чес\-кой либо скобочной записи.
 Для большей наглядности предусмотрено сопровождение теорем с
 геометрическими объектами чертежом; компилятор этот чертеж никак
 не использует.

 Заметим, что хотя ГЕНОЛОГ и приближен к логическому языку
 предметной области, все же он представляет собой язык
 программирования. Настоящие теоремы предметной области содержатся
 в базе теорем. В теореме приема же допустимы (как правило,
 небольшие) отклонения от логических стандартов предметного
 уровня. Эта теорема обычно преобразуется к виду, более удобному для
 практического использования - например, в посылках могут вводиться
 вспомогательные обозначения для объектов, упоминаемых в
 утверждении те\-о\-ре\-мы; часть посылок, которые в обычных "разумных"
 \ контекстах автомати\-чес\-ки бывают выполнены, отбрасывается, и
 т.п. В особых случаях теорема при\-е\-ма вообще может представлять
 собой техническую заглушку - "псевдотеорему".

 \item Заголовок приема. Он указывает на общую схему использования
 теоремы в приеме.

 \item Список фильтров приема. Элементы этого списка суть
 сформулированные с помощью несколько модифицированного логического языка
 условия на це\-ле\-со\-об\-раз\-ность применения приема в текущем
 контексте. Это - второй логический уровень описания приема;
 первым уровнем является сама теорема, также за\-да\-ва\-е\-мая на
 логическом языке. Однако, в случае теоремы логический язык
 используется для описания ситуаций на предметном уровне, а в
 случае фильт\-ров - для описания ситуаций на структурном уровне.
 В этом он близок ЛОСу и может рассматриваться (с рядом
 существенных оговорок) как "ЛОС в тео\-рем\-ных переменных". В
 действительности многие операторы ЛОСа имеют своих одноименных
 двойников в языке фильтров приемов, хотя эти двойники
 ис\-поль\-зу\-ют\-ся уже по-другому - у них часто отбрасываются однозначно
 вос\-ста\-нав\-ли\-ва\-е\-мые из контекста описания приема операнды. Кроме
 того, в языке фильтров приема возникают конструкции, совершенно
 не имеющие аналогов в ЛОСе.

 \item Список указателей компилятору (далее называем их просто
 указателями прие\-ма). Элементы этого списка уточняют способ
 формирования ЛОС-програм\-мы приема компилятором ГЕНОЛОГа. По
 существу, это основная часть "геноти\-па" \ приема. Здесь
 уточняются: средства, используемые для усмотрения в задаче
 "замаскированных" \ возможностей применения теоремы; способы
 обработки от\-дельных посылок теоремы; технические комментарии,
 вводимые в задачу либо удаляемые при применении приема; логика
 переключения внимания после при\-ме\-не\-ния приема, и др.

 \item Список нормализаторов. При формировании результирующих
 (включаемых в структуру данных задачи) либо вспомогательных
 (рассматриваемых в процессе работы приема) термов могут
 применяться процедуры для их упрощения либо каких-либо иных
 специальных преобразований. Такие процедуры задаются
 по\-сле\-до\-вательным применением нормализаторов - либо специальных
 пакетов при\-е\-мов для тождественных и эквивалентных преобразований,
 либо вспомога\-тель\-ных задач. Использование небольшого пакета
 приемов вместо общей базы при\-е\-мов, активизируемой при
 сканировании задачи, во многих случаях на порядок ускоряет
 вычисления. Эти "локальные" \ приемы отличаются от приемов
 ска\-ни\-ро\-вания задачи - они применяются не в контексте задачи, а в
 некотором другом специальном контексте, состоящем из преобразуемого
 терма, списка посылок, в предположении истинности которых ведутся
 преобразования, и списка тех\-ни\-чес\-ких комментариев. Задаются они,
 как и приемы сканирования задач, на ГЕНОЛОГе.

 Специальный интерфейс позволяет достаточно быстро вводить
 обращения к нормализаторам путем указания в теореме (либо в
 сопровождающих теорему термах описания приема) подлежащих
 нормализации точек. В результате ис\-поль\-зо\-ва\-ния нормализаторов
 и вспомогательных процедур обработки посылок теоремы, срабатывание
 приема оказывается иногда чрезвычайно сложным вы\-чис\-ли\-тель\-ным
 процессом, основанным не на единственной теореме предметной
 области, а на десятках и даже сотнях (с учетом прменяемой
 рекурсии) раз\-лич\-ных теорем.

 \item Шаблоны сопровождения. Здесь хранятся текст-формульные
шаблоны, ис\-поль\-зу\-е\-мые при создании текстов, объясняющих
срабатывания приемов. Способ их применения регламентируется
специальными указателями приема.

 \end{enumerate}

 Для примера описания приема по данной схеме, рассмотрим простейший
 прием решения уравнения $ax=b$.

 Теорема приема имеет в этом случае вид:

 \par\medskip

 $\forall abx( \mbox{число}(a)\ \& \ \mbox{число}(b) \ \& \
 \mbox{число}(x) \Rightarrow (ax = b \Leftrightarrow (\neg (a = 0)\ \&
 \ x = b/a) \vee (a = 0 \ \& \ b = 0)))$

 \par\medskip

 Заголовком приема служит логический символ "второйтерм",
 указывающий, что теорема будет применяться для эквивалентной
 замены слева направо.

 \par\medskip

 Фильтры приема указывают следующий контекст, в котором
 выполняется замена:

 а) Тип решаемой задачи - на описание;

 б) Преобразуемое равенство входит в условие задачи, причем это
 вхождение - корневое;

 в) Текущий уровень сканирования, при котором происходит
 срабатывание приема, равен 1;

 г) Выражение $b$ не содержит неизвестных задачи, а $x$ -
 содержит.

 \par\medskip

 Указания компилятору уточняют следующие подробности:

 а) Переменная $x$ идентифицируется как совокупность всех
 множителей рас\-смат\-ри\-ва\-е\-мо\-го произведения, содержащих неизвестные
 задачи (это автоматически пред\-о\-пре\-де\-ля\-ет, что переменная $a$ будет
 идентифицирована с выражением без неизвест\-ных);

 б) При идентификации выражения $ax$ возможен учет стоящего перед
 ним знака "минус", который относится программой приема к коэффициенту
 $a$;

 в) Посылки теоремы проверяются при помощи специального пакета
 приемов, обеспечивающего быстрое усмотрение условий вида
 "число($\ldots$)".

 \par\medskip

 В приеме используются следующие обращения к нормализаторам:

 а) Предпринимаются обращения к вспомогательному пакету приемов
 для раз\-ло\-же\-ния на множители выражений $a,b$. Если такие разложения
 не находятся сразу же, до преобразования рассматриваемого
 уравнения, то впоследствии может возникнуть разбор случаев,
 приводящий к дублирующим попыткам разложения на множители в
 различных подслучаях;

 б) Выполняется обращение к пакету стандартизации дробных
 выражений для выражения $b/a$. Этот пакет состоит из
 нескольких десятков простых продукций, выполняющих, в частности,
 сокращение дробей, деление и умножение дробных вы\-ра\-жений, учет
 констант 0 и 1, и т.п.;

 в) Для уравнений $a = 0, b = 0$ выполняются обращения к пакетам
 приемов, стандартизирующим уравнения данного вида (сокращение левой
 части на множи\-те\-ли, не обращающиеся в 0; усмотрение тождественной
 ложности; преобразова\-ние равенства нулю произведения в дизъюнкцию
 равенств нулю сомножителей, и т.п.);

 г) К заменяющей дизъюнкции применяется пакет общелогических
 приемов (ус\-тра\-не\-ние логических констант "истина" \ и "ложь";
 стандартизация конструкций с логическими связками и кванторами).

 В результате выполнения указанных преобразований заменяющий терм
 в данном приеме приобретает достаточно устойчивый вид, не
 вызывающий немедленного сра\-ба\-ты\-ва\-ния цепочки простейших
 нормализующих приемов. Заметим, что трудоем\-кость одного цикла
 сканирования задачи обычно возрастает пропорционально сум\-мар\-ной длине
 находящихся в активной области ее термов, а всего времени решения
 задачи - пропорционально квадрату средней такой длины. Поэтому
 вынесение во вспомогательные задачи преобразований подтермов
 сложного выражения приводит, если эти преобразования достаточно
 интенсивны, к значительному ускорению ре\-ше\-ния задачи.
 Соответственно, стандартом программирования на ГЕНОЛОГе является
 как можно большее использование нормализаторов.

 \section{Типы заголовков приемов}

 Перечислим в этом разделе типы заголовков приемов, используемые в
 ГЕНОЛО\-Ге.

 \subsection{Приемы, осуществляющие тождественную ли\-бо
 экви\-ва\-лен\-т\-ную замену}

 \begin{enumerate}

 \item Замена подтерма с помощью тождества либо эквивалентности. Если
 теорема приема имеет вид $\forall x (A \rightarrow B=C)$ либо
 вид $\forall x (A \rightarrow (B \leftrightarrow C))$, то
 заголовок приема, использующего эту теорему для замены слева
 направо ($B$ на $C$) есть "второйтерм"; заголовок для замены
 справа налево - "первыйтерм". Название заголовка приема здесь
 указывает на номер заменяющего опе\-ран\-да в равенстве либо
 эквивалентности. Заметим, что приемы с указанными двумя
 заголовками (а также приемы вывода в посылках) - наиболее часто
 встре\-ча\-ю\-щи\-е\-ся в базе приемов. Пример приема
 эквивалентной замены был приведен в предыдущем подразделе.

 \item Замена группы условий задачи на описание при помощи
 эквивалентности. Если теорема приема имеет вид
 $\forall x(A \rightarrow ((B_1 \ \& \ \ldots \ \& \
 B_n)\leftrightarrow C))$, где $n \ge 1$, то на ней может быть
 основан прием, идентифицирующий группу условий задачи на описание
 с утверждениями $B_1, \ldots, B_n$, и заменяющий их на
 утверждение $C$ (если оно само является конъюнкцией, то прием не
 разбивает ее на атомарные подутверждения - это выполняет после
 его применения другой прием). За\-го\-ло\-вок приема имеет вид
 "заменаусловия(второйтерм)", если замена выполняется слева
 направо; если же части приведенной выше эквивалентности поменять
 местами и замена будет выполняться справа налево, то заголовок
 приема будет иметь вид "заменаусловия(первыйтерм)".
 Заметим, что рассматриваемая эк\-ви\-ва\-лент\-ность может одновременно
 порождать и другой прием ГЕНОЛОГа - для эквивалентной замены
 конъюнкции $B_1 \ \& \ \ldots \ \& \ B_n$, встречающейся внутри
 некоторого одного терма задачи. Здесь уже будет использован
 заголовок "вто\-рой\-терм" \ (соответственно, "первыйтерм").
 Пример приема замены группы ус\-ло\-вий - использование теоремы
 $\forall xAB(x \in A \ \& \ x \in B \leftrightarrow x \in (A \cap
 B))$ для группировки условий на неизвестную $x$ при известных
 множествах $A,B$.

 \item Замена группы посылок задачи при помощи эквивалентности.
 На теореме ука\-зан\-но\-го выше вида  $\forall x(A \rightarrow ((B_1 \ \& \ \ldots \ \& \
 B_n)\leftrightarrow C))$, где $n \ge 1$, может быть основан также
 прием, идентифицирующий группу посылок задачи с ут\-вер\-жде\-ни\-я\-ми
 $B_1, \ldots, B_n$, и заменяющий их на утверждение $C$. Заголовок
 этого приема - "заменатермов(второйтерм)" \ в случае замены слева
 направо либо "заменатермов(первыйтерм)" \ в случае замены справа
 налево (в последнем слу\-чае части указанной выше эквивалентности
 переставлены). Пример приема замены группы посылок -
 использование теоремы $\forall x(\mbox{число}(x) \rightarrow
 0 \le x \ \& \ \neg (x = 0)\leftrightarrow 0 < x)$ для
 объединения нестрогого неравенства и отрицания равенства нулю в
 строгое неравенство.

 \item Исключение несущественных неизвестных задачи на описание.
 Если теорема приема имеет вид $\forall x(A \rightarrow (\exists
 y(B) \leftrightarrow C))$, то на ней может быть основан прием,
 идентифицирующий конъюнктивные члены утверждения $B$ со всеми
 условиями $U_1, \ldots, U_m$ задачи на описание, содержащими
 неизвестные списка $y$. Если все эти неизвестные - несущественные
 (т.е. достаточно установить су\-щес\-тво\-ва\-ние их значений, не включая
 информацию об этих значениях в ответ задачи; такие неизвестные
 $z_1, \ldots, z_k$ определяются целью "параметры $z_1 \ldots
 z_k$"), то теорема позволяет заменить $U_1, \ldots, U_m$ на $C$ и
 устранить неизвестные $y$ из списка неизвестных. Прием,
 выполняющий такое преобразование, имеет за\-го\-ло\-вок "связка".
 Пример приема исключения несущественных неизвестных -
 использование теоремы $\forall abc(\exists c(a < c \ \& \ c < b \
 \& \ \mbox{число}(c))\leftrightarrow a < b)$ для исключения
 несущественной неизвестной $c$, ограничения на которую сводятся к
 указанию числового типа значений и интервала значений.

 \item Лексикографическое упорядочение операндов коммутативных
 операций и пре\-ди\-ка\-тов. Если некоторая операция (предикат) $A$ не
 изменяет своего значения при любой перестановке операндов, то с
 ней связан прием, обеспечивающий лексикографическое упорядочение
 операндов. При выдаче терма на экран обыч\-но происходит некоторое
 стандартное переупорядочение операндов для про\-ри\-сов\-ки формул в их
 привычном виде, однако во внутреннем представлении для коммутативных
 логических символов постоянно применяется именно лек\-си\-ко\-гра\-фи\-чес\-кое
 упорядочение. Заголовок приема, выполняющего такое упо\-ря\-до\-че\-ние,
 - логический символ "лексупорядочение". Теорема приема в этом случае
  имеет вид "коммутативно($A$)" \ (например, "коммутативно(умножение)").

  \item Циклическая перестановка операндов для размещения на первом
  месте первого в лексикографическом порядке операнда (для теоремы
  "циклупорядочение($A$)"). Если операция $A$ не изменяет своего
  значения при произвольных циклических перестановках операндов,
  то используется прием, переносящий на первое место первый в
  лексикографическом порядке операнд. Заголовок приема -
  "цикл\-упо\-ря\-до\-че\-ние"; теорема его - "циклупорядочение($A$)".

  \item Устранение вложенных одинаковых ассоциативно - коммутативных
  операций. Для устранения вложенных одинаковых ассоциативно -
  коммутативных опе\-ра\-ций $A$: $A(\ldots A(\ldots)\ldots)
  = A(\ldots \ldots \ldots)$ - служит прием, имеющий заголовок
  "спускоперандов". Теорема этого приема имеет вид "коммутативно($A$)".

  \item Лексикографическое упорядочение элементов набора,
  расположенного под од\-но\-мест\-ной операцией. Иногда многоместная
  операция с переменным числом операндов представляется в виде
  одноместной операции над набором, пред\-став\-лен\-ным термом вида
  "набор($A_1 \ldots A_n$)". В тех случаях, когда значение этой
  операции не зависит от порядка элементов набора, используется
  прием, выполняющий лексикографическое упорядочение операндов
  $A_1, \ldots, A_n$. За\-го\-ло\-вок этого приема - "стандупорядочение($A$)";
  теорема его - "список($A$)".

 \end{enumerate}

 \subsection{Приемы для вывода следствий}

 \begin{enumerate}

 \item Вывод следствий в посылках задачи. Теорема вида $\forall
 x_1 \ldots x_n(A_1 \ \& \ \ldots \ \& \ A_m \rightarrow A_0)$
 может быть использована для вывода следствий в посылках задачи.
 Часть утверждений $A_1, \ldots, A_m$ при этом идентифицируется с
 посылками; остальные утверждения этого списка - проверяются с
 помощью вспомогательных процедур либо служат для ввода
 вспомогательных обозначений. В список посылок за\-но\-сит\-ся
 утверждение $A_0$. Заметим, что иногда список непосредственно
 иден\-ти\-фи\-ци\-ру\-е\-мых с посылками утверждений $A_i$ может быть и
 пустым: по\-пыт\-ка применения приема может начинаться с усмотрения
 встречающегося где-либо в задаче (в том числе и в условиях) терма
 специального вида, и далее выполняются лишь проверки истинности
 необходимых $A_i$ с помощью вспо\-мо\-га\-тель\-ных процедур. Такие
 режимы применения приема уточняются спе\-ци\-аль\-ны\-ми его указателями.
 Заголовок приема, обеспечивающего вывод в посылках задачи -
 "вывод". Пример приема вывода в посылках - использование теоремы
 $\forall ABC(B \in \mbox{прямая}(AC) \ \& \ l(AB)=l(BC) \ \& \
 \mbox{разныеточки}(A,C)\rightarrow B \in \mbox{отрезок}\\ (AC))$ для
 усмотрения принадлежности отрезку точки, равноудаленной от его
 концов и лежащей на той же прямой, что и эти концы.

 \item Вывод следствий в условиях задачи на описание. Теорема
 указанного выше вида $\forall x_1 \ldots x_n(A_1 \ \& \ \ldots
 \ \& \ A_m \rightarrow A_0)$ может быть использована не только
 для вывода следствий в посылках, но для вывода следствий в
 условиях задачи на описание. Вывод такого рода используется
 достаточно редко, так как за\-гро\-мож\-де\-ние списка условий задачи
 следствиями исходных условий нежелательно - усложняется
 последующая проверка найденных значений. Как правило, сов\-мест\-ные
 следствия условий и посылок извлекаются в блоке анализа задачи на
 описание - специально предназначенной для этого вспомогательной
 задаче на исследование. Часть утверждений $A_1, \ldots, A_m$
 (возможно, пустая) иден\-ти\-фи\-ци\-ру\-ет\-ся с посылками либо условиями;
 остальные утверждения этого списка - проверяются с помощью
 вспомогательных процедур либо служат для ввода вспомогательных
 обозначений. В список условий заносится утверждение $A_0$.
 Заголовок приема, обеспечивающего вывод в условиях задачи на
 описание - "выводусловия". Большей частью, вывод в условиях
 задачи на описание ис\-поль\-зу\-ет\-ся либо для регистрации дизъюнкции,
 по которой будет выполняться разбор случаев, либо для регистрации
 утверждений, подготавливающих такой разбор случаев (например,
 утверждений о принадлежности значения це\-ло\-чис\-лен\-ной неизвестной
 некоторому конечному промежутку). Пример приема вы\-во\-да в условиях
 задачи на описание - использование теоремы $\forall xn(x < n \ \&
 \ $ на\-ту\-раль\-ное($x$)$\rightarrow \exists m(m \in \{1, \ldots,
 n-1 \} \ \& \ x = m))$ для занесения в условия задачи утверждения
 $(m = 1 \vee \ldots \vee m = n-1) \ \& \ x = m$, позволяющего найти
 неизвестное значение $x$ путем разбора случаев.

 \end{enumerate}

 \subsection{Обратный вывод для условий задачи}

 \begin{enumerate}

 \item Использование кванторной импликации для обратного вывода
 условия задачи на описание. Теорема вида $\forall x(A_1 \ \& \
 \ldots \ \& \ A_n \rightarrow A_0)$ - утверждения такого вида
 называем кванторными импликациями - может быть использована для
 попытки замены условия задачи на описание, идентифицированного с
 $A_0$, на груп\-пу антецедентов $A_i$, выделенных в описании приема
 указателями "под\-бор\-зна\-че\-ний($i$)". Перед попыткой проверяется
 истинность остальных антецеден\-тов. При\-ем, реализующий эти
 действия, имеет заголовок "подборзначений". При\-ме\-не\-ние его
 допустимо лишь в задачах, не требующих получения полного описания
 множества допустимых значений неизвестных. Чаще всего прием
 при\-ме\-ня\-ется для выбора конкретного значения неизвестной, входящей
 в $A_0$, если прочие ограничения на эту неизвестную сводятся
 только к указанию типа зна\-че\-ния. Пример приема - использование
 теоремы $\forall ax(x = \emptyset \rightarrow x \subseteq a)$ для
 вы\-бо\-ра пустого множества в качестве неизвестного подмножества $x$
 некоторого мно\-жес\-тва $a$.

 \item Попытка использования параметрического описания для
 эквивалентного пре\-об\-ра\-зо\-ва\-ния условия задачи на описание. Теорема
 вида $\forall x(A \rightarrow (B(x) \leftrightarrow \exists
 y(F(x,\\ y))))$ может быть использована для замены условия задачи на
 описание, иден\-ти\-фи\-ци\-ро\-ванного с утверждением $B(x)$, на
 параметрическое описание $\exists y(F(x,y))$ (в большинстве
 случаев $F(x,y)$ дает явное выражение $x$ через $y$, но не
 обя\-за\-тель\-но). Такая замена реализована как переход к
 вспомогательной за\-да\-че, условия которой получены из условий
 текущей задачи заменой $B(x)$ на груп\-пу конъюнктивных членов
 утверждения $F(x,y)$ и присоединением новых пе\-ре\-мен\-ных $y$ к
 списку неизвестных. Если вспомогательная задача решена, то на ее
 ответ навешивается квантор существования по $y$ и предпринимается
 ре\-дак\-ти\-ро\-ва\-ние полученного таким образом параметрического
 описания; если же ее решить не удалось, то возобновляется процесс
 решения текущей задачи без применения данной замены. Заголовок
 приема, выполняющего указанные действия - "параметризация".
 Заметим, что хотя теорема приема и имеет вид эквивалентности,
 допустимо применение приема и в случаях, когда эк\-ви\-ва\-лент\-ность не
 имеет места - если в задаче не требуется получить полный ответ
 (например, есть цель "пример"), то достаточно лишь, чтобы имела
 место имп\-ли\-ка\-ция в направлении справа налево. Формально, для
 простоты ком\-пи\-ля\-ции, и в этом случае теорема приема записывается
 в виде эквивалентности. При\-мер приема - использование теоремы
 $\forall ab(a \subseteq b \leftrightarrow \exists
 c(\mbox{set}(c)\ \& \ b = a \cup c))$ для представления неизвестного
 надмножества $b$ множества $a$ виде объединения $a$ с некоторым
 вспомогательным множеством $c$, которое далее будет рас\-смат\-ри\-вать\-ся
 как новая неизвестная; прием применяется, если нужно лишь подобрать
 какой-либо пример для $b$.

 \item Попытка решить задачу на доказательство путем идентификации
 ее условия с консеквентом кванторной импликации, а посылок - с
 антецедентами этой импликации. Если теорема имеет вид $\forall
 x(A \rightarrow \forall y(B_1 \ \& \ \ldots \ \& \ B_n
 \rightarrow B_0))$, то ее можно использовать для решения задачи
 на доказательство, условие которой идентифицируется с $B_0$, а
 утверждения $B_1, \ldots, B_n$ - со всеми посылками, со\-дер\-жа\-щи\-ми
 переменные списка $y$. При установлении истинности конъюнктивных
 членов утверждения $A$ (без использования посылок, содержащих
 переменные списка $y$) с помощью средств, уточняемых в указателях
 приема (решение вспо\-мо\-га\-тель\-ных задач на доказательство,
 проверочных пакетных операторов и т.п.) выдается ответ "истина".
 Прием имеет заголовок "свертка". В решателе приемы такого типа
 используются для доказательств по индукции. Пример -
 использование теоремы $\forall mg(\mbox{натуральное}(m) \ \& \
 g(m) \ \& \ \forall n(\mbox{натуральное}(n) \ \& \\ g(n) \ \& \ 0
 \le n-m \rightarrow g(n+1)) \rightarrow \forall
 n(\mbox{натуральное}(n) \ \& \ 0 \le n-m \rightarrow g(n)))$ для
 доказательства утверждения $g(n)$ при всех натуральных $n$, не
 меньших $m$, индукцией по $n$.

 \end{enumerate}

 \subsection{Приемы для усмотрения ответа задачи}

 \begin{enumerate}

 \item Усмотрение явного описания для значения неизвестной. Для
 задания вида яв\-но\-го описания значений неизвестной $x$
 используется псевдотеорема "явное($x$ набор($f_1 \ldots f_n$)
 набор($g_1 \ldots g_m$) набор($h_1 \ldots h_k$))". Здесь $f_1,
 \ldots, f_n$ - все не более чем однократно встречающиеся в явном
 описании утверждения; $g_1, \ldots, g_m$ - все утверждения,
 которые могут встречаться в явном описании несколько раз. Каждая
 отличная от $x$ переменная может встречаться в наборе $f_1,
 \ldots, f_m, g_1,\\ \ldots, g_m$ лишь однократно; при неоднократном
 использовании некоторого $g_i$ та\-кие переменные переобозначаются
 в $g_i$ на новые переменные. $h_1, \ldots, h_k$ - условия на
 отличные от $x$ переменные явного описания, при которых оно
 непроти\-во\-ре\-чи\-во (набор этих условий, по возможности более полный,
 тем не менее не обязан гарантировать непустоту множества
 удовлетворяющих явному описанию зна\-че\-ний $x$). Возможны случаи
 $n=0; m=0; k=0$ - тогда вместо терма "набор($\ldots $)" \
 используется логический символ "пустоеслово".

 Псевдотеорема набирается при помощи текстового редактора. На ней
 основана группа приемов, соответствующих идентификации,
 начинающейся с усмотрения различных утверждений списка $f_1,
 \ldots, f_n, g_1, \ldots, g_m$. Заголовки этих приемов имеют,
 соответственно, вид "ответ($f_1$)", $\ldots$, "ответ($f_n$)",
 "ответ($g_1$)", $\ldots$, "от\-вет($g_m$)". Для удобства ввода
 таких приемов рекомендуется, набрав текст псев\-до\-теоремы и введя
 логический символ, за которым закрепляется прием, далее нажать
 Esc и "а" \ (кир.). Тогда включается цикл автоматической
 генерации указанной серии приемов - для регистрации очередного
 приема следует на\-жи\-мать F3, и далее - снова "а", пока новые
 приемы не иссякнут.

 Указанное выше дублирование точек активизации приема позволяет
 выявлять ответ задачи сразу же, как только он появляется - в
 противном случае точка привязки могла бы находиться в одном из
 условий задачи, имеющем большой вес и таким образом находящемся
 вне поля зрения решателя, в то время как только что измененное
 условие (веса 0), после преобразования которого воз\-ник\-ла
 требуемая форма ответа - не анализировалось бы с точки зрения
 усмотрения ответа.

 Прием срабатывает при текущем уровне сканирования, равном 1;
 сопро\-вож\-де\-ние его фильтрами не предусмотрено (компилятор
 игнорирует указание филь\-тров).

 Пример приема - использование псевдотеоремы "явное(х1
 набор(число(х1)мень\-шеилиравно(х1 х2)меньшеилиравно(х3
 х1))набор(не(равно(х1 х4)))пустоесло\-во)" \ для усмотрения явного
 описания значений числовой неизвестной х1 в виде одного, двух
 (либо нуля) нестрогих неравенств, ограничивающих ее про\-ме\-жу\-ток
 изменения, быть может, сопровождаемых указанием конечного числа
 отбрасываемых точек.

 \item Выдача ответа задачи на описание с учетом контекста. Хотя
 приемы выдачи ответа задачи на описание при усмотрении явного
 описания значений ее не\-из\-вест\-ной являются наиболее
 употребительными, они обладают одним не\-до\-стат\-ком - применение их
 не может быть ограничено с учетом целевой установки задачи.
 Поэтому введена другая форма усмотрения и выдачи ответа задачи на
 описание. В этом случае теорема приема имеет вид $A_1 \ \& \
 \ldots \ \& \ A_n$ - эта конъюнкция определяет вид списка условий
 задачи, при котором следует вы\-да\-вать ответ. Специальные указатели
 приема ("смответ", "серия") уточняют, в котором из утверждений
 $A_i$ выбирается точка привязки - с рассмотрения ее будет начата
 попытка применения приема, а также выделяют те $A_i$, которые
 могут идентифицироваться с несколькими условиями задачи. Прием
 имеет за\-го\-ло\-вок "ответзадачи". В отличе от приема "ответ", он
 допускает обычное использование фильтров для уточнения контекста
 срабатывания. Пример при\-е\-ма - использование описания
 $\mbox{число}(x) \ \& \ a \le x \ \& \ x \le b \ \& \ f(x) \le y
 \ \& \ y \le g(x) \ \& \ \mbox{число}(y)$ вида ответа при решении
 системы неравенств с двумя не\-из\-вест\-ны\-ми $x,y$. Фильтры приема
 уточняют, что выражения $a,b$ не содержат неизвестных, а
 выражения $f(x),g(x)$ - не содержат неизвестной $y$.

 \end{enumerate}

 \subsection{Перенесение во внешнюю задачу на описание
 ут\-вер\-ж\-де\-ний из бло\-ка ана\-ли\-за}

 В процессе вывода совместных следствий из условий и посылок
 задачи на описание (такой вывод реализуется во вспомогательной
 задаче на исследование, называемой блоком анализа данной задачи
 на описание) может сложиться необходимость пе\-ре\-да\-чи некоторых
 ценных следствий во внешнюю задачу на описание. Это выполняется
 приемом с заголовком "замещениеусловий"; псевдотеорема приема
 имеет вид "за\-ме\-ще\-ни\-еус\-ловий($A$)", где $A$ - утверждение,
 идентифицируемое с посылкой блока анализа, переносимой во внешнюю
 задачу на описание. При перенесении указанного утверждения
 предпринимается попытка исключить возможно большее число условий
 задачи на описание, если они становятся следствиями $A$ и
 некоторых (дополнительно переносимых) простых утверждений,
 имеющих по отношению к $A$ сопровождающий характер. Специальный
 указатель приема ("обрывзадачи") может сразу же по пе\-ре\-не\-се\-нии
 $A$ прервать сканирование блока анализа и возобновить
 сканирование внеш\-ней задачи на описание.

 Пример приема - использование псевдотеоремы
 "замещениеусловий(эллипс(х1))" \ для передачи в список условий
 внешней задачи на описание, решаемой с целью характеризации типа кривой
 второго порядка х1, найденного типа "эллипс(х1)" \ этой кривой.
 Прием не имеет указателя "обрывзадачи", и после передачи
 указанного утверждения анализ кривой продолжается.

 \subsection{Ввод и удаление комментариев}

 Предусмотрены приемы "управляющего" \ характера, которые не
 вносят каких-либо изменений в логические структуры данных задачи,
 а выполняют ввод, удаление либо изменение ее комментариев.
 Псевдотеорема такого приема имеет вид "длялюбого($x_1 \\ \ldots x_n$
 если $A_1 \ldots A_m$ то контекст($A_0$))", если идентификация
 начинается с ус\-мот\-ре\-ния вхождения терма $A_0$, либо
 "длялюбого($x_1 \ldots x_n$ если $A_1 \ldots A_m$ то
 $\emptyset$)", если идентификация начинается с усмотрения
 некоторой посылки либо условия (в за\-ви\-си\-мос\-ти от указания в
 фильтрах приема) $A_i$. Собственно действия с комментариями
 обеспечиваются указателями приема так же, как это происходит при
 применении невырожденных приемов, изменяющих логические структуры
 данных. Приемы дан\-ного типа имеют заголовок "замечание".
 Примеры использования указателей для определения преобразований
 комментариев задачи будут приведены в разделе, по\-свя\-щен\-ном таким
 указателям.

 \subsection{Пакетные операторы и их приемы}

 Процедура сканирования задачи оказалась чрезвычайно эффективным
 "дис\-пет\-че\-ром", организующим совместные действия по решению задачи
 всего многообразия приемов, накопленных при обучении. По
 существу, это - механизм "внутреннего логического зрения" \
 интеллектуальной системы, позволяющий ей планировать свои
 действия на основе прямого доступа к огромному массиву знаний и
 умений.

 Однако, этот механизм имеет существенный недостаток - полный
 просмотр и осмысление всего "поля задачи" \ оказывается весьма
 трудоемкой процедурой. Как показывает трассировка, основную часть
 времени решатель, сканирующий задачу, затрачивает на обработку
 начальных отрезков фрагментов программ встречаемых им в задаче
 логических символов - то есть в каком-то смысле "впустую". На
 этом фоне какая-либо оптимизация либо замедление вычислений,
 выполняемых фак\-ти\-чес\-ки реализуемыми приемами, оказывается
 практически незаметной - она не влияет на итоговое время решения
 задачи.

 Наоборот, весьма ощутимо сказывается на времени работы решателя
 уменьшение числа циклов сканирования за счет укрупнения процедур,
 выполняемых отдельными приемами. Оптимизация решателя оказалась
 связанной с максимальным уве\-ли\-че\-ни\-ем объема вычислений и
 преобразований, выполняемых приемом вне цикла ска\-ни\-ро\-ва\-ния.
 Поведение его как-бы состоит из циклов "планирования" \ (поиск
 наилучшего приема при сканировании) и реализации найденного
 плана. Чем больше необходимых действий вовлекается в этот план,
 тем меньше будет число сканирований, и тем больше -
 быстродействие решателя.

 Одним из наиболее эффективных средств для "укрупнения" \ приемов
 ска\-ни\-ро\-ва\-ния задачи оказалось использование в них пакетов
 "локальных" \ приемов, при\-ме\-ня\-е\-мых уже не в контексте
 сканирования всей задачи, а для обработки каких-либо выделенных
 подтермов. Такие объединения локальных приемов получили название
 пакетных операторов. Эффективность их применения объясняется малым
 числом используемых приемов и обычно малым по сравнению со всей задачей
 размером обрабатываемых термов. Приемы пакетного оператора
 упорядочены по уровням сра\-ба\-ты\-ва\-ния, и на каждом уровне организованы
 в древовидную процедуру, поз\-во\-ля\-ю\-щую отсекать заведомо не
 реализуемые ситуации. Посимвольного просмотра обрабатываемых
 термов здесь не происходит - поиск приема выполняется одно\-крат\-ным
 прохождением программы пакетного оператора.

 Приемы пакетных операторов (как и приемы сканирования задачи) задаются
 на ГЕНОЛОГе и затем компилируются в программы ЛОСа. В них допускаются
 обращения к другим пакетным операторам и рекурсивные обращения. Возникло
 4 основных типа пакетных операторов, аналогичных 4 основным типам задач
 (на доказательство, описание, преобразование и исследование):

 \begin{enumerate}

 \item Аналогом задачи на доказательство является проверочный
 оператор, по\-лу\-ча\-ю\-щий в качестве входных данных проверяемое
 утверждение (точнее, на\-бор выражений, подставляемых вместо
 переменных в "шаблон", задающий вид та\-ко\-го утверждения); список
 посылок, в предположении истинности которых про\-во\-дит\-ся проверка, а
 также список комментариев управляющего характера. Помимо проверки
 истинности, проверочный оператор также выдает список посылок,
 фактически использованных при проверке. Пример проверочного опе\-ра\-то\-ра
 - оператор "усмменьше", получающий в качестве входных данных:
 вы\-ра\-же\-ния $a,b$, для которых проверяется условие $a<b$; список посылок,
 в пред\-по\-ло\-же\-нии истинности которых происходит проверка; набор
 комментариев (в частности, в нем могут содержаться ограничения на
 применяемые при проверке средства).

 \item Аналогом задачи на описание является пакетный оператор,
 названный син\-те\-за\-то\-ром. Он предназначен для решения задач на
 описание с единственным условием, имеющим строго ограниченный вид,
 определяемый некоторым "шаб\-ло\-ном". Часть переменных шаблона выделена
 как "известные", а часть - как "неизвестные". Синтезатор определяет
 значения неизвестных, получая в ка\-чест\-ве входных данных: набор
 выражений, подставляемых вместо "извест\-ных" \ переменных в шаблон;
 список посылок, в предположении истинности которых предпринимается
 подбор значений неизвестных, и набор комментариев, име\-ю\-щих управляющий
 характер (целевая установка и т.п.). Результатом работы синтезатора
 служат набор искомых значений неизвестных и список фактически
 использованных посылок. В зависимости от своего типа, синтезатор
 либо на\-хо\-дит единственный пример допустимых значений неизвестных,
 либо перечисляет такие примеры. Пример синтезатора - оператор
 "верхняяоценка", реализующий утверждения вида $a \le x$ для
 известной переменной $a$ и неизвестной $x$, который перечисляет
 представляющие интерес (с учетом комментариев) константные верхние
 оценки $x$ выражения $a$.

 \item Аналогом задачи на преобразование является пакетный
 оператор, названный нормализатором. Он получает в качестве
 входных данных преобразуемый терм (выражение либо утверждение),
 список посылок, в предположении истинности которых выполняются
 преобразования, и набор комментариев, имеющих уп\-рав\-ля\-ю\-щий
 характер. Прием нормализатора выполняет некоторое преобразование
 его "условия". Это преобразование (в зависимости от
 предназначения нор\-ма\-ли\-за\-то\-ра) не обязательно должно быть
 тождественным (например, при получении асимптотической оценки
 какого-либо выражения). В отличие от проверочного оператора и
 синтезатора, представляющих собой операторы ЛОСа, нор\-ма\-ли\-за\-тор
 является операторным выражением - его значением служит возникший
 после цепочки преобразований терм. Чтобы определить, какие из
 посылок фак\-ти\-чес\-ки были использованы при его получении, в
 комментариях нормализатора используется информационный элемент
 "выводимо $A$", накапливающий такие посылки в наборе $A$.
 Пример нормализатора - операторное выражение "норм\-дробь",
 осуществляющее общую стандартизацию дробных выражений
 (от\-бра\-сы\-вание знаменателя 1, деление дроби, деление на дробь,
 вынесение минуса из числителя либо знаменателя, и т.п.).

 \item Аналогом задачи на исследование является пакетный оператор,
 названный ана\-ли\-за\-то\-ром.
 Он обрабатывает копию списка посылок текущей задачи $Z$, оформленную
 в виде вспомогательной задачи на исследование $Z'$. Анализатор
 не обращается для сканирования $Z'$ к основной базе приемов, а
 использует свои собственные приемы. Так как их существенно
 меньше, то удается за сравнительно небольшое время получить
 значительное число следствий. Иэ этих следствий отбираются
 лишь ценные для внешней задачи $Z$, которые по окончании работы
 анализатора переносятся в ее список посылок. Отбор выполняется
 приемами анализатора, помечающими нужные посылки комментарием
 "внешвывод". Обращение к анализатору обеспечивается специальными
 приемами, указывающими лимит времени его работы.
 Передача отобранных утверждений происходит по исчерпании этого
 лимита. При получении особо важных следствий возможен немедленный
 обрыв работы. Входными данными обращения к
 анализатору служат: задача $Z$, максимальный уровень используемых
 приемов и целевая установка, передаваемая задаче
 $Z'$. Вспомогательная задача $Z'$ создается самим анализатором.
 Он же реализует передачу отобранных утверждений в задачу $Z$.


 \end{enumerate}

 Кроме указанных выше основных четырех типов пакетных операторов,
 ис\-поль\-зу\-ет\-ся еще один, вспомогательный. В фильтрах нескольких различных
 приемов иногда возникает необходимость применения одного и того
 же условия, представляющего собой конъюнкцию либо дизъюнкцию
 большого (и возрастающего по мере обучения) числа описаний
 частных ситуаций. Здесь становится целесообразным создание
 ре\-али\-зо\-ван\-но\-го на ГЕНОЛОГе пакетного оператора, выполняющего
 проверку этого условия либо определение значений его "выходных"
 \ переменных. Этот оператор, в отличие от перечисленных выше,
 относится к "структурному" \ уровню - он проверяет условие,
 относящееся не к объектам предметной области, а к логическим
 структурам данных, имеющимся в задаче. Хотя, в принципе, для
 задания операторов "струк\-тур\-но\-го" \ уровня мог бы с равным
 успехом использоваться ЛОС (ведь он представ\-ля\-ет собой логический
 язык для формулировки условий на текущую структуру данных), в
 решающих правилах приемов часто возникает необходимость задавать
 вид термов "предметного" \ уровня - и здесь существенное
 упрощение записи создает ГЕНОЛОГ. Пакетный оператор данного,
 пятого, типа, называется оператором фильтра.

 \subsubsection{Прием проверочного оператора}

 Прием проверочного оператора обычно имеет теорему вида $\forall
 x(A_1 \ \& \ \ldots \ \& \ A_n \rightarrow A_0)$. Здесь утверждение
 $A_0$ идентифицируется с проверяемым условием (оно само дол\-жно иметь
 вид, согласованный с шаблоном проверочного оператора). Применение
 при\-ема заключается в проверке (с учетом указателей приема)
 утверждений $A_1, \ldots, A_n$ и выходе из проверочного оператора
 (как из программы на ЛОСе) по значению "истина"; выходной
 переменной оператора при этом присваивается список фак\-ти\-чес\-ки
 использованных при проверке $A_1, \ldots, A_n$ посылок. Заголовок
 приема имеет вид "спуск($B$)", где $B$ - название проверочного
 оператора. Пример приема проверочного оператора - использование
 теоремы $\forall x(\mbox{число}(x) \ \& \ \neg(x = 0) \rightarrow
 \neg(-x = 0))$ для проверки отличия от нуля значения выражения,
 начинающегося со знака "ми\-нус". Заголовок данного проверочного
 оператора - "усмне0"; шаблон проверяемых им ут\-вер\-жде\-ний - $\neg(a
 = 0)$.

 \subsubsection{Прием синтезатора}

 Прием синтезатора имеет теорему вида: $\forall x(A_1 \ \& \ \ldots \ \& \ A_n \rightarrow A_0)$.
 Здесь утверж\-де\-ние $A_0$ идентифицируется с реализуемым условием;
 применение приема заключается в проверке либо реализации (с
 учетом указателей приема) утверждений $A_1, \ldots, A_n$ и выдаче
 найденных значений переменных; дополнительной выходной переменной
 оператора при этом присваивается список фактически использованных
 при ре\-али\-за\-ции посылок. Заголовок приема имеет вид
 "значение($B$)", где $B$ - название син\-те\-за\-то\-ра. Пример приема
 синтезатора - использование теоремы $\forall abc(0<c \ \& \ a \le
 b \ \& \ 0 \le a \rightarrow a^c \le b^c)$ для получения
 верхней оценки степенного выражения $a^c$, у которого показателем
 степени служит положительная константа, а основание степени
 не\-от\-ри\-ца\-тель\-но. Название синтезатора - "верхняяоценка"; значение
 $b$ определяется из антецедента $a \le b$, представляющего собой
 рекурсивное обращение к тому же самому синтезатору. Шаблон
 реализуемых синтезатором утверждений - $x \le y$, где
 пе\-ре\-мен\-ная $x$ - входное (известное) выражение; переменная $y$ -
 выходная (не известная).

 \subsubsection{Прием нормализатора}

 Приемы нормализатора бывают следующих типов:

 \begin{enumerate}

 \item Если теорема представляет собой тождество $\forall x(A
 \rightarrow(B = C))$ либо эк\-ви\-ва\-лент\-ность $\forall x(A
 \rightarrow (B \leftrightarrow C))$, то она может быть
 использована для создания приема нормализатора, выполняющего
 замену слева направо либо справа на\-ле\-во. В первом случае
 заголовок приема имеет вид "замена(второйтерм $N$)"; во втором
 случае - "замена(первыйтерм $N$)". Здесь $N$ - название
 нормализатора. Пример приема такого типа - использование теоремы
 $\forall_{abc}(b / ( c / a) = ab / c)$ в
 нор\-ма\-ли\-за\-то\-ре "нормдробь" \ для исключения делений на дробное
 выражение.

 \item Возможно создание нормализаторов, в которых предусмотрен
 разбор случаев при выполнении преобразований. Обычно потребность
 в таком разборе вы\-яв\-ля\-ется не сразу, а после некоторой цепочки
 преобразований. Разбор случаев инициируется специальным приемом,
 организующим откат к циклу пре\-об\-ра\-зо\-ва\-ний исходного терма в
 различных подслучаях. В рамках рассмотрения отдельного подслучая
 возможна инициализация вложенного разбора случаев - без ограничений
 на глубину вложенности. По завершении рассмотрения всего дерева
 подслучаев формируется объединяющий их терм - с помощью
 логичес\-кой конструкции "вариант($A \ t_1 \ t_2$)"; этот терм и
 выдается как результат при\-ме\-не\-ния нормализатора. Примером
 нормализатора, допускающего указанный разбор случаев, является
 нормализатор вычисления пределов "нормпредел".

 Заметим, что при откатах, вызванных разбором случаев, теряются
 ранее про\-ве\-ден\-ные вычисления. Однако, для нормализаторов, выполняющих
 сколь-нибудь трудоемкие вычисления, предусмотрено автоматическое
 сохранение резуль\-та\-тов обращений к ним в специальном буфере. При
 каждом последующем об\-ра\-ще\-нии к нормализатору прежде всего
 проверяется наличие в буфере готового результата, и если есть, то
 он сразу и выдается. Это позволяет экономить при откатах,
 фактически извлекая из буфера готовые результаты там, где они не
 зависели от определяющего подслучай утверждения. Буферы,
 сохраняющие результаты нескольких последних обращений,
 используются и для некоторых других типов пакетных операторов; их
 применение позволило при про\-грам\-ми\-ро\-ва\-нии на ГЕНОЛОГе практически
 не заботиться о предотвращении дуб\-ли\-ро\-ва\-ний, возникающих при
 обращении из различных приемов к одним и тем же вспомогательным
 вычислениям.

 Возвращаясь к разбору случаев в нормализаторах, укажем вид
 псевдотеорем, применяемых для инициализации этого разбора:
 $\forall_x(A \rightarrow (B = $ разбор\-слу\-чаев($C$))). Здесь
 дизъюнкция $C$ определяет необходимые подслучаи; терм $B$
 идентифицируется с текущим преобразуемым термом либо (в
 зависимости от типа нормализатора) с его подтермом. Заголовок
 приема здесь по-прежнему имеет вид "замена(второйтерм $N$)", где
 $N$ - название нормализатора, хотя в действительности прием не
 выполняет никакой замены. Пример приема данного типа -
 использование псевдотеоремы

 $\forall_{xfabc}(lim_{x \to b
 \backslash a} f(x) = 0 \rightarrow lim_{x \to b \backslash a}
 f(x)^c = $ разборслучаев $(0 < c \ \vee \ c < 0 \ \vee \ c = 0))$

 при инициализации разбора случаев для знака показателя степени, если
 предел основания степени равен нулю.

 \item Для устранения вложенных одинаковых ассоциативно - коммутативных
 опе\-ра\-ций $f$: $f(\ldots f(\ldots )\ldots ) = f(\ldots \ldots
 \ldots)$ - служит прием нормализатора, имеющий заголовок
 "замена(спускоперандов $B$)", где $B$ - название нормализатора.
 Тео\-ре\-ма этого приема имеет вид "коммутативно($f$)".

 \item Для лексикографического упорядочения операндов
 коммутативной опе\-ра\-ции $f$ в нормализаторе используется прием
 теоремы "коммутативно($f$)", имеющий заголовок
 "замена(лексупорядочение $B$)", где $B$ - заголовок
 нормализатора.

 \item В тех случаях, когда требуется ввести, удалить либо
 изменить комментарий нормализатора, не предпринимая изменений его
 преобразуемого терма, ис\-поль\-зу\-ет\-ся прием с заголовком
 "замена(замечание $N$)", где $N$ - заголовок нор\-ма\-ли\-за\-то\-ра.
 Теорема такого приема имеет вид "длялюбого($x_1 \ldots x_n$ если
 $A_1 \ldots A_m$ то контекст($A_0$))", причем идентификация
 начинается с усмотрения вхождения в преобразуемый терм терма
 $A_0$. Необходимые действия с комментариями оп\-ре\-де\-ля\-ют\-ся
 предназначенными для этого указателями приема.

 \end{enumerate}

 \subsubsection{Прием анализатора}

 Как и приемы вывода, приемы анализаторов имеют теорему вида
 $\forall x(A_1 \ \& \ \ldots \ \& \ A_n \rightarrow A_0)$, при помощи которой
 осуществляется вывод следствия $A_0$; способ обработки
 утверждений $A_i (i=1, \ldots, n)$ при этом уточняется
 указателями приема (возможны непосредственная идентификация
 такого утверждения с одной из посылок; проверка его истинности
 при помощи проверочного оператора либо задачи на доказательство;
 использование для ввода вспомогательных обозначений, и т.п.).
 Заголовок приема - "внутрвывод($B$)", где $B$ - название
 анализатора.

 \subsubsection{Прием оператора фильтра}

 Прием оператора фильтра имеет псевдотеорему "блок" \ (на экран
 при про\-смот\-ре описания приема вместо этой псевдотеоремы выводится
 текст концевого пункта ог\-лав\-ле\-ния, в котором расположены задающие
 формат оператора фильтра приемы справочников "блок" \ и
 "блокпроверок"; этот текст обычно напоминает смысл вход\-ных
 и выходных переменных оператора). Заголовок приема -
 "контекст($A$)", где $A$ - название оператора фильтра. При
 отсутствии выходных переменных оператор получает значение
 "истина", если выполнены условия на текущий контекст,
 оп\-ре\-де\-ля\-емые фильтрами хотя бы одного из его приемов; при наличии
 выходных пе\-ре\-мен\-ных - выдает их значения при срабатывании
 какого-либо из его приемов. В зависимости от типа оператора, при
 его работе, кроме входных переменных, могут быть доступны другие
 структуры данных (текущая задача и координата вхождения в нее -
 если обращение к оператору происходит из приема сканирования
 задачи, либо список комментариев внешнего пакетного оператора -
 если обращение имеет место из такого оператора, и т.п.).

 \subsection{Вычислительные пакеты}

 Рассмотренные выше пакетные операторы предназначены для работы с
 логически\-ми структурами данных. Однако, ГЕНОЛОГ можно использовать и
 для созда\-ния программ, работающих с "обычными" \ техническими
 структурами данных - числа\-ми, массивами, таблицами и т.п. Эти
 программы, разумеется, тоже имеют свои\-ми источниками теоремы или
 группы теорем, так что естественным образом возника\-ет задача
 компиляции их непосредственно с теоремного уровня.

 Для задания обычных, нелогических вычислений на ГЕНОЛОГе используются
 так называемые вычислительные пакеты. Они компилируются в программу
 опе\-ра\-то\-ра ЛОСа и состоят обычно из небольшого числа вычислительных
 "приемов" \ или "про\-дукций".

 В приемах логического характера четко разделены структурный и
 предметный уровни. Обрабатываемая информация представлена на структурном
 уровне, в виде формул, косвенным образом ссылающихся на объекты и
 отношения предметного уровня. Поэтому возникает необходимость в
 двухуровневой конструкции приемов: на предметном уровне записывается
 теорема, обеспечивающая возможность вы\-пол\-ня\-е\-мых приемом преобразований,
 а на структурном уровне записываются условия, при которых это
 преобразование представляется целесообразным. Но для
 вычис\-ли\-тель\-ного приема предметный и структурный уровни сливаются.
 Здесь обрабатывае\-мая информация состоит из технических
 структур данных, которые однозначно опре\-де\-ля\-ют объекты и отношения
 между ними - являются, своего рода, именами этих объектов и отношений.
 Поэтому вся управляющая часть приема может быть пол\-нос\-тью погружена в
 предметный уровень - в виде дополнительных посылок теоремы,
 определяющих целесообразность ее применения. Соответственно,
 приемы вы\-чис\-ли\-тельных пакетов имеют (за редкими исключениями,
 связанными с использованием комментариев) пустой список фильтров.

 Выделим здесь два типа вычислительных пакетов - пакеты продукций
 и тех\-ни\-чес\-кие анализаторы.

 Пакет продукций можно рассматривать как вычислительный аналог синтезатора.
 Прием его имеет заголовок "продукция($A$)", где $A$ - заголовок пакета.
 Если список термов и логических символов, задающих формат пакета
 продукций, имеет элемент "эквивалентно", то приемы этого пакета работают
 в режиме эквивалентных пре\-об\-ра\-зований группы входных данных,
 приводя ее к такому виду, для которого значения выходных переменных
 вычисляется непосредственно. Такой режим аналогичен ре\-жи\-му работы
 пакетных нормализаторов. При отсутствии элемента "эквивалентно" \ каждый
 прием пакета продукций определяет значения выходных переменных
 за один шаг, как и у пакетного синтезатора. Разумеется, этот шаг
 может включать в себя рекурсивные обращения к вспомогательным
 вычислениям.

 Технический анализатор выполняет разметку некоторой сложной
 структуры дан\-ных, снабжая ее элементы наборами значений параметров,
 характеризующих эти элементы либо связи между ними. Разметка
 осуществляется в режиме сканирования технической структуры данных.
 Список параметров определен форматом ана\-ли\-за\-то\-ра; хранятся они во
 вспомогательной структуре данных, организованной подобно анализируемой.
 Режим работы технического анализатора аналогичен режиму работы пакетного
 анализатора, так как представляет собой, по существу, процесс вывода
 следствий вплоть до полного их исчерпания. Прием технического
 анализатора имеет заголовок "знач($A$)", где $A$ - название анализатора.

 Чтобы перейти от рекурсивного характера вычислений, свойственного
 логичес\-ким пакетным операторам, к вычислениям итерационным, в
 описаниях форма\-та вы\-чис\-лительных пакетов используются указатели,
 регулирующие объ\-е\-ди\-нение про\-грамм различных приемов в общую
 программу пакета.

 \subsection{Простейшие приемы непосредственного усмотрения
 ис\-тин\-нос\-ти либо ложности}

 Для усмотрения истинности утверждений вида $f(A)$, где $f$
 определяет один из ба\-зис\-ных типов объектов (число; множество;
 функция; точка и т.п.), вводятся приемы, усматривающие этот тип
 для значений выражения $A$ из анализа заголовка $A$.
 Псев\-до\-теорема такого приема имеет вид "родобъекта($f$)";
 заголовок - "родобъекта".

 Для усмотрения противоречивых указаний на тип объекта вводится
 также прием с заголовком "различны" \ (его псевдотеорема - та же,
 т.е. "родобъекта($f$)").

 \subsection{Приемы справочников}

 Количество различных справочников, используемых в системе,
 приближается к сот\-не. Задание их приемов на ГЕНОЛОГе обычно
 весьма простое - фильтры и ука\-за\-те\-ли приема здесь, как правило,
 отсутствуют (в таких ситуациях, для обеспечения работы
 компилятора ГЕНОЛОГа, приходится вводить какой-либо незначащий
 логический символ в качестве указателя - как правило,
 используется логический символ "пусто" \ либо "справка"). Для
 каждого нового справочника в компилятор ГЕНОЛОГа вво\-дит\-ся свой
 (обычно коротенькая) программа трансляции - копируется с
 аналогичной программы другого справочника, с минимальными
 изменениями. Функционирование справочников достаточно подробно
 описано в информации о логических символах - названиях этих
 справочников (доступной, например, по F2 из редактора программ
 ЛОСа); названия справочников перечислены, например, в информации
 по за\-го\-лов\-кам приемов ГЕНОЛОГа, доступной по Ctr-з (кир.) из
 просмотра описания какого-либо приема ГЕНОЛОГа. Поэтому мы
 ограничимся здесь лишь рассмотрением спра\-воч\-ни\-ков, используемых
 для задания формата пакетных операторов. Приемы этих справочников
 создаются перед созданием самого пакетного оператора; после того,
 как они введены, можно переходить ко вводу и компиляции его
 приемов. В ин\-тер\-фей\-се редактора приемов предусмотрены средства
 автоматической инициализации пакетного оператора.

 \subsubsection{Задание формата проверочных операторов}

 Формат проверочного оператора определяется справочником
 "легковидеть". Тео\-ре\-ма приема этого справочника имеет вид
 "легковидеть($f(x_1 \ldots x_n \ x_{n+1} \ x_{n+2} \ x_{n+3})$
 уровень($N$)$T$)". Здесь $f(x_1 \ldots x_n \ x_{n+1} \
 x_{n+2} \ x_{n+3})$ - вид обращения к оператору; $T$ - шаблон
 проверяемого ут\-вер\-жде\-ния. $x_1, \ldots, x_n$ - все свободные
 переменные ут\-вер\-жде\-ния $T$; Входной переменной $x_{n+1}$
 передается список утверждений, истин\-ность которых может быть
 использована при проверке (посылок); переменной $x_{n+2}$ -
 спи\-сок комментариев. Выходной переменной $x_{n+3}$ присваивается
 набор посылок, факти\-чес\-ки использованных при усмотрении. $N$ -
 число уровней срабатывания опе\-ра\-то\-ра $f$ (при $N=1$ указатель
 "уровень($N$)" \ может отсутствовать).

 Кроме обычных проверочных операторов, можно создавать операторы
 усиленной проверки. Их формат определяется справочником
 "проверка", аналогичным спра\-воч\-нику "легковидеть". Теорема приема
 этого справочника имеет вид "проверка($f(x_1 \\ \ldots x_n \ x_{n+1}
 \ x_{n+2} \ x_{n+3})$ уровень($N$)$T$)", и далее - так же, как у
 обычного проверочного оператора.

 \subsubsection{Задание формата синтезаторов}

 Формат синтезатора определяется справочниками "синтезатор" \ и
 "значения". Оба этих справочника основаны на одной и той же
 псевдотеореме вида "синтезатор($f \ T$ вход($x_1 \ldots x_n$) \
 выход($y_1 \ldots y_k$) \ $A_1 \ldots A_m$)". Здесь $f$ -
 заголовок синтезатора (ло\-ги\-чес\-кий символ); $T$ - конъюнкция
 утверждений, связывающих значения входных и выходных переменных
 ($T$ не имеет двух различных вхождений одной и той же
 переменной); $x_1, \ldots, x_n$ - список входных переменных;
 $y_1, \ldots, y_k$ - список выходных переменных. $A_1, \ldots,
 A_m$ - информационные термы, уточняющие тип синтезатора (см.
 ниже). Обращение к синтезатору имеет вид $f(x_1 \ldots x_n \
 x_{n+1} \ x_{n+2} \ y_1 \ldots \ y_k \ y_{k+1})$, где $x_{n+1}$ -
 список посылок; $x_{n+2}$ - список комментариев; $y_{k+1}$ -
 список утверждений, использованных в качестве обоснования
 результата.

 Используются следующие типы информационных термов $A_i$:

 \begin{enumerate}

 \item уровень($N$). $N$ есть число уровней срабатывания приемов
 синтезатора;

 \item перечисление. Синтезатор определяет перечисление значений
 выходных пе\-ре\-мен\-ных;

 \item коррекцияпосылок. Перед обращением к синтезатору из приема
 сканирования задачи в комментариях синтезатора создается
 накопитель (коррекцияпосылок $C$). Набор $C$ (вначале пустой)
 заполняется синтезатором тройками ($B_1 \ B_2 \ B_3$), где $B_1$ - на\-бор
 дополнительных посылок, введенных для того, чтобы обеспечить
 непосредственное усмотрение принадлежности области до\-пус\-ти\-мых
 значений входящих в результат обращения к синтезатору выражений; $B_3$ -
 список ис\-ход\-ных посылок, из которых были выведены посылки списка
 $B_1$; $B_2$ - либо 0, либо подмножество списка $B_3$,
 эквивалентное списку $B_1$ в предположении истинности остальных
 утверждений списка $B_3$.

 \end{enumerate}

 \subsubsection{Задание формата нормализаторов}

 Формат нормализатора определяется справочником "быстрпреобр".
 Псевдоте\-оре\-ма приема этого справочника имеет вид "быстрпреобр($f
 \ U_1 \ldots \ U_n$)", где $f$ - заголовок нормализатора; $U_1,
 \ldots, U_n$ - указатели типа нормализатора (см. ниже). Кроме
 спра\-воч\-ни\-ка "быстрпреобр", для нормализаторов общей
 стандартизации термов с за\-го\-лов\-ком $B$ создается также справочник
 "нормализатор". Псевдотеорема приема такого справочника имеет вид
 "нормализатор($B \ f$)". Данный справочник нужен для определения
 названия $f$ нормализатора по заголовку $B$ преобразуемого терма.
 Заметим, что такое название всегда имеет вид "норм$B$" ("нормплюс",
 "нормми\-нус", нормстепень" \ и т.д.). Кроме приема справочника
 "нормализатор", обычно вво\-дит\-ся также прием справочника
 "ключоператора" \ с псевдотеоремой "ключоператора($f \ B$)" \ - он
 решает обратную задачу определения $B$ по $f$. Заголовки приемов
 всех трех справочников совпадают с названием этих справочников.

 Используются следующие указатели типа нормализатора:

 \begin{enumerate}

 \item "уровень($A$)" \ - $A$ есть логический символ, равный числу
 различных уровней срабатывания приемов нормализатора. Отсутствие
 такого терма означает, что все приемы срабатывают на одном и том
 же уровне (рекомендуется вводить хотя бы два различных уровня).

 \item "списокпосылок" \ - обращение к нормализатору имеет вид $f(A_1
 \ A_2 \ A_3)$, где $A_1$ - преобразуемый терм; $A_2$ - набор
 посылок, в предположении истинности которых выполняются
 преобразования; $A_3$ - набор комментариев, включающий, в
 частности, набор (выводимо $B$); $B$ - накопитель утверждений
 списка $A_2$, фактически использованных в процессе
 преобразований. Если элемент "спи\-сок\-по\-сы\-лок" \ отсутствует, то
 обращение к нормализатору имеет вид $f(A)$, где $A$ -
 преобразуемый терм, либо (см. ниже случай указателя "неизвестные")
 вид $f(A \ B)$.

 \item "корень" \ - приемы применяются только к корневому
 вхождению. Это - наи\-бо\-лее распространенный тип нормализаторов (в
 частности, к нему относятся все нормализаторы общей
 стандартизации). Во-первых, здесь происходит ус\-ко\-ре\-ние поиска приема
 за счет рассмотрения единственной "точки привязки" \ - корня
 преобразуемого терма. Во-вторых, упрощается ввод сопровож\-да\-ю\-щих
 утверждений для указания области допустимых значений новых
 термов, воз\-ни\-ка\-ю\-щих в процессе преобразований (фактически такое
 сопровождение по\-ка предусмотрено только для нормализаторов
 "корневого" \ типа, и при рабо\-те с числовыми выражениями, за
 редкими исключениями, используются только они). Недостаток таких
 нормализаторов - затруднения при усмотрении и ре\-али\-за\-ции
 преобразований некорневых подтермов. Обычно эти затруднения
 пре\-о\-до\-ле\-ва\-ют\-ся за счет обработки соответствующими корневыми
 нормализаторами всех операций, упомянутых в заменяющем терме
 теоремы приема, а также перехода от тождества $A = B$ к тождеству
 вида $g(\ldots A \ldots) = g(\ldots B \ldots)$, если корневой
 контекст $g(\ldots \ldots)$ некорневого преобразования $A = B$
 просле\-жи\-ва\-ет\-ся однозначно либо с малым числом вариантов.

 \item "1" \ - результат выдается после однократного применения
 любого приема.

 \item "неизвестные" \ - обращение к нормализатору имеет вид $f(A_1
 \ A_3)$ (при от\-сут\-ст\-вии указателя "списокпосылок") либо вид
 $f(A_1 \ A_2 \ A_3)$; наличие в $A_3$ эле\-мен\-та (неизвестные $x_1
 \ldots x_n$) означает, что переменные $x_1, \ldots, x_n$ суть
 неизвестные той внешней задачи, из которой произошло обращение к
 нормализатору, при\-чем если эта задача - на описание, то
 преобразуемый терм относится к ее условиям. Компилятор ГЕНОЛОГа
 автоматически обеспечивает создание такого эле\-мен\-та в наборе
 $A_3$ при обращениях к нормализаторам данного типа.

 \item "стандупорядочение" \ - перед выдачей результата
 осуществляется обращение к операторному выражению
 "стандупорядочение", обеспечивающему стан\-дарт\-ное упорядочение
 операндов операций - там, где допустимы простейшие типы
 перестановки операндов.

 \item "разборслучаев" \ - предусмотрена нормализация с откатами
 для разбора слу\-ча\-ев.

 \item "глуб" \ - в комментариях нормализатора формируется элемент
 (глуб $N$), у ко\-то\-ро\-го $N$ есть число внешних обращений к данному
 нормализатору в цепоч\-ке обращений к нормализаторам.

 \item "группировка" \ - нормализатор, работающий в режиме отбора
 нескольких на\-и\-бо\-лее упрощающих выражение преобразований
 непересекающихся его под\-тер\-мов и последующей их одновременной
 реализации.

 \item "контрольнормализации" \ - используется буфер
 "контрольнормализации", со\-хра\-ня\-ю\-щий результаты нескольких
 последних обращений к нормализатору. При трассировке "по шагам
 решения задачи" \ обращения к таким нормализаторам выводятся на
 экран и происходит показ их пошаговых действий. Использование
 буфера позволяет при программировании не слишком заботиться о
 экономии на повторных обращениях к обработке одного и того же
 терма, происходящих из различных приемов - такие обращения обычно
 идут друг за другом достаточно компактной группой, и размеров
 буфера (50 позиций) оказывается вполне до\-ста\-точ\-но для их
 отслеживания.

 \item "коррекцияпосылок" \ - перед обращением к нормализатору из
 приема ска\-ни\-ро\-ва\-ния задачи в комментариях нормализатора создается
 накопитель (кор\-рек\-ци\-я\-по\-сы\-лок $A$). Набор $A$ (вначале пустой)
 заполняется тройками ($B_1 \ B_2 \ B_3$), где $B_1$ - набор
 дополнительных посылок, введенных для сопровождения результа\-та
 обращения к нормализатору. Эти посылки позволяют непосредственно
 ус\-мат\-ри\-вать принадлежность области допустимых значений (о.д.з.)
 подвыра\-же\-ний результата. $B_3$ - список исходных посылок, из
 которых были вы\-ве\-де\-ны посылки списка $B_1$; $B_2$ - либо 0, либо
 подмножество списка $B_3$, эквивалент\-ное списку $B_1$ в
 предположении истинности остальных утверждений списка $B_3$.
 Использование указанного накопителя совершенно необходимо в тех
 случа\-ях, когда предметная область требует аккуратного
 сопровождения термов по о.д.з. (например, в элементарной алгебре),
 причем выполняемые нормализатором преобразования способны привести
 к появлению термов с неочевидным в ис\-ход\-ном контексте выполнением
 условий на о.д.з.

 \end{enumerate}

 \subsubsection{Задание формата анализаторов}

 Формат анализатора определяется справочником "анализатор".
 Псевдотеорема приема этого справочника имеет вид "анализатор($f$
 $S$)", где $f$ - логический символ, являющийся названием
 анализатора, $S$ - либо отсутствует, либо представляет собой
 один из логических символов "корень", "полный". Если $S$
 отсутствует, то анализатор сканирует все вхождения логических
 символов в посылки своей вспомогательной задачи, обращаясь на
 каждом уровне сканирования только к посылкам, вес которых не
 превосходит этого уровня. Если $S$ есть символ "корень", то
 сканирование ограничивается лишь корневыми точками посылок.
 Наконец, если $S$ есть символ "полный", то сканирование
 ведется по корневым точкам, а веса посылок при сканировании игнорируются.

 \subsubsection{Задание формата операторов фильтра}

 Формат оператора фильтра определяется справочниками "блок" \ и
 "блокпрове\-рок". Псевдотеорема приема этих справочников - общая;
 она имеет вид "блок($A$ \ вход($B_1 \\ \ldots B_n$) \ выход($B_{n+1}
 \ldots B_m) \ C_1 \ldots \ C_k$)". Здесь $A$ - заголовок
 оператора; обраще\-ние к оператору имеет вид $A(y_1 \ldots y_p \
 x_1 \ldots x_m)$. Каждое $B_i$ - указатель типа данных
 соответствующей входной либо выходной переменной $x_i$ (лог.
 символы "терм", "вхож\-де\-ние", "логсимвол", "переменная");
 $y_1, \ldots, y_p$ - дополнительные входные перемен\-ные, значения
 которых автоматически определяются (как это указано ниже) из
 те\-ку\-ще\-го контекста. Если выходных переменных нет, то терм
 "выход($B_{n+1} \ldots B_m$)" \ отсутствует. $C_1, \ldots, C_k$ -
 указатели типа оператора структурного уровня.

 Концевой пункт оглавления базы приемов, в котором хранятся
 указанные два приема справочников "блок" \ и "блокпроверок",
 располагается первым в подразделе, охватывающем приемы заданного
 оператора фильтра $A$. Текст этого пункта для удобства
 программирования автоматически выводится на экран вместо
 псев\-до\-те\-о\-ре\-мы "блок" \ всех приемов оператора $A$, и его следует
 составлять таким образом, чтобы из него извлекалась информация о
 назначении вход-выходных переменных $x_i$.

 Указатели типа оператора фильтра таковы:

 \begin{enumerate}

 \item Указатель текущего контекста, в котором происходит
 обращение к опера\-то\-ру - лог.символ "пусто" \ (число $p$ равно 0),
 либо "решить" \ (текущий кон\-текст - сканирование задачи, и тогда
 $p = 5$ - для программных переменных х1 - х5, определенных при
 сканировании), либо "замена" \ (текущий контекст - пакетный
 нормализатор, и тогда $p = 3$ - для программных переменных х1 -
 х3 этого нормализатора).

 \item "перечисление" \ - указатель на наличие режима перечисления
 без повторений выходных наборов.

 \end{enumerate}

 \subsection{Приемы вывода теорем}

 Кроме базы приемов, в логической системе имеется также база
 теорем. Она не\-об\-хо\-ди\-ма как источник, из которого берутся новые
 приемы. В свою очередь, источником новых теорем является
 процедура логического вывода, архитектура которой будет описана в
 третьей книге данной монографии. При логическом выводе теорем
 ис\-поль\-зу\-ют\-ся возможности решателя, обращения к которому
 происходят из приемов вывода теорем. Такие приемы отличаются от
 обычных правил вывода прежде всего тем, что в них содержатся
 элементы постановки задач для решателя и эле\-мен\-ты формирования
 гипотез, проверяемых решателем. Приемы вывода теорем акти\-ви\-зи\-ру\-ются
 через справочник "теорема" \ в процессе сканирования некоторой
 "теку\-щей" \ теоремы, следствия из которой нужно получать. Все они
 реализованы на ГЕНОЛОГе и имеют заголовок "теорема".
 Большинство их сами основаны на теоремах какой-либо отдельной
 предметной области, и таким образом вывод приобретает
 "мно\-го\-мест\-ный" характер. Для автоматического синтеза приемов
 вывода используется еще один реализованный на ГЕНОЛОГе справочник -
 "логвывод". Теоремы его прие\-мов представляют собой шаблоны
 создания по теоремам соответствующих им одно\-мест\-ных правил вывода.
 Подроб\-нее обо всех этих приемах будет рассказано в треть\-ем томе.

 \section{Типы фильтров приемов}

 Логический язык, на котором формулируются фильтры приема,
 относится к уров\-ню "структур данных" \ - в этом он весьма близок к
 ЛОСу. Отличие от ЛОСа состоит в том, что при задании фильтра
 приходится ссылаться на термы задачи через по\-сред\-ство "теоремных"
 \ переменных, идентифицированных с этими термами (иногда - с
 пе\-ре\-мен\-ны\-ми либо логическими символами); при использовании ЛОСа
 такая ссылка осуществляется непосредственно, через программные
 переменные, которым заранее присваивается необходимое значение. С
 некоторым приближением, можно считать, что язык для задания
 фильтров - это "ЛОС в теоремных переменных". Многие операторы и
 операторные выражения, используемые для записи фильтров, попросту
 копируют соответствующие операторы и операторные выражения ЛОСа;
 иногда при этом удается опускать ряд их входных параметров,
 определяемых в контексте "по умолчанию".

 При задании фильтров можно использовать, наряду с логическими
 связками, также и квантор существования (квантор общности
 сводится к нему с помощью отрицаний). Однако, этот квантор
 представляется здесь с помощью специальной конструкции
 "контекст($\ldots $)" \ (см. подробнее подраздел "Логические
 связки и кван\-тор существования"), в которой опущена кванторная
 приставка - по умолчанию к ней относятся все переменные,
 встречающиеся внутри данной конструкции, не опре\-де\-лен\-ные к
 моменту ее рассмотрения внешним образом (в частности, не входящие
 в теорему). Такое соглашение укорачивает записи и практически не
 усложняет по\-ни\-ма\-ния их смысла. Другое важное отличие от обычного
 квантора существования состо\-ит в том, что внутри конструкции
 "контекст($\ldots $)" \ могут использоваться условия,
 идентифицирующие термы задачи с некоторыми заданными термами, и в
 этом слу\-чае наряду с "чисто логическими" \ записями здесь будут
 встречаться техничес\-кие указатели, уточняющие способ
 идентификации.

 Как правило, порядок размещения фильтров в описании приема
 несущественен - компилятор размещает их программы в программе
 приема "по-своему", стараясь обеспечить определяемое ими отсечение
 как можно раньше. Однако, существу\-ет возможность влиять на
 размещение программы фильтра в программе приема (ино\-г\-да это все
 же позволяет уменьшить "холостой ход" \ приема) - путем
 использования специальных сопровождающих фильтр пометок либо
 путем обычного их упоря\-до\-че\-ния (если в программе необходимые для
 выполнения проверок переменные опре\-де\-ля\-ют\-ся для нескольких
 фильтров одновременно, то их программные фрагменты размещаются в
 программе приема в том же порядке, что и сами фильтры в описа\-нии
 приема).

 В большинстве случаев компилятор автоматически определяет тип
 значения пе\-ре\-мен\-ной, используемой в фильтре (терм, либо
 вхождение, либо символ, и т.п.) - в особых случаях предусмотрено
 явное указание такого такого типа.

 Часть встречающихся в фильтрах подвыражений называем, по аналогии
 с ЛОСом, операторными выражениями. Иногда они действительно
 оказываются тождественны операторным выражениям ЛОСа. Кроме
 операторных выражений, в фильтрах могут использоваться также
 термы предметного уровня. В отличие от операторных вы\-ра\-же\-ний,
 составленных из операций над объектами структурного уровня
 (термами, списками, задачами и т.п.), термы предметного уровня
 образованы операциями и отношениями над объектами рассматриваемой
 предметной области (например, чис\-ла\-ми, точками, функциями, и
 т.п.). Термы предметного уровня, встречающиеся в фильтрах, будем
 называть также термами "в теоремных переменных", так как они
 аналогичны термам теоремы приема. При описании фильтров
 уточняется, в каких случаях допустимо использование операторного
 выражения, а в каких - терма "в теоремных переменных".

 \subsection{Логические связки и квантор существования}

 В фильтрах можно использовать обычные логические связки
 "не($A$)", "и($A_1 \ldots A_n$)", "или($A_1 \ldots A_n$)", а
 также конструкцию "альтернатива($A_1 \ A_2 \ A_3$)" \ - в случае
 истин\-но\-го $A_1$ ее истинность совпадает с истинностью $A_2$, а
 иначе - с истинностью $A_3$.

 Роль квантора существования при задании фильтров играет
 конструкция "кон\-текст($A_1 \ldots A_n$)". Термы $A_i$ в этой
 конструкции бывают трех типов:

 а) Идентифицирующие термы - они аналогичны операторам ЛОСа,
 имею\-щим выходные переменные (в том числе перечисляющим) и
 определяют значения не\-ко\-то\-рых новых, до этого не определенных,
 переменных, используемых в других термах $A_j$ того же списка.
 Вне данной конструкции "контекст($\ldots$)" \ эти перемен\-ные
 будут считаться не определенными. Изначально определенными
 при рассмотрении фильтров считаются все переменные, входящие в
 теорему, а также некоторые пере\-мен\-ные, дополнительно определяемые
 в специальных указателях приема;

 б) Проверочные термы - они формулируют условия на значения ранее
 опре\-де\-лен\-ных переменных и представляют собой произвольные
 правильно построенные фильтры;

 в) Указатели идентификации - они уточняют спосбо применения
 иден\-ти\-фи\-ци\-ру\-ющих термов и идентичны аналогичным указателям для
 описания всего приема.

 Фильтр "контекст($A_1 \ldots A_n$)" \ выражает условие
 существования значений пе\-ре\-мен\-ных, определяемых его
 идентифицирующими термами $A_i$, при которых истин\-ны все
 проверочные термы. Порядок размещения термов $A_i$ в списке, в
 общем, произвольный, за исключением одного ограничения: после
 первого же иден\-ти\-фи\-ци\-ру\-ю\-ще\-го терма с заголовком "вид" \ либо
 "подтерм" \ либо "усм" \ могут идти толь\-ко такие идентифицирующие
 термы, которые имеют один из данных трех заголовков. Допускаются
 вложенные (с произвольной глубиной вложения) конструкции
 "кон\-текст($\ldots$)".

 В качестве простого примера использования фильтра
 "контекст($\ldots$)" \ рассмот\-рим следующую ситуацию. Пусть в
 теореме встречается переменная $x$, иден\-ти\-фи\-ци\-ро\-ван\-ная с
 неизвестной задачи на описание, и требуется ввести фильтр, разрешающий
 применение приема лишь тогда, когда эта неизвестная встречается в
 каком-либо неравенстве из условий задачи. Этот фильтр может быть
 записан как "контекст(ус\-ло\-вие($A$)заголовок($A$ меньше
 меньшеилиравно) входит($x$ $A$))". Здесь $A$ - какая-либо
 переменная, не встречающаяся в теореме приема. Идентифицирующий
 терм "усло\-вие($A$)" \ будет перечислять все условия задачи;
 проверочный терм "заголовок($A$ мень\-ше меньшеилиравно)" \ -
 отбирать из них лишь те, заголовком которых служит отно\-ше\-ние
 "меньше" \ либо "меньшеилиравно", а проверочный терм "входит($x$
 $A$)" \ - про\-ве\-рять вхождение в условие переменной,
 идентифицированной с $x$.

 Квантор общности в фильтрах не предусмотрен - он выражается через
 кван\-тор существования и отрицание.

 \subsection{Равенство объектов}

 Условие "равно($A \ B$)" \ используется для указания на равенство
 значений опера\-тор\-ных выражений $A$ и $B$. Если нужно сравнить два
 терма $P,Q$ "предметного уровня", т.е. заданных через переменные
 теоремы, то в качестве $A,B$ следует брать опера\-тор\-ные выражения
 "терм($P$)", "терм($Q$)".

 Для сокращенной записи используется также обозначение "равно($A
 \ B_1 \ldots B_n$)", означающее, что значение операторного выражения
  $A$ равно хотя бы одному из значений операторных выражений $B_1,
  \ldots, B_n$.

 \subsection{Сравнение числовых характеристик термов}

 Если требуется указать, что некоторый терм предметного уровня $A$
 имеет значение числовой харктеристики $f(A)$ меньшим, чем любой
 из термов $B_1, \ldots , B_n$, то ис\-поль\-зу\-ет\-ся запись
 "упрощение($x_i$ и($A \ B_1 \ldots B_n$) $f(x_i)$)". Здесь $x_i$
 - новая переменная, используемая в определяющем характеристику
 $f$ операторном выражении $f(x_i)$.

 Если терм $A$ должен иметь значение числовой характеристики
 $f(A)$ меньшим, чем хотя бы один из термов $B_1, \ldots, B_n$,
 то используется запись "упрощение($x_i$ или($A \ B_1 \ldots \\ B_n$)
 $f(x_i)$)".

 Например, если требуется применять прием лишь в том случае, когда
 число неизвестных задачи, встречающихся в терме, идентифицированном
 с переменной $a$, меньше числа неизвестных в любом из термов,
 идентифицированных с переменными $b,c,d$, то используется фильтр
 "упрощение($x$ и($a \ b \ c \ d$) число(неизвестная($y$) вхо\-дит($y\
 x$))".

 \subsection{Ограничения на задачу}

 \subsubsection{Текущий уровень задачи}

 Для указания допустимых значений $A_1, \ldots, A_n$ текущего
 уровня сканирования те\-ку\-щей задачи используется фильтр
 "уровень($A_1 \ldots A_n$)". При вводе описания приема,
 реализуемого в режиме сканирования задачи, обязательно должен
 быть указан такой фильтр (иначе компилятор сразу будет выдавать
 отказ).

 \subsubsection{Цели задачи}

 Фильтр "цель($A$)" \ означает, что текущая задача имеет цель $A$.
 Здесь $A$ - либо ло\-ги\-чес\-кий символ, либо операторное выражение,
 определяющее цель. Если посредст\-вом идентифицирующих термов либо
 операторных выражений выделена некоторая другая задача $Z$, то для
 указания на то, что она имеет цель $A$, применяется запись "цель($Z$)".

 Фильтр "цели($A_1 \ldots A_n$)" \ означает, что текущая задача не
 имеет цели, заголовок которой не входил бы в список $A_1, \ldots,
 A_n$.

 \subsubsection{Тип задачи}

Фильтр "тип($A$)" \ означает, что текущая задача имеет тип $A$.
$А$ - логический символ либо операторное выражение. Фильтр "тип($Z
\ A$)" \ означает, что задача $Z$ (вве\-ден\-ная при помощи
идентифицирующих термов либо операторных выражений) имеет тип $A$.

 \subsubsection{Текущая задача - корневая}

Для указания на то, что текущая задача - корневая, т.е. выбрана
непосредст\-вен\-но из задачника, используется фильтр
"исходнаязадача". Он помогает в тех случаях, когда для корневой
задачи нужно разрешить применение различного рода усилен\-ных
средств.

\subsubsection{Неизвестные задачи}

Чтобы указать, что текущая задача имеет не более одной
неизвестной, использу\-ет\-ся фильтр "неизвестные(1)". В случае $N
>1$ фильтр "неизвестные($N$)" \ при\-ме\-ня\-ет\-ся несколько
иначе - он указывает, что текущая задача имеет не менее $N$
неизвестных.

\subsubsection{Раздел, к которому относится условие задачи на
доказательство либо на преобразование}

Фильтр "раздел($A$)", где $A$ - название раздела, используется,
если нужно проверить, что условие текущей задачи на преобразование
либо на доказательство со\-дер\-жит хотя бы один логический
символ, относящийся к разделу $A$ либо к подразделу раз\-де\-ла
$A$.

\subsubsection{Проверка наличия посылок специального вида}

Во многих предметных областях бывает полезно вводить в процессе
решения задач фиктивные посылки вида "актив($A$)", где $A$ -
некоторое выражение, которое полезно рассмотреть в задаче, но
которое пока не встречается в других ее термах. Такие посылки
также упрощают обнаружение в задаче выражений специального вида и
часто используются для инициализации применения приемов. Например,
в гео\-мет\-ри\-чес\-ких задачах посылки
"актив(расстояние($AB$))", "актив(прямая($AB$))",
"актив(ок\-ружность($AB$))" \ и т.п. выделяют для рассмотрения при
сканировании раз\-лич\-ные элементы чертежа. Фильтр "См($A_1
\ldots A_n$)" \ используется для указания на то, что задача имеет
посылки "актив($A_1$)", $\ldots$, "актив($A_n$)".

\subsection{Ограничения на термы, переменные и логические
сим\-во\-лы}

\subsubsection{Простейшие свойства термов и переменных}

\begin{enumerate}

\item Фильтр "входит($X \ A$)" \ означает, что переменная либо
логический символ, за\-дан\-ные операторным выражением $X$, входят
в терм, заданный операторным выражением $A$.

\item Фильтр "переменная($X$)" \ означает, что переменная $X$
идентифицирована с переменной.

\item Фильтр "константа($A$)" \ означает, что операторное
выражение $A$ задает терм без свободных переменных.

\item Фильтр "вхождениетерма($A \ B$)" \ означает, что терм $B$
входит в терм $A$. Здесь $A,B$ - не операторные выражения, а термы
предметного уровня, записан\-ные непосредственно в "теоремных" \
переменных.

\item Фильтр "короче($A \ B$)" \ означает, что терм, заданный
операторным выражением $A$, короче терма, заданного операторным
выражением $B$. Под длиной терма понимается число вхождений в него
логических символов и символов пе\-ре\-мен\-ных.

\item Фильтр "родобъекта($A \ B$)" \ означает, что терм,
определенный оператор\-ным выражением $A$, имеет своим заголовком
операцию, тип значения которой оп\-ре\-де\-ля\-ется логическим
символом $B$.

\item Фильтр "род($A \ B$)" \ представляет собой усиленную версию
фильтра "родобъ\-ек\-та", использующую при проверке не только
заголовок терма $A$, но и посылки текущего контекста.

\item Фильтр "подобныетермы($A \ B$)" \ означает, что термы,
определенные опера\-тор\-ны\-ми выражениями $A$ и $B$, получены
друг из друга изменением порядка опе\-ран\-дов в коммутативных
операциях.

\item Фильтр "связка($A \ X$)" \ означает, что переменная,
определенная оператор\-ным выражением $X$, входит в связывающую
приставку терма, определенного опе\-ра\-тор\-ным выражением $A$.

\end{enumerate}

\subsubsection{Заголовки термов}

Фильтр "заголовок($A \ B_1 \ldots B_n$)" \ означает, что терм,
определенный операторным выражением $A$, имеет своим заголовком
один из логических символов, определенных операторными выражениями
$B_1, \ldots, B_n$.

Фильтры "первыйсимвол($A \ B$)", "второйсимвол($A \ B$)",
"предпоследсимвол($A \ B$\\ )", "последнийсимвол($A \ B$)" \
аналогичны одноименным операторам ЛОСа; здесь опе\-ра\-торное
выражение $A$ задает некоторый терм, а операторное выражение $B$ -
ло\-ги\-чес\-кий символ.

\subsubsection{Характеризация терма либо переменной по отношению
к задаче}

\begin{enumerate}

\item Фильтр "неизвестная($x \ A$)" \ означает, что переменная $x$
идентифицирована с неизвестной задачи $A$. Обычно $A$ не
указывается - тогда по умолчанию рас\-смат\-ри\-ва\-ет\-ся текущая
задача.

\item Фильтр "параметр($x \ A$)" \ означает, что переменная $x$
идентифицирована с не\-су\-щест\-вен\-ной неизвестной задачи на
описание $A$ (при отсутствии $A$ - текущей задачи). Несущественные
неизвестные выделяются целью "параметры $x_1 \ldots x_n$"; они
представляют собой подмножество неизвестных задачи. При решении
за\-да\-чи требуется лишь установить существование удовлетворяющих
условиям значений несущественных неизвестных, не находя полного их
описания и не включая найденные значения в ответ.

\item Фильтр "известно($T \ A$)" \ означает, что операторное
выражение $T$ иден\-ти\-фи\-цируется с термом, не содержащим
неизвестных задачи $A$ (при отсутствии $A$ - текущей задачи).

\item Фильтр "симметрично($T_1 \ T_2 \ A$)" \ означает, что термы
$T_1,T_2$ входят сим\-мет\-рич\-ным образом в список посылок (при
$A$ = "списокпосылок") либо в условия (при $A$ = "списокусловий")
текущей задачи, либо в текущий терм задачи или нормализатора (при
$A$ = "корень").

\item Фильтр "независит($A$)" \ означает, что терм, заданный
операторным выраже\-ни\-ем $A$, не содержит переменных, указанных
в цели "независит $x_1 \ldots x_n$" \ текущей задачи на описание.
Такая цель указывает переменные, которые не должны иметь свободных
вхождений в ответ задачи.

\item Фильтр "обозначения($A$)" \ означает, что терм, заданный
операторным вы\-ра\-же\-ни\-ем $A$, содержит дополнительные
переменные, возникшие при выводе в посылках и зарегистрированные в
комментарии к посылкам "новаяперемен\-ная $\ldots$". Одним из
источников появления таких переменных является прием, заменяющий в
посылках задачи утверждение о существовании объектов,
удов\-лет\-во\-ря\-ющих некоторому условию $P$, на само условие
$P$, в котором дан\-ные объекты переобозначены на новые
переменные.

\end{enumerate}

\subsubsection{Алгебраические выражения}

В ГЕНОЛОГе используются не только фильтры общего характера, но и
множест\-во специальных фильтров, связанных с различными понятиями
конкретных предмет\-ных областей. Разумеется, по мере освоения
новых разделов приходится пополнять запас типов таких фильтров и,
соответственно, расширять компилятор ГЕНОЛО\-Га. Однако, эта
процедура достаточно проста - она сводится к реализации на ЛО\-Се
оператора для нового фильтра и вводу коротенькой программы приема
справочника "блокпроверок", обеспечивающего создание обращений к
этому оператору для про\-вер\-ки фильтра.

\begin{enumerate}

\item Фильтр "линейно($A \ X_1 \ldots X_n$)" \ означает, что
операторное выражение $A$ опре\-де\-ля\-ет алгебраическое
выражение, которое после раскрывания скобок становит\-ся линейным
относительно переменных, определяемых операторными
выра\-же\-ни\-ями $X_1, \ldots, X_n$.

\item Фильтр "линейноеуравнение($A \ X_1 \ldots X_n$)" \ означает,
что операторное выраже\-ние $A$ определяет алгебраическое
уравнение, которое после раскрывания скобок становится линейным
относительно переменных, определяемых операторными выражениями
$X_1, \ldots, X_n$.

\end{enumerate}

\subsection{Ограничения на вхождения}

\subsubsection{Символы, расположенные по заданному вхождению}

Чтобы указать, что на вхождении, определенном операторным
выражением $t$, рас\-по\-ло\-жен один из логических символов
списка $A_1, \ldots, A_n$, используется фильтр "сим\-вол($t \ A_1
\ldots A_n$)". Этот же фильтр можно использовать, если $t$
определяет вхождение в набор, не являющийся термом, а $A_1,
\ldots, A_n$ - операторные выражения, опре\-де\-ля\-ю\-щие
объекты, один из которых должен находиться на заданном вхождении.

\subsubsection{Взаимное расположение двух вхождений}

\begin{enumerate}

\item Для указания на то, что вхождение, определенное операторным
выражением $t_1$, расположено внутри вхождения, определенного
операторным выражением $t_2$, используется фильтр "подчинено($t_1
\ t_2$". Здесь допускается совпадение вхож\-де\-ний.

\item Чтобы указать, что вхождение $t_1$ расположено не левее
вхождения $t_2$, приме\-ня\-ет\-ся фильтр "постпозиция($t_1 \
t_2$)".

\item Фильтр "алгебрвхождение($t_1 \ t_2$)" \ означает, что
вхождение $t_2$ расположено внут\-ри вхождения $t_1$ (или
совпадает с ним) и достижимо из него только через операции "плюс",
"минус", "умножение", "дробь", "модуль", равно", меньше",
"меньшеилиравно", а также через основания степеней.

\item Фильтр "обобщмножитель($t_1 \ t_2$)" \ означает, что
вхождение $t_2$ расположено внут\-ри вхождения $t_1$ (или
совпадает с ним) и достижимо из него только через операции
"минус", "умножение", "дробь", "модуль", а также через основания
степеней.

\end{enumerate}

\subsubsection{Свободные переменные}

Фильтр "свобоперанд($t$)" \ означает, что операторное выражение
$t$ определяет вхож\-де\-ние подтерма, каждая свободная переменная
которого свободна во всем терме.

\subsection{Ограничения на наборы}

\begin{enumerate}

\item Фильтр "входит($t$ набор($A_1 \ldots A_n$))" \ означает, что
объект, определяемый опе\-ра\-тор\-ным выражением $t$, входит в
набор, элементы которого задаются опе\-ра\-тор\-ными выражениями
$A_1, \ldots, A_n$.

\item Фильтр "длинатекста($A \ B$)" \ означает, что длина набора,
определяемого опе\-ра\-тор\-ным выражением $A$, равна символьному
числу - значению операторного выражения $B$.

\item Фильтр "длинаменее($A \ B$)" \ означает, что длина набора,
определяемого опе\-ра\-тор\-ным выражением $A$, меньше символьного
числа - значения оператор\-но\-го выражения $B$.

\end{enumerate}

\subsection{Ограничения на новые термы, вводимые приемом}

\begin{enumerate}

\item Фильтр "длина($A$)" \ означает, что применение приема
тождественной либо эк\-ви\-ва\-лент\-ной замены привело к
получению более простого в смысле оператора $A$ терма. Оператор
$A$, реализованный на ЛОСе, должен иметь 5 входных пере\-мен\-ных:
х1 - задача; х2,х3,х4 - вхождение в эту задачу заменяемого терма;
х5 - заменяющий терм. Истинное значение оператора означает наличие
упрощения. Допускается отсутствие явного указания $A$, и тогда по
умолчанию берется оператор "стандартизация". Возможно
использование фильтра "длина($A$)" \ и в случае нормализаторов.
Тогда оператор $A$ имеет уже 4 входных переменных: х1, х2 -
заменяемый и заменяющий термы; х3 - список посылок нормализатора;
х4 - список его комментариев.

\item Фильтр "контрольодз" \ означает, что все подвыражения
заменяющего терма (в приеме замены либо в приеме нормализатора)
удовлетворяют условиям на о.д.з.

\item Фильтр "контрольвывода" \ означает, что новое утверждение,
заносимое в список посылок либо условий, не содержит выражений, до
этого отсутствовавших в задаче.

\end{enumerate}

\subsection{Ограничение на способ идентификации}

Если прием замены основан на тождестве либо эквивалентности с
заменяемой частью $F(t_1 \ldots t_n)$, где $F$ -
ассоциативно-коммутативный символ, то фильтр "полный" \
оз\-на\-ча\-ет, что идентификации с $t_1, \ldots, t_n$ подлежат
все операнды рассматриваемого в задаче вхождения операции $F$.

\subsection{Числовые предикаты}

\begin{enumerate}

\item Для указания того, что номер логического символа либо
переменной $A$ меньше номера логического символа либо переменной
$B$, используется фильтр "ме\-нее($A \ B$)".

\item Если операторные выражения $A,B$ задают десятичные числа, то
для сравнения этих чисел используется фильтр "меньше($A \ B$)".

\item Фильтры "десчисло($A$)", "целое($A$)", "натуральное($A$)" \
выражают условия на то, что значением операторного выражения $A$
служит терм - десятичная запись числа (соответственно, целого
числа и натурального числа).

\end{enumerate}

\subsection{Учет комментариев задачи либо пакетного опе\-ра\-то\-ра}

Для задания комментария в приводимых ниже фильтрах используется
набор $(A \ B_1 \\ \ldots B_n)$, где $A$ - логический символ,
являющийся заголовком комментария; $B_1, \ldots, B_n$ -
операторные выражения, опреде\-ля\-ю\-щие элементы комментария.
Для $B_i$ имеются следующие возможности:

 а) $B_i$ - логический символ либо терм $C$ в теоремных переменных
 - тогда данный разряд комментария представлен,
 соответственно, как логический символ либо как терм. Если
 логический символ $C$ нужно преобразовать к формату терма, то в
 ка\-чест\-ве $B_i$ берется запись "терм($C$)".

 б) $B_i$ - служебное слово "теквхожд" \ (подтерм,
 идентифицируемый с заменяемым термом) либо "корень" \ (текущий
 терм задачи - условие либо посылка) либо "ре\-зуль\-тат" \
 (заменяющий терм приема).

 в) $B_i$ - указатель вхождения в теорему "фикс($i_1 \ldots
 i_k$)". Здесь $i_1$ - номер анте\-це\-ден\-та (начиная с 1) либо
 указатель на консеквент (0), в котором находится вхож\-де\-ние; $i_2$
 - номер операнда выделенного антецедента либо консеквента, к
 которому следует переходить на втором шаге, и т.д. - вплоть до
 перехода к требуемому вхождению. Соответствующий $B_i$ разряд
 комментария есть подтерм по найденному вхождению.

 г) Если $B_i$ имеет вид "вхождение($C$)", то операторное
 выражение $C$ интер\-пре\-ти\-ру\-ет\-ся как задающее вхождение; если $B_i$
 имеет вид "логсимвол($C$)" \ либо "пе\-ре\-мен\-ная($C$)", то $C$
 интерпретируется как определяющее соответствующий символ (а не
 терм).

 д) Если $B_i$ имеет вид "набор($C_1 \ldots C_m$)", то оно
 определяет набор значений опе\-ра\-тор\-ных выражений $C_1, \ldots,
 C_m$.

 При работе с комментариями используются фильтры следующих типов:

 \begin{enumerate}

 \item Фильтр "комментусловия($A \ B_1 \ldots B_n$)" означает, что
 текущий терм задачи (для приема замены - тот, который содержит
 заменяемый подтерм) не имеет ком\-мен\-та\-рия $(A \ B_1 \ldots B_n)$.
 В зависимости от того, где расположен в задаче текущий терм,
 здесь имеется в виду комментарий посылки либо условия.

 \item Фильтр "коммент($A \ B_1 \ldots B_n$)" \ означает, что
 текущая задача либо (в случае приема пакетного оператора)
 пакетный оператор не имеет комментария ($A \ B_1 \\ \ldots B_n$). В
 случае задачи на исследование здесь рассматриваются общие
 ком\-мен\-та\-рии к посылкам.

 \item Фильтр "комментпосылки($i \ A \ B_1 \ldots B_n$)" \ означает,
 что терм задачи, иден\-ти\-фи\-ци\-ро\-ван\-ный с $i$-м антецедентом теоремы,
 не имеет комментария ($A \ B_1 \ldots B_n$). Вместо номера
 антецедента (номер здесь символьный) $i$ может быть опе\-ра\-тор\-ным
 выражением, определяющим данный терм задачи, либо логическим
 символом "теквхожд", указывающим терм задачи, содержащий точку
 привязки.

 \item Фильтр "комментпосылок($A \ B_1 \ldots B_n$)" \ означает,
 что текущая задача не имеет комментария к посылкам ($A \ B_1
 \ldots B_n$).

 \end{enumerate}

 \subsection{Ограничения на точку привязки}

 Под точкой привязки приема понимается то текущее вхождение в терм
 задачи либо пакетного оператора, рассмотрение которого
 инициализирует применение приема.

 \begin{enumerate}

 \item Фильтры "условие" \ и "посылка" \ означают, соответственно,
 что точка привязки приема располагается в условии либо в посылке
 текущей задачи.

 \item Фильтр "внешзнак($A_1 \ldots A_n$)" \ означает, что
 заменяемый подтерм расположен только внутри таких термов,
 заголовки которых принадлежат списку логи\-чес\-ких символов $A_1,
 \ldots, A_n$.

 \item Фильтр "корень" \ означает, что заменяемый подтерм
 совпадает со всем рас\-смат\-ри\-ва\-е\-мым термом (является "корневым" \
 его подтермом).

 \item Фильтр "отрицание" \ означает, что заменяемый подтерм $A$ -
 корневой либо находится под корневым отрицанием, т.е. весь текущий
 терм имеет вид $A$ либо "не($A$)".

 \item Фильтр "отр" \ означает, что заменяемый подтерм находится
 под корневым от\-ри\-ца\-ни\-ем, т.е. текущий терм задачи имеет вид
 "не($A$)".

 \item Фильтр "неизвтермы" \ означает, что точка привязки
 расположена внутри тер\-ма задачи на описание либо исследование,
 контролируемого при выделении повторных вхождений неизвестных.
 При наличии уравнений с неизвестными этот фильтр отсекает
 рассмотрение условий, не являющихся уравнениями.

 \item Фильтр "внешоператор($i \ B$)" \ означает, что $i$ - й
 внешний стэковый кадр (по цепочке кадров глобального стэка -
 источников его текущего кадра) является кадром оператора
 либо операторного выражения с заголовком $B$, либо задачи типа $B$.

 \item Фильтр "блокнеравенства" \ используется в тех случаях,
 когда прием выполняет преобразования, направленные на решение
 неравенства, и нужно проверить целесообразность таких действий в
 контексте задачи (например, заблокировать решение неравенства при
 наличии уравнений с теми же неизвестными).

 \end{enumerate}

 \subsection{Обращение к проверочному оператору из фильтра}

 Иногда бывает необходимо перед применением приема убедиться в
 том, что некоторое утверждение предметного уровня не является
 (реже - что является) очевидным в контексте задачи. Например, это
 может понадобиться для предотвращения выво\-да малоинформативных
 следствий. В этих случаях используется фильтр "легковидеть\\ ($A \
  B$)", где $A$ - проверяемое утверждение, сформулированное "в
 теоремных пе\-ре\-мен\-ных". $B$ - терм "посылки($C$)", определяющий
 дополнительные посылки $C$; этот терм может в фильтре
 отсутствовать. Фильтр используется только для таких $A$, кото\-рые
 получаются подстановкой в "шаблон" \ какого-либо проверочного
 оператора.

 \subsection{Идентифицирующие термы}

 Идентифицирующие термы используются в фильтрах "контекст($\ldots$)" \ и
 в некото\-рых специальных операторных выражениях. Они представляют
 собой аналог операторов, имеющих выходные переменные, и позволяют
 доопределять ("идентифицировать") значения новых переменных,
 используемых в том же фильтре.

 \subsubsection{Определение вида термов путем их идентификации с
 заданными тер\-ма\-ми предметного уровня}

 Если требуется выполнить идентификацию терма $T$, определенного
 оператор\-ным выражением $A$, с заданным термом $B$ предметного
 уровня, то используется иден\-ти\-фи\-ци\-ру\-ю\-щий терм "вид($A \ B$)".
 Терм $B$ может содержать новые (не встречающиеся в теореме либо
 во внешних фильтрах "контекст($\ldots$)") переменные, и после
 иден\-ти\-фи\-ка\-ции этим переменным оказываются сопоставлены некоторые
 термы предмет\-но\-го уровня. Такие переменные могут встречаться в
 фильтрах, относящихся к той же конструкции "контекст($\ldots$)",
 что и "вид($A \ B$)", и там их значения уже будут определены.

 Фильтры, использующие результаты идентификации с помощью терма
 "вид($A \ B$\\ )", могут быть расположены как после данного терма,
 так и до него - транслятор автоматически переупорядочивает
 проверки. Требуется лишь, чтобы группа иден\-ти\-фи\-ци\-ру\-ющих термов
 "вид($\ldots$)", "подтерм($\ldots$)" \ и "усм($\ldots$)" \
 (последние два ти\-па таких термов описываются ниже) завершала
 список идентифицирующих тер\-мов внутри фильтра
 "контекст($\ldots$)". Фильтры после данной группы располагать\-ся
 могут. Эта группа обрабатывается компилятором отдельно;
 возникающая для нее программа на ЛОСе выполняет идентификацию
 всей группы одновременно, учи\-ты\-вая имеющиеся связи между
 ее элементами.

 В некоторых случаях для определения целесообразности применения
 приема за\-ме\-ны бывает необходимо уточнить вид надтерма заменяемого
 терма. Чтобы иден\-ти\-фи\-ци\-ро\-вать этот надтерм с заданным термом $A$,
 в котором собственно заменяемый терм обозначен посредством
 служебного логического символа "теквхожд", при\-ме\-ня\-ет\-ся
 идентифицирующий терм "подтерм($A$)". Как и в случае
 идентифицирую\-ще\-го терма "вид($A_1 \ A_2$)", внутри $A$ могут
 находиться новые переменные, значение кото\-рых будет определяться
 при идентификации.

 Если требуется уточнить вид надтерма не заменяемого терма, а
 терма, рас\-по\-ло\-жен\-но\-го по какому-либо другому вхождению $v$, то в
 идентифицирующем терме "подтерм($A$)" \ вместо логического
 символа "теквхожд" \ используется терм "теквхожд\\ ($B$)", где $B$
 определяет вхождение $v$ одним из следующих способов:

 а) $B$ - переменная $x$, имевшая в ранее идентифицированной части
 единственное вхождение;

 б) $B$ - указатель вхождения в теорему "фикс($\ldots$)" \ (см.
 ниже подраздел "Опера\-тор\-ные выражения").

 \subsubsection{Использование идентифицирующих операторов}

 Для косвенной идентификации различных часто встречаемых отношений
 между объектами предметной области создаются специальные
 операторы ЛОСа, на\-зы\-ва\-е\-мые идентифицирующими операторами.
 Например, в геометрии введены: опера\-тор, перечисляющий все точки,
 для которых в контексте усматривается их принад\-леж\-ность заданной
 прямой; оператор, перечисляющий все прямые, для которых
 усматривается принадлежность им заданной точки; оператор,
 перечисляющий все прямые, для которых усматривается их
 перпендикулярность заданной прямой, и т.д. Эти операторы
 могут использовать простейшие логические переходы, извлекая новые
 объекты перечисления из имеющихся в контексте утверждений.
 Несколько подробнее о них будет сказано в разделе, посвященном
 указателям обработки ан\-те\-це\-ден\-тов теоремы. Однако, такие
 операторы могут возникать и при обработ\-ке компилятором фильтров
 приема. Именно, если группа утверждений $A_1, \ldots, A_n$,
 оп\-ре\-де\-ля\-ю\-щих отношения, допускающие обработку идентифицирующими
 операторами, объединяется внутри фильтра "контекст($\ldots$)" \ в
 идентифицирующий терм вида "усм\\ ($A_1 \ldots \ A_n$)", то компилятор
 обеспечит идентификацию новых переменных, встре\-ча\-ющ\-их\-ся в $A_1, \ldots,
 A_n$, с помощью идентифицирующих операторов.

 \subsubsection{Идентификация с использованием операции
 подстановки}

 Для работы с операцией подстановки служит идентифицирующий терм
 "ре\-зульт\-подст($A \ B \ C \ D$)". Здесь возможны два случая:

 а) $D$ - новая переменная, и тогда ей присваивается результат
 подстановки в терм, определяемый операторным выражением $C$,
 набора термов, определяемого операторным выражением $B$, вместо
 набора переменных, определяемого опера\-тор\-ным выражением $A$.

 б) $B$ - новая переменная, и тогда ей присваивается такой набор
 термов, под\-ста\-нов\-ка которого вместо набора переменных,
 определяемого операторным выражением $A$, в терм, определяемый
 операторным выражением $C$, дает терм, определяемый опера\-тор\-ным
 выражением $D$.

 \subsubsection{Операнды и подтермы}

 \begin{enumerate}

 \item Идентифицирующий терм "операнд($A \ B$)", как и одноименный
 оператор ЛОСа, может использоваться в двух вариантах: либо $A$
 есть операторное выра\-же\-ние, имеющее своим значением вхождение в
 терм, и тогда новая переменная $B$ идентифицируется как операнд
 этого вхождения, либо $B$ - операторное выра\-же\-ние, имеющее своим
 значением вхождение, и тогда новая переменная $A$
 иден\-ти\-фи\-ци\-ру\-ет\-ся как вхождение, непосредственным операндом
 которого является вхождение $B$.

 \item Идентифицирующий терм "позиция($A \ B$)" \ позволяет
 идентифицировать новую переменную $A$ с вхождением в терм либо
 набор, определяемый операторным выражением $B$.

 \item Идентифицирующий терм "подчинено($A \ B$)" \ аналогичен
 одноименному опе\-ра\-то\-ру ЛОСа. Если $A$ - операторное выражение,
 значением которого служит вхождение $v$ в терм, то новая
 переменная $B$ идентифицируется с вхождением строгого надтерма
 $v$; если $B$ - операторное выражение, значением которого служит
 вхождение $v$ в терм, то новая переменная $A$ идентифицируется с
 вхож\-де\-ни\-ем нестрогого подтерма $v$. В случае необходимости
 идентифицировать $B$ с вхождением нестрогого надтерма $v$ вместо
 терма "подчинено($A \ B$)" \ ис\-поль\-зу\-ет\-ся "Подчинено($A \ B$)".

 \item Идентифицирующий терм "вхождениетерма($A \ B \ C$)" \
 используется для иден\-ти\-фи\-ка\-ции переменной $C$ со вхождением
 терма, заданного операторным вы\-ра\-же\-ни\-ем $B$, в терм, заданный
 операторным выражением $A$.

 \item При работе с кванторной импликацией применяются
 идентифицирующие термы "антецедент($A \ B$)" \ и "консеквент($A \
 B$)". В них операторное выражение $A$ задает некоторую кванторную
 импликацию, а переменная $B$ идентифицируется, соответственно, с
 антецедентом либо консеквентом этой импликации.

 \end{enumerate}

 \subsubsection{Заголовки операндов}

 Идентифицирующие термы "символ($A \ B$)", "первыйсимвол($A \
 B$)", "вто\-рой\-сим\-вол($A \\ B$)", "предпоследсимвол($A \ B$)",
 "последнийсимвол($A \ B$)" \ используются для иден\-ти\-фи\-ка\-ции новой
 переменной $B$ с символом, расположенным по вхождению, задан\-но\-му
 операторным выражением $A$ либо по непосредственному операнду
 этого вхождения (соответственно, первому, второму, предпоследнему
 и последнему).

 \subsubsection{Условия на вхождения и термы, связанные с
 предметной областью}

 Такие идентифицирующие термы время от времени придется добавлять
 к данному списку, по мере того, как этого будут требовать новые
 предметные области. При этом понадобится расширять и компилятор
 ГЕНОЛОГа. Однако, это расширение весьма несложно - оно сводится
 к написанию небольших программ справочника "значение",
 обеспечивающего компиляцию идентифицирующих термов.

 \begin{enumerate}

 \item Идентифицирующий терм "алгебрвхождение($A \ B$)" \
 позволяет иден\-ти\-фи\-ци\-ро\-вать переменную $B$ с вхождением,
 расположенным внутри вхождения, задан\-но\-го операторным выражением
 $A$, и достижимым из него только через операции "умножение",
 "плюс", "минус", "модуль", "дробь", "равно", "меньше",
 "мень\-ше\-или\-равно", а также через основания степеней. Возможна
 обратная иден\-ти\-фи\-ка\-ция: операторное выражение $B$ задает
 некоторое вхождение $v$, а новая переменная $A$ идентифицируется
 с вхождением, внтури которого расположено $v$ и достижимым из $v$
 только через операции того же списка.

 \item Идентифицирующий терм "обобщмножитель($A \ B$)" \ позволяет
 иден\-ти\-фи\-ци\-ро\-вать переменную $B$ с вхождением, расположенным
 внутри вхождения, за\-дан\-но\-го операторным выражением $A$, и
 достижимым из него только через операции "минус", "умножение",
 "дробь", "модуль", а также через основания степеней.

 \item Идентифицирующий терм "обобщслагаемое($A \ B$)" \ позволяет
 идентифици\-ро\-вать переменную $B$ с вхождением, расположенным
 внутри вхождения, за\-дан\-но\-го операторным выражением $A$, и
 достижимым из него только через операции "умножение", "плюс",
 "минус", причем в этом смысле тупиковым.

 \item Идентифицирующий терм "тригаргумент($A \ B$)" \ позволяет
 идентифициро\-вать переменную $B$ с вхождением аргумента
 тригонометрической операции в терм, определяемый операторным
 выражением $A$.

 \item Идентифицирующий терм "кратныйаргумент($A \ B \ C$)" \
 позволяет иден\-ти\-фи\-ци\-ро\-вать переменную $C$ с целым числом
 (термом), при домножении на который тригонометрический аргумент -
 значение операторного выражения $B$ - об\-ра\-ща\-ет\-ся в
 тригонометрический аргумент - значение операторного выражения
 $B$.

 \item Идентифицирующий терм "частное($A \ B \ C$)" \ позволяет
 идентифицировать но\-вую переменную $C$ с частным целых чисел,
 являющихся значениями опе\-ра\-тор\-ных выражений $A$ и $B$.

 \item Идентифицирующий терм "видмногочлена($A \ B \ C$)" \
 проверяет, что терм, вхож\-де\-ние которого определяется операторным
 выражением $A$, при раскрывании скобок преобразуется к многочлену
 от переменной - значения операторного выражения $B$, и
 идентифицирует новую переменную $C$ со сте\-пенью этого мно\-го\-чле\-на
 (десятичным числом).

 \end{enumerate}

 \subsubsection{Элементы задачи либо обращения к пакетному
 оператору}

 \begin{enumerate}

 \item Идентифицирующий терм "посылка($A \ B$)" \ идентифицирует
 переменную $A$ с посылкой задачи $B$. Указание на задачу $B$ может
 отсутствовать. Если прием с данным фильтром применяется при сканировании
 задачи, то в этом случае берутся посылки текущей задачи; если же
 прием относится к пакетному опе\-ра\-то\-ру, то берутся посылки, указанные
 в обращении к оператору.

 \item Идентифицирующий терм "условие($A \ B$)" \ идентифицирует
 переменную $A$ с условием задачи $B$. Указание на задачу $B$
 может отсутствовать, и тогда берется текущая задача.

 \item Если требуется идентифицировать $A$ с еще не
 идентифицированной в приеме посылкой (условием) текущей задачи,
 то используется терм "новаяпосылка($A$)" \ (соответственно,
 "новоеусловие($A$)").

 \item Идентифицирующий терм "неизвестная($A \ B$)" \
 идентифицирует переменную $A$ с неизвестной задачи $B$. Если указание
 на задачу $B$ отсутствует, то берется текущая задача. Если $B$ -
 логический символ "вход", то текущая задача приема есть задача на
 исследование, и тогда берется ее внешняя задача на описание.
 Данный терм может применяться также в приемах нормализаторов и
 ана\-ли\-за\-то\-ров. Тогда $B$ отсутствует; в случае нормализатора для
 определения спис\-ка неизвестных используется комментарий
 (неизвестные $\ldots$) из списка ком\-мен\-та\-ри\-ев обращения к
 нормализатору. Компилятор обеспечивает создание таких
 комментариев при обращениях к нормализаторам, формат которых
 имеет эле\-мент "неизвестные".

 \item Идентифицирующий терм "цель($A \ B_1 \ldots B_n$)" \
 идентифицирует набор ($B_1 \ldots \\ B_n$) с целью ($C_1 \ldots
 C_n$) задачи $A$. При отсутствии $A$ берется текущая задача.
 Не\-ко\-то\-рые элементы $B_i$ набора ($B_1 \ldots B_n$) суть
 операторные выражения, опре\-де\-ля\-ю\-щие соответствующие разряды
 $C_i$; другие суть новые переменные, иденти\-фи\-ци\-ру\-емые с $C_i$.
 Требуется наличие хотя бы одной новой переменной (при этом
 возможен случай $n = 1$ - тогда $B_1$ просто идентифицируется с
 произволь\-ной целью задачи $A$). По умолчанию новые переменные
 идентифицируются с тер\-ма\-ми (предполагается, что на
 соответствующем разряде набора - цели также находится терм). Если
 требуется уточнить тип объекта, с которым должна быть
 идентифицирована переменная $x$, то соответствующее $B_i$ может
 иметь вид "переменная($x$)" \ (здесь $x$ идентифицируется с
 переменной) либо вид "терм($x$)" \ (здесь при идентификации $x$
 преобразуется к виду терма, даже если в со\-от\-вет\-ству\-ющем разряде
 цели находился не терм, а символ).

 \item Для идентификации переменной $A$ с надзадачей текущей
 задачи, имеющей тип $B$, используется идентифицирующий терм
 "надзадача($A \ B$)". Если $B$ есть логический символ 0, то $A$
 идентифицируется с произвольной надзадачей те\-ку\-щей задачи.

 \item Идентифицирующий терм "внешусловие($A$)" \ идентифицирует
 переменную $A$ с условием внешней задачи на описание, блоком
 анализа которой служит текущая задача на исследование.

 \item Идентифицирующий терм "обл($A$)" \ идентифицирует
 переменную $A$ с ут\-вер\-жде\-ни\-ем из области текущего вхождения в
 задачу.

 \end{enumerate}

 \subsubsection{Комментарии задач и пакетных операторов}

 \begin{enumerate}

 \item Идентифицирующий терм "комментариипосылки($i \ A_1 \ldots
 A_n$)" \ идентифици\-ру\-ет набор ($A_1 \ldots A_n$) с комментарием к
 терму задачи, идентифицированному с $i$ - м антецедентом ($i$ -
 символьный номер) теоремы, либо, при $i=0$, к текущему терму задачи.
 Некоторые из $A_j$ - новые переменные, которым присваивают\-ся
 соответствующие разряды комментария, остальные - операторные
 выражения, значения которых должны совпадать с соответствующими
 позициями ком\-мен\-та\-рия. Если новая переменная $x$ должна быть
 идентифицирована с переменной, то $A_j$ берется вида
 "переменная($x$)"; иначе, по умолчанию, новые перемен\-ные
 идентифицируются как термы.

 \item Идентифицирующий терм "комментарий($A_1 \ldots A_n$)" \
 идентифицирует набор ($A_1\\ \ldots A_n$) с комментарием к текущей
 задаче (если тип ее - "исследовать", то с комментарием к посылкам
 задачи; для приема пакетного оператора здесь берется комментарий
 из обращения к этому оператору). Некоторые из $A_j$ - новые
 переменные, которым присваиваются соответствующие разряды
 ком\-мен\-та\-рия, остальные - операторные выражения, значения которых
 должны совпадать с соответствующими позициями комментария. Если
 новая перемен\-ная $x$ должна быть идентифицирована с переменной,
 то $A_j$ берется вида "пе\-ре\-мен\-ная($x$)"; иначе, по умолчанию,
 новые переменные идентифицируются как термы.

 \item Идентифицирующий терм "примечание($A_1 \ldots A_n$)" \
 идентифицирует набор ($A_1\\ \ldots A_n$) с комментарием к списку
 посылок текущей задачи. Возможно ис\-поль\-зо\-ва\-ние данного терма в
 приеме пакетного оператора (комментарий и в этом случае берется к
 списку посылок текущей задачи). Некоторые из $A_j$ - но\-вые
 переменные, которым присваиваются соответствующие разряды
 комментария, остальные - операторные выражения, значения которых
 должны совпадать с соответствующими позициями отбираемого
 комментария. Если новая пере\-мен\-ная $x$ должна быть
 идентифицирована с переменной, то $A_j$ берется вида
 "переменная($x$)"; иначе, по умолчанию, новые переменные
 идентифицируются как термы.

 \end{enumerate}

 \subsubsection{Контекст точки привязки}

 \begin{enumerate}

 \item Идентифицирующий терм "внешоперанд($A$)" \ идентифицирует
 новую пере\-мен\-ную $A$ с еще не вовлеченным в идентификацию
 операндом той ассоциативно - коммутативной операции, с
 подмножеством операндов которой идентифици\-ро\-ван преобразуемый
 терм в приеме замены.

 \item Идентифицирующий терм "внешвхождение($A$)" \ идентифицирует
 новую пе\-ре\-мен\-ную $A$ при помощи оператора "внешвхождение" \ с
 вхождением, встре\-ча\-ю\-щим\-ся вне текущего вхождения в обрабатываемый
 нормализатором терм либо в один из термов списка $B$ комментария
 "внешвхождение $B$" \ к этому нор\-ма\-ли\-за\-то\-ру. Такие
 идентифицирующие термы применяются в нормализаторах,
 обеспечивающих выявление повторных вхождений подтермов
 специального ви\-да (например, подтермов с неизвестными). Эти
 повторные вхождения про\-сле\-жи\-ва\-ют\-ся во всей группе термов,
 получаемой добавлением обрабатываемого нормализатором терма к
 списку $B$ указанного выше комментария.

 \item Идентифицирующий терм "другоевхождение($A$)" \
 идентифицирует новую пе\-ре\-мен\-ную $A$ при помощи оператора
 "другоевхождение" \ с отличным от текущего вхождением в
 обрабатываемый нормализатором терм либо в один из термов списка
 $B$ комментария "внешвхождение $B$". Применяется в
 нормализаторах, обеспечивающих выявление повторных вхождений
 подтермов специального ви\-да.

 \item Идентифицирующий терм "внешконтекст($A$)" \ идентифицирует
 новую пе\-ре\-мен\-ную $A$ с вхождением $B_2$ из комментария
 "внешконтекст $B_1 \ B_2$" \ к текущему нормализатору. Последний
 комментарий вводится в тех случаях, когда при\-ме\-не\-ние
 нормализатора должно учитывать внешний контекст преобразуемо\-го
 терма. У него $B_2$ - вхождение преобразуемого нормализатором
 терма в не\-ко\-то\-рый "базовый" \ терм - условие или посылку задачи,
 обратившейся к нор\-ма\-ли\-за\-то\-ру, либо терм, преобразуемый внешним
 нормализатором.

 \item Идентифицирующий терм "внешкорень($A$)" \ идентифицирует
 новую перемен\-ную $A$ с термом, вхождение $B_2$ в который
 определяется комментарием "внеш\-кон\-текст $B_1 \ B_2$" \ к текущему
 нормализатору.

 \end{enumerate}

 \subsubsection{Наборы}

 \begin{enumerate}

 \item Идентифицирующий терм "входит($A \ B$)" \ идентифицирует
 новую перемен\-ную $A$ с элементом набора, определяемого
 операторным выражением $B$.

 \item Идентифицирующий терм "символ($A \ B$)" \ идентифицирует
 новую переменную $B$ с объектом, расположенным по вхождению,
 определяемому операторным выражением $A$.

 \item Идентифицирующий терм "заголовок($A \ B$)" \ идентифицирует
 новую пе\-ре\-мен\-ную $B$ с логическим символом либо переменной -
 первым элементом терма ли\-бо набора, определяемого операторным
 выражением $A$.

 \item Идентифицирующий терм "постпозиция($A \ B$)" \
 идентифицирует новую пе\-ре\-мен\-ную $A$ с вхождением в набор либо
 терм, расположенным не раньше вхож\-де\-ния в этот набор или терм,
 являющегося значением операторного выра\-же\-ния $B$.

 \item Идентифицирующий терм "новпозиция($A \ B$)" \
 идентифицирует новую пе\-ре\-мен\-ную $A$ с вхождением в набор либо
 терм, расположенным строго после вхож\-де\-ния в этот набор или терм,
 являющегося значением операторного выражения $B$.

 \item Идентифицирующий терм "ключ($A \ B \ C$)" \ идентифицирует
 новую пере\-мен\-ную $C$ с элементом набора, являющегося значением
 операторного выражения $A$, и представляющим собой либо логический
 символ, определяемый операторным выражением $B$, либо набор,
 начинающийся с такого логического символа.

 \item Идентифицирующий терм "биключ($A \ B \ C \ D$)" \
 идентифицирует новую пе\-ре\-мен\-ную $D$ с элементом набора,
 являющегося значением операторного вы\-ра\-же\-ния $A$, и
 представляющим собой набор, первый элемент которого есть
 логический символ - значение операторного выражения $B$, а второй
 элемент определяется значением операторного выражения $C$.

 \item Идентифицирующий терм "разряд($A \ B \ C$)" \
 идентифицирует новую пере\-мен\-ную $C$ с вхождением в набор либо
 терм, определяемый операторным выра\-же\-ни\-ем $A$ логического символа
 либо переменной, определяемых операторным выражением $B$.

 \item Идентифицирующий терм "серия($A_1 \ B_1 \ldots \ A_n \
 B_n$)" \ идентифицирует новые переменные $A_1, \ldots , A_n$ с
 элементами наборов - значений операторных выра\-же\-ний $B_1, \ldots,
 B_n$ - имеющими один и тот же номер $i; i = 1,2, \ldots$.

 \item Идентифицирующий терм "контрсерия($A_1 \ B_1 \ldots A_n \
 B_n$)" \ идентифицирует но\-вые переменные $A_1, \ldots , A_n$ с
 вхождениями в наборы, расположенными левее вхождений в эти наборы
 - значений операторных выражений $B_1, \ldots , B_n$ - на одно и
 то же число позиций $i; i = 0,1, \ldots$.

 \end{enumerate}

 \subsubsection{Логические конструкции, используемые в
 идентифицирующих термах}

 \begin{enumerate}

 \item Идентифицирующий терм "список($A \ B_1 \ldots B_n$)" \
 идентифицирует значение но\-вой переменной $A$ со значением одного
 из операторных выражений $B_1, \ldots, B_n$.

 \item Идентифицирующий терм "равно($A \ B$)" \ идентифицирует
 значение новой пе\-ре\-мен\-ной $A$ со значением операторного выражения
 $B$. Если $A$ имеет вид "зна\-че\-ние($F \ X$)", то идентифицируется
 терм, определяющий значения функции $F$.

 \item Идентифицирующий терм "новаяпеременная($A \ B$)" \
 идентифицирует новую пе\-ре\-мен\-ную $B$ с переменной, не входящей в
 список переменных, определяемый операторным выражением $A$.

 \item Идентифицирующий терм "перестановка($A \ B \ C \ D$)" \
 идентифицирует новые переменные $C$ и $D$ с парой операторных
 выражений $A$ и $B$ - в прямом либо обратном порядке.

 \item Идентифицирующий терм "или($A_1 \ldots A_n$)" \ позволяет
 осуществлять иден\-ти\-фи\-ка\-цию согласно одному из дизъюнктивных
 членов $A_i; i = 1, \ldots, n$. Каж\-дый такой член имеет вид $B_1
 \ \& \ \ldots \ \& \ B_m$, где $B_1, \ldots, B_m$ - набор
 иден\-ти\-фи\-ци\-ру\-ю\-щих термов и фильтров, а также указателей
 идентификации - как для фильт\-ра "контекст($\ldots$)".
 Идентификации подлежат общие для всех $A_1, \ldots, A_n$ но\-вые
 переменные.

 \item Идентифицирующий терм "значения($A \ B$)" \ позволяет
 провести иден\-ти\-фи\-ка\-цию для утверждения $A$ предметного уровня
 посредством пакетного синтеза\-то\-ра, предусмотренного для
 утверждений такого вида. $B$ - терм "посылки($C$)", определяющий
 дополнительные посылки $C$ обращения к синтезатору. Ут\-вер\-жде\-ние $C$ -
 конъюнкция этих посылок - также относится к предметному уров\-ню.
 Если дополнительные посылки не требуются, то терм $B$ отсутствует.

 \end{enumerate}

 \subsection{Операторные выражения}

 Операторные выражения используются для задания в фильтрах приемов
 различных объектов "структурного" \ уровня (термов, наборов,
 символов и т.п.). Их следует отличать от выражений, задающих
 объекты "предметного" \ уровня (числа, точки постранства, функции
 и т.п.). Последние выражения также могут использоваться в
 фильтрах, однако это происходит значительно реже и лишь в
 специально огово\-рен\-ных случаях.

 \subsubsection{Простейшие выражения}

 \begin{enumerate}

 \item Любой логический символ представляет собой операторное
 выражение; зна\-че\-ни\-ем его (за исключением приводимых ниже
 служебных слов) служит он сам.

 \item Любая теоремная переменная, либо вспомогательная
 переменная, опреде\-лен\-ная до этого некоторым идентифицирующим
 термом, представляет собой опе\-ра\-тор\-ное выражение. Тип значения
 этого выражения (терм, логический символ, вхождение, и т.п.)
 определяется компилятором ГЕНОЛОГа автоматически - в зависимости
 от контекста. Исключительные случаи, когда такое автомати\-чес\-кое
 доопределение типа необходимо уточнять вручную, указываются
 при описании различных контекстов использования операторных
 выражений.

 \item Логический символ "теквхожд" \ - служебный символ,
 обозначающий за\-ме\-ня\-е\-мый терм для приемов замены (в зависимости от
 контекста, этот символ может также обозначать вхождение
 заменяемого терма; далее аналогичные оговорки опускаем).

 \item Логический символ "корень" \ служебный символ, обозначающий
 текущий терм задачи; этот терм содержит точку привязки приема.

 \item Логический символ "вход" \ - служебный символ, используемый
 в фильтрах, сопровождающих обращение к нормализатору (см. ниже
 раздел, посвященный обращениям к нормализаторам), и обозначающий
 подлежащий нормализации терм.

 \item Логический символ "текущийуровень" \ - служебный символ,
 обозначающий те\-ку\-щий уровень текущей задачи.

 \item Логический символ "исходнаязадача" \ - служебный символ,
 обозначающий ис\-ход\-ную задачу, т.е. фиктивную задачу на исследование,
 при сканировании ко\-то\-рой запускается процедура интерфейса.

 \item Логический символ "посылки" \ - служебный символ,
 обозначающий список ут\-вер\-жде\-ний, образующих контекст реализуемого
 приема.

 \item Логический символ "текущаязадача" \ - служебный символ,
 обозначающий те\-ку\-щую задачу.

 \item Логический символ "внешописать" \ - служебный символ,
 обозначающий внеш\-нюю задачу на описание для текущей задачи на
 исследование.

 \item Логический символ "результат" \ - служебный символ,
 обозначающий за\-ме\-ня\-ю\-щий терм приема замены. Применяется как в
 приемах сканирования задачи, так и в приемах нормализаторов.

 \end{enumerate}

 \subsubsection{Численные выражения}

 \begin{enumerate}

 \item Операторное выражение "количествооперандов($A$)" \
 обозначает число (де\-ся\-тич\-ное) корневых операндов терма,
 определяемого операторным выражением $A$. Служебный символ
 "количествооперандов" \ используется для обозначения чис\-ла
 операндов заменяемого подтерма.

 \item Служебный символ "числонеизвестных" \ обозначает число
 неизвестных теку\-щей задачи либо текущего пакетного оператора.
 Операторное выражение "чи\-сло\-не\-известных($A$)" \ обозначает число
 (десятичное) неизвестных в терме, оп\-ре\-де\-ля\-е\-мом операторным
 выражением $A$.

 \item Для нахождения числа наборов объектов, удовлетворяющих заданному
 ус\-ло\-вию, используется логическая конструкция "число($A$)",
 аналогичная фильт\-ру "контекст($A$)". Здесь $A$ - список
 идентифицирующих термов, указате\-лей идентификации и фильтров,
 описывающих условия на объекты - значения но\-вых переменных,
 определяемых идентифицирующими термами из $A$. Значение
 операторного выражения представлено в формате десятичного числа.

 \item Если нужно не просто определить число наборов объектов,
 удовлтеворяющих заданному условию, но просуммировать по всем таким
 наборам значения за\-дан\-но\-го операторного выражения, то используется
 логическая конструкция "суммавсех($A \ t$)". Здесь, как и в предыдущем
 случае, $A$ есть список иден\-ти\-фи\-ци\-ру\-ющих термов, указателей
 идентификации и фильтров, описывающих условия на объекты -
 значения новых переменных. $t$ есть операторное вы\-ра\-же\-ние,
 определяющее суммируемые величины (десятичные числа).

 \item Возможно нахождение наибольшего общего делителя всех целых
 чисел, оп\-ре\-де\-ля\-емых заданным операторным выражением для
 всевозможных наборов объектов, удовлетворяющих заданному условию.
 Здесь используется кон\-ст\-рук\-ция "нод($A \ t$)"; $A$ - список
 идентифицирующих термов, указателей иден\-ти\-фи\-ка\-ции и фильтров,
 описывающих условия на объекты - значения новых переменных; $t$ -
 операторное выражение, определяющее указанные целые числа.

 Аналогичная конструкция "нок($A \ t$)" \ используется для
 нахождения наи\-мень\-ше\-го общего кратного.

 Если нужно определить наибольший общий делитель либо наименьшее
 общее кратное двух чисел, определяемых операторными выражениями
 $B$ и $C$, то используются, соответственно, операторные выражения
 "нод($B \ C$)" \ и "нок($B \\ C$)". Чтобы не было путаницы с
 указанными выше конструкциями "нод($A \ t$)" \ и "нок($A \ t$)",
 список $A$ должен начинаться с идентифицирующего терма либо с
 фильтра.

 \item Для сложения, вычитания и умножения чисел, определенных
 оператор\-ны\-ми выражениями $A$ и $B$, используются операторные
 выражения "плюс($A \ B$)", "вычитание($A \ B$)" \ и "умножение($A
 \ B$)". Здесь речь идет о десятичных числах. Для выполнения этих
 же операций над числами в символьной записи ис\-поль\-зу\-ют\-ся
 операторные выражения "плюссимв($A \ B$)", "вычитсимв($A \ B$)" \
 и "ум\-нож\-симв($A \ B$)". Заметим, что все перечисленные операции -
 строго двуместные; если число операндов более двух, то нужно
 использовать выражение мно\-го\-мест\-ной операции через двуместные.

 Чтобы изменить знак десятичного числа, определенного операторным
 вы\-ра\-же\-ни\-ем $A$, используется операторное выражение "минус($A$)";
 аналог для сим\-воль\-но\-го формата чисел здесь отсутствует.

 \item Номер (в формате десятичного числа) логического символа,
 определенного опе\-ра\-тор\-ным выражением $A$, задается операторным
 выражением "номерсимв($A$)". Чтобы определить номер переменной,
 задаваемой операторным выражением $A$, используется выражение
 "номерпеременной($A$)". Этот номер представлен уже в символьном
 формате.

 \item Операторное выражение "числзначение($A$)" \ имеет своим
 значением число в десятичном формате, определяемое константным
 числовым термом - значением операторного выражения $A$.

 \item Операторное выражение "длинанабора($A$)" \ имеет своим
 значением кон\-стант\-ный числовой терм, задающий длину набора,
 определяемого операторным вы\-ра\-же\-ни\-ем $A$. Чтобы определить
 десятичное число разрядов набора либо терма, определяемого
 операторным выражением $A$, используется операторное вы\-ра\-же\-ние
 "Длина($A$)".

 \item Операторное выражение "числочленов($A \ B$)" \ имеет своим
 значением число корневых операндов терма, определенного
 выражением $A$, если заголовок этого терма - логический символ
 $B$. Иначе это выражение имеет своим значением число 1.

 \item Для нахождения числа делителей целого числа - значения
 операторного вы\-ра\-же\-ния $A$ - используется операторное выражение
 "числоделителей($A$)".

 \end{enumerate}

 \subsubsection{Переменные и логические символы}

 \begin{enumerate}

 \item Для обозначения переменной, номер которой (символьное
 число) определя\-ет\-ся операторным выражением $A$, используется
 операторное выражение "икс($A$)". Для обозначения логического
 символа, номер которого (в формате десятичного числа)
 определяется операторным выражением $A$, используется операторное
 выражение "симвномер($A$)".

 \item Если требуется ввести набор переменных, не входящих в
 список переменных, определяемый операторным выражением $A$, и
 имеющий такую же длину, как набор - значение операторного
 выражения $B$, то используется операторное выражение
 "кортежпеременных($A \ B$)".

 \item Связывающая приставка терма, определяемого операторным
 выражением $A$, обозначается как "связприставка($A$)".

 \item Если операторное выражение $A$ определяет терм либо набор
 термов, то вы\-ра\-же\-ние "параметры($A$)" \ определяет список всех
 свободных переменных терма $A$ (термов набора $A$). Выражение
 "списокпеременных($A$)" \ определяет в этой же ситуации список
 всех вообще переменных, входящих в $A$ (либо в термы набо\-ра $A$).

 \item Если операторное выражение $A$ обозначает терм, то
 выражение "Неизвест\-ные($A$)" \ обозначает список всех
 неизвестных, входящих в этот терм.

 \end{enumerate}

 \subsubsection{Наборы}

 \begin{enumerate}

 \item Набор, образованный объектами - значениями операторных
 выражений $A_1, \ldots,\\ A_n$ - обозначается "набор($A_1 \ldots
 A_n$)".

 \item Для создания набора, перечисляющего без повторений объекты,
 удов\-лет\-во\-ря\-ю\-щие заданному условию, используется операторное
 выражение "перечисление($A \\ B$)". Здесь $A$ - список
 идентифицирующих термов, указателей идентификации и фильтров,
 описывающих условия на новые переменные (аналогично фильтру
 "контекст($A$)"); $B$ - операторное выражение с этими
 переменными, опреде\-ля\-ю\-щее перечисляемые объекты. Если тип
 значения выражения $B$ допускает различные варианты, то по
 умолчанию это значение определяется как ло\-ги\-чес\-кий символ либо
 символ переменной; чтобы явно указать, что рассматриваемый объект
 должен представлять собой терм, $B$ берется вида "терм($C$)", где
 $C$ собственно и определяет данный терм.

 \item Для создания набора, перечисляющего с возможными
 повторениями объекты, удовлетворяющие заданному условию,
 используется операторное выраже\-ние "выписка($A \ B$)" \ -
 аналогично выражению "перечисление($A \ B$)".

 \item Если требуется сформировать набор заданной длины, на каждой
 позиции ко\-то\-ро\-го находится один и тот же объект, то используется
 операторное выражение "бланк($A \ B \ C$)". Здесь операторное
 выражение $C$ пределяет некоторое сим\-воль\-ное число, причем длина
 формируемого набора на $C$ больше длины на\-бо\-ра $A$. Операторное
 выражение $B$ указывает объект, помещаемый на каждой позиции
 формируемого набора.

 \item Конкатенация наборов либо символов, определяемых
 операторными вы\-ра\-же\-ни\-ями $A_1, \ldots, A_n$, обозначается
 "конкатенация($A_1 \ldots A_n$)".

 \item Операторные выражения "вычеркивание($A \ B$)",
 "пересечениесписков($A \ B$)", "объединениесписков($A \ B$)", как
 и в ЛОСе, определяют, соответственно, ре\-зуль\-тат исключения из
 набора, определяемого операторным выражением $A$, элементов
 набора, определяемого операторным выражением $B$ (как и в ЛОСе,
 при исключении учитывается кратность вхождений - из $A$
 исключается лишь столько вхождений заданного элемента, сколько их
 есть в $B$); пересечение этих наборов (в $A$ сохраняются только
 те элементы, которые входят в $B$) и их объединение (к концу
 набора $A$ присоединяются все не входившие в него элементы набора
 $B$).

 \item Результат присоединения к началу набора, определяемого
 операторным вы\-ра\-же\-ни\-ем $A$, объекта, определяемого операторным
 выражением $B$, обозначается "префикс($B \ A$)"; результат
 присоединения $B$ к концу $A$ - "суффикс($A \ B$)". Результат
 вставки в набор $A$ перед позицией, определяемой выражением $B$,
 значения выражения $C$, обозначается "вставка($A \ B \ C$)".

 \item Результат отбрасывания первого элемента набора,
 определяемого операторным выражением $A$, обозначается
 "окончание($A$)". Результат исключения в наборе $A$ разряда либо
 группы разрядов, определяемых выражением $B$, обозначается
 "исключение($A \ B$)".

 \item Копия набора, определяемого операторным выражением $A$,
 обозначается "ко\-пия($A$)".

 \item Первый элемент терма либо набора, определяемого операторным
 выраже\-ни\-ем $A$, обозначается "начало($A$)"; последний элемент
 набора $A$ обознача\-ет\-ся "конец($A$)". Объект, расположенный на
 $i+1$ - м месте, считая от начала набора $A$, обозначается
 "левпозиция($A \ I$)", где $i$ - сивмольное число, являющееся
 зна\-че\-ни\-ем выражения $I$. Объект, расположенный на $i+1$ - м
 месте, считая с конца набора $A$, обозначается "правпозиция($A \
 I$)".

 \item Объект, расположенный в наборе, определяемом выражением $B$
 на пози\-ции, соответствующей позиции объекта - значения выражения
 $C$ в наборе, опре\-де\-ля\-е\-мом выражением $A$, обозначается
 "таблзначение($A \ B \ C$)".

 \item Набор объектов $X$, таких, что в наборе $a$ имеется пара
 $(b \ X)$, обознача\-ет\-ся "Ключ($A \ B$)"; здесь $A,B$ -
 операторные выражения, имеющие значения $a,b$.

 \end{enumerate}

 \subsubsection{Термы}

 \begin{enumerate}

 \item Чтобы задать терм $T$, полученный из некоторого терма $A$
 предметного уровня подстановкой в него вместо "теоремных" \
 переменных идентифицированных с ними подтермов, используется
 операторное выражение "терм($A$)". Если в $A$ имеются подтермы, к
 которым согласно описанию приема должный при\-ме\-нять\-ся цепочки
 нормализаторов либо вспомогательных задач, то при построении $T$
 эти подтермы подвергаются данной обработке.

 \item Иногда терм, который нужен в качестве значения операторного
 выражения, уже имеется в теореме. Чтобы не переписывать этот терм,
 используя при\-ве\-ден\-ную выше конструкцию "терм($\ldots$)", можно
 сослаться на его вхождение в теорему при помощи так называемого
 указателя вхождения в теорему - терма "фикс($n_0 \ n_1 \ldots
 n_k$)". Если теорема приема имеет вид "длялюбого($x_1 \ldots x_p$
 если $A_1 \ldots A_m$ то $A_0$)", то $n_0$ есть номер $i$ того
 утверждения $A_i$, в котором рас\-по\-ло\-же\-но рассматриваемое
 вхождение. При этом $(n_1 \ldots n_k)$ - последователь\-ность
 номеров операндов в $A_i$, определяющая путь от корня $A_i$ к
 данному вхожде\-нию (операнды нумеруются начиная с 1, слева
 направо; сначала выполня\-ет\-ся переход к $n_1$ - му операнду
 корневой операции $A_i$, затем к $n_2$ - му операнду данного
 операнда, и т.д.). Если заголовок теоремы приема отличен от
 квантора общности, то указатель вхождения перечисляет номера
 операндов прямо с кор\-не\-вой операции теоремы. Указатель вхождения
 в теорему терма $A$ заменяет опе\-ра\-тор\-ное выражение "терм($A$)" \
 и сам может рассматриваться как опе\-ра\-тор\-ное выражение. Оно
 является даже более сильным, чем "терм($A$)", так как в тех
 фильтрах, где нужно вхождение терма $A$, а не сам этот терм,
 в качестве значения выражения и берется такое вхождение (то, с которым
 было идентифицировано соответствующее вхождение $A$ в теорему).
 Заметим, что набирать вручную последовательность номеров $n_0,
 \ldots n_k$ из указателя вхож\-де\-ния не нужно - в интерфейсе
 редактора приемов предусмотрена возможность автоматического ввода
 этой последовательности после выделения клавишами курсора подтерма
 теоремы.



 \item Терм, сформированный из операндов, перечисляемых в наборе,
 явля\-ю\-щем\-ся значением операторного выражения $B$, при помощи
 заголовка - значения выражения $A$, обозначается "сборка($A \
 B$)". Если в случае одноэлементного набора $B$ заголовок $A$ не
 навешивается, а результатом служит сам элемент набора $B$, то
 используется операторное выражение "унисборка($A \ B$)".

 \item Если операторные выражения $A_1, \ldots, A_n$ определяют
 некоторые термы $a_1, \ldots,\\ a_n$, а операторное выражение $B$ -
 логический символ $b$, то операторное выра\-же\-ние "запись($B \ A_1
 \ldots A_n$)" \ определяет терм $b(a_1 \ldots a_n)$.

 \item Если операторное выражение $A$ определяет некоторый терм
 $f(t_1 \ldots t_n)$ либо вхождение первого символа такого терма,
 то операторное выражение "пер\-вый\-терм($A$)" \ определяет терм
 $t_1$, операторное выражение "второйтерм($A$)" \ - терм $t_2$,
 операторное выражение "предпоследтерм($A$)" \ - терм $t_{n-1}$ и
 операторное выражение "последнийтерм($A$)" \ - терм $t_n$.
 Наконец, операторное выражение "набороперандов($A$)" \ определяет
 набор термов $(t_1, \ldots, t_n)$.

 \item Если операторное выражение $A$ определяет вхождение первого
 символа не\-ко\-то\-ро\-го подтерма, то сам этот подтерм задается
 выражением "подтерм($A$)". Чтобы определить тот терм, вхождение в
 который задает выражение $A$, используется выражение
 "базавхождения($A$)".

 \item Если операторное выражение $A$ определяет вхождение первого
 символа не\-ко\-то\-ро\-го терма, а операторное выражение $B$ - вхождение
 корневого операнда этого терма, то выражение
 "исключениеоперанда($A \ B$)" \ определяет результат исключения в
 терме $A$ его операнда $B$ (если остается единственный операнд
 корневой операции, то корневая операция отбрасывается).

 \item Если операторное выражение $A$ определяет терм; операторное
 выражение $B$ - вхождение либо набор вхождений в $A$
 (упорядоченных слева направо), а операторное выражение $C$ -
 соответственно, терм либо набор термов (той же длины, что и $B$),
 то выражение "заменатермов($A \ B \ C$)" \ обозначает результат
 замены в $A$ вхождений $B$ на термы $C$.


 \end{enumerate}

 \subsubsection{Вхождения}

 \begin{enumerate}

 \item Если операторное выражение $A$ обозначает вхождение в терм
 либо в набор, то выражение "буква($A$)" \ обозначает объект,
 расположенный по этому вхожде\-нию.

 \item Если операторное выражение $A$ определяет набор, то
 выражение "левый\-край($A$\\ )" \ обозначает вхождение первого
 элемента набора $A$, а "правыйкрай($A$)" \ - вхождение последнего
 элемента набора $A$. Если, далее, операторное выраже\-ние $B$
 определяет символьный номер $i$, то выражение "окрестность($A \
 B$)" \ обоз\-на\-ча\-ет вхождение $i+1$ - го элемента набора $A$.

 \item Если операторное выражение $A$ определяет терм $f(a_1
 \ldots a_n)$ либо вхожде\-ние этого терма, то выражения
 "первыйоперанд($A$)", "второйоперанд($A$)",
 "пред\-пос\-ледоперанд($A$)", "последнийоперанд($A$)" \ обозначают
 вхождения операндов $a_1$, $a_2$, $a_{n-1}$, $a_n$
 соответственно.

 \item Если операторное выражение $A$ определяет вхождение в
 набор, то выражение "левсосед($A$)" \ определяет вхождение
 предыдущего элемента набора (если $A$ - вхождение первого
 элемента, то берется то же самое вхождение $A$). Выражение
 "правсосед($A$)" \ обозначает вхождение следующего элемента
 набора (если $A$ - вхождение последнего элемента, то берется оно
 само).

 \item Если операторное выражение $A$ определяет вхождение в
 набор, являющийся значением операторного выражения $B$, причем
 операторное выражение $C$ так\-же определяет набор, то выражение
 "соотвпозиция($A \ B \ C$)" \ обозначает вхож\-де\-ние в набор $C$
 разряда, имеющего тот же номер, что и разряд $A$ набора $B$.

 \item При идентификации антецедента вида $P(A \ B)$, где $P$ -
 симметричный и тран\-зи\-тив\-ный предикатный символ, может
 использоваться указатель "равно($i$)" \ ($i$ - символьный номер данного
 антецедента). Такой антецедент может быть усмотрен либо из явно
 присутствующего в контексте утверждения $P(A \ B)$, либо из двух
 утверждений $P(A \ C)$, $P(B \ C)$. В последнем случае $C$ -
 "стандартное обозначение" \ выражений $A,B$, а также, быть может,
 ряда других встреча\-ю\-щих\-ся в контексте выражений (в первом случае
 роль "стандартного обозначения" \ играет выражение $B$).
 Появление группы утверждений $P(\ldots )$, связываю\-щих $A,B,
 \ldots $ с их "стандартным обозначением", должно быть
 заблаговременно обес\-пе\-че\-но специальной стандартизацией. Чтобы в
 описании приема можно было анализировать не только выражения $A$
 и $B$, но и выражение $C$, использует\-ся операторное выражение
 "выражение($i$)", значением которого служит вхожде\-ние первого
 символа подтерма $C$ (фактически это вхождение второго операнда в
 использованное при идентификации утверждение $P(A \ C)$).

 \item Если $i$ - й антецедент теоремы был идентифицирован с
 посылкой либо услови\-ем задачи, то операторное выражение
 "вхождениепосылки($i$)" \ определяет вхож\-де\-ние этой посылки либо
 условия, соответственно, в список посылок либо условий. Здесь $i$
 - символьный номер.

 \end{enumerate}

 \subsubsection{Задачи}

 \begin{enumerate}

 \item Если операторное выражение $A$ обозначает задачу, то
 операторные выраже\-ния "цели($A$)", "списокусловий($A$)",
 "списокпосылок($A$)" \ обозначают, со\-от\-вет\-ствен\-но, список целей,
 список условий (используется только в ситуации, когда
 заблаговременно установлено, что $A$ - задача на описание) и
 список посылок задачи $A$. Возможно отбрасывание явного указания
 на задачу $A$ - тогда рас\-смат\-ри\-ва\-е\-мое операторное выражение
 становится логическим символом. В этой ситуации по умолчанию
 берется текущая задача.

 \item Если операторное выражение $A$ обозначает задачу, то
 операторные выражения "неизвестные($A$), "переменные($A$)" \
 обозначают, соответственно, список всех не\-из\-вест\-ных задачи $A$ (в
 него не включается заголовок "неизвестные" \ цели, пе\-ре\-чис\-ля\-ю\-щей
 неизвестные) и список всех переменных, встречающихся в задаче
 $A$. Возможно опускание явной ссылки на задачу, и тогда берется
 текущая задача.

 \item Если операторное выражение $A$ обозначает задачу, то
 операторное выражение "комментарии($A$)" \ обозначает список
 комментариев к задаче $A$ (которая не должна иметь типа
 "исследовать"). Возможно опускание явной ссылки на за\-да\-чу $A$, и
 тогда берется текущая задача. Данное операторное выражение (без
 ссылки на $A$) применяется также для приемов пакетных операторов
 - тогда оно имеет своим значением список комментариев обращения к
 данному опера\-то\-ру. Операторное выражение "комментариипосылок($A$)" \
 определяет аналогичным образом список комментариев к
 посылкам задачи $A$.

 \item Чтобы обозначить список комментариев к заданному условию
 задачи, оп\-ре\-де\-ля\-е\-мой операторным выражением $A$, используется
 выражение "коммента\-рии\-ус\-ло\-вия($A \ B$)". Здесь $B$ - либо
 символьный номер антецедента теоремы, идентифицированного с
 рассматриваемым условием, либо логический символ "корень" \
 (указатель на условие, в котором находится текущее вхождение
 ска\-ни\-ро\-ва\-ния задачи), либо операторное выражение, имеющее своим
 значением рассматриваемое условие. Возможно опускание явной
 ссылки на задачу $A$, и тогда берется текущая задача.

 \item Операторное выражение "комментариипосылки($A \ B$)" \
 совершенно аналогично выражению "комментарииусловия($A \ B$)" \ -
 оно обозначает список комментариев к посылке $B$ задачи $A$.

 \item Если операторное выражение $A$ обозначает задачу, то
 выражение "мак\-си\-маль\-ный\-уро\-вень($A$)" \ обозначает максимальный
 уровень этой задачи. Возможно от\-сут\-ствие явного указания на
 задачу $A$, и тогда берется текущая задача.

 \item Если операторное выражение $A$ определяет задачу на
 доказательство либо на преобразование, то выражение
 "условие($A$)" \ обозначает условие этой задачи. Возможно
 отсутствие явного указания на задачу $A$, и тогда берется текущая
 задача.

 \end{enumerate}

 \subsubsection{Обращения к справочникам}

 Результат обращения к справочнику определяется операторным
 выражением "спра\-вка($A \ B \ C_1 \ldots C_n$)". Здесь $A$ - тип
 справочника (логический символ); $B$ - логический символ, к
 программе которого происходит обращение (может задаваться
 про\-из\-воль\-ным операторным выражением); $C_1, \ldots, C_n$ -
 операторные выражения, определя\-ю\-щие сопутствующие данные
 обращения.

 \subsubsection{Определение типа объекта}

 Операторное выражение "типданных($A$)" \ определяет тип объекта,
 заданного опе\-ра\-тор\-ным выражением $A$: 0 - логический символ либо
 переменная, 1 - терм, 2 - вхождение, 3 - ошибка (ссылка на пустую
 зону), 4 - набор, не являющийся термом.

 \subsubsection{Условное выражение}

 Операторное выражение "вариант($A \ B \ C$)" \ определяет при
 истинном фильтре $A$ значение, задаваемое операторным выражением
 $B$, а при ложном - операторным выражением $C$.

 \subsection{Очередность проверки фильтров и дополнитель\-ные \\
 дейст\-вия при про\-вер\-ке}

 \subsubsection{Организация слежения за ситуацией, в которой
 ложный на текущий мо\-мент фильтр может оказаться истинным}

 Если условие фильтра $A$ не выполнено, но оно может оказаться
 выполненным при возникновении в списке посылок задачи одного из
 утверждений списка $B$, то при появлении таких посылок
 целесообразна повторная попытка применения приема. Ее можно
 организовать, например, понизив вес текущего терма (при
 сканировании которого была инициирована попытка применения
 приема) до заданной величины $P$. Указанные действия -
 организация слежения за появлением при решении задачи посылок
 списка $B$ и соответствующее переключение внимания - будут
 выполняться, если вместо фильтра $A$ поместить в описании приема
 фильтр "пересмотр($A \ B \ P$)".

 \subsubsection{Проверка истинности фильтра в конце программы
 приема}

 Проверка истинности некоторых фильтров приема оказывается
 достаточно тру\-до\-ем\-кой. В таких случаях ее выполнение
 целесообразно предпринимать лишь в самом конце программы приема,
 после применения более дешевых "отсекающих" \ средств. Чтобы
 указать компилятору на необходимость размещения программы фильтра
 $A$ в конце программы приема, этот фильтр преобразуется к виду
 "конец($A$)". Таким образом можно размечать лишь "корневые" \
 фильтры, не расположенные внутри более сложного фильтра.

 \subsubsection{Проверка истинности фильтра непосредственно перед
 обработкой за\-дан\-но\-го антецедента}

 В некоторых случаях проверку истинности фильтра следует выполнять
 не в нача\-ле программы приема (так как она сравнительно
 трудоемкая), но все же до существенно более трудоемкой обработки
 некоторого антецедента (например, передаваемого про\-ве\-роч\-ному
 оператору). В этих случаях для сообщения компилятору пожелания о
 данном размещении фильтра $A$ он преобразуется к виду
 "проверка($A \ i$)", где $i$ - символьный номер рассматриваемого
 антецедента. Таким образом размечаются лишь "корневые" \
 вхождения фильтров.

 \section{Типы указателей приемов}

 Перечислим типы используемых в ГЕНОЛОГе указателей приема -
 различных ин\-фор\-ма\-ционных элементов, уточняющих компилятору
 необходимую версию про\-грам\-мы приема.

 \subsection{Указатели идентификации}

 В подавляющем большинстве случаев логические конструкции,
 используемые в те\-о\-ре\-ме приема, не встречаются в задаче в чистом
 виде. Для усмотрения возможности применения данной теоремы обычно
 приходится применять специальные пре\-о\-бра\-зо\-ва\-ния встречающихся в
 задаче термов, "подгоняя" \ их под испольуемые в теореме выражения.
 При описании приема на ГЕНОЛОГе такие преобразования должны быть
 явно заданы - с помощью так называемых указателей идентификации.
 Ком\-пи\-ля\-тор ГЕНОЛОГа создает на основе этих указателей программу
 усмотрения за\-мас\-ки\-ро\-ван\-ных возможностей применения теоремы,
 существенно расширяя тем самым область применимости приема.

 \subsubsection{Вырожденные значения переменных}

 \begin{enumerate}

 \item Если теоремная переменная $x$ встречается в
 идентифицируемой части тео\-ре\-мы в качестве операнда таких операций
 $f(x \ Q)$, которые сводятся к $Q$ при специальном "единичном"
 значении $a$ переменной $x$, то использование ука\-за\-те\-ля
 "единица($a \ x$)" \ обеспечивает трансляцию приема, при
 которой иден\-ти\-фи\-ци\-ру\-е\-мый с $f(x \ Q)$ терм задачи $t$, не имеющий
 заголовка $f$, будет автомати\-чес\-ки представляться в виде $f(a \
 t)$; при этом $x$ будет идентифицироваться с $a$, а $Q$ - с $t$.
 Возможно объединение нескольких указателей "единица($a \ x_1$)",
 $\ldots$ "единица($a \ x_n$)" \ в один указатель "единица($a \
 x_1 \ldots x_n$)". Для использова\-ния данного указателя
 предварительно должен быть создан соответствующий паре $f,a$ прием
 справочника "единица". Пример использования указателя "едини\-ца" \
 - для идентификации квадратного трехчлена $ax^2 + bx+c$, у
 которого ко\-эф\-фи\-ци\-енты $a,b$ могут оказаться вырожденными -
 равными 1. В этом случае вместо указанных в записи общего вида
 квадратного трехчлена произведений $ax^2$ и $bx$ будут иметься
 некоторые выражения, не имеющие вида произведений. Чтобы
 компилятор мог воспринять их как произведения на единицу,
 вво\-дит\-ся указатель "единица($1 \ a \ b$)".

 \item Иногда в теореме используется ассоциативно - коммутативная
 операция, не\-ко\-то\-рые операнды которой при идентификации могут
 отсутствовать - в этом случае определенным параметрам таких
 отсутствующих членов при\-сва\-и\-ва\-ют\-ся наперед заданные константные
 значения (например, нулевое значение ко\-эф\-фи\-ци\-ен\-та в отсутствующем
 слагаемом). Чтобы обозначить такую ситуацию, используется
 указатель "подстановка($v \ x \ a$)". Здесь $v$ - указатель
 вхож\-де\-ния в теорему операнда ассоциативно-коммутативной операции,
 который может отсутствовать; $x$ - переменная (она должна иметь
 единственное вхождение в идентифицируемую часть); $a$ -
 логический символ, с однобуквенным термом ($a$) которого
 идентифицируется $x$ при отсутствии операнда $v$. Пример
 ис\-поль\-зо\-ва\-ния указателя "подстановка" \ - при задании вида
 кубического многочлена $ax^3 + bx^2 + cx + d$ уточняется, что
 члены второй либо первой степени могут отсутствовать.
 Соответственно, вводятся указатели "подстановка($K_1 \ b \ 0$)" \
 и "подстановка($K_2 \ c \ 0$)", где $K_1,K_2$ - указатели
 вхождения в теорему членов второй и первой степени. Такие
 указатели можно использовать одновременно с указателями "единица"
 \ для $a,b,c$. Различные указатели, затрагивающие иден\-ти\-фи\-ка\-цию
 одной и той же переменной, обычно можно вводить одновременно - кроме
 случаев, когда они явно противоречат друг другу.

 \item Если переменная $x$ идентифицируется как "общая часть" \
 нескольких вхож\-де\-ний ассоциативно-коммутативной операции $f$, то
 можно разрешить иден\-ти\-фи\-ци\-ро\-вать ее в случае пустой
 общей части с единицей этой операции. Для этого используется указатель
 "пустоеслово($x$)". Разрешается объединять несколько таких
 указателей в один указатель "пустоеслово($x_1 \ldots x_n$)".
 Обычно данный указатель не нужен - вместо него берется указатель
 "единица($a \ x$)". Однако, если в теореме имеется более двух
 операндов операции $f$, и нужно пред\-ус\-мот\-реть возможность вырожденной
 идентификации данной операции с выра\-же\-ни\-ем, не имеющим заголовка $f$
 (когда все операнды, кроме одного, обраща\-ют\-ся в единицу), то
 указатель "пустоеслово" \ дополняет указатель "единица".

 \end{enumerate}

 \subsubsection{Учет внешней одноместной операции либо связки}

 \begin{enumerate}

 \item Если одноместная операция $f$ удовлетворяет тождеству
 $f(f(X))=X$, то ука\-за\-тель "отрицание($f \ x_1 \ldots x_n$)" \
 определяет такую идентификацию переменных $x_i; i=1, \ldots, n$,
 при которой терм задачи $t$, идентифицируемый с $f(x_i)$,
 авто\-ма\-ти\-чес\-ки представляется в виде $f(f(t))$. Заблаговременно
 должен быть создан прием справочника "отрицание" \ для $f$.
 Пример применения данного указателя - идентификация в алгебре
 логики выражения, содержащего одновременно и переменную, и ее
 отрицание. Если выражение вида $a \vee \neg a \cdot b$ при
 идентификации снабдить указателем "отрицание(отр \ $a$)", то
 становится возможной иден\-ти\-фи\-кация $a$ с $\neg c$, а отрицания $a$ -
 с $c$. Здесь "отр" \ - логический символ для булева отрицания
 $\neg$.

 \item Если переменная $x$ имеет единственное вхождение в таком
 идентифицируемом подтерме $t(x)$ теоремы приема, что для
 одноместной операции $f$ выполнено тождественно $f(t(X)) =
 t(f(X))$, то указатель "заменазнака($f \ x$)" \ определяет
 идентификацию терма $t(x)$, при который идентифицируемый с ним
 терм вида $f(t(A))$ автоматически преобразуется к виду $t(f(A))$,
 т.е. внешний знак $f$ пере\-да\-ет\-ся переменной $x$. Подтерм $t(x)$
 определяется по идентифицируемому вхож\-де\-нию переменной $x$ как
 максимальный подтерм, для которого возможна ука\-зан\-ная передача
 знака $f$ по цепочке вложенных операций (используются при\-емы
 справочника "заменазнака" \ для этих операций, которые должны
 быть заблаговременно созданы). Возможна идентификация с передачей
 знака $f$ при наличии нескольких непересекающихся подтермов
 $t_1(x), \ldots , t_m(x)$. Несколько указателей "заменазнака($f \
 x_1$)", $\ldots$, "заменазнака($f \ x_n$)" \ могут быть
 объе\-ди\-не\-ны в один указатель "заменазнака($f \ x_1 \ldots x_n$)".
 Пример использования указателя "заменазнака" \ - идентификация
 квадратного трехчлена $ax^2 + bx + c$, у которого перед членами второй
 и первой степени могут стоять знаки "минус". В этом случае указатель
 "заменазнака(минус $a \ b$)" обеспечивает передачу данных минусов
 коэффициентам $a,b$.

 \item Если консеквент приема замены имеет вид "не($A$)", то по
 умолчанию будет идентифицироваться вхождение утверждения $A$,
 заменяемое приемом на кон\-стан\-ту "ложь". В тех случаях, когда
 требуется идентифицировать именно вхож\-де\-ние утверждения
 "не($A$)", заменяемое на константу "истина", применя\-ет\-ся
 указатель идентификации "прямойответ". Пример применения данного
 ука\-за\-те\-ля - приемы усмотрения истинности условий задачи на описание,
 име\-ю\-щих вид отрицания равенства нулю. Такие вспомогательные условия
 обычно воз\-ни\-ка\-ют при сопровождении основных условий по области
 допустимых зна\-че\-ний. В некоторый момент решения надобность в них
 отпадает, и тогда пред\-при\-ни\-ма\-ет\-ся попытка отбросить данные условия,
 предварительно убедившись в том, что они вытекают из прочих условий.
 Без указателя "прямойответ" \ данный прием предпринимал бы также попытку
 усмотрения ложности имеющихся в условиях уравнений с нулем в правой
 части, что нецелесообразно.

 \end{enumerate}

 \subsubsection{Перестановки операндов}

 \begin{enumerate}

 \item Если заменяемый терм приема тождественной либо
 эквивалентной замены (в том числе приема нормализатора) имеет вид
 $f(A_1 \ A_2)$, причем при иден\-ти\-фикации допустима перестановка
 операндов $A_1,A_2$ с одновременной пе\-ре\-ста\-нов\-кой операндов
 $B_1,B_2$ заменяющего терма $f(B_1 \ B_2)$, то используется
 ука\-за\-тель "дробь". Заменяющий терм может и не иметь вида $f(B_1 \
 B_2)$; тог\-да используется искусственное его представление в таком
 виде, использующее еди\-ни\-цу операции $f$. Пример использования
 указателя "дробь" \ - три\-го\-но\-мет\-ри\-чес\-кое сокращение с помощью
 тождества $a(\sin b)^n / c(\tan b)^n = a(\cos b)^n / c$. Ес\-ли
 ввести данный указатель, то сокращение будет выполняться и при
 перестанов\-ке числителя со знаменателем.

 \item Указатель "дробь($v \ w_1 \ldots w_n$)" \ обобщает
 указатель "дробь". У него $v$ - указа\-тель вхождения в теорему
 идентифицируемого терма $f(A_1 \ A_2)$, операнды ко\-то\-ро\-го $A_1$ и
 $A_2$ при идентификации могут быть переставлены; $w_1, \ldots,
 w_n$ - список указателей вхождений двуместных операций либо
 отношений, при иден\-ти\-фи\-ка\-ции либо формировании которых
 осуществляется синхронная с $v$ перестанов\-ка операндов. Пример
 использования данного указателя - декомпозиция строгого
 неравенства для произведения по теореме $0 \le a \rightarrow (0 <
 ab \leftrightarrow 0 < a \ \& \ 0 < b)$. Указатель "дробь(фикс(0
 1)фикс(0 2 2))" \ выделяет вхождения в теорему неравенства $0<ab$
 и неравенства $0<b$. При его наличии прием будет выпол\-нять также
 и декомпозицию неравенств вида $ab<0$ на $0<a, b<0$.

 \item Указатель "циклупорядочение($v$)" \ используется в тех
 случаях, когда иден\-ти\-фи\-ка\-ция терма $f(A_1 \ldots A_n)$,
 расположенного по указателю вхождения $v$, вы\-пол\-ня\-ет\-ся с
 возможными циклическими перестановками операндов $A_1, \ldots,
 A_n$. Если допускается лишь однократная циклическая перестановка,
 при которой перечисление операндов начинается со второго операнда
 $A_2$, то используется указатель "второйоперанд($v$)". Пример
 использования указателя "цикл\-упо\-ря\-до\-че\-ние" \ - идентификация
 утверждения "четырехугольник($ABCD$)", которую можно начинать с
 любой из расположенных по циклу вершин $A,B,C,D$. При\-мер
 использования указателя "второйоперанд" \ - идентификация
 утверждения "параллелограмм($ABCD$)" \ в той ситуации, когда
 достаточно различать лишь два случая - выделение пары параллельных
 сторон $AB,CD$ либо пары $BC,AD$.

 \item Указатель "контрсерия($v$)" \ используется в тех случаях,
 когда идентификация терма $f(A_1 \ldots A_n)$, расположенного по
 указателю вхождения $v$, выполняется с возможным изменением
 порядка операндов на противоположный. Если же, кроме этого,
 возможны также любые циклические перестановки операндов, то
 используется указатель "подобны($v$)". Пример использования
 указателя "кон\-тр\-серия" \ - идентификация утверждения
 "трапеция($ABCD$)", если в приеме нужно обеспечить возможности
 идентификации, симметричные относительно вертикального для
 трапеции направления. При этом одновременно рас\-смат\-ри\-ва\-ют\-ся два
 различных обозначения одной и той же трапеции - $ABCD$ и $DCBA$.
 Пример использования указателя "подобны" \ - идентификация
 утверждения "четырехугольник($ABCD$)" \ в тех приемах, где
 нужно учесть не только воз\-мож\-ные варианты обозначения $BCDA$,
 $CDAB$, $\ldots$, но и варианты $DCBA$, $CBAD$, $\ldots$.

 \item Указатель "множество($v$)" \ используется в тех случаях,
 когда идентифи\-ка\-ция терма $f(A_1 \ldots A_n)$, расположенного по
 указателю вхождения $v$, происходит с произвольной перестановкой
 операндов. Если данный терм определяет набор, идентифицируемый
 без учета порядка элементов (этот набор может задаваться явным
 перечислением элементов - "набор($A_1 \ldots A_n$)" \ либо
 косвенным образом - "префикс($A \ B$)", "конкатенация(набор($A_1
 \ A_2$)$B$)", где для идентификации выделяются один либо два
 элемента набора), то используется указатель "спи\-сок($v$)". Пример
 использования указателя "множество" \ - идентификация вы\-ра\-же\-ния
 "плоскость($ABC$)" \ без учета порядка точек $A,B,C$. Пример
 ис\-поль\-зо\-ва\-ния указателя "список(фикс(0 1 1))" \ - применение тождества
 "равно(перечень (конкатенация(набор($a \ a$) $b$)) перечень
 (префикс ($a \ b$)))" \ для исключения по\-вто\-ря\-ю\-щих\-ся элементов в
 списке, определяющем конечное множество. Этот указатель выделяет
 вхождение выражения "конкатенация(набор($a \ a$)$b$)", ко\-то\-рое
 идентифицируется с набором из задачи так, что различные позиции, на
 которых встречаются одинаковые элементы $a$, - произвольны.

 \item При идентификации операндов коммутативной операции по
 умолчанию учи\-ты\-ва\-ется возможность перестановки операндов. Кроме
 того, рассматриваются символы со специальной симметрией
 (см ниже), идентификация которых также по умолчанию производится
 с допустимыми перестановками операндов. Если же такую
 перестановку требуется заблокировать - для коммутативной
 не\-ас\-со\-ци\-а\-тив\-ной операции либо операции со специальной симметрией
 - то ис\-поль\-зу\-ет\-ся указатель "коммутативно($v$)"; $v$ - указатель
 вхождения в теорему этой операции.

 \end{enumerate}

 \subsubsection{Альтернативные заголовки подтермов}

 \begin{enumerate}

 \item В некоторых случаях теорема приема может быть
 модифицирована при одно\-вре\-мен\-ной замене заголовков операций либо
 отношений, расположенных на заданных вхождениях. Эти вхождения
 выделяются как в идентифицируемой части теоремы, так и в тех ее
 частях, которые определяют новые термы, соз\-да\-ва\-емые приемом.
 Возможность модификации определяется указателем
 "аль\-тер\-на\-тива($C_1 \ldots C_n$)", где каждое $C_i$ - группа
 операндов вида $A_1 \ldots A_m \ B$, при\-чем $A_1, \ldots, A_m$ -
 указатели вхождений в теорему термов, которые в мо\-ди\-фи\-ци\-ро\-ван\-ной
 теореме все имеют альтернативный заголовок $B$. Требуется, чтобы
 альтернативные заголовки имели одновременно все термы по
 указателям вхож\-де\-ний из $C_1, \ldots, C_n$. Если имеется
 несколько различных указателей "аль\-тер\-на\-ти\-ва($\ldots$)", то
 модификации теоремы согласно этим указателям осуществляются
 независимо (т.е. возможны любые их комбинации). При этом
 различные группы термов, выделенные в теореме данными
 указателями, не должны пересекаться друг с другом. В качестве примера
 рассмотрим теорему $0 \le \arctg(a) - \arctg(b) \leftrightarrow
 0 \le a-b$, определяющую прием исключения арктангенсов в неравенствах.
 Чтобы прием обрабатывал как нестрогие, так и строгие неравенства,
 вводит\-ся указатель "альтернатива(фикс(0 1)фикс(0 2)меньше)".

 \item Если в теореме выделяется вхождение операции либо
 отношения, для которого при идентификации допускается более
 одного альтернативного заголовка, то используется указатель
 идентификации "вариант($A \ B_1 \ldots B_n$)", где $A$ - ука\-за\-тель
 данного вхождения в теорему; $B_1, \ldots, B_n$ - список всех
 альтернативных заголовков. В качестве примера рассмотрим теорему
 "вершина($A,E$) \ \& \ лин\-втор\-по\-рядка($E$) $\rightarrow $ $A \in
 E$", определяющую прием вывода следствий в задачах по
 аналитической геометрии. Чтобы прием мог срабатывать на
 кривых второго порядка конкретных типов, вводится указатель
 "вариант(фикс(2)эллипс ги\-пер\-бола парабола)".

 \item Для некоторых ассоциативно-коммутативных операций $f$
 предусмотрена спе\-ци\-аль\-ная процедура, которая может при
 идентификации вводить искусственное представление терма в виде
 $f(A_1 \ldots A_n)$, даже если он первоначально не имел заголовка
 $f$. Например, степенное выражение при идентификации может
 рас\-смат\-ри\-вать\-ся как произведение двух других степенных выражений.
 Такие про\-це\-ду\-ры определяются справочником "пересечениесписков"
 \ (см. об этом спра\-воч\-ни\-ке в начале следующего подраздела, посвященного
 идентификации опе\-ран\-дов ассоциативно - коммутативных операций).
 Чтобы заблокировать про\-вер\-ку наличия у идентифицирующего терма
 заголовка $f$, в таких случаях ре\-ко\-мен\-дуется применять указатель
 идентификации "пересечениесписков($K_1 \ldots \\ K_m$)", где $K_1,
 \ldots, K_m$ - указатели вхождений в теорему идентифицируемых
 операций $f$. Отметим, что иногда такая блокировка выполняется
 компилятором ГЕНОЛОГа автоматически - например, при идентификации
 термов $f(x \ T)$, где переменная $x$ может принимать вырожденное
 "единичное" \ значение. Как правило, специальная блокировка нужна
 для операций $f$ с более чем двумя операндами.

 \item Если необходимо при идентификации выражения
 "частнпроизв($A_1 \ A_2 \ A_3$)" \ для частной производной
 автоматически приводить к виду "частнпроизв($B \ 1 \ C$)"
 \ выражения "производная($B \ C$)" \ для обычной производной, то
 используется указатель "частнпроизв".

 \end{enumerate}

 \subsubsection{Идентификация операндов ассоциативно - коммутативной
 операции}

 \begin{enumerate}

 \item При идентификации операндов ассоциативно - коммутативных
 операций может использоваться специальная процедура "пересечения"
 \ списков операндов двух операций, определяющая общую их
 переменную. Фактически это пока сделано лишь для вещественного и
 комплексного умножений - здесь "пересечение" \ по\-ни\-ма\-ется как
 определение некоторой версии наибольшего общего делителя двух
 одночленов. Однако, в компиляторе ГЕНОЛОГа предусмотрена общая
 кон\-струк\-ция, позволяющая при необходимости подключать и другие
 процедуры такого типа. Компилятор использует для определения данной
 процедуры по символу $f$ ассоциативно - коммутативной операции
 справочник "пе\-ре\-се\-че\-ние\-спис\-ков". Эта же процедура определяет
 "остаточные" \ после определения об\-щей части фрагменты (в случае
 умножения - частные от деления одночленов на их наибольший общий
 делитель). Такое усиление идентификации вводится по умолчанию. В
 тех редких случаях, когда оно не нужно и лишь замедляет рабо\-ту
 приема, применяется указатель идентификации "набороперандов($K_1
 \ldots K_n$)". Здесь $K_1, \ldots, K_n$ - указатели вхождений в
 теорему некоторых ассоциативно - коммутативных операций,
 обрабатываемых компилятором без применения указанных процедур.

 \item Приведем еще два способа отключения указанной выше усиленной
 иден\-ти\-фи\-кации. Первый из них связан с идентификацией логического
 символа $A$ - операнда ассоциативно - коммутативной операции $f$.
 Указатель идентификации "логсимвол($A \ f$)" \ означает, что $A$
 должно быть усмотрено "в чистом виде" \ как операнд этой
 операции. Если в случае умножения не применять данный указатель,
 то прием будет предпринимать попытку деления соответствующего
 одночлена на константу $A$. Второй способ - при идентификации
 переменной $x$ из пересечения наборов операндов нескольких
 одноименных ассоциативно - коммутативных операций использовать
 указатель "операнды($x$)" \ вместо явного перечисления в
 указателе "набороперандов($\ldots$)" \ вхождений этих операций.

 \item Если требуется идентифицировать переменную $X$ с
 результатом $f(B_1 \ldots B_m)$ выделения среди операндов $A_1,
 \ldots , A_n$ ассоциативно - коммутативной опера\-ции $f$
 подмножества всех операндов $B_i$, удовлетворяющих заданному
 условию, то используется указатель "перечень($X \ P(X)$)", где
 $P$ - условие на операнд $B_i$, в котором этот операнд обозначен
 посредством самой переменной $X$ (это усло\-вие сформулировано на
 том же языке, на котором определяются фильтры приемы). При
 использовании данного указателя предполагается, что переменная
 $X$ имеет ровно одно вхождение в идентифицируемую часть - в
 качестве операнда неко\-то\-рой ассоциативно - коммутативной операции
 $f$. В качестве примера рассмот\-рим теорему $a + b = c
 \leftrightarrow a = c - b$, используемую для перенесения в правую
 часть уравнения всех известных слагаемых $b$. Указатель
 "перечень($a$ не(известно($a$)\\ ))" \ определяет идентификацию
 переменной $a$ с суммой всех слагаемых, со\-дер\-жа\-щих неизвестные; тогда
 сумма остальных слагаемых идентифицируется с $b$.

 \item Если переменная $X$ имеет несколько вхождений в
 идентифицируемую часть, причем все они суть операнды различных
 ассоциативно - коммутативных опе\-ра\-ций с одним и тем же заголовком
 $f$, то возможна идентификация ее в виде $f(B_1 \ldots B_m)$, где
 $B_1, \ldots, B_m$ - пересечение всех подмножеств операндов $B$
 ука\-зан\-ных операций, удовлетворяющих условию $P(B)$. Для этого
 используется указатель "выписка($X \ P(X)$)". В качестве примера
 рассмотрим теорему $ab + ac = a(b+c)$, применяемую в
 нормализаторе выявления повторяющихся вхож\-де\-ний выражений с
 неизвестными и обеспечивающую вынесение за скобку лишь известных общих
 множителей слагаемых. Вынесение за скобку неизвестного множителя
 в таком нормализаторе может разрушить произведение с неиз\-вест\-ны\-ми
 сомножителями, встречающееся повторно в другой части преобразуемого
 терма, и поэтому нежелательно. Здесь используется указатель
 "выписка($a$ из\-вест\-но($a$))".

 \item Возможна идентификация переменной $X$ с коэффициентом,
 возникающим пос\-ле приведения нескольких "подобных членов". Эта
 переменная должна иметь единственное вхождение в идентифицируемую
 часть теоремы, причем внутри терма $f( \ldots g(X \ A) \ldots )$,
 где $f,g$ - ассоциативно - коммутативные операции; $A$ -
 некоторый терм. При идентификации значением $X$ становится терм
 вида $f(B_1 \ldots B_n)$, где $g(A \ B_1), \ldots , g(A \ B_n)$ -
 все операнды операции $f( \ldots g(X \ A) \ldots )$, множество
 $g$ - членов которых включает множество $g$ - членов терма $A$.
 Указа\-тель идентификации здесь имеет вид "группировка($X$)".
 В качестве приме\-ра рассмотрим идентификацию квадратного
 трехчлена $ad^2 + bd + c$ при раз\-ло\-же\-нии на множители. Cначала
 идентифицируется выражение $d^2$, и тем самым - ос\-но\-ва\-ние степени
 $d$, а затем группируются в $ad^2$ все слагаемые с $d^2$ и в
 $bd$ - все слагаемые с $d$. Используются указатели
 "группировка($a$)", "группировка($b$)".

 \item В случае обычных сложения и умножения идентификация
 коэффициента $X$, возникающего после приведения подобных членов,
 может быть усилена таким образом, чтобы коэффициенты извлекались
 также из дробных слагаемых (на\-при\-мер, коэффициент 2/3 из
 слагаемого $2A/3$). Переменная $X$ должна иметь единственное
 вхождение в идентифицируемой части - в слагаемом вида $AX$ либо
 $AX/B$. Она идентифицируется после идентификации $A$ и $B$, как
 сумма коэффициентов при $A$ (соответственно, при $A/B$) всех
 слагаемых рас\-смат\-ри\-ва\-емой суммы, представимых в таком виде.
 Указатель идентификации в данном случае имеет вид "коэффициент($X
 \ K$)", где $K$ - указатель вхождения в теорему слагаемого с
 переменной $X$.

 \item Иногда встречается несколько другая ситуация - требуется
 выделить груп\-пу "подобных членов", общий коэффициент $K$ которых
 уже известен. В этом случае внутри идентифицируемой части теоремы
 выделяется терм вида $g(\ldots f(\\ X \ A) \ldots)$, где $f,g$ -
 ассоциативно - коммутативные символы. Перед иден\-ти\-фи\-ка\-цией
 операнда $f(X \ A)$ терм, идентифицированный с $X$,
 представляется в виде $g(t_1 \ldots t_n)$, и указанный операнд
 идентифицируется с группой операндов $f(t_1 \ A), \ldots , f(t_n
 \ A)$ операции $g$. Указатель идентификации здесь имеет вид
 "группировки($X \ K$)", где $K$ - указатель вхождения в теорему
 операнда $f(X \ A)$. В качестве приме\-ра рассмотрим теорему
 $ab + bd = (a+d)b$, применяемую при разложении на множители в
 ситуации, когда выражение $b$, идентифицированное как сомножитель
 слагаемого $ab$, имеет вид суммы $b_1 + \ldots + b_n$, а выражение $bd$
 составляется при идентификации из слагаемых $b_1d, \ldots,
 b_nd$. Используется указатель "группировки($b$ фикс(0 1 2))".

 \item Если вместо операнда $f(X \ A)$ в предыдущем случае
 рассматривается операнд вида $f(X)$, который (уже после
 идентификации $X$ с $g(t_1 \ldots t_n)$) должен быть
 идентифицирован с группой $f(t_1), \ldots , f(t_n)$ операндов
 операции $g$ (при фор\-ми\-ро\-ва\-нии этих операндов двойные применения
 операции $f$ отбрасываются, т.е. предполагается истинным
 тождество $f(f(x)) = x$, то используется указатель идентификации
 "нормзнака($X \ f \ g$)". В качестве примера рассмотрим теоре\-му
 $a + b = 0 \ \& \ a - b = 0 \leftrightarrow a = 0 \ \& \ b = 0$,
 применяемую для тривиального упро\-ще\-ния системы двух уравнений.
 Сначала идентифицируется $a$, как общая часть групп слагаемых
 левых частей этих уравнений. Это позволяет идентифицировать $b$
 из первого уравнения - как сумму оставшихся слагаемых, а затем
 иден\-ти\-фи\-ци\-ро\-вать $-b$ во втором уравнении как сумму этих же
 слагаемых, взятых с обратными знаками. Используется указатель
 "нормзнака($b$ минус плюс)".

 \item Если переменную $X$ требуется идентифицировать с отдельным
 операндом ас\-со\-ци\-а\-тив\-но - коммутативной операции $f$, не прибегая
 к каким-либо группировкам, то используется указатель идентификации
 "операнд($X \ K$)". Здесь $K$ - ука\-за\-тель вхождения в теорему данной
 операции. Если в идентифицируемой части теоремы переменная $X$ имеет
 единственное вхождение (именно, как опе\-ран\-да рассматриваемой операции), то
 возможно указание вместо $K$ символа опе\-ра\-ции $f$.
 В качестве примера рассмотрим теорему $b \le 0 \rightarrow -b|a|
 = |ab|$, используемую для вынесения из-под модуля неположительных
 сомножителей. Если не ввести указатель "операнд($b$ фикс(0 2
 1))", то компилятор может идентифицировать с сомножителем не $b$,
 а переменную $a$, в то время как $b$, для которого и прове\-ря\-ет\-ся
 неположительность, будет идентифицироваться с произведением оставшихся
 сомножителей.

 \item Если переменная $X$ встречается в качестве операнда
 нескольких ассоциативно - коммутативных операций с общим заголовком $f$,
 то она по умолчанию иден\-ти\-фи\-ци\-ру\-ется как результат применения $f$
 к списку всех общих операндов этих операций, оставшихся после
 идентификации более явно обозначенных опе\-ран\-дов. Можно, однако,
 выделить лишь подмножество $M$ указанных ассоци\-а\-тив\-но -
 коммутативных операций, из рассмотрения которых и будет
 иден\-ти\-фи\-ци\-ро\-ваться $X$ - как пересечение только их остаточных
 операндов. Для этого используется указатель идентификации
 "пересечение($X \ K_1 \ldots K_n$)", где $K_1, \ldots, K_n$ -
 указатели вхождений в теорему операций подмножества $M$. В
 качестве примера рассмотрим теорему $ca^2 -2cab +cb^2 + da - db =
 (a - b)(d + ac - cb)$, применяемую для разложения на множители.
 Переменную $c$ здесь достаточно идентифицировать из рассмотрения
 слагаемых $ca^2,cb^2$, что и достигается с помощью указателя
 "пересечение($c$ фикс(0 1 1) фикс(0 1 3))".

 \item Иногда при идентификации ассоциативно - коммутативной
 операции $f(A_1 \ldots A_n)$ бывает нужно идентифицировать
 некоторое $A_i$ только с первым операндом соответствующей
 операции из идентифицируемого терма. Например, это может быть
 полезным при заменах рекурсивного типа - для отсечения попыток
 при\-ме\-нить рекурсию с участием внутреннего операнда, если она не
 удалась для первого операнда. Здесь используется указатель
 идентификации "первыйтерм(\\ $K$)"; $K$ - указатель вхождения в
 теорему операнда $A_i$. В качестве примера рассмотрим теорему
 "нечетнаяфункция($\lambda_x(f(x),h(x))$) \ \& \ нечетнаяфункция
 ($\lambda_x(g(x),h(x))$) $\rightarrow $
 нечетнаяфункция($\lambda_x(f(x)+g(x),h(x))$)", применяемую для
 усмотрения нечетной функции, являющейся суммой нечетных функций.
 Нет смысла перебирать всевозможные перестановки слагаемых - достаточно
 про\-вес\-ти рекурсию, рассматривая их лишь последовательно слева направо.
 Для этого служит указатель "первыйтерм(фикс(0 1 1))".

 \item Если в приеме замены заголовком заменяемого терма служит
 конъюнкция либо дизъюнкция, то по умолчанию она идентифицируется
 так, чтобы эту конъюнкцию либо дизъюнкцию можно было усмотреть из
 внешнего квантора общности (возможно, при перенесении некоторых
 антецедентов в консеквент) либо из внешнего отрицания
 двойственной логической связки. Чтобы за\-бло\-ки\-ро\-вать такой режим
 идентификации, используется указатель "дизъюнктопе\-ранд". В
 качестве примера рассмотрим теорему $a \in b \cup c \leftrightarrow
 a \in b \vee a \in c$, используемую для группировки известных
 выражений $b,c$ при неизвестном $a$ в условии задачи на описание.
 Такая группировка внутри квантора общности либо конъюнкции отрицаний
 принадлежности малополезна, и для отсечения этих случаев служит
 указатель "дизъюнктоперанд".

 \end{enumerate}

 \subsubsection{Одновременное изменение знаков операндов
 ассоциативно - ком\-му\-та\-тив\-ной операции}

 Если идентифицируется выражение вида $f(A_1 \ldots A_n)$, где $f$
 есть символ ассоциативно - коммутативной операции, причем
 одноместная операция $g$ удовлетворяет тождеству $g(g(x)) = x$,
 то при идентификации можно разрешить одновременное изменение
 "знака" \ $g$ у всех операндов $A_1, \ldots, A_n$. В тех случаях,
 когда указанное выражение является заменяемой частью некоторого
 тождества, при формировании заменяющего выражения также будет
 происходить одновременная замена знака $g$ у всех $f$ - членов. В
 противном случае данная альтернативная идентификация на
 формировании за\-ме\-ня\-ющих термов никак не сказывается. Указателем
 идентификации служит терм "знаксуммы($g \ K$)", где $K$ есть
 указатель вхождения в теорему выражения $f(A_1 \ldots \\ A_n)$.
 Возможно применение этого указателя внутри фильтра
 "контекст($\ldots$)" \ - тогда в качестве $K$ берется само
 выражение $f(A_1 \ldots A_n)$. В качестве примера рассмотрим
 теорему $a^2 + b^2 - 2ab = (a - b)^2$, применяемую для
 разложения на множители. Чтобы прием позволял разложить на множители
 также выражение $2ab - a^2 - b^2$, вводится указатель
 "знаксуммы(минус фикс(0 1))".

 \subsubsection{Идентификация кванторов и описателей}

 \begin{enumerate}

 \item В задачах обычно применяется стандартизация, при которой
 кванторная им\-пли\-ка\-ция с конъюнктивным консеквентом преобразуется
 в конъюнкцию нес\-коль\-ких кванторных импликаций. Все эти кванторные
 импликации имеют один и тот же список антецедентов. Чтобы при
 идентификации автоматически вы\-пол\-нять "сборку" \ ранее
 расформированных кванторных импликаций, исполь\-зу\-ет\-ся указатель
 "консеквент($A$)", где $A$ - указатель вхождения в теорему
 кон\-сек\-вен\-та идентифицируемой кванторной импликации. Этот
 консеквент будет идентифицироваться с конъюнкцией консеквентов
 всех кванторных импли\-ка\-ций из области идентификации, имеющих
 заданный список антецедентов (к моменту идентификации кванторной
 импликации все переменные ее анте\-це\-ден\-тов должны быть уже
 идентифицированы). Единственный прием, где пока используется
 такой указатель - доказательства индукцией по длине набора. К моменту
 применения этого приема в посылках задачи должны иметься кван\-тор\-ные
 импликации, определяющие априори известные свойства $i$ - го элемента
 набора, которые и группируются указанным выше образом.

 \item Если теорема приема замены представляет собой
 эквивалентность с квантором $K$ в заменяемой части, то можно
 усилить идентификацию, разрешая выделять $K$ либо отрицание $K$
 из квантора с более длинной связывающей приставкой путем
 группировки всех подкванторных утверждений, зависящих от
 пе\-ре\-мен\-ных некоторого подмножества этой приставки. Такое усиление
 обеспечивается указателем "кванторнаясвертка". В качестве примера
 рассмотрим теорему $a \subseteq b \leftrightarrow \forall c(c \in
 a \rightarrow c \in b)$, применяемую для перехода от кванторной
 импликации к условию включения множеств. При наличии указателя
 "кванторнаясвертка" \ прием будет выполнять такой переход в
 утверждении вида $\forall xy(x \in y \ \& \ y \in a \rightarrow
 x \in b)$, преобразуя его в утверждение $\forall y(y \in a
 \rightarrow  y \subseteq b)$ с помощью перегруппировки
 $\forall y(y \in a \rightarrow \forall x(x \in y \rightarrow x
 \in b))$.

 \item По умолчанию компилятор ГЕНОЛОГа организует идентификацию
 заменя\-е\-мо\-го квантора с попыткой усмотреть его отрицание в
 противоположном кванторе. Если такая идентификация нежелательна,
 то используется указатель "внеш\-ний\-кван\-тор($A$)", где $A$ -
 указатель вхождения данного квантора в теорему. Примеры
 использования указателя - приемы редактирования параметри\-чес\-ких
 описаний решений тригонометрических уравнений либо неравенств,
 где изначально предполагается использование именно квантора
 существования и нет смысла тратить время на анализ возможных
 вхождений в задачу кван\-то\-ров общности.

 \item Если в теореме приема встречается квантор либо описатель,
 то компилятор обеспечивает проверку невхождения переменных его
 связывающей приставки в термы, идентифицированные с
 подкванторными переменными - обычными либо функциональными, т.е.
 выражениями вида $f(x)$, не зависящими от этой связывающей
 приставки. Эту проверку можно отменить, используя указатель
 "обобщподст($A$)", где $A$ - указатель вхождения рассматриваемого
 квантора либо описателя в теорему. В качестве примера рассмотрим
 теорему приема $\neg (b = 0) \rightarrow set_x(a/b + c = 0 \ \& \
 A(x)) = set_x(a + bc = 0 \ \& \ A(x))$, применяемую для
 устранения знаменателей в уравнениях кривых либо плоскостей.
 Чтобы не перегружать теорему обозначениями $a(x),b(x),c(x)$,
 вместо них используются $a,b,c$, но зато введен указатель
 "обобщподст(фикс(0 1))".

 \item Указанную выше отмену проверки невхождения переменных
 связывающей при\-став\-ки можно сделать частичной. Указатель
 идентификации "содержится($x \ y_1 \\ \ldots y_n$)" \ выделяет те
 переменные $y_1, \ldots, y_n$, встречающиеся под квантором ли\-бо
 описателем по переменной $x$, которые могут идентифицироваться с
 тер\-ма\-ми, содержащими переменную, идентифицированную с $x$.

 \item Другой способ сделать отмену проверки невхождения
 переменных связывающей приставки частичной - указатель
 "Входит($x$)", определяющий ту переменную $x$ связывающих приставок,
 для которой не предпринимается проверка не\-вхож\-дения
 идентифицированных с ней переменных в термы, идентифицированные с
 прочими переменными под кванторами и описателями.

 \item При идентификации кванторов и описателей иногда бывает
 удобно выделить ряд конкретных переменных в связывающей
 приставке, а все оставшиеся пе\-ре\-мен\-ные сгруппировать в набор,
 обозначаемый в теореме приема единственной (условной) переменной
 $x$. Такой набор, в частности, может оказаться пустым. Данный
 режим вводится указателем идентификации "кортежпеременных($x$)".
 Заметим, что список выделяемых "штучным образом" \ переменных
 может быть пустым; в случае его непустоты такие переменные
 идентифицируются в свя\-зы\-ва\-ю\-щей приставке без учета порядка. В
 качестве примера рассмотрим теорему $set_x((f(x) \vee g(x)) \ \&
 \ h(x)) = set_x(f(x) \ \& \ h(x)) \cup set_x(g(x) \ \& \ h(x))$,
 использу\-е\-мую для перехода от дизъюнкции в условии принадлежности
 множеству к объединению множеств. Прием имеет указатель
 "кортежпеременных($x$)", что позволяет ему обрабатывать
 описания множеств наборов произвольной длины.

 \item Чтобы идентифицировать теоремную переменную $x$ с
 произвольным элементом связывающей приставки, без учета порядка
 ее переменных, применяется ука\-за\-тель "элемент($x$)".

 \item В теореме приема допускается использовать запись вида
 $\forall_x(f(x))$. Если со\-про\-во\-дить ее указателем "импликация($f$)",
 то выражение $f(x)$ идентифицируется со вспомогательным термом
 "то($A_0 \ A_1 \ldots A_n$)", где $A_0$ - консеквент; $A_1, \ldots ,
 A_n$ - антецеденты идентифицирующей кванторной импликации, расположенной
 в задаче. В заменяющем терме выражение $f(B)$ может быть
 использовано только непосредственно под квантором, где оно
 расформируется на антецеденты и консеквент. Данный указатель
 применяется лишь в приемах вывода теорем, обычно в сочетании с
 указателем "вхождение($f$)".

 \item Если внутри теоремы приема встречается кванторная импликация
  $\forall_x(A_1 \ \& \ \ldots \\ \& \ A_n \rightarrow A_0)$, у
  которой некоторое $A_i$ представляет собой функциональную
  переменную $F(x)$ либо обычную переменную $F$, и нужно
  идентифицировать его с отдельным антецедентом идентифицирующей
  кванторной импликации, то используется указатель "антецедент($F \ P$)".
  Здесь $P$ - указатель вхождения в теорему данной кванторной импликации.

  \item Иногда бывает удобно выделить в идентифицируемом
  кванторе единственную переменную $x$ связывающей приставки, а
  остальные переменные (которые могут иметься либо отсутствовать)
  вообще не указывать. Если в теореме формиру\-ют\-ся новые кванторные
  конструкции с $x$, то все отличные от $x$ переменные исходной
  связывающей приставки переносятся в них по умолчанию. Для такого
  режима служит указатель "связка($x$)".

 \end{enumerate}

 \subsubsection{Идентификация функциональных переменных}

 В теореме приема могут встречаться подтермы вида $f(x),
 f(x,y), f(x,y,z), \ldots$, где $f,x,y,z, \ldots$ - переменные. Во
 внутреннем логическом представлении (в скобочной записи) они
 соответствуют выражениям "значение($f \ x$)", "значение($f$ набор($x \ y$))", "значение($f$ набор($x \ y
 \ z$))", $\ldots$. Такие выражения называем функциональными
 пе\-ре\-мен\-ны\-ми. Для идентификации функциональной переменной
 предусмотрены пе\-ре\-чис\-ля\-е\-мые ниже указатели; при отсутствии этих
 указателей выражения "значение($f \\ \ldots$)" \ идентифицируются с
 имеющими заголовок "значение" \ термами задачи обыч\-ным образом.

 \begin{enumerate}

 \item Наиболее часто встречающийся случай - идентификация терма
 $f(x_1 \ldots x_n)$ с произвольным подтермом задачи $T$ (здесь
 $n$ может равняться 1, причем пе\-ре\-мен\-ные $x_1, \ldots, x_n$
 попарно различны). Если переменные $x_1, \ldots, x_n$ согласно
 другим фрагментам теоремы окажутся идентифицированы с некоторыми
 пе\-ре\-мен\-ны\-ми задачи $y_1, \ldots, y_n$, то далее $T$ начинает
 играть роль "шаблона": ос\-таль\-ные подтермы теоремы вида $f(t_1
 \ldots t_n)$, если они есть, при идентификации ли\-бо формировании
 новых термов получаются как результат подстановки в $T$ вмес\-то
 переменных $y_1, \ldots, y_n$ термов, определяемых по результатам
 идентификации термами $t_1, \ldots ,t_n$. Указатель на
 идентификацию данного типа имеет вид "ото\-бра\-же\-ние($f$)".
 Рекомендуется объединять несколько различных указателей та\-ко\-го
 типа в общий указатель "отображение($f \ g \ldots h$)". Заметим,
 что если в теореме $f$ встречается только в виде $f(x)$, то $x$
 может (до идентификации $f(x)$) быть идентифицировано не с переменной,
 а со списком переменных (на\-при\-мер, со связывающей приставкой квантора
 либо описателя). В качестве примера рассмотрим теорему $c =
 \lim_{x \to a}f(x) \ \& \ $ число($c) \ \& \ d = \lim_{x \to
 a}g(x) \ \& \ $ число($d) \rightarrow \lim_{x \to a}(f(x)+g(x)) =
 c+d$, используемую при вычислении предела суммы, если пределы
 слагаемых существуют и конечны. Наличие указателя "отображение($f
 \ g$)" \ позволяет идентифицировать $f(x),g(x)$ с произвольными
 выражениями, не обязательно даже содержащими переменную $x$.

 \item Если при идентификации терма $f(t)$ все переменные
 аргумента $t$ уже иден\-ти\-фи\-ци\-рованы так, что этот аргумент задает
 терм $T$ "в переменных задачи", то можно выделить в текущем
 (идентифицируемом с $f(t)$) терме $A$ все вхождения $v_1, \ldots,
 v_n$ подтерма $T$, и считать, что остальные вхождения в теорему
 термов $f(p)$ задают результаты замены в $A$ вхождений $v_1,
 \ldots v_n$ на определяемый ар\-гу\-мен\-том $p$ терм $P$. Такой режим
 вводится указателем "заменатермов($K$)", где $K$ - указатель
 вхождения в теорему терма $f(t)$. В качестве примера рассмотрим
 теорему $f(y) = a \rightarrow (a$ при $x=y$, иначе $f(x))=f(x)$,
 используемую для исключения условного выражения, у которого
 особый случай $x=y$ сводится к общему случаю. Указатель
 "заменатермов(фикс(0 1 3))" \ позволяет рас\-смат\-ри\-вать выражение,
 идентифицированное с $f(x)$, как шаблон для построения $f(y)$.

 \item Если необходимо потребовать, чтобы идентифицируемый с
 теоремным термом $f(t)$ терм задачи $A$ содержал переменную $X$
 только внутри вхождений терма $T$, определяемого аргументом $t$,
 то используется указатель "новаргумент($f \ x \ N$)".
 Предполагается, что к моменту идентификации $f(t)$ все переменные
 из $t$ уже идентифицированы, а теоремная переменная $x$
 идентифицирована с переменной задачи $X$. $N$ - либо логический
 символ "фикс", либо название нормализатора, применяемого к $A$
 перед попыткой выделения вхождений терма $T$. Такой нор\-ма\-ли\-затор
 в качестве входного комментария получает набор (новаргумент $T \
 X$); он пытается преобразовать "неявные" \ вхождения терма $T$ в терм
 $A$ в явные. Если $N$ = "фикс", то $A$ используется без
 преобразований. После проведения идентификации терма $f(t)$
 остальные вхождения в теорему термов $f(p)$ оп\-ре\-де\-ля\-ют результаты
 замены всех вхождений $T$ в преобразованный нормализа\-то\-ром $N$
 терм $A$ на терм $P$, определяемый аргументом $p$. В качестве
 приме\-ра рассмотрим теорему

 $$ \int \frac{(1-x^2)^{\frac{a-1}{2}}f(x)}{g(x)}dx =
 \lambda_x(h(x),\mbox{число}(x)) \rightarrow \int \frac{(\sin x)^a
 f(\cos x)}{g(\cos x)}dx =$$ $= \lambda_x (-h(\cos x), \mbox{число}(x))$,

 позволяющую вычислять неопределенный интеграл путем замены $\cos x = y$.
 Указатели "новаргумент($f \ x$ извлечение)", "новаргумент($g \ x$
 извлечение)" \ оп\-ре\-де\-ля\-ют попытки преобразования выражений $A,B$,
 идентифицируемых с $f(\\ \cos x)$, $g(\cos x)$, к виду, в котором
 переменная интегрирования $x$ встречалась бы только как $\cos x$.
 Для этого применяется нормализатор "извлечение", имеющий (в том числе)
 ряд несложных приемов перехода к косинусам.

 \item Указатель "новаргумент", введенный в предыдущем пункте,
 допускает об\-об\-щение на случай идентификации "многоместного" \
 теоремного терма $f(t_1 \ldots t_n)$. Здесь он уже имеет вид
 "новаргумент($f$ набор($x_1 \ldots x_m$) $N$)". Проверяется, что
 идентифицируемое с указанным термом выражение $A$ содержит
 переменные, идентифицированные с переменными $x_1, \ldots, x_m$,
 только внутри вхождений тер\-мов $t_1, \ldots, t_n$, все
 переменные которых заранее идентифицированы. В слу\-чае $m=1$
 символ "набор" \ перед переменной $x_1$ отбрасывается. После
 иден\-ти\-фи\-ка\-ции формирование термов $f(p_1 \ldots p_n)$
 осуществляется на основе выделения в $A$ вхождений термов
 $t_1, \ldots, t_n$.

 \item Еще одно обобщение указателя "новаргумент" \ связано с
 иден\-ти\-фи\-кацией, до\-пус\-ка\-ющей переобозначения связанных переменных.
 Это обобщение ис\-поль\-зу\-ет\-ся крайне редко (пока - лишь в приемах,
 связанных с решением диф\-фе\-рен\-ци\-альных уравнений порядка выше
 первого). По сравнению с предыдущим обобщением, здесь добавляется
 еще список $a_1, \ldots, a_n$, каждый элемент которого - либо
 переменная, либо 0. Если $a_i$ - переменная, то при выделении
 вхождения выражения $t_i$ в терме $A$ разрешается переобозначать
 ее внутри этого вхождения на переменную, свя\-зан\-ную внешним по отношению к данному
 вхождению кван\-то\-ром либо описателем. Если $a_i = 0$, то никакие
 переобозначения внутри $t_i$ не допускаются. После идентификации
 формирование термов $f(p_1 \ldots p_n)$ про\-ис\-хо\-дит с переобозначением
 переменных $a_i$ на те же связанные переменные. Указатель, вводящий
 данный режим идентификации, имеет вид "функ\-ар\-гу\-мент($f$
 набор($x_1 \ldots x_m$) набор($a_1 \ldots a_n$) $N$)". В качестве
 примера ситуации, где он может понадобиться, рассмотрим
 идентификацию терма $f(g'(x))$  с термом, имеющим вид второй производной
 $g''(x)$. Нормализатор $N$ преобразует вторую производную к виду
 повторной производной $g'(g'(x))$. На логическом языке эта
 запись выглядит как "производная(ото\-бра\-жение($y$ число($y$)
 производная(ото\-бра\-же\-ние($z$ число($z$) $g(z)$)$y$))$x$)".
 Внутренняя производная здесь берется в точ\-ке, обозначенной
 некоторой вспомогательной переменной $y$, связанной внешней
 производной. Поэтому при идентификации этой производной с
 $g'(x)$ по\-на\-до\-бит\-ся переобозначение $x$ на $y$.


 \item В ряде случаев требуется идентифицировать функциональную
 переменную с символом операции либо отношения. Здесь терм $f(t)$
 либо $f(t_1 \ldots t_n)$ (в ско\-боч\-ной записи последний представлен
 как "значение($f$ набор($t_1 \ldots t_n$))") иден\-ти\-фи\-ци\-руется с
 термом $F(T)$ либо $F(T_1 \ldots T_n)$, где $F$ - логический
 символ. После этого остальные "теоремные" \ термы вида
 $f(r)$,$f(r_1 \ldots r_n)$ определяют термы $F(R)$,$F(R_1 \ldots
 R_n)$. Указателем на данный режим идентификации служит
 "сим\-вол($f$)". Обычно этот указатель используется в приемах текстового
 анализатора либо в приемах логического вывода базы теорем.

 \item Если выражение $f(A)$ должно идентифицироваться с
 многочленом от $A$, то используется указатель идентификации
 "сммногочлен($f \ S$)". Здесь $S$ указывает на способ определения
 выражения $A$ при идентификации. Если $S$ - символ "неизвестные",
 то $A$ выявляется из рассмотрения всех содержащих неизвестные
 задачи или пакетного оператора множителей одночленов; если $S$
 есть теоремная переменная, то $A$ выявляется из всех содержащих
 идентифицированную с $S$ переменную множителей одночленов; если
 $S$ имеет вид "терм($T$)", то $A$ опре\-де\-ля\-ет\-ся операторным
 выражением $T$. Наконец, $S$ вообще может отсутствовать, и тогда
 $A$ выявляется из рассмотрения всех неконстантных множителей
 од\-но\-чле\-нов. Во всех перечисленных случаях (кроме случая явного
 указания $A$ посредством записи "терм($T$)") идентификация $f(A)$
 определяет как многочлен, так и выражение $A$. После такой
 идентификации остальные встречающиеся в теореме термы вида $f(B)$
 определяют многочлены с теми же коэффициентами, что и $f(A)$,
 примененные к выражению $B$. Если для выделенных указателями
 "сммногочлен($a \ x$)", "сммногочлен($f \ x$)" переменных $a,f$
 имеется антеце\-дент теоремы $a = \lambda_x(bx^c + f(x))$, причем этот
 антецедент - идентифицирующий (см. следующий раздел), то переменная
 $c$ будет идентифицироваться со степенью многочлена, переменная $b$ -
 с коэффициентом при старшем члене, а функ\-ци\-о\-наль\-ная переменная $f(x)$
 - с суммой оставшихся членов. В этом случае указатель
 "отображение($f$)" \ не нужен. Заметим, что здесь и далее в
 ука\-за\-те\-лях ГЕНОЛОГа под многочленами понимаются термы,
 имеющие вид мно\-го\-чле\-нов, а не формальные многочлены,
 рассматриваемые в алгебре.

 \item В некоторых случаях переменную $f$, идентифицированную
 обычным образом с термом $A$ (т.е. с использованием
 такого ее вхождения в теорему, которое не имеет вида $f(t)$),
 бывает необходимо использовать после этого как функ\-ци\-о\-нальную
 переменную. Выражения $f(r)$ либо $f(r_1 \ldots r_n)$ при этом
 будут оп\-ре\-де\-лять результаты замены в $A$ некоторых переменных $y$
 либо $y_1, \ldots, y_n$ на термы $R$ либо $R_1, \ldots, R_n$,
 соответствующие $r,r_1, \ldots, r_n$. Чтобы ввести такой режим,
 используется указатель идентификации "функция($f \ x$)" \ либо
 "функ\-ция($f$ набор($x_1 \ldots x_n$))". Теоремные переменные
 $x,x_1, \ldots, x_n$ должны быть иден\-ти\-фи\-ци\-рованы до формирования
 выражений $f(r),f(r_1 \ldots r_n)$ независимым об\-ра\-зом; они
 определяют указанные выше переменные задачи $y,y_1, \ldots, y_n$.

 \item Иногда бывает нужно идентифицировать с заданным теоремным
 выражением $t$ какой-то произвольный подтерм заданного терма задачи $T$ ,
 безотносительно к тому, где этот подтерм расположен внутри $T$.
 Тогда в теореме используется функциональная запись $P(x,t)$, где
 $P$ - вспомогательная переменная, в со\-че\-та\-нии с указателем
 "вхождение($P$)". Здесь переменная $x$ заранее иден\-ти\-фи\-ци\-рована
 с переменной либо со списком переменных. Теоремный терм $P(x,t)$
 идентифицируется с термом задачи $T$, а $t$ - с некоторым
 вхождением $v$ в $T$. В заменяющих фрагментах теоремы запись
 $P(A,B)$ далее используется для обозначения результата замены
 выделенного внутри $T$ вхождения $v$ на $B$, с одновременной
 подстановкой вместо всех остальных (не расположенных внут\-ри $v$)
 вхождений переменной либо переменных $x$ терма либо термов $A$.
 Чтобы в этой ситуации сослаться на результат подстановки терма
 $A$ вместо $x$ в конъ\-юнк\-цию всех утверждений из области вхождения
 $v$, используется запись $P(A)$. Если в теореме не используется
 нетождественная подстановка $A$ вместо $x$ (а такие невырожденные
 подстановки появляются обычно в приемах вывода теорем), то вместо
 $P(x,t)$ может быть использована запись $P(t)$.

 \item Указатель "функподст($f \ g$)" \ позволяет идентифицировать
 теоремные термы вида $f(g(A),B)$ либо $f(g(A))$. Предварительно
 переменная $g$ должна быть иден\-ти\-фи\-цирована с некоторой
 переменной $G$. Проверяется, что идентифици\-ру\-ю\-щий терм $T$ содержит
 переменную $G$ только в виде "значение($G \ldots$)". После
 иден\-ти\-фи\-кации формирование заменяющих термов $f(C,B)$ либо $f(C)$
 про\-ис\-хо\-дит путем замены всех вхождений выражений "значение($G
 \ldots $)" \ в $T$ на $C$. Данная идентификация применяется в
 приемах вывода теорем.

 \item Если нужно идентифицировать терм вида $f(A,B)$ с термом
 вида $F(X,Y)$ либо $G(F(X,Y))$, где $F,G$ - логические символы
 операций либо отношений, то при\-ме\-ня\-ется указатель
 "Бинарнаяоперация($f$)". $A,B$ идентифицируются с $X,Y$ без учета
 порядка этих операндов. Переменная $f$, рассматриваемая отдельно,
 считается идентифицированной с символом $F$.

 \item Если нужно идентифицировать терм вида $f(A_1 \ldots A_n)$,
 у которого $f$ - некоторая операция либо отношение, причем лишь
 единственный операнд $A_i$ содержит заданную переменную $x$, то в
 теореме приема можно использовать запись $F(A)$, сопровождаемую
 указателем "внешфункция($F, X$)". Здесь переменная $F$
 иден\-ти\-фи\-цируется с логическим символом $f$, переменная $X$
 заранее должна быть идентифицирована с $x$, а выражение $A$ будет
 идентифицироваться с тем опе\-ран\-дом, который содержал
 $x$.Соответственно, термы вида $F(B)$ будут фор\-ми\-ро\-ваться как
 результаты замены найденного операнда $A_i$ на $B$.

 \end{enumerate}

 \subsubsection{Идентификация операций над конечными семействами
 и кванторных им\-пли\-ка\-ций для конечных областей}

 \begin{enumerate}

 \item Пусть одноместная операция $F$ над семейством объектов
 возникла из дву\-мест\-ной ассоциативно-коммутативной операции $f$
 (например, "суммавсех" \ либо "произведениевсех" из двуместных
 сложения и умножения). Выражение $F$(ото\-бра\-жение($i$ и(целое($i$)
 меньшеилиравно($1 \ i$)меньшеилиравно($i \ n$))$P(i)$)), оп\-ре\-де\-ляющее
 результат применения данной операции к конечному семейству (фор\-муль\-ный
 редактор прорисовывает такое выражение, например, в случае
 сум\-ми\-ро\-вания, как $$\sum_{i=1}^n P(i)),$$ можно идентифицировать с
 термом задачи ви\-да $f(A_1 \ldots A_n)$ (в случае сум\-ми\-ро\-вания - с
 суммой $A_1 + \ldots + A_n$). Для этого используется указатель
 "развертка($K$\\ )", где $K$ - указатель вхождения в теорему данного
 выражения $F(\ldots)$. Пред\-при\-ни\-мается последовательная
 идентифи\-ка\-ция $P(i)$ с $A_1, \ldots, A_n$. При этом еще не
 идентифицированные переменные $g$, встречающиеся внутри терма $P(i)$
 в ви\-де $g(i)$, оказываются идентифици\-ро\-ва\-ны с термами "набор($B_1
 \ldots B_n$)"; здесь $B_j$ - терм, с которым была
 идентифици\-ро\-ва\-на $g(i)$ при рассмотрении $A_j$. Несколько
 различных указателей "развертка($K_1$)", $\ldots$,
 "развертка($K_m$)" \ можно объе\-ди\-нять в общий указатель
 "развертка($K_1 \ldots K_m$)". Чтобы при идентификации допустить
 вырожденный случай $n=0$, используется дополнительный указатель
 "пустоеслово($K$)". В качестве примера рассмотрим теорему
 $$\forall_i(i \in \{1, \ldots, n\}\rightarrow
 \mbox{конечное}(B(i))) \ \& \ A = \bigcup_{i=1}^n B(i) \rightarrow
 \mbox{конечное}(A),$$ применяемую в проверочном операторе
 усмотрения конечного множества. Ука\-за\-тель
 "развертка(фикс(2 2))" \ позволяет идентифицировать второй
 антецедент с произвольным равенством вида $A = B_1 \cup \ldots
 \cup B_n$; при этом одновременно идентифицируются число операндов
 $n$ и набор $B$.

 \item Указатель "развертка($K$)" \ можно использовать не только
 для уточнения ре\-жи\-ма идентификации, но и для того, чтобы новый
 терм согласно выражению $F$(отображение($\ldots$)) формировался
 как $f(A_1 \ldots A_n)$. Допускается объедине\-ние таких указателей
 формирования новых термов с указателями идентификации в общую
 запись "развертка($\ldots$)". Примером может служить теорема
 $$\mbox{периметр(фигура}(x))=\sum_{i=1}^n l(x(i)x(i(\mbox{mod} n)+1)),$$
 используемая для перехода к выражению периметра многоугольника,
 заданного набором $x$ своих вершин, в виде сумм длин его сторон.
 Здесь используется указатель "развертка(фикс(0 2))",
 обеспечивающий формирование "конкрет\-ной" \ суммы длин.

 \item Следующий способ применения указателя "развертка($K$)" \ -
 для идентификации терма "отображение($i$ принадлежит($i$ номера(1
 $n$)) $P(i)$)" \ с термом "набор($A_1 \\ \ldots A_n$)", определяющим
 конечный набор, либо для формирования второго терма по первому
 после идентификации из других источников всех его переменных.
 Заметим, что формульный редактор прорисовывает терм
 "отображение($\ldots$)" \ в виде $\lambda_i(P(i),i \in \{1, \ldots, n\})$.

 \item Особо выделен случай двуместной коммутативно -
 ассоциативной связки "и" \ - аналогом этой связки для семейства
 утверждений служит кванторная им\-пли\-ка\-ция "длялюбого($i$ если
 принадлежит($i$ номера($1 \ n$)) то $P(i)$)". Формульный редактор
 прорисовывает ее в виде $\forall_i(i \in \{1, \ldots,
 n\}\rightarrow P(i))$. Если такая им\-пли\-ка\-ция представляет собой
 антецедент теоремы приема, то указатель иден\-ти\-фи\-кации
 "развертка($K$)" \ определяет режим поиска в контексте
 идентифика\-ции группы утверждений $A_1, \ldots, A_n$,
 идентифицируемых последовательно с $P(i)$. Функциональные
 переменные $g(i)$ из $P(i)$ при этом идентифицируют\-ся так же, как
 в случае термов $F$(отображение($\ldots$)). Указатель
 "развертка($K$)" \ может ссылаться и на определяющую новый терм
 кванторную имплика\-цию приведенного выше вида, которая в этом
 случае порождает конъюнкцию $P(1) \\ \ \& \ \ldots \ \& \ P(n)$.
 Наконец, рассматриваемая кванторная импликация, являющаяся
 антецедентом теоремы, может быть выделена, кроме указателя
 "развертка($K$)", также некоторым указателем обработки
 антецедента (см. следующий раздел), определяющим режим проверки
 этого антецедента при помощи пакетного опе\-ра\-то\-ра либо
 вспомогательной задачи. В этом случае к моменту проверки дол\-жны
 быть идентифицированы все переменные антецедента, и
 проверка будет заключаться в последовательности обращений к
 указанным оператору либо задаче для $i=1, \ldots, n$.

 \item Возможна идентификация многочлена, определенного с помощью
 выражения "суммавсех(отображение($i$
 и(целое($i$)меньшеилиравно($1 \ i$)меньшеилиравно($i \
 n$)\\ )умножение(значение($A \ i$)степень($x$ плюс($i$
 минус(1))))))". Это выражение про\-ри\-со\-вывается формульным
 редактором как
 $$ \sum_{i=1}^n A(i)x^{i-1}.$$
 Здесь используется указатель идентификации "Многочлен($K$)", где
 $K$ - ука\-затель вхождения в теорему рассматриваемого выражения.
 Переменная $A$ при этом идентифицируется с термом "набор($C_1
 \ldots C_n$)", задающим коэффи\-ци\-ен\-ты многочлена $C_i$,
 упорядоченные по возрастанию степеней; переменная $n$ - с
 увеличенной на единицу степенью многочлена (термом). Все
 переменные вы\-ра\-же\-ния $x$ должны быть определены до идентификации
 данного многочлена.

 \end{enumerate}

 \subsubsection{Идентификация матриц}

 Матрицы задаются термами "строки($\ldots $)" \ либо
 "столбцы($\ldots$)", перечисляющими элементы матрицы,
 соответственно, по строкам либо по столбцам. Чтобы
 иден\-ти\-фи\-цировать с такой матрицей выражение $\lambda_{ij}
 (A(i,j),i \in \{1, \ldots , m\} \ \& \ j \in \{1, \ldots , n\})$,
 используется указатель "матрица($S$)", где $S$ - указатель
 вхождения данного вы\-ра\-же\-ния в теорему. Такой же указатель
 применяется, если на основе приведенного выше выражения нужно
 создать новый терм, обозначающий матрицу. Допуска\-ет\-ся объединение
 нескольких указателей "матрица($\ldots$)" \ в один, перечисляющий
 сразу все рассматриваемые указатели вхождений в теорему $S$.

 Если нужно идентифицировать матрицу из коэффициентов выражений
 заданного вида, встречающихся, например, в некоторой сумме, то
 для идентификации с суммой (или подобной многоместной операцией)
 используется выражение вида $F(\lambda_j(g(A(i,j)\\ ,B),P(j)))$,
 сопровождаемое указателем "развертка($\ldots$)", где $F$ -
 обобщение дву\-мест\-ной ассоциативно-коммутативной операции $f$ (аналога
 сложения) на наборы произвольной длины. Добавление указателя
 "коэфф($A$)"  обеспечивает идентфикацию $A$ как матрицы из
 коэффициентов $A(i,j)$. При отсутствии в сумме некоторых членов
 $g(\ldots)$ значение $A(i,j)$ идентифицируется с нулем операции
 $f$.

 \subsubsection{Дополнительная идентификация}

 Некоторые из теоремных переменных, а также некоторые переменные,
 встре\-ча\-ю\-щи\-еся в фильтрах приема, могут быть идентифицированы за
 счет "внешних" \ по отношению к тексту теоремы средств. Для такой
 дополнительной идентификации используется указатель
 "контекст($A_1 \ldots A_n$)", устроенный совершенно так же, как
 одноименный фильтр. Единственным отличием от фильтра здесь
 является то, что переменные, значения которых определяются в
 $A_1, \ldots, A_n$ посредством иден\-ти\-фи\-ци\-ру\-ющих термов, имеют
 своей областью действия не только данный указатель
 "контекст($\ldots$)", как это было в случае фильтра, а все
 описание приема. Эти пе\-ре\-мен\-ные, в частности, могут встречаться и
 в тексте теоремы, где они рассматриваются как уже
 идентифицированные. Такая переменная может отсутствовать в
 иден\-ти\-фи\-ци\-рующей части теоремы, но входить в ту ее часть, на
 основе которой формируются новые термы. В качестве простого
 примера рассмотрим теорему $\neg(i - j = 0) \rightarrow
 \mbox{card}(\mbox{set}_x(l(x)=2 \ \& \ \mbox{слово}(x) \ \& \
 x(i)=a \ \& \ P(x(j)))) = \mbox{card}(\mbox{set}_x(P(x)))$, исполь\-зу\-е\-мую
 для сведения числа пар $x$, у которых одна компонента фиксирована, а
 другая удо\-влет\-во\-ря\-ет некоторому условию $P$, к числу объектов,
 удовлетворяющих условию $P$. Здесь выражение $x(j)$ при идентификации
 $P(x(j))$ должно быть уже иден\-ти\-фи\-ци\-ро\-ва\-но. Для этого служит указатель
 "контекст(позиция($b$ теквхожд)вид($b$ значение($x \ j\\ $))не(равно($i
 \ j$)))", который усматривает вхождение данного выражения внутри
 за\-ме\-ня\-е\-мо\-го терма, определяя таким образом значение $j$. Будет ли
 переменная $x$ иден\-ти\-фи\-ци\-ро\-ва\-на по данному указателю, или
 непосредственно из теоремы (где она легко усматривается из
 связывающей приставки в $\mbox{set}_x(\ldots)$) - остается на
 усмотрение компилятора.

 \subsubsection{Формирование вспомогательных термов при
 идентификации}

 Если к моменту идентификации некоторого теоремного терма $A$ все
 его перемен\-ные уже идентифицированы, то $A$ определяет некоторый
 терм $B$, полученный из $A$ подстановкой вместо переменных
 идентифицированных с ними термов. Тогда по\-яв\-ля\-ет\-ся возможность не
 "накладывать" \ при идентификации терм $A$ на со\-от\-вет\-ству\-ю\-щий
 терм задачи $C$, а сформировать вспомогательный терм $B$ и затем
 проверить совпадение термов $C$ и $B$. Если подтермы терма $A$
 были снабжены указателями нормализации, то фактически $C$ будет
 сравниваться не с $B$, а с результатом при\-ме\-не\-ния к $B$ тех или
 иных дополнительных преобразований. Данный режим иден\-ти\-фи\-ка\-ции
 включается при наличии указателя "подтерм($K$)", где $K$ - либо
 указатель вхождения в теорему терма $A$, либо сам этот терм. В
 качестве примера рассмотрим теорему
 "таблица$\{;\lambda_i$(конст($a(i),b(i)),i \in \{1, \ldots ,n \})
 \} + $ таблица$ \{;\lambda_i$(конст($a(i),c(i)),\\ i \in \{1, \ldots
 , n \}) \} = $ таблица$\{;\lambda_i$(конст($a(i),b(i)+c(i)),i \in
 \{1, \ldots , n \}) \}$". На ней основан прием сложения двух
 функций, заданных таблицами на одном и том же множестве точек
 $a(i), i = 1, \ldots, n$. Эти точки идентифицируются по первому
 слагаемому, а при идентификации второго слагаемого выражения
 $a(i)$ рассматриваются как уже известные и просто сравниваются с
 идентифицирующими термами. Для такой иден\-ти\-фикации служит
 указатель "подтерм(фикс(0 1 2 1 1 3 1))", ссылающийся на
 вхож\-дение выражения $a(i)$ во второе слагаемое.

 \subsubsection{Идентификация квазиодноместных операций с помощью
 вспо\-мо\-га\-тель\-ных процедур}

 В некоторых разделах встречаются часто повторяющиеся одноместные
 операции $t(x)$, возникающие на основе многоместных при подстановке
 вместо части их опе\-ран\-дов констант. Например, в элементарной
 алгебре таковыми являются константные натуральные степени
 аргумента $x$: $x^2,x^3,x^4, \ldots$. Для идентификации таких
 "ква\-зи\-од\-но\-мест\-ных" \ операций $t(A)$ могут быть использованы
 специальные процедуры. Эти процедуры определяются справочником
 "вид" \ по заголовку терма $t(x)$, а сам справочник используется
 компилятором ГЕНОЛОГа таким образом, что по умол\-ча\-нию всегда,
 когда это возможно, указанные специальные процедуры применяются.
 В частности, при идентификации константных натуральных степеней
 применя\-ет\-ся процедура "выделениестепени".

 Для блокировки использования справочника "вид" \ при
 идентификации под\-тер\-мов, расположенных по указателям вхождения в
 теорему $K_1, \ldots, K_n$, применяется указатель идентификации
 "вид($K_1 \ldots K_n$)".

 Если необходимо передать вспомогательным процедурам, вводимым
 спра\-воч\-ни\-ком "вид" \ для идентификации подтермов по указателям
 вхождений в теорему $K_1, \ldots,\\ K_n$, некоторый комментарий, то
 используется указатель "выделениестепени($K_1 \ldots K_n \\ \ A_1
 \ldots A_m$)", где набор $A_1 \ldots A_m$ определяет данный
 комментарий ($A_1$ - логический символ, являющийся заголовком
 комментария; возможен случай $m=0$).

 \subsubsection{Выделение общей части нескольких термов при
 помощи вспомо\-га\-тель\-ных процедур}

 Если идентифицируется группа термов $B_1, \ldots, B_n$,
 содержащих общую переменную $x$, причем каждый из них, помимо
 $x$, имеет ровно одно вхождение единственной переменной
 (возможно, функциональной, т.е. выражения вида $f(t)$), не
 встреча\-ю\-щей\-ся более в идентифицируемой части теоремы, то для
 выделения "общей части" \ $x$ этих термов, а также идентификации
 остальных входящих в них переменных, может быть применена
 реализованная на ЛОСе вспомогательная процедура $P$. Эта
 процеду\-ра должна иметь формат $P$(х1 х2 х3), где значением
 входной переменной х1 служит набор термов, идентифицируемых с
 $B_1, \ldots, B_n$, значением выходной переменной х2 - набор
 термов, идентифицированных с отличными от $x$ переменными термов
 $B_1, \ldots \\ , B_n$, а значением выходной переменной х3 - терм,
 идентифицированный с $x$. Указа\-тель идентификации, определяющий
 данный режим, имеет вид "общаястепень($P \ x \\ B_1 \ldots B_n$)".
 Примером вспомогательной процедуры указанного типа служит
 про\-це\-ду\-ра "общаястепень(х1 х2 х3)", предназначенная для
 представления группы выраже\-ний в виде степеней с общим
 показателем $x$ (каждое выражение $B_i$ представ\-ля\-ет\-ся этой
 процедурой в виде произведения степеней; у каждой степени
 определя\-ет\-ся рациональный коэффициент показателя, и находится
 частное наибольших общих делителей числителей и знаменателей этих
 коэффициентов). Эта процедура ис\-поль\-зуется, например, в приеме с
 теоремой $$0 \le b \ \& \ 0 \le d \ \& \ 0 \le a \ \& \ 0 \le e \
 \& \ 0 < c \rightarrow (ab^c - ed^c = 0 \leftrightarrow
 a^{\frac{1}{c}}b - e^{\frac{1}{c}}d = 0),$$ осуществляющем
 извлечение корня степени $c$ из обеих частей равенства. Величина
 $c$ определяется как общий множитель показателей степени всех
 неизвестных со\-мно\-жи\-те\-лей частей этого равенства. Таких
 сомножителей в каждой части может быть несколько, причем каждый
 из них имеет вид степени. Для нахождения $c$ вводит\-ся указатель
 "общаястепень(общаястепень $c$ степень($b$ $c$) степень($d$
 $c$))".

 \subsubsection{Идентификация наборов}

 Если в теореме встречается терм вида "префикс($A \ B$)", то
 компилятор автоматичес\-ки обеспечивает такой режим идентификации,
 при котором этот терм мог бы иден\-ти\-фи\-цироваться как с выражением
 вида "набор($\ldots$)" \ (из него выбирается первый элемент для
 $A$, а остаток набора определяет $B$), так и с явным выражением
 вида "префикс($\ldots$)". Это же относится к термам вида
 "конкатенация(набор($A \ B \ldots C)D$)" \ и "суффикс($A \ B$)".
 Никаких специальных указателей при этом не используется.
 Фактически выделение нескольких первых либо последнего элемента
 набора обес\-пе\-чи\-вают операторы ЛОСа: "элементнабора",
 "элементномер", "Элементномер", "ос\-та\-токнабора" \ - для уточнения
 подробностей идентификации либо ее развития следует обращаться к
 программам этих операторов.

 Если в указанных выше случаях термы "префикс($A \ B$)",
 "конкатенация(набор($A \\ B \ldots C)D$)", "суффикс($A \ B$)" \
 выделены указателем "список($K$)" \ ($K$ - указатель вхождения
 такого терма в теорему приема), то порядок расположения элементов
 в наборе при идентификации игнорируется. В частности, при
 идентфикации тер\-ма "префикс($A \ B$)" \ будут последовательно
 предприниматься попытки иден\-ти\-фи\-ци\-ровать с $A$ каждый из
 элементов набора. В качестве примера использования ука\-за\-те\-ля
 "список" \ рассмотрим теорему $b \in a \rightarrow \{b;c\}
 \setminus a = \{;c \}\setminus a$, на которой основан прием
 "вычитания" \ множеств, заданных конечными списками. Заметим, что
 обозначениям формульного редактора $\{b;c\}$ и $\{;c\}$ в
 скобочной записи соответствуют выражения "перечень(префикс($b$
 $c$))" \ и "перечень($c$)" \ соответственно. Чтобы поиск элемента $b$,
 отбрасываемого из перечня ввиду его принадлежности вычитаемому
 множеству $a$, происходил по всем элементам перечня, в приеме
 введен указатель "список(фикс(0 1 1 1))", выделяющий вхождение
 подтерма "префикс($b$ $c$)".

 \subsubsection{Группировка всех слагаемых неравенства в одной
 части}

 Для идентификации неравенства вида $0 < A$ либо $A < 0$ может
 быть использован режим с автоматической группировкой всех
 слагаемых в одной части (такой же режим может быть введен и для
 идентификации нестрогих неравенств). Здесь ис\-поль\-зуется указатель
 "перегруппировка($B_1 \ldots B_n$)", где $B_1, \ldots , B_n$ -
 указатели вхож\-де\-ний в теорему всех неравенств, требующих данного
 режима идентификации. В качестве примера рассмотрим теорему
  $0 < a \ \& \ c < 0 \ \& \ 0 < ax+b \ \& \ 0 <
 cx+d \rightarrow 0 < ad - bc$, на которой основан прием,
 выводящий из двух неравенств их линейную комбинацию, в которой
 исключена переменная $x$. Чтобы избежать создания приемов для
 различных случаев размещения $x$ слева либо справа от знака
 неравенства, вве\-ден указатель "перегруппировка(фикс(3)фикс(4))".

 \subsubsection{Использование равенств из контекста
 идентификации}

 Если в теореме приема указано некоторое выражение $A$, которое
 при идентификации сравнивается с выражением $B$, не имеющим
 такого вида, то идентификация, все же, могла бы состояться, если
 бы в текущем контексте нашлась посылка $A=B$. Чтобы такие попытки
 усиления идентификации предпринимались, прием снабжается
 указателем "смравно($P$)", где $P$ - указатель идентифицируемого
 вхождения вы\-ра\-жения $A$ в теорему приема.



 \subsubsection{Уточнение порядка, в котором происходит
 идентификация}

 Через указатели можно в некоторой степени влиять на порядок, в
 котором прием будет идентифицировать значения переменных. Это
 может оказаться полезным для получения менее трудоемкой (с
 б\'ольшим отсечением на ранних шагах) процедуры идентификации. К
 числу таких указателей, уточняющих порядок идентификации,
 относится указатель "определено($K \ x$)". Он блокирует
 идентификацию подтерма - операнда ассоциативно - коммутативной
 операции, расположенного по указателю вхождения $K$, до тех пор,
 пока не будет идентифицирована переменная $x$. Некото\-рые другие
 указатели, от которых тоже зависит порядок идентификации, связаны
 с очередностью обработки антецедентов теоремы; они вводятся в
 следующем раз\-де\-ле.

 \subsection{Указатели обработки антецедентов теоремы}

 Антецеденты $A_1, \ldots A_n$ теоремы приема $\forall_{x_1 \ldots
 x_m}(A_1 \ \& \ \ldots \ \& \ A_n \rightarrow A_0)$
 предпо\-ла\-га\-ют\-ся занумерованными слева направо последовательными
 натуральными числами $1,2, \ldots, n$. Эти номера используются в
 указателях обработки антецедентов для ссы\-лок на антецеденты.

 \subsubsection{Непосредственная идентификация антецедентов}

 Если для обработки антецедента не предусмотрена специальная
 процедура, в со\-от\-вет\-ст\-вии с приводимыми далее указателями
 обработки, то прием пытается иден\-ти\-фи\-ци\-ровать его с некоторым
 утверждением, содержащимся в контексте иден\-ти\-фи\-кации. Это
 называется непосредственной идентификацией антецедента.

 Обычно контекст идентификации совпадает с областью вхождения в
 задачу точ\-ки привязки приема. Если прием был инициирован при
 рассмотрении вхождения в посылку, то такой контекст идентификации
 включает в себя все остальные посылки задачи; если прием был
 инициирован при рассмотрении вхождения в условие, то контекст
 идентификации включает в себя все остальные условия, а также все
 посылки задачи. Кроме того, в контекст идентификации будут входить
 относящиеся к области текущего вхождения подутверждения текущего
 терма задачи.

 Можно уточнять подмножество контекста идентификации, из которого
 берется идентифицирующее заданный антецедент утверждение.
 Указатель "списокпосылок(\\ $i_1 \ldots i_n$)" \ перечисляет номера
 $i_1, \ldots , i_n$ тех антецедентов, которые идентифицируются с
 посылками задачи; указатель "списокусловий($i_1 \ldots i_n$)" \ -
 номера тех антецедентов, которые идентифицируются с условиями
 задачи.

 \subsubsection{Проверка истинности антецедента с помощью
 проверочного оператора}

 \begin{enumerate}

 \item Указатель обработки "блокпроверок($i_1 \ldots i_n$)" \ указывает
 номера $i_1, \ldots, i_n$ тех антецедентов, для проверки
 истинности которых будут использоваться па\-кет\-ные проверочные
 операторы. Компилятор сам определяет заголовки этих опе\-ра\-торов,
 используя справочник "легковидеть". Каждый проверочный оператор
 сопровождается указанием вида $T$ утверждений, для проверки
 истинности ко\-то\-рых он предназначен. При указании на обработку
 антецедента проверочным оператором необходимо, чтобы уже имелся
 оператор для проверки утверждений данного вида. Простейший пример
 использования проверочных операторов для обработки антецедентов -
 основанный на теореме $0 \le a \ \& \ 0 \le b \rightarrow (a + b = 0
 \leftrightarrow a = 0 \ \& \ b = 0)$ прием декомпозиции уравнения
 с нулем в правой части и левой частью, представимой в виде суммы двух
 слагаемых одного знака. Для быстрого усмотрения неотрицательности
 слагаемого $a$ и суммы остальных слагаемых $b$ используется
 проверочный оператор "усмменьшеилиравно". Чтобы компилятор
 создал обращения к нему, вводится указатель "блокпроверок(1 2)".

 \item Для некоторых типов утверждений предусмотрена усиленная
 версия про\-ве\-роч\-ного оператора. Заголовок такого усиленного
 проверочного оператора опре\-де\-ля\-ется при помощи справочника
 "проверка", аналогичного справочнику "лег\-ко\-ви\-деть". Для ссылки на
 антецеденты, обрабатываемые усиленными прове\-роч\-ны\-ми операторами,
 используется указатель "проверка($i_1 \ldots i_n$)"; $i_1,
 \ldots, i_n$ - номера этих антецедентов.

 \item В ряде случаев бывает целесообразно в зависимости от
 контекста кор\-рек\-ти\-ро\-вать заголовок антецедента, указанный в
 теореме. Например, вместо проверки строгого неравенства может
 оказаться достаточной проверка нестрогого не\-ра\-вен\-ства. Чтобы
 прием мог выбирать необходимый проверочный оператор для такого
 антецедента (в указанном случае - оператор "усмменьше" \ либо
 "усмменьшеилиравно"), используется указатель "замещение($P \ i \
 A$)", который означает, что при выполнении условия $P$ заголовок
 антецедента с номером $i$, обрабатываемого проверочным
 оператором, заменяется на $A$.

 \item Иногда в качестве антецедента теоремы используется
 переменная (обычная либо функциональная, вида $f(x)$), которая
 идентифицируется из других фраг\-мен\-тов теоремы с некоторым
 утверждением. Организовать непосредственную проверку истинности
 такого утверждения проверочным оператором невозмож\-но, так как
 априори вид его не известен. Однако, здесь можно воспользоваться
 оператором "очевидно($\ldots$)", который с помощью справочника
 "легковидеть" \ пытается определить по виду предъявленного ему
 для проверки утверждения необходимый проверочный оператор и
 переадресует ему дальнейшую проверку. Чтобы предпринять такую
 обработку для антецедентов с номерами $i_1, \ldots , i_n$,
 применяется указатель "очевидно($i_1 \ldots i_n$)". В качестве
 примера рассмотрим теорему
 "семействомножеств($\lambda_a(f(a),g(a))) \ \& \ g(x) \rightarrow
  \mbox{set}(f(x))$)", на которой основан прием, усматривающий
  множество в элементе семейства множеств. Первый антецедент
  идентифицируется непосредственно; для обработки второго введен
  указатель "очевидно(2)".

  \end{enumerate}

  \subsubsection{Реализация антецедента с помощью пакетного
  синтезатора}

  Если группа антецедентов с номерами $i_1, \ldots , i_n$ должна
  обрабатываться од\-ним об\-щим пакетным синтезатором, то
  используется указатель обработки "значе\-ния($i_1 \ldots i_n$)".
  Компилятор определяет заголовок применяемого синтезатора с
  помощью спра\-воч\-ни\-ка "значения". Как и в случае проверочного
  оператора, синтезатор предназначен для обработки утверждений
  лишь специального вида, причем обработка заключается в нахождении
  значений выходных переменных, при которых эти утверждения
  ста\-но\-вят\-ся истинными. Вид списка $T_1, \ldots , T_n$
  обрабатываемых утверждений определя\-ет\-ся в описании формата
  синтезатора (см. справочник "синтезатор"). Среди перемен\-ных
  утверждений $T_1, \ldots ,T_n$ вы\-де\-лены входные - они должны
  быть уже иденти\-фи\-ци\-ро\-ваны к моменту об\-ра\-бот\-ки указанных
  антецедентов, а также выходные - их значения будут опреде\-лять\-ся
  в результате применения синтезатора. Заметим, что на "выходных"
  \ позици\-ях антецедентов, обрабатываемых синтезатором, могут
  стоять только обыч\-ные переменные (недопустимы даже
  функциональные переменные - вы\-ра\-же\-ния вида $f(x)$). В то время,
  как ссылки на антецеденты, обрабатываемые про\-ве\-роч\-ными
  операторами, объединяются в общий указатель
  "блокпроверок($\ldots$)", каж\-дое обращение к синтезатору требует
  своего указателя "значения($\ldots$)". В ка\-чест\-ве примера
  обработки антецедентов синтезаторами рассмотрим прием,
  основанный на теореме $b \le a \ \& \ a \le c \ \& \ d = [b] \
  \& \ 0 < d - c + 1 \rightarrow [a] = d$. Этот прием
  предпринимает попытку определения значения целой части путем
  получения верх\-ней и нижней численных оценок $b,c$ выражения $a$.
  Собственно нахождение этих оценок в нем выполняется
  синтезаторами "нижняяоценка" \ (первый антецедент) и верхняяоценка"
  \ (второй антецедент). Шаблон обраще\-ния к первому из них имеет
  вид $b \le a$, где $a$ - входная переменная, $b$ - выход\-ная;
  шаблон обращения ко второму име\-ет вид $a \le c$, где $a$ -
  входная переменная, $c$ - выходная. Компилятор сам определяет,
  какой из синтезаторов для какого антецедента нужно использовать
  - иденти\-фи\-ци\-ро\-ван\-ной на момент рас\-смот\-ре\-ния этих антецедентов
  является только переменная $a$, которая и рассмат\-ри\-ва\-ет\-ся как
  входная. Указатели обработки первых двух ан\-те\-це\-ден\-тов в дан\-ном
  приеме имеют вид "значения(1)", "значения(2)".

  \subsubsection{Идентифицирующий антецедент}

  Некоторые антецеденты теоремы приема могут вводить
  вспомогательный терм $T$ и затем идентифицировать его с заданным
  термом $B$. Они называются иден\-ти\-фи\-ци\-рующими антецедентами.
  Самый распространенный вид иденти\-фи\-ци\-рующего антецедента - "$A =
  B$". В этом случае терм $T$ определяется, с учетом указателей
  нормализации, заданных в приеме, по терму $A$. К моменту
  об\-ра\-бот\-ки антецедента все переменные терма $A$ должны быть уже
  идентифицированы. Расположение терма $A$ в левой либо правой
  части равенства несущественно. Если терм $B$ имеет хотя бы одну
  не идентифицированную переменную, то он будет идентифицироваться
  с термом $T$ так же, как, например, заменяемая часть какого
  - либо тождества идентифицируется с подтермом текущего терма задачи.
  В простейшем случае, если $B$ является пе\-ре\-мен\-ной, то эта переменная
  будет идентифицирована с $T$. Таким образом в теоремах приемов
  часто вводятся вспомогательные обозначения для громоздких либо
  встре\-ча\-ю\-щих\-ся несколько раз выражений. Если же все переменные
  терма $B$ иден\-ти\-фи\-ци\-ро\-ва\-ны, то он, как и $A$, определяет некоторый
  терм $T'$. Тогда обработка антецедента сводится к сравнению $T$ и $T'$.

  Идентифицирующий антецедент может также иметь вид дизъюнкции
  нес\-коль\-ких равенств - $A_1 = B_1 \vee \ldots \vee A_n = B_n$.
  Здесь предпринимаются альтернатив\-ные попытки идентификации
  термов $B_1, \ldots, B_n$ с термами, определенными по $A_1,
  \ldots , A_n$. Как и выше, порядок размещения частей равенств
  несущественен. Наконец, возможно применение идентифицирующего
  антецедента "при\-над\-ле\-жит($x$ номера($m$ $k$))", ко\-то\-рый
  последовательно идентифицирует переменную $x$ с десятичными
  записями чисел $m, m+1, \ldots , k$. Такой антецедент
  применяется только в случаях, когда переменные $m,k$
  идентифицируются с десятичными записями целых чисел. Для
  выделения иден\-ти\-фи\-ци\-рующих антецедентов ис\-поль\-зу\-ется указатель
  обработки "идентификатор($i_1\\ \ldots i_n$)", перечисляющий все
  их номера $i_1, \ldots , i_n$. В качестве примера рассмотрим
  теорему для нахождения корней квадратного уравнения:

  $d = b^2+4ac \rightarrow ax^2+bx=c \leftrightarrow \neg(a=0) \
  \& \ 0 \le d \ \& \ (x = \frac{\sqrt d -b}{2a} \vee x =
  -\frac{\sqrt d + b}{2a}) \vee bx = c \ \& \ a = 0$.

  Ее единственный антецедент вводит обозначение $d$ для
  дискриминанта, которое далее используется в теореме несколько
  раз. В действительности, с учетом нор\-ма\-ли\-за\-то\-ров приема,
  в данном антецеденте происходит и вычисление дис\-кри\-ми\-нанта -
  упрощение его и попытка разложения на множители. Указатель
  обработ\-ки антецедента здесь имеет вид "идентификатор(1)".

  Если идентифицирующий антецедент $A = B$ применяет к
  сформированному по терму $A$ утверждению $T$ нормализаторы либо
  вспомогательные задачи на описание, то это утверждение может
  принять вид дизъюнкции нескольких подутверждений - "подслучаев".
  Чтобы рассматривать такие подслучаи по отдельности, вво\-дит\-ся
  специальный режим идентификации терма $B$ не со всей дизъюнкцией
  $T$, а с от\-дель\-ны\-ми ее членами. Такой режим допустим для приема,
  выполняющего эквивалентную замену, причем итоговый заменяющий
  терм будет формироваться как дизъюнкция тех вариантов
  "теоремного" \ заменяющего терма, которые соответствуют
  отдельным подслучаям. Данный режим может быть применен сразу к
  нескольким пере\-чис\-ля\-ю\-щим подслучаи идентифицирующим антецедентам
  с номерами $i_1, \ldots, i_n$. Со\-от\-вет\-ству\-ю\-щий указатель
  обработки антецедентов имеет вид "дизъюнктчлен($i_1 \ldots
  i_n$)". Он вводится в дополнение к указателю
  "идентификатор($\ldots $)", также выделяющему эти антецеденты.
  Примеры его использования можно найти в подразделе базы приемов,
  посвященном дифференциальным уравнениям. Идентифицирующий
  антецедент при\-меняется для обращения к задаче на описание,
  решающей некоторое вспомогательное дифференциальное уравнение; по
  различным подслучаям решения этого вспо\-мо\-га\-тель\-но\-го уравнения
  определяются решения основного уравнения, и далее они
  объ\-е\-ди\-ня\-ют\-ся в общую дизъюнкцию.

  Иногда бывает необходимо формировать некоторый вспомогательный
  терм $A$, используемый приемом, в два этапа: сначала ввести
  новую переменную $x$ и пре\-об\-ра\-зо\-вать с помощью нормализаторов
  либо вспомогательных задач терм $t(x)$ к требуемому виду $r(x)$
  (например, разложить на множители), а затем для получения $A$
  подставить в $r(x)$ вместо $x$ заданное выражение $P$. Чтобы
  обеспечить такой режим, вводятся дополнительный антецедент $x =
  P$ и указатель "свертка($x \ F$)". Антецедент $x = P$ снабжается
  при этом стандартным указателем "идентификатор($i$)". Пе\-ре\-мен\-ная
  $x$ будет идентифицироваться как новая переменная, причем
  нормализа\-то\-ры, обрабатывающие термы с $x$, снабжаются
  дополнительными посылками - конъ\-юнк\-тив\-ны\-ми членами утверждения
  $F$. По окончании применения таких нормализато\-ров в их
  результирующий терм вместо $x$ будет подставляться $P$.
  Утверждение $F$ может отсутствовать. Примером использования
  указателя "свертка" \ может служить теорема $h = bd \ \& \ i =
  bf \ \& \ g = \sqrt be \ \& \ j = ag^3+cg^2+hg+i \rightarrow a
  \sqrt be^3 + ce^2 +d \sqrt be + f = j/b$, позволяющая выполнять
  разложение на множители выражения $a \sqrt be^3 + ce^2 + d \sqrt be +
  f$ сведением к разложению на множители многочлена $ag^3+cg^2+hg+i$.
  Новая переменная $g$ этого многочлена введена идентифицирующим
  антецедентом $g = \sqrt be$. Если бы вместо переменной здесь
  было сразу подставлено обозначаемое ею выражение, то при
  преобразованиях вид многочлена оказался бы утерян, и необходимые
  приемы не сработали бы. Прием использует указатель "сверт\-ка($g$
  число($g$))".

  \subsubsection{Программно реализуемый антецедент}

  Если переменные антецедента были идентифицированы с термами
  "константного" \ характера, обозначающими объекты, для
  представления которых предусмотрены нелогические структуры
  данных (например, десятичные числа), то проверка либо реализация
  такого антецедента могут выполняться процедурами,
  обрабатывающими не сами константные термы, а обозначаемые ими
  объекты, заданные нелогическими структурами данных. Такие
  антецеденты называем программно реализуемыми. Ука\-за\-тель,
  выделяющий программно реализуемые антецеденты, имеет вид
  "программа(\\ $i_1 \ldots i_n$)", где $i_1, \ldots , i_n$ - все их
  номера. В программно реализуемых антецедентах используются
  выражения и утверждения, для которых компилятор ГЕНОЛОГа мо\-жет
  формировать процедуры непосредственного вычисления. К их числу,
  в частнос\-ти, относятся выражения, построенные при помощи
  числовых констант, операций сложения, изменения знака,
  умножения, возведения в константную натуральную степень, модуля,
  взятия максимума либо минимума двух чисел, наибольшего обще\-го
  делителя и наименьшего общего кратного.

  Приведем наиболее часто встречающиеся типы программно реализуемых
  ан\-те\-це\-ден\-тов:

  \begin{enumerate}

  \item Антецедент для деления целого числа $m$ на целое ненулевое
  число $n$ с остатком: $m = an + b$. Остаток здесь берется от 0
  до $|n|-1$.

  \item Антецедент, перечисляющий все целочисленные делители $m,k$
  целого числа $n$: $n = mk$.

  \item Антецедент, перечисляющий все представления целого числа
  $n$ в виде про\-из\-ве\-де\-ния целого $m$ на заданную натуральную
  степень $p$ целого $k$: $n = mk^p$.

  \item Антецедент для проверки числового равенства либо
  присвоения: $a = b$.

  \item Антецедент для проверки неравенства $a<b$ либо $a \le b$.

  \item Отрицание, дизъюнкция либо конъюнкция нескольких
  программно ре\-али\-зу\-е\-мых антецедентов проверочного типа также
  является программно реализу\-е\-мым антецедентом.

  \item Антецедент для нахождения целочисленных решений $m$
  квадратного уравнения с целыми коэффициентами $a,b,c$:
  $am^2+bm=c$.

  \item Антецедент для перечисления всех целых чисел $i$ из
  промежутка от $m$ до $n$: $i \in \{m, \ldots ,n\}$.

  \item Антецедент для выделения наибольшей натуральной степени
  $n$ целого числа $a$, на которую делится целое число $b$;
  определяется также частное $c$ от деления $b$ на эту натуральную
  степень: $b = a^n c$.

  \item Антецедент для перечисления всех простых либо
  целочисленных делителей $m$ целого $n$ (если в фильтрах указано
  "простое($m$)", то перечисляются простые делители, иначе -
  целочисленные): $m|n$.

  \item Антецедент для проверки четности целого числа $n$:
  $n-even$.

  \end{enumerate}

  В качестве примера рассмотрим теорему "$x - \mbox{целое} \ \& \ y
  - \mbox{целое} \ \& \ |a| \le |b| \ \& \ b = ap+q \rightarrow
  ax+by=c \leftrightarrow \exists_z(x = z - py \ \& \ z -
  \mbox{целое} \ \& \ az + qy = c)$", используемую для решения линейного
  целочисленного уравнения с двумя не\-из\-вестными. Она со\-от\-вет\-ствует
  одному шагу алгоритма Евклида. В фильтрах приема указано, что $a,b,c$
  идентифицируются с целочисленными константами, и это позволяет
  реализовать третий и четвертый антецеденты с помощью операторов ЛОСа,
  применяемых к целым числам (для четвертого антецедента выполняется
  деление $b$ на $a$ с остатком). Указатели обработки антецедентов
  приема - "блокпроверок(1 2)" \ и "программа(3 4)".

  Вместо указателя "программа($\ldots$)", программно реализуемый
  антецедент вида $x=t$ может быть выделен указателем
  "выч($\ldots$)". Это происходит в тех случаях, когда все переменные
  выражения $t$ оказываются идентифицированы с константными
  термами, причем переменную $x$ нужно идентифицировать с
  численной константой, полученной при приближенном вычислении
  значения $t$ с помощью машинной ариф\-метики для чисел формата
  "с плавающей запятой". Например, так делается в при\-е\-мах
  анализатора "чертеж", позволяющего строить эскизы к
  планиметрическим за\-да\-чам.

  Список типов программно реализуемых антецедентов постоянно
  пополняется. Ос\-новные типы задаются приемами справочника "вычисл".
  Чтобы получить ин\-фор\-мацию о программной реализации антецедента,
  содержащего некоторый ключевой логический символ, находим в оглавлении
  приемов раздел данного символа, входим в его подраздел "Справочники",
  и далее - в подраздел "Вычисл". Анализируя прие\-мы справочника "вычисл",
  определяем, какие типы программно реализуемых анте\-це\-ден\-тов существуют
  и на какие форматы данных они рассчитаны. Теорема справоч\-ни\-ка
  "вычисл" \ имеет вид "вычисл($s \ T \ A_1 \ldots A_n \ R$)", где
  $s$ - ключевой логический символ; $T$ - шаблон антецедента,
  содержащий символ $s$; $A_1, \ldots, A_n$ - указатели форматов входных
  и выходных переменных; $R$ - оператор ЛОСа, вставляемый
  компилято\-ром ГЕНОЛОГа в программу приема для обработки
  антецедента. Точно таким же образом справочник "вычисл" \
  определяет компиляцию подвыражений программ\-но реализуемых
  антецедентов. В этом случае некоторое $A_i$ имеет вид
  "выход($f$)"; $f$ - формат значения выражения $T$.

  Отдельный программно реализуемый антецедент приема сканирования
  задачи может представлять собой обращение к вычислительному
  пакету, реализованному на ГЕНОЛОГе и предназначенному для
  выполнения каких-либо трудоемких вычисле\-ний вне логического
  процесса. Таким образом обеспечивается подключение к ло\-ги\-чес\-кому
  программированию "обычных" \ вычислений.

  \subsubsection{Проверка истинности антецедента при помощи
  решения задачи на до\-ка\-за\-тель\-ство}

  Для проверки истинности антецедента с помощью задачи на
  доказательство могут применяться различные указатели, уточняющие
  уровень используемых для нее сред\-ств. Эта проверка предпринимается лишь
  в исключительных случаях, так как она обычно гораздо более
  трудоемка, чем обращение к проверочному оператору. Реше\-ние
  вспомогательной задачи на доказательство может вызвать неоправданно
  большую паузу в решении основной задачи - если нет веских оснований
  считать, что про\-ве\-ря\-емое условие вообще выполнено. Поэтому
  рекомендуется сопровождать обращения к таким задачам ограничителями
  трудоемкости (см. указатель "Обрыв($\ldots$)").

  \begin{enumerate}

  \item Если максимальный уровень используемой задачи на
  доказателство равен 4, причем она снабжается комментарием
  "извлекается" \ и решается с за\-бло\-ки\-ро\-ван\-ным сканированием
  посылок (их веса подняты до величины, превосходящей максимальный
  уровень), то применяется указатель "легковидеть($i$)"; $i$ -
  номер антецедента (этот и другие приводимые ниже однотипные
  указатели $U$ об\-ра\-бот\-ки обычно группируются в указатель $U(i_1
  \ldots i_m)$, ссылающийся сразу на несколько антецедентов).

  \item Если максимальный уровень задачи на доказательство равен
  5, то применяется указатель "усматривается($i$)".

  \item Наконец, наиболее сильное средство проверки -
  использование задачи на до\-ка\-за\-тель\-ство, максимальный уровень
  которой полагается совпадающим с мак\-си\-маль\-ным уровнем текущей
  задачи. Здесь используется указатель обработки "следствие($i$)".
  Простейший пример - прием, основанный на теореме $0 < a-b \rightarrow
  \neg(a = b)$ и используемый для попытки усмотреть неразрешимость
  уравнения $a=b$ в условии задачи на описание путем
  доказательства неравенства. Этот прием применяется на достаточно
  большом уровне, когда решение задачи обыч\-ны\-ми средствами уже
  зашло в тупик. Первый антецедент в нем выделен ука\-за\-те\-лем
  "следствие(1)", причем трудоемкость попытки доказательства
  нера\-вен\-ства (может быть, придется еще проверить и противоположное
  неравенство) ограничена сверху с помощью указателя "лимит(3000000)".

  \item Особо выделен случай, когда решается задача на
  доказательство, причем она фактически сводится к проверке
  истинности заданного антецедента. Тогда вспо\-мо\-га\-тель\-ная задача
  формируется при помощи оператора "спуск" \ (специально
  предназначенного для формирования задач на описание либо
  доказательство, к которым решаемая задача может быть сведена
  путем замены некоторого условия). Максимальный уровень ее
  полагается равным максимальному уров\-ню текущей задачи на
  доказательство. Данный режим проверки вводится при по\-мо\-щи
  указателя "доказать($i$)". Этот же указатель можно использовать
  в па\-кет\-ных операторах, где он имеет несколько иной смысл -
  просто указывает на обращение к вспомогательной задаче на
  доказательство с максимальным уровнем обращения, равным 8.
  В качестве примера рассмотрим теорему $$\forall_x(g(x)\rightarrow
  0<f(x))\rightarrow 0<\prod_{x,g(x)}f(x),$$ на которой основан
  прием, предпринимающий попытку доказательства по\-ло\-жи\-тель\-ности
  конечного произведения путем установления положительности его
  общего члена. Первый антецедент, выделенный указателем
  "доказать(1)", обрабатывается путем решения задачи на
  доказательство, полученной из те\-ку\-щей задачи на доказательство
  путем соответствующей замены условия. Заме\-тим, что сама текущая
  задача при этом не изменяется, пока не будет решена
  вспомогательная - лишь после этого условие основной задачи будет
  заменено на константу "истина".

  \end{enumerate}

  \subsubsection{Антецеденты, реализуемые путем обращения к
  вспомогательной задаче на описание}

  Применение приема вывода следствий в задаче на исследование
  может быть связано с необходимостью предварительно вычислить
  значения группы вспомогательных вы\-ра\-жений. Для такого вычисления
  обычно используется задача на описание, имеющая цель "известно
  $\ldots$", перечисляющую те известные параметры, через которые
  должны быть определены вычисляемые выражения. Чтобы создать данную
  задачу на опи\-са\-ние и обратиться к ее решению, в теореме приема
  вводятся антецеденты $x_1 = t_1, \ldots , x_n = t_n$, перечисляющие
  подлежащие вычислению выражения $t_1, \ldots , t_n$ и те
  переменные $x_1, \ldots , x_n$, которым присваиваются
  вычисленные значения (т.е. вы\-ра\-же\-ния, не содержащие неизвестных
  контекста применения приема). Эти антецеденты сопровождаются
  указателем "вычисл($A \ B$)". Здесь $A$ - список их номеров; $B$ -
  список дополнений: "посылки($P$)" \ - указание конъюнкции $P$
  дополнительных посылок, ис\-поль\-зу\-емых в задаче;
  "удалениепосылок($Q$)" \ - $Q$ есть список названий таких разде\-лов,
  что содержащие их понятия посылки текущей задачи не переносятся
  во вспо\-мо\-га\-тельную задачу на описание. Известные параметры
  вспомогательной зада\-чи берутся из списка известных параметров
  текущей задачи на исследование.

  \subsubsection{Антецеденты, реализуемые идентифицирующими
  операторами}

  В некоторых предметных областях приходится идентифицировать
  антецеденты, для которых контекст идентификации не содержит
  явных прототипов, однако такие про\-тотипы могут быть извлечены из
  утверждений данного контекста с помощью край\-не небольшого числа
  простых логических переходов. Высокая частота попыток такой
  идентификации и расположение их в самом начале программ приемов
  делают не\-же\-ла\-тель\-ным применение здесь обычных проверочных
  операторов и синтезаторов. Для ускорения идентификации в таких
  ситуациях применяются так называе\-мые идентифицирующие операторы
  - специальные реализованные непосредственно на ЛОСе
  вспомогательные процедуры, выполняющие указанные выше логические
  пе\-ре\-хо\-ды.

  Например, для перечисления всех точек, выделенных на текущий
  момент на некоторой прямой, применяется идентифицирующий
  оператор "точкипрямой", ко\-то\-рый усматривает точки из различных
  источников: точки из названия самой прямой; точки из явно
  содержащихся в посылках условий принадлежнотси этой прямой;
  точки из условий принадлежности интервалам и отрезкам, концы
  которых при\-над\-ле\-жат данной прямой.

  Ускоренное, по сравнению с пакетными операторами,
  функционирование иден\-ти\-фи\-ци\-рующих операторов достигается не
  только за счет малого числа и простоты применямых в них
  логических переходов, но и за счет использования специальных
  адресных структур данных, группирующих посылки специального
  вида, необходимые для выполнения таких переходов. Эти структуры
  данных технически оформлены в виде комментариев к посылкам
  "списокпосылок $\ldots$", "выражение $\ldots$" и "отр $\ldots$"
  \ (подробнее о них см. информацию о логических символах -
  заголовках этих ком\-мен\-та\-ри\-ев). Они автоматически корректируются
  в процессе преобразований списка посылок - эту работу выполняют
  процедуры, осуществляющие преобразования спи\-ска посылок, т.е.
  "вывод", "заменавхождения", и т.п.

  Применение специальных адресных структур для быстрого поиска
  нужных по\-сы\-лок сближает по своей эффективности применяемое
  логическое представление с сетевым, где непосредственно
  указывались бы объекты, находящиеся в заданном отношении с
  рассматриваемым объектом. Такое сближение усиливается
  ис\-поль\-зо\-ва\-ни\-ем буфера, в котором сохраняются результаты
  нескольких десятков последних обращений к идентифицирующему
  оператору (см. комментарий к посылкам "Бу\-фер"). Фактически этот
  буфер становится в некотором смысле самоорганизую\-щим\-ся
  "расширенным контекстом", содержащим сотни готовых ответов на
  типовые во\-про\-сы, относящиеся к текущей ситуации. Во избежание
  ошибок управляющего харак\-те\-ра, буферы идентифицирующих
  операторов сбрасываются после каждого пре\-об\-ра\-зо\-ва\-ния посылок,
  которое могло бы изменить результат обращения.

  Указатель обработки антецедентов с номерами $i_1, \ldots , i_n$
  посредством иден\-ти\-фи\-ци\-ру\-ющих операторов имеет вид "усм($i_1
  \ldots i_n$)".

  Ввод нового идентифицирующего оператора осуществляется следующим
  об\-ра\-зом:

  \begin{enumerate}

  \item Определяется, какого вида группа антецедентов $T_1, \ldots,
  T_n$ будет обрабатывать\-ся при помощи нового оператора. В этой
  группе антецедентов выделяются входные термы $A_1, \ldots, A_m$
  (эти термы должны быть к началу идентификации уже определены -
  либо как выходные значения ранее примененных иден\-ти\-фи\-ци\-ру\-ющих
  операторов, либо через идентифицированные значения их
  пе\-ре\-мен\-ных). Выделяются также выходные термы $B_1, \ldots, B_k$,
  которые будут оп\-ре\-де\-лять\-ся идентифицирующим оператором. Здесь
  допустим случай $k=0$.

  \item На ЛОСе создается программа идентифицирующего оператора
  $f(x_1 \ldots x_{m+k+1})$, входные данные которой суть: $x_1$ -
  текущая задача на исследование либо на доказательство, при
  сканировании которой применяется идентифицирующий оператор;
  $x_2, \ldots x_{m+1}$ - термы $A_1, \ldots , A_m$. Выходные
  переменные $x_{m+2}, \ldots ,\\ x_{m+k+1}$ перечисляют наборы
  термов $B_1, \ldots , B_k$ (в случае $k=0$ оператор вы\-пол\-ня\-ет
  проверку истинности соответствующих $T_1, \ldots , T_n$).

  \item Создаются приемы справочников "усм" \ и "См", основанные на
  псевдотео\-ре\-ме вида "усм($f$ вход($A_1 \ldots A_m$) выход($B_1
  \ldots B_k$) усм($T_1 \ \& \ \ldots \ \& \ T_n$) $C_1 \ldots
  C_p$)". Здесь $C_1, \ldots , C_p$ - информационные элементы,
  используемые компилятором ГЕ\-НОЛОГа при формировании обращений к
  оператору $f$. Вид этих элемен\-тов приведен в информации о
  логическом символе "усм". Отметим, в частности, элемент
  "уровень($U$)", который определяет уровень приоритетности при
  при\-ме\-не\-нии компилятором данного идентифицирующего оператора (чем
  мень\-ше $U$, тем выше приоритет).

  \end{enumerate}

  После этого компилятор ГЕНОЛОГа готов к использованию нового
  иденти\-фи\-ци\-ру\-ю\-ще\-го оператора.

  При вводе комплекта новых идентифицирующих операторов следует
  учиты\-вать, что идентификация одних и тех же утверждений в разных
  приемах может про\-ис\-хо\-дить в различном порядке - с различными
  комбинациями определенных к моменту идентификации подтермов.
  Отсутствие идентифицирующего оператора, об\-слу\-жи\-ва\-ю\-ще\-го
  какую-либо из таких комбинаций, может ухудшить качество
  компиляции или вообще вызвать отказ компилятора.

  Основной раздел, в котором были использованы идентифицирующие
  операторы - элементарная геометрия. Перечислим логические
  символы, для которых в их под\-раз\-делах оглавления базы приемов
  указаны справочники "усм" \ и "См", а также созданные для этих
  символов идентифицирующие операторы:

  \begin{enumerate}

  \item "Прямая". Введены операторы: "прямыеточки" \ (перечисление
  прямых, про\-хо\-дя\-щих через данную точку); "точкипрямой" \
  (перечисление точек пря\-мой); "точкапрямой" \ (проверка
  принадлежности точки прямой); "общаяточка" \ (оп\-ре\-деление общих
  точек двух прямых); "общаяпрямая" \ (определение прямых,
  про\-хо\-дя\-щих через две точки); "лежатнапрямой" \ (определение
  прямых, про\-хо\-дя\-щих через три заданные точки - так как нет гарантий,
  что эти точки действительно различны или что не совпадают две
  по-разному обозначенные прямые, он выдает результаты в режиме
  перечисления); "точкилуча" \ (пе\-ре\-чис\-ле\-ние точек луча,
  определяемого по двум точкам); "точкалуча" \ (про\-вер\-ка
  принадлежности третьей точки лучу, определяемому двумя первыми
  точками); "пооднусторону"; "поразныестороны" \ (перечисление
  точек, лежащих на плос\-кос\-ти, соответственно, по одну либо по
  разные стороны от данной точки от\-но\-си\-тель\-но данной прямой);
  "Однасторона"; "Разныестороны" \ (проверка рас\-по\-ло\-же\-ния двух
  точек по одну либо по разные стороны относительно данной
  прямой). Заметим, что последние два идентифицирующих оператора в
  итоге оказались практически неиспользуемыми, так как их
  вытеснили хотя и более медленные, но на порядок более мощные
  проверочные операторы "раз\-ны\-е\-сто\-роны" \ и "однасторона".

  \item "Плоскость". Введены операторы: "точкиплоскости" \
  (перечисление точек плос\-кости); "точкаплоскости" \ (проверка
  принадлежности точки плоскости); "плос\-коститочки" \
  (перечисление плоскостей, проходящих через заданную точку);
  "общаяплоскость" \ (проверка принадлежности двух прямых одной
  плоскости).

  \item "Отрезок". Введены операторы: "точкиотрезка" \
  (перечисление точек отрезка); "точкаотрезка" \ (проверка
  принадлежности точки отрезку); "конецотрезка" \ (оп\-ре\-деление
  противоположного конца отрезка, если заданы точка отрезка и
  пер\-вый конец). Заметим, что идентифицирующие операторы для
  работы с от\-рез\-ком сами по себе весьма слабые; чтобы эффективно
  определять вза\-им\-ное расположение точек на прямой с помощью этих
  операторов, необходимо за\-бла\-го\-вре\-мен\-но в явном виде выводить
  следствия - утверждения о принадлежности или непринадлежности
  точек отрезкам и интервалам.

  \item "Расстояние". Введены операторы "расстояния" \
  (перечисление точек, для ко\-то\-рых введено в рассмотрение
  расстояние до данной точки); "смрасстояние" \ (проверка того,
  что расстояние между двумя точками введено в рассмотре\-ние);
  "равныедлины" \ (перечисление пар точек $C,D$, таких, что
  расстояние от $C$ до заданной точки $A$ равно расстоянию от $D$
  до заданной точки $B$); "равноуда\-ле\-на" \ (перечисление пар точек
  $B,C$ и прямых $BC$, таких, что расстояние от $B$ до заданной
  точки $A$ равно расстоянию от $B$ до $C$, причем точка $A$ лежит
  на прямой $BC$.

  \item "Угол". Введены операторы: "углывершины" \ (перечисление
  пар точек $B,C$, для которых введен в рассмотрение угол с
  заданной вершиной $A$); "усмугол" \ (проверка того, что заданный
  угол $ABC$ был введен в рассмотрение); "имяугла" \ (по заданной
  вершине угла $A$, двум прямым, проходящим через $A$ и двум
  точкам, определяющим направления лучей на этих прямых,
  перечисля\-ют\-ся пары точек $B,C$, определяющих заданный этими
  лучами угол $BAC$).

  \item "Параллельны". Введены операторы: "параллелпрямые" \
  (перечисление пря\-мых, параллельных данной); "усмпараллельны" \
  (проверка параллельности двух прямых); "параллели" \
  (перечисление пар параллельных прямых, первая их которых
  проходит через точку $A$, а вторая - через точку $B$);
  "параллелплос\-кос\-ти" \ (перечисление плоскостей, параллельных
  данной).

  \item "Перпендикулярно". Введены операторы: "перпендикуляры" \
  (перечисление \\ пря\-мых, перпендикулярных данной);
  "перпендикулярны" \ (проверка перпен\-ди\-ку\-ляр\-ности двух прямых);
  "перпендикпрямые" \ (перечисление пар прямых, па\-рал\-лель\-ных двум
  заданным перпендикулярным прямым. В этом и ряде других случаев
  входным данным для идентифицирующего оператора служит не терм, а
  вхождение в терм условия перпендикулярности некоторых прямых -
  см. по\-дроб\-нее информационный элемент "перпендикулярно" \ из
  описания формата идентифицирующих операторов); "прямыеуглы" \
  (перечисление пар прямых, параллельных двум заданным
  перпендикулярным прямым, и точек их пе\-ре\-се\-че\-ния);
  "Перпендикулярны" \ (проверка перпендикулярности прямой и
  пло\-с\-ко\-сти); "Перпендикуляры" \ (перечисление прямых,
  перпендикулярных плоскос\-ти); "Перпендикпрямые" \ (перечисление
  пар "прямая - плоскость", па\-рал\-лель\-ных заданной паре
  перпендикулярных прямой и плоскости); "Прямыеуглы" \
  (пе\-ре\-чис\-ле\-ние пар "прямая - плоскость", параллельных заданной
  паре пер\-пен\-ди\-ку\-ляр\-ных прямой и плоскости, а также точек их
  пересечения).

  \item "Окружность". Введены операторы: "точкиокружности" \
  (перечисление точек окружности); "окружноститочки" \
  (перечисление окружностей, проходящих че\-рез заданную точку);
  "точкаокружности" \ (проверка принадлежности точки заданной
  окружности).

  \end{enumerate}

  В качестве примера использования идентифицирующих операторов
  рассмотрим теорему $l(AB)=l(BC) \ \& \ \mbox{прямая}(BD) \ \bot
  \ \mbox{прямая}(AC) \ \& \ D \in \mbox{прямая}(AC) \rightarrow
  l(AD)=l(DC)$. На этой теореме основан прием, усматривающий
  медиану в высоте $BD$ рав\-но\-бед\-рен\-ного треугольника $ABC$.
  Применение приема начинается с об\-на\-ру\-же\-ния равенства
  $l(AB)=l(BC)$ либо пары равенств $l(AB)=a$,$l(BC)=a$,
  поз\-во\-ля\-ю\-щих идентифицировать точки $A,B,C$. Прием имеет
  указатель "усм(2 3)", так что далее используется
  идентифицирующий оператор, перечисляющий для иден\-ти\-фи\-ка\-ции пря\-мой
  $BD$ прямые, перпендикулярные прямой $AC$. Идентифицирующий
  оператор про\-вер\-ки принадлежности точки прямой отбирает ту из них,
  на которой лежит точка $B$. Наконец, применяется идентифицирующий
  оператор, находящий точку $D$ пересечения прямых $BD$ и $AC$.

  \subsubsection{Уточнение списка посылок, участвующих в проверке
  либо реализации антецедента}

  \begin{enumerate}

  \item При обработке пакетным оператором либо вспомогательной
  задачей антеце\-ден\-та с номером $i$ могут быть введены
  дополнительные посылки $A_1, \ldots , A_n$. Для этого
  используется указатель "занесениепосылки($i$ и($A_1 \ldots
  A_n$))". Наибо\-лее часто дополнительные посылки вводятся для
  исключения кванторного анте\-це\-ден\-та теоремы. Например, на теореме

  $\forall_y(f(y)\rightarrow \neg(h(g(y)))) \rightarrow
  \mbox{непересек}(\mbox{set}_x(\exists_y(f(y) \ \& \ x =
  g(y))),\mbox{set}_z(h(z)))$

  можно было бы создать прием проверки
  непересечения двух множеств, за\-дан\-ных описателями "класс".
  Однако, эта теорема имеет кванторный антеце\-дент, и вместо нее
  можно взять теорему

   $\neg(h(g(y))) \rightarrow
  \mbox{непересек}(\mbox{set}_x(\exists_y(f(y) \ \& \ x =
  g(y))),\mbox{set}_z(h(z)))$,

  полученную сохранением лишь
  консеквента кванторного антецедента, однако добавить указатель
  "занесениепосылки(1 $f(y)$)". Результат будет тот же, что и в
  первом случае, но запись теоремы сокращается, и экономится
  срабатывание приема доказательства истинности кванторной импликации,
  перебрасываю\-ще\-го ее антецеденты в посылки задачи.

  \item Если при обработке пакетным оператором либо
  вспомогательной задачей ан\-те\-це\-дента с номером $i$ требуется
  исключить посылки, удовлетворябщие заданному условию, то
  применяется указатель "удалениепосылок($i \ X \ P(X)$)". Здесь
  $X$ - вспомогательная переменная, обозначающая исключаемую
  посылку; $P(X)$ - условие на эту посылку. Обычно удаление
  посылок предпринимается в тех случаях, когда есть основания
  предполагать наличие в контексте громоздких посылок, которые
  заведомо не нужно использовать при проверке утверждения
  рассматриваемого типа.

  \item Если в приеме нормализатора обработка антецедента
  проверочным операто\-ром должна производиться с использованием
  списка посылок этого нормализатора, пополненного утверждениями
  из контекста текущего вхождения, то исполь\-зу\-ет\-ся указатель
  "облнорм".

  \end{enumerate}

  \subsubsection{Специальная идентификация антецедентов, имеющих
  своим заголовком транзитивное бинарное отношение}

  Для посылок, заголовком которых служит транзитивное бинарное
  отношение, обычно предусматривается стандартизация, сжимающая
  все многообразие извлекаемых по транзитивности следствий к
  возможно меньшему числу базисных утверждений. В этой ситуации
  для идентификации антецедента с одним из элементов "замыкания по
  транзитивности" \ этих базисных утверждений служат специальные
  указатели.

  Если рассматриваемое транзитивное отношение является отношением
  экви\-ва\-лент\-нос\-ти $E$, то обычно антецедент $E(X \ Y)$
  идентифицируется либо с явно со\-дер\-жа\-щим\-ся в контексте
  идентификации утверждением $E(A \ B)$, либо с собираемым из двух
  таких утверждений $E(A_1 \ A_2)$, $E(A_3 \ A_2)$ новым
  утверждением $E(A_1 \ A_3)$. Последнее объясняется тем, что
  для всех находящихся в отношении $E$ рас\-смат\-ри\-ва\-емых в задаче объектов
  выбирается некоторый эталонный объект (в данном случае его роль играет
  $A_2$), и связь с ним других объектов задается с помощью утверждений
  вида $E(A \ A_2)$. Указателем на данную идентификацию
  служит "равно($i$)", где $i$ - номер антецедента $E(X \ Y)$.
  Примером ее может служить обработка антецедента
  $l(AB)=l(BC)$ в приводившемся выше примере с
  высотой равнобедренного тре\-у\-голь\-ника.



  Для транзитивного отношения $E$, не являющегося отношением
  эквивалентности, при идентификации может быть использован
  оператор "транзитпереход", пе\-ре\-чис\-ляющий с учетом транзитивности
  все термы, находящиеся в отношении $E$ с заданным термом на
  основе явно присутствующих в контексте идентификации утверждений
  $E(A \ B)$. Идентификация антецедента $E(X \ Y)$ начинается
  здесь после того, как были идентифицированы все переменные
  одного из операндов $X,Y$. Данный режим вводится указателем
  "транзитпереход($i_1 \ldots i_n$)", где $i_1, \ldots , i_n$ -
  номера всех ре\-али\-зу\-е\-мых таким образом антецедентов. Например, в
  основанном на теореме

  $b \subseteq \mbox{прообраз}(f,a) \rightarrow
  \mbox{образ}(f,b) \subseteq a$

  \noindent приеме усмотрения включения прослеживаются по цепочкам
  включения мно\-жест\-ва $b$, явно указываемые в посылках, и таким
  образом идентифицируется правая часть включения
  $b \subseteq \mbox{прообраз}(f,a)$.

\subsubsection{Очередность обработки антецедентов при применении
приема}

Для ускорения работы программы приема иногда приходится
определенным образом упорядочивать обработку антецедентов:
отодвигать в конец программы априори тру\-до\-ем\-кие вычисления,
и наоборот, переносить в начало быстрые проверки,
поз\-во\-ля\-ющие усиливать отсечение нереализуемых ситуаций.

Чтобы приблизить к началу программы обработку антецедента с
номером $i$, ис\-поль\-зу\-ет\-ся указатель "начало($i \ x_1
\ldots x_n$)". В этом случае обработка данного ан\-те\-це\-ден\-та
будет выполняться сразу же, как только идентифицируются
зна\-че\-ния переменных списка $x_1, \ldots , x_n$.

Указатель "конец($i_1 \ldots i_n$)" \ отодвигает обработку
антецедентов с номерами $i_1, \ldots \\ , i_n$ к концу программы
приема.

В тех случаях, когда антецедент с номером $i$ непосредственно
идентифицируется с некоторым утверждением из контекста
идентификации, можно заблокировать его обработку до того момента,
пока не окажутся идентифицированы заданные пе\-ре\-мен\-ные $x_1,
\ldots, x_n$. Для этого используется указатель "подчинено($i \ x_1
\ldots x_n$)".

\subsubsection{Слежение за появлением требуемого антецедента}

Если проверка истинности антецедента при помощи пакетного
оператора оказалась неудачной, то можно организовать слежение за
появлением этого антецедента "в чистом виде" \ в контексте
идентификации, с переключением внимания, обес\-пе\-чи\-ва\-ющим в
этом случае повторную попытку применения приема. Здесь
используется указатель обработки "См($i$)", где $i$ - номер
антецедента.

\subsubsection{Ограничение трудоемкости обработки антецедента}

 Для установки лимита в $N$ шагов работы интерпретатора ЛОСа,
 отводимых на обработку антецедента с номером $i$, применяется
 указатель "Обрыв($i \ N$)". Если эта обработка завершается менее
 чем за $N$ шагов, то данный лимит сбрасывается, иначе -
 происходит откат, такой же, как при нелимитированной неудачной
 попытке обработки.

 \subsubsection{Отмена ограничений на использование утверждений
 текущего контекста для непосредственной идентификации}

 Если некоторые антецеденты теоремы приема были непосредственно
 идентифи\-ци\-ро\-ва\-ны с утверждениями $A_1, \ldots, A_n$ из контекста
 идентификации, и после этого произошло обращение к проверочному
 оператору либо пакетному синтезатору, то утверждения $A_1, \ldots,
 A_n$ не будут при работе данного оператора использоваться в
 непосредственной идентификации антецедентов. Они регистрируются
 для этого в комментарии "исключение $\ldots$", передаваемом
 оператору. Это делается по умолча\-нию для предотвращения зацикливаний в
 рекурсивных обращениях пакетных операто\-ров. Однако, такое ограничение
 можно отменить для группы непосредственно иден\-ти\-фи\-цируемых
 антецедентов приема пакетного оператора, имеющих номера
 $i_1, \ldots , i_m$. Если вводится указатель "повтор($i_1 \ldots i_m$)",
 то данные антецеденты будут иден\-ти\-фи\-ци\-ро\-ваться с утверждениями из
 текущего контекста без учета комментария "ис\-клю\-че\-ние $\ldots$".

 \subsubsection{Выделение антецедентов, используемых для
 замещения условия при об\-рат\-ном выводе}

 Ранее (см. раздел "Типы заголовков приемов") были введены приемы
 с заголов\-ком "подборзначений". Они осуществляют попытку подбора
 примера путем за\-ме\-ны идентифицированного с консеквентом $A_0$
 теоремы приема $\forall_{x_1 \ldots x_m}(A_1 \ \& \ \ldots \ \& \
 A_k \rightarrow A_0)$ условия задачи на описание на группу
 антецедентов с номерами $i_1, \ldots , i_n$, вы\-де\-лен\-ных
 указателем "подборзначений($i_1 \ldots i_n$)". Остальные
 антецеденты при этом обрабатываются обычным образом.
 В качестве примера рассмотрим теорему $0<a \ \& \ x = a/2 \rightarrow
 x \in (0,a)$, используемую для указания точки, принадле\-жа\-щей
 интервалу $(0,a)$. Она позволяет переходить от условия $x \in
 (0,a)$ к условию $x = a/2$, после того, как проверено, что $a$
 положительно. Прием имеет фильтр, проверяющий, что неизвестная
 $x$ не входит в другие условия (кроме, быть может, условия
 "чис\-ло($x$)"). Первый его антецедент снабжен указателем
 "блокпроверок(1)", второй - "подборзначений(2)".

 \subsubsection{Принятие истинности антецедента по умолчанию в
 зависимости от кон\-тек\-ста}

 Ряд антецедентов в определенных контекстах, уточняемых фильтрами
 приема, мо\-гут оказаться избыточными (но не во всех случаях
 применения приема - иначе их мож\-но было бы вообще отбросить).
 Чтоы в этих ситуациях сэкономить время на провер\-ках или избежать
 отказа из-за возможной некомплектности списка посылок, имеющихся
 в определяемой фильтром ситуации, можно применять указатель "пассив($i
 \ A$)", где $i$ - номер антецедента, проверка которого
 отключается, $A$ - фильтр, определяющий условие отключения
 проверки.

 \subsubsection{Унифицирующий антецедент}

 В приемах вывода теорем используются антецеденты вида $A=B$,
 обрабатыва\-е\-мые путем обращения к процедуре унификации. Процедура
 обрабатывает сразу все такие равенства, унифицируя их левые части
 с правыми. Равенства содержат выра\-же\-ния $f(t_1 \ldots t_k)$,
 соответствующие уже идентифицированным функциональным пе\-ре\-мен\-ным
 $f(x_1 \ldots x_k)$. Здесь каждый содержащий еще не
 идентифицированные перемен\-ные терм $t_i$ представляет собой новую
 переменную, и значения всех таких новых переменных определяются
 процедурой унификации. Допускается использование для одной и той
 же переменной $x_j$ нескольких различных $t_j$. Перед обращением
 к про\-це\-ду\-ре унификации в таких случаях выполняется
 соответствующая расклейка пе\-ре\-мен\-ной $x_j$ на несколько различных
 новых переменных, вместо которых и будут подставляться при
 унификации соответствующие различные $t_j$. Унифицирующие
 антецеденты выделяются указателем "унификация($i_1 \ldots i_n$)",
 где $i_1, \ldots , i_n$ - номера этих антецедентов.

 \subsection{Указатели, уточняющие тип основного преобразования}

 \begin{enumerate}

 \item Если прием замены, применяемый при сканировании задачи,
 должен заменять не только текущее вхождение преобразуемого терма,
 но все его вхождения в термы задачи, для которых удается
 усмотреть корректность данной замены, то используется указатель
 "заменавхождений".

 \item Если замена выполняется в задаче на доказательство либо на
 описание, причем нет полной уверенности в том, что она не заведет
 задачу в тупик, то можно организовать ввод вспомогательной задачи
 - копии текущей задачи, и вы\-пол\-нить данную замену лишь во
 вспомогательной задаче. Тогда, после получе\-ния отказа на такую
 вспомогательную задачу, решение текущей задачи будет про\-дол\-жать\-ся
 без выполнения рассматриваемой замены; если же на вспо\-мо\-га\-тель\-ную
 задачу будет получен ответ, то он будет выдан как ответ текущей
 задачи. Данный режим обеспечивается указателем "попытказамены".

 \item Если при выполнении приема "замещениеусловий", передающего
 во внешнюю задачу на описание найденные в ее блоке анализа
 следствия, требуется сразу же вернуться к сканированию этой
 внешней задачи, то применяется указатель "обрывзадачи($A$)".
 Здесь $A$ - фильтр, определяющий условия, при которых необходим
 такой переход. Он может отсутствовать, и тогда указатель имеет
 вид "обрывзадачи".

 \item Если выполняется замена согласно тождеству "вариант($P \
 t_1 \ t_2) = t$" \ (напри\-мер, при усмотрении модуля), то имеется
 возможность автоматически обобщить это тождество до "вариант($P \
  F(t_1) \ F(t2)) = F(t)$", введя указатель "из\-вле\-че\-ние\-ва\-ри\-анта".
  Прием будет пытаться представить находящиеся "под вариантом" \
  тер\-мы в виде $F(t_1)$ и $F(t_2)$, используя процедуру
  "извлечениеварианта". Заме\-тим, что все входящие в $t_1,t_2$
  переменные должны быть идентифицированы из других частей теоремы
  (например, из условия $P$).

  \item Если теорема приема проверочного оператора имеет вид
  $\forall_{y_1 \ldots y_n}(P(\ldots a \ldots) \ \& \ \\ P(\ldots b
  \ldots)\rightarrow P(\ldots h(a \ b) \ldots))$, где $h$ -
  ассоциативно - коммутативная операция, то есть прием
  предпринимает разбиение группы операндов операции $h$ на два
  подмножества, то возможно предпринять разбиение этой группы
  операндов сразу на одноэлементные подмножества и проверять
  $P(\ldots a \ldots)$ последова\-тель\-но для всех одиночных
  операндов $a$. Такой режим вводится указателем
  "ди\-ст\-риб\-раз\-вертка($K$)", где $K$ - указатель вхождения в теорему
  операции $h(a \ b)$.

  \item Если прием тождественной либо эквивалентной замены, либо
  прием нор\-ма\-ли\-за\-то\-ра основан на тождестве (либо эквивалентности)
  типа $P(h(a \ b)) = f(P(a)P\\ (b))$, с ассоциативно -
  коммутативными $f,g$, то возможно ввести режим од\-но\-вре\-мен\-ной
  обработки всех операндов операции $h$ либо $f$, в зависимости от
  направления замены. В случае "разгруппировки" \ операции $h$
  применяется ука\-за\-тель "набор(первыйтерм)", иначе (при
  группировке операндов операции $f$) - указатель
  "набор(второйтерм)".

  \item Обычно при компиляции тождества, заголовок заменяемой
  части которого есть ассоциативно - коммутативный символ $f$,
  вводится новая переменная $x$, до\-бав\-ля\-е\-мая к $f$ - членам обеих
  частей тождества. Эта переменная идентифицируется с остаточными
  членами операции $f$. Если же требуется идентифицировать
  заменяемую часть целиком со всем списком $f$ - членов
  преобразуемого терма, не допуская остатка последних, то вводится
  указатель "модификатор" \ (в ком\-пи\-ля\-то\-ре модификатором
  называется упомянутая выше переменная $x$).

  \item В некоторых предметных областях (например, в геометрии)
  возникает не\-об\-хо\-ди\-мость в определенных преобразованиях теоремы
  перед компиляцией приема. Такие преобразования обобщают
  определяемое теоремой описание ситуа\-ции, уменьшая потребность в
  средствах специальной идентификации. В качестве примера здесь
  можно было бы привести прием, основанный на теореме Пи\-фа\-го\-ра. В
  этом приеме рассматривается прямоугольный треугольник $ABC$ с
  прямым углом $B$. Последнее формулируется как условие
  перпендикулярности прямых $AB$ и $BC$. Однако, применяемая
  стандартизация условий па\-рал\-лель\-нос\-ти и перпендикулярности
  прямых выбирает для каждого класса па\-рал\-лель\-ных прямых лишь один
  эталонный экземпляр, и все условия параллельности и
  перпендикулярности для этого класса формулируются с его
  участием. В результате может оказаться так, что в задаче не
  найдется условия пер\-пен\-ди\-ку\-ляр\-нос\-ти для требуемых прямых, а
  будет условие перпендикулярности для каких-то двух других
  прямых, $DE$ и $FG$. Соответственно, в теореме вводятся новые
  переменные $D,E,F,G$, а условие перпендикулярности для $AB$,$BC$
  пре\-об\-ра\-зу\-ется в условие перпендикулярности для $DE$,$FG$ и
  условия параллельности $AB$ с $DE$ и $BC$ с $FG$. Такого рода
  преобразования теоремы выполняются до тех пор, пока не будут
  устранены все нежелательные связи между объектами,
  ограничивающие общность описания ситуации. Преобразования эти
  вы\-пол\-ня\-ются по умолчанию (их обеспечивает процедура "развязка",
  к которой об\-ра\-ща\-ет\-ся компилятор). Однако, их можно отключить
  (иногда это необходимо), вводя указатель "развязка".

  \item Если теорема приема имеет вид $A\rightarrow P(t_1 \ldots
  t_n)$, где отношение $P$ однозначно определяет значение $t_i$ по
  значениям $t_1, \ldots , t_{i-1},t_{i+1}, \ldots , t_n$, то
  возможно ав\-то\-ма\-ти\- ческое преобразование этой теоремы при
  компиляции к виду $$A \rightarrow (P(t_1 \ldots t_{i-1} \ x \
  t_{i+1} \ldots t_n)\leftrightarrow x = t_i).$$ Это делается при
  наличии указателя "однозначно", причем факт однознач\-но\-го
  определения $t_i$ распознается компилятором с помощью
  справочника "одно\-знач\-но". В качестве примера приведем теорему
  "$\mbox{натуральное}(n) \rightarrow \mbox{наибольший}(n,\\ \mbox{set}_m
  (\mbox{натуральное}(m) \ \& \ m | n))$", по которой создается
  прием, заменяющий ут\-вер\-жде\-ния вида "$\mbox{наибольший}(A, \mbox{set}_m
  (\mbox{натуральное}(m) \ \& \ m | n))$" \ на "$A = n$".

 \item Если имеется множество альтернативных приемов, которые должны
 сраба\-ты\-вать на одном и том же уровне, но среди них нужно отобрать
 один самый "лучший", то применяется специальный механизм,
 связанный с использова\-ни\-ем указателя "оценка($u_1 A_1 \ldots A_n
 v$)". Такая ситуация складывается, напри\-мер, при выборе той
 формулы для площади треугольника, которая будет наиболее полезна
 в решаемой планиметрической задаче. Если промедлить со вводом
 формулы, то решатель отвлечется на посторонние действия.
 Поэтому рас\-пре\-де\-лить формулы для площади по различным уровням
 сканирования оказывается невозможным - они должны относиться к
 одному и тому же уровню. Одна\-ко, можно использовать приемы,
 выписывающие эти формулы, в специальном "двухуровневом режиме".
 Каждый из них имеет два уровня срабатывания: предварительный
 уровень $u_1$ и основной уровень $u_2$, больший предваритель\-но\-го. На
 предварительном уровне предпринимается лишь выбор оценки $v$
 пред\-по\-ч\-ти\-тель\-ности применения приема (чем меньше оценка,
 тем выше пред\-поч\-ти\-тель\-ность). Эта оценка сохраняется в комментарии $(A_1
 \ldots A_n v)$ к посыл\-кам задачи. Здесь компоненты $A_1, \ldots
 A_n$ - общие для всех альтернативных при\-ме\-не\-ний приемов
 (например, представляющие собой ссылку на треугольник, для
 которого нужно выписать формулу площади), а в компоненте $v$
 отбирается минимальное значение оценок, сообщаемых приемами при
 сканировании на уровне $u_1$. Таким образом, при сканировании на
 уровне $u_2$ уже можно отобрать наилучший прием: им окажется тот,
 чья повторно вычисляемая оценка $v$ сов\-па\-дет с оценкой $w$, извлекаемой
 из комментария $(A_1 \ldots A_n w)$. Если таких прие\-мов будет
 несколько, то сработает первый из них. Чтобы заблокировать
 сра\-ба\-ты\-ва\-ние прочих приемов с той же оценкой, сработавший прием
 может ввести специальный комментарий. Для создания описанного
 двухуровневого режима срабатывания приема достаточно ввести
 приведенный выше указатель "оцен\-ка($\ldots$)". Заметим, что
 перед $A_1$ может быть размещен терм "условие($U$)", где $U$ -
 фильтр, определяющий случай для выбора оценки. Чтобы находить
 оценку для нескольких различных непересекающихся подслучаев,
 вводятся несколь\-ко соответствующих им условных
 указателей "оценка($\ldots$)".

 \end{enumerate}

 \subsection{Указатели, играющие роль дополнительных фильтров
 либо от\-ме\-ня\-ющие ограничения на применение приема}

 Если прием использует нормализатор $A$, выполняющий
 преобразование терма $t$, причем применение приема теряет смысл
 при сохранении терма $t$ неизменным, то вводится указатель
 "различны($A \ t$)", блокирующий в этих случаях срабатывания
 приема.

 Обычно применение приема блокируется, если он пытается
 преобразовать ут\-вер\-жде\-ние, используемое для сопровождения по
 области допустимых значений других термов задачи. Однако,
 указатель "сопровождение" \ позволяет отменить это огра\-ни\-че\-ние.
 Применять его следует лишь в исключительных случаях, когда либо
 про\-дол\-же\-ние сопровождения по о.д.з. становится ненужным, либо
 усмотрение условий на о.д.з. легко может быть осуществлено и на
 основе преобразованного утверждения - например, если
 предпринимаемое преобразование должно синхронным образом изменить
 и сопровождаемые данным утверждением термы задачи.

 \subsection{Указатели, уточняющие способ формирования новых
 термов}

 \begin{enumerate}

 \item Если квантор существования в заменяющем терме приема замены
 либо приема нормализатора берется по конечной области, то его
 бывает целесообразно пред\-ста\-вить в виде конечной дизъюнкции. В
 этом случае используется указатель "или($A \ B_1 \ldots B_n$)",
 где $A$ - указатель вхождения в теорему приема данного квантора
 существования; $B_1, \ldots , B_n$ - список указателей вхождений
 конъ\-юнк\-тив\-ных членов подкванторного утверждения, определяющих
 перечисление ди\-зъ\-юнктивных членов и компилируемых так, как
 компилируются программно реализуемые антецеденты. В качестве
 примера рассмотрим теорему "$x < n \ \& \\ \mbox{натуральное}(x)
 \rightarrow \exists_m(m \in \{1, \ldots , n-1\} \ \& \ x = m)$",
 используемую для вы\-во\-да условия $x=1 \vee \ldots \vee x=n-1$ задачи на
 описание, имеющей неизвестное выражение $x$, принимающее
 натуральные значения и ограниченное сверху на\-ту\-ральной
 константой $n$. Такое условие инициирует далее разбор случаев.
 Прием имеет указатель "или(фикс(0)фикс(0 2 1))", у которого
 первый указатель вхож\-де\-ния в теорему относится к вхождению
 квантора существования, а второй - к вхождению утверждения
 $m \in \{1, \ldots , n-1\}$, определяющего перечисление
 натуральных значений $m$.

 \item Предположим, что формируется терм вида $f(t)$ для ранее
 идентифицированной с некоторым термом $T(x)$ функциональной
 переменной $f(x)$, причем можно считать достаточно вероятным
 появление внутри $T(x)$ подтермов $R_1(x), \ldots , \\ R_n(x)$, для
 которых $R_1(t), \ldots , R_n(t)$ могут быть упрощены до термов
 $Q_1, \ldots , Q_n$. Тогда можно еще до подстановки $t$ вместо
 $x$ в $T(x)$ заменить все вхожде\-ния $R_1(x), \ldots , R_n(x)$ в
 $T(x)$ на $Q_1, \ldots , Q_n$ (выделяя в первую очередь все
 вхождения $R_1(x)$, затем - не пересекающиеся с ними вхождения
 $R_2(x)$, и т.д.), и лишь после этого оставшиеся (не накрытые
 $R_1(x), \ldots , R_n(x)$) вхождения $x$ заменить на $t$. Такой
 режим формирования $f(t)$ обеспечивается указателем
 "мультизамена($K \\ R_1(x) \ Q_1 \ldots R_n(x) \ Q_n$)", где $K$ -
 указатель вхождения в теорему приема тер\-ма $f(t)$. В решателе он
 используется для ускоренного упрощения выражений, возникающих
 после замены переменной при интегрировании (подстановки Эй\-ле\-ра и др.).

 \item Как правило, вводимые в приеме новые термы $t$
 обрабатываются цепочкой нормализаторов, а иногда - также и
 вспомогательными задачами на пре\-об\-ра\-зо\-вание либо описание.
 В тексте приема не сохраняются координаты того вхождения в
 теорему терма $t$, который должен быть подвергнут обработке -
 считается, что она распространяется на все его вхождения, как в
 теорему, так и в фильтры приема. Однако, имеется возможность
 часть вхождений $t$ в теорему и в фильтры формировать с
 заблокированной обработкой нормализато\-ра\-ми (это бывает полезно,
 если $t$ встречался в идентифицируемой части теоремы и был
 отождествлен с некоторым термом задачи $T$ - для ссылок на этот
 "ис\-ход\-ный" \ вид терма $T$). Здесь применяется указа\-тель
 "копия($K$)", где $K$ - указатель того вхождения $t$ в теорему,
 для которого обработка нормализаторами бло\-ки\-ру\-ется. Если
 требуется заблокировать обработку нормализаторами вхождения $t$ в
 фильтр приема, то в этом фильтре вместо $t$ помещается запись
 "копия($t$)". Наиболее частый случай использования указателя
 "копия" \ - блокировка об\-ра\-бот\-ки нормализаторами некоторого терма
 при проверке предваритель\-ных условий. Например, в приеме
 предпринимается попытка разложения на мно\-жи\-те\-ли некоторой суммы
 $a+b$, но лишь после того, как установлено, что она
 неотрицательна. При проверке неотрицательности нет необходимости
 ис\-поль\-зо\-вать результат разложения на множители $a+b$, а берется
 исходный вид этой суммы.

 \item Если переменная $X$ была идентифицирована с выражением,
 заголовком ко\-то\-ро\-го служит ассоциативно - коммутативная операция
 $f$, то при формирова\-нии нового терма вида $f(A \ldots X \ldots
 B)$ корневые $f$ - операнды $X$ будут объединены в общую группу
 $f$ - операндов с $A, \ldots , B$. В тех случаях, когда это
 нежелательно (например, нужно выделить явное вхождение подтерма
 $X$, чтобы впоследствии заменить все такие вхождения на новую
 переменную), применяется указатель "спускоперандов($X$)" \ - он
 блокирует включение $f$ - операндов идентифициро\-ван\-но\-го с $X$
 выражения в группу $f$ - операндов внешней операции.

 \end{enumerate}

 \subsection{Указатели, определяющие дополнительные
 пре\-об\-ра\-зо\-ва\-ния}

 \subsubsection{Вывод дополнительных посылок и условий}

 В некоторых случаях целесообразно дополнить выполнение основного
 преобразова\-ния приема (тождественную либо эквивалентную замену,
 вывод условия либо по\-сыл\-ки) занесением в список посылок
 сопровождающих утверждений, истинность которых является
 следствием антецедентов теоремы, а также, быть может, ряда других
 специально проверяемых утверждений. Для этого используется
 указа\-тель "посылка(условие($A$)$B_1 \ldots B_n \ C$
 примечание($K_1$) $\ldots$ примечание($K_m$))". Здесь $A$ -
 фильтр, определяющий условия, при которых занесение посылки
 целесообразно (он может отсутствовать); $B_1, \ldots
 ,B_n$ - сформулированные в терминах переменных тео\-ре\-мы
 утверждения, истинность которых должна быть дополнительно
 установлена с помощью проверочных операторов перед занесением
 новой посылки; $C$ - сама новая посылка (тоже в терминах
 теоремных переменных); $K_1, \ldots , K_m$ - комментарии,
 которыми сопровождается эта посылка. При выводе $C$ проверяется,
 что все ут\-вер\-жде\-ния, использованные для проверки корректности
 преобразований приема и для проверки $B_1, \ldots , B_n$,
 относятся к списку посылок текущей задачи. Заметим, что
 фактически терм "примечание($K_i$)" \ здесь имеет вид
 "примечание($D_1 \ldots D_p$)", так что $K_i$ есть набор
 операндов $(D_1 \ldots D_p)$, начинающийся с логического символа
 $D_1$ (заголовка комментария); $p \ge 0$. Как и обычно, по
 умолчанию $D_j$ при $0 < j$ компилируются в виде термов; если
 требуется вместо этого иметь в коммента\-рии переменную либо
 логический символ, то используется запись "переменная($D_i$)".
 Ти\-пич\-ный случай использования указателя "посылка($\ldots$)" \ -
 вывод в геометрическом приеме таких дополнительных утверждений,
 характеризующих чертеж, которые по\-лез\-ны лишь при
 выполнении специальных условий.

 Особый случай - занесение дополнительных посылок, используемых
 при со\-про\-вож\-дении по области допустимых значений. Такие посылки
 необходимо своевре\-мен\-но формировать в процессе преобразований,
 чтобы легко было усматривать выполнение условий по о.д.з. на
 новые термы, введенные приемом. Так как выполнение даже самых
 простых алгебраических преобразований связано с проверкой
 выполнения условий по о.д.з., отсутствие сопровождающих
 утверждений может полностью за\-бло\-ки\-ро\-вать решение задачи. Отличие
 от общего случая со вводом дополнительных посылок заключается,
 во-первых, в том, что сопровождающее утверждение может быть
 занесено не только в список посылок, но и в список условий (если
 прием преобразует условие задачи на описание), и во-вторых, в
 том, что может происходить автоматический контроль
 неиспользуемости для сопровождения по о.д.з. ранее вве\-ден\-ных
 утверждений, с устранением их по мере возможности. Здесь
 используется указатель "вывод(условие($A$)$C$ эквивалентно($i_1
 \ldots i_n$))"; $A$ - фильтр проверки це\-ле\-со\-об\-разности вывода
 дополнительного утверждения $C$; $i_1, \ldots ,i_n$ - номера
 некоторых антецедентов теоремы, истинность которых является
 следствием утверждения $C$ и остальных антецедентов теоремы
 (подтерм "эквивалентно($\ldots$)", как и "условие($\ldots$)",
 может отсутствовать). Утверждения задачи, с которыми были
 идентифицированы указанные утверждения, если они после выполнения
 преобразования приема не ис\-поль\-зу\-ют\-ся в качестве сопровождающих
 по о.д.з., удаляются. В качестве при\-ме\-ра ситуации, требующей
 сопровождения преобразований вводом дополнительной по\-сыл\-ки с
 помощью указателя "вывод", рассмотрим исключение иррациональности в
 знаменателе выражения $a /(\sqrt(b)-\sqrt(c))$ путем
 домножения числителя и знаменателя на $\sqrt(b)+\sqrt(c)$.
 Знаменатель $b-c$ новой дроби может быть существенно видоизменен
 после приведения подобных членов, и для того, чтобы последующие
 приемы не испытывали затрудений при усмотрении отличия его от
 нуля, нужно сразу же вво\-дить посылку $b-c=0$. Так как
 нормализаторы применяются ко всем вхождениям терма $b-c$,
 то выполняемое ими приведение подобных членов будет предпринято и
 в новом знаменателе, и в сопровождающей посылке.

 Если решается задача на описание, то появляется возможность
 выполнять пре\-об\-ра\-зование подвыражения ее условия, используя в
 заменяющем терме вспомога\-тель\-ные обозначения, определяемые с
 помощью вводимых тем же приемом новых условий. Для этой и
 возможных других целей служит указатель "выводусловия($A \\ B_1
 \ldots B_n$)", позволяющий сопровождать основные действия приема
 занесением в спи\-сок условий текущей задачи на описание нового
 условия $A$. Данное условие снаб\-жа\-ет\-ся комментариями, вводимыми в
 термах $B_i$ вида "комментарий($\ldots$)"; возможен случай $n=0$.

 \subsubsection{Удаление посылок и условий}

 Если в результате применяемого преобразования пропадает терм,
 требовавший спе\-ци\-аль\-ного сопровождения по о.д.з., то прием может
 предпринять попытку исклю\-чить утверждения, обеспечивавшие такое
 сопровождение. В случае исключения по\-сыл\-ки для этого вводится
 указатель "удалениепосылки(условие($A$)$B$)"; в случае уда\-ле\-ния
 условия - указатель "удалениеусловия(условие($A$)$B$)". Здесь $B$
 - удаля\-е\-мое утверждение (в теоремных переменных); $A$ - фильтр,
 проверяющий целесообраз\-ность удаления (он может отсутствовать).
 Если $B$ действительно является посылкой (соответственно,
 условием) текущей задачи, то после выполнения определяемой
 при\-е\-мом замены проверяется, используется ли оно все еще в
 качестве сопровождаю\-ще\-го по о.д.з. утверждения, и если не
 используется, то удаляется. Пример использова\-ния указателя -
 при решении уравнения $\mbox{tg}(x) = a$ предпринимается попытка
 удалить условие $\neg(\cos(x) = 0)$, обеспечивавшее до этого
 сопровождение по о.д.з для ус\-тра\-нен\-ного тангенса.

 \subsubsection{Новые переменные, вводимые приемом}

 Прием может вводить новую переменную - такая переменная не имеет
 вхождений в идентифицируемые термы приема, но встречается в
 формируемых приемом новых термах. Если речь идет о связанной
 переменной, возникающей при вводе нового квантора либо описателя,
 то никаких специальных указателей для нее не требуется -
 компилятор обеспечит ввод ее автоматически. В противном случае
 нужны спе\-ци\-аль\-ные указатели, уточняющие способ ввода данной
 переменной. При отсутствии этих указателей компиляция приема не
 состоится.

 \begin{enumerate}

 \item Простейший указатель ввода новой переменной $X$ имеет вид
 "новаяпере\-мен\-ная($X$)". При его наличии компилятор просто выберет
 для построения ново\-го терма с $X$ некоторую не встречающуюся в
 текущем контексте переменную. Обозначение для нее будет
 выбираться, по мере возможности, с учетом условий на $X$ из
 антецедентов теоремы и с учетом контекста задачи - для
 неизвестных будут выбраны $x,y,z, \ldots$, для целочисленных
 переменных - $m,n,k, \ldots $, для точек - $A,B,C, \ldots $,
 и т.д. Часто встречающаяся ситуация со вводом новой пе\-ре\-мен\-ной -
 использование ее в качестве вспомогательного обозначения.
 Напри\-мер, вычисляется производная некоторой функции $f$, обозначаемая
 новой пере\-мен\-ной $g$, и в посылки задачи заносятся как утверждение
 "Производная($f,g$)", связывающее $g$ с $f$, так и равенство, явно
 определяющее $g$.

 \item Иногда нужно ввести не единственную переменную, а сразу
 кортеж перемен\-ных, длина которого определяется в зависимости от
 контекста. Например, это бывает при работе с функциями многих
 переменных. Тогда применяется ука\-за\-тель "переменные($X \ N$)",
 определяющий, что переменная $X$ идентифициру\-ет\-ся с набором новых
 переменных, длина которого определяется значением тео\-рем\-ной
 переменной $N$, идентифицированной с десятичной записью числа.

 \item Если новые переменные $X_1, \ldots , X_n$ должны быть
 присоединены к списку неиз\-вест\-ных текущей задачи на описание либо
 исследование, то используется ука\-за\-тель "новыенеизвестные
 ($X_1 \ldots X_n$)".

 \item Если прием вводит дополнительные построения - рассматривает
 некоторые новые объекты, условия на которые заносятся в список
 посылок текущей задачи, то особо должен быть учтен случай задачи
 на исследование - в этом случае предпринимается перенесение
 основных условий на новые объекты в список посылок внешней задачи
 на описание. Здесь используется указатель "но\-вый\-сим\-вол($X \ K_1
 \ldots K_n$)", где $X$ - новая переменная; $K_1, \ldots , K_n$ -
 указатели вхож\-де\-ний в теорему основных утверждений о свойствах
 $X$, которые целесообразно перенести в список посылок внешней
 задачи на описание. Хотя в процессе обучения решателя оказалось,
 что такая предусмотрительность является лишь формальностью -
 список посылок внешней задачи на описание фактически полностью
 отключен от процесса решения - указатель "новыйсимвол($\ldots$)"
 \ при\-ме\-ня\-ется во всех приемах по планиметрии, связанных с
 дополнительными пос\-т\-ро\-ениями.

 \item При решении задачи на исследование, связанной с задачей на
 описание вы\-чис\-ли\-тель\-ного типа (например, вычислительные задачи в
 планиметрии), либо при решении задачи на доказательство путем
 вычислений в посылках, существен\-ным является разделение
 переменных на неизвестные внешней задачи, неиз\-вест\-ные
 "внутреннего" \ характера (это просто обозначения вспомогательных
 объектов, которые не должны войти в окончательный ответ,
 например, обоз\-на\-че\-ния точек на чертеже), и известные параметры.
 Часто для решения задач такого типа применяется прием, вводящий
 как бы известный новый параметр, через который далее будут
 выражаться прочие переменные задачи. Впослед\-ст\-вии либо окажется,
 что удалось найти выражения для неизвестных, в которых такой
 вспомогательный параметр "сократился", либо будут предприняты
 допол\-ни\-тель\-ные действия по определению его значения после
 выражения через него неизвестных задачи. Тогда он сам поменяет
 статус вспомогательной "извест\-ной" \ на вспомогательную
 "неизвестную". Для первоначального ввода вспо\-мо\-га\-тель\-ного
 "известного" \ параметра $X$ применяется указатель
 "вспомпараметр($X \\ K_1 \ldots K_n$)", где $K_1, \ldots , K_n$ -
 указатели вхождений в теорему тех утверждений о $X$, добавляемых
 при вводе этого параметра к списку посылок, которые одно\-вре\-мен\-но
 должны быть зарегистрированы в списке посылок внешней задачи на
 описание. Заметим, что при вводе вспомогательного параметра все
 веса посылок задачи обращаются в 0; это способствует срабатыванию
 полез\-ных приемов при повторном сканировании ее посылок,
 независимому от введения дополнительных "известных" \ параметров.
 Заметим также, что один прием мо\-жет вводить несколько
 вспомогательных параметров (каждый требует своего указателя).

 \item Другой способ придать нужную целенаправленность действиям
 по решению задачи на исследование, имеющей цель "известно", либо
 задачи на дока\-за\-тель\-ство - ввести вспомогательную неизвестную
 $X$, которая в случае задачи на исследование переносится также в
 список неизвестных внешней задачи на описание, однако найденные
 ее значения не включаются в ответ такой задачи. Фильтры многих и
 многих приемов (например, по планиметрии) ак\-тив\-но ре\-а\-ги\-ру\-ют на
 связь с неизвестными внешней задачи тех или иных числовых
 параметров текущей задачи (расстояния, углы и проч.), так что
 фактичес\-ки ввод вспомогательной неизвестной оказывается примерно
 равноценен ре\-ше\-нию вспомогательной задачи на нахождение значения
 такой неизвестной. Впро\-чем, вычисление ее значения происходит
 здесь в более гибком режиме - парал\-лель\-но с прочими действиями по
 решению основной задачи, что часто гораздо более предпочтительно,
 чем грубое прерывание общего процесса анализа посылок и
 локализация внимания только на вспомогательном вычислении. Для
 указания на то, что прием вывода фактически вводит обозначение
 для новой неизвестной $X$, используется указатель
 "вспомнеизвестная($X$)". Прием может вводить сразу несколько
 вспомогательных неизвестных, связанных между собой утвер\-жде\-ни\-ями,
 присоединяемыми им к списку посылок. В этом случае вводятся
 несколько отдельных указателей "вспомнеизвестная($\ldots$)". В
 случае задачи на дока\-за\-тель\-ство ввод вспомогательной неизвестной
 сопровождается понижением до 0 ве\-сов всех посылок и веса условия.

 \end{enumerate}

 \subsubsection{Обработка надтермов}

 Если применяется преобразование тождественной либо эквивалентной
 замены, то оно может повлечь за собой различного рода нарушения
 стандартизации вида термов, и как следствие - цепочку
 срабатываний мелких нормализующих приемов. Такого рода цепочки
 срабатываний увеличивают число сканирований и могут ощутимо
 по\-вли\-ять на время решения задачи. Для борьбы с ними, в первую
 очередь, применяются различного рода нормализаторы,
 обеспечивающие необходимую стандартизацию вну\-три самого
 заменяющего терма. Однако, эти нормализаторы не выполняют
 вос\-ста\-нов\-ле\-ния стандартизации для надтермов заменяемого терма.
 Чтобы выполнять такую стандартизацию надтермов, в оператор ЛОСа
 "заменавхождения($\ldots$)", ис\-поль\-зу\-емый для реализации
 тождественных и эквивалентных замен при ска\-ни\-ро\-ва\-нии задачи,
 встроена процедура, последовательно просматривающая надтермы (в
 направлении их увеличения) и обрабатывающая их посредством
 пакетных нор\-ма\-ли\-за\-то\-ров общей стандартизации (эти нормализаторы
 находятся с помощью спра\-воч\-ни\-ка "нормализатор"). Эта процедура
 активизируется, если прием выделен указател\-ем "норм". Примером
 использования этого режима служит группа приемов, выпол\-ня\-ю\-щих
 сложение и упрощение дробей - для проверки возможности применения
 последующей стандартизации дробей (деление дроби; деление на
 дробь; сокращение дроби и т.п.).

 Аналогичный механизм стандартизации надтермов может быть включен
 при по\-мо\-щи указателя "нормализатор". Такой указатель обычно
 выделяет приемы общей стандартизации. После некоторых замен,
 нарушающих стандартизацию для над\-тер\-мов замененного терма, может
 возникнуть длинная цепочка простых стан\-дар\-ти\-зи\-ру\-ющих
 преобразований. Эти преобразования, в целях уменьшения
 трудоемкости, выгодно применять вне сканирования. Поэтому, как
 только к одному и тому же тер\-му задачи применяются подряд два
 приема, снабженные указателем "нормализа\-тор" \ (что может служить
 сигналом о наличии указанной выше длинной цепочки
 стандартизации), автоматически включается специальная процедура,
 выполняющая полную обработку этого терма пакетными
 нормализаторами. Эта же процедура обес\-пе\-чи\-ва\-ет необходимую
 коррекцию структур данных, выполняющих сопровожде\-ние по о.д.з.
 Обращение к указанной процедуре (заголовком ее служит логический
 символ "блокнормализации") происходит из программы
 "заменавхождения", обеспечива\-ю\-щей замены при сканировании задачи.

 \subsubsection{Коррекция содержимого буферов обращений к
 пакетным операторам}

 После выполнения преобразования может сложиться ситуация, когда
 автоматическое использование таких хранящихся в буфере обращений
 к заданному нормализатору результатов, которые содержат некоторый
 терм $t$, нецелесообразно - прием только что "избавился" \ от
 этого терма. Здесь применяется указатель "контрольнорма\-ли\-за\-ции($A
 \ t$)", инициирующий исключение из буфера обращений к
 нормализатору $A$ всех результатов, содержащих подтерм $t$.
 Возможно также исключение из буфера всех результатов обращений к
 $A$ - для этого достаточно не указывать $t$.

 \subsubsection{Особые случаи сопровождения по области допустимых
 значений}

 \begin{enumerate}

 \item Если прием выполняет замену некоторого утверждения, которое
 может ис\-поль\-зо\-вать\-ся в качестве сопровождающего по о.д.з. (при
 отключенной блокиров\-ке таких замен - на это отключение приходится
 идти при завершающем ре\-дак\-ти\-ро\-вании ответа), то рекомендуется
 сохранять информацию о том, что его исходная версия выводима из
 новой версии (а также из прочих обеспечивавших корректность замены
 утверждений из текущего контекста), вводя указатель
 "стандследствие". Эта информация сохраняется в комментарии
 "стандследст\-вие $\ldots$" \ к посылкам исходной задачи и может
 быть использована далее опе\-ра\-то\-ром "стандследствие", к
 которому обращаются все проверочные операторы.

 \item Если сопровождающие по о.д.з. утверждения нецелесообразно
 регистриро\-вать в списках посылок и условий задачи, но тем не
 менее указания на то, что они являются следствиями конкретных
 посылок и условий, могут пригодиться, то применяется указатель
 "вычерк". Прием в этом случае будет сохранять информацию о
 сопровождающих утверждениях в комментарии "стандследст\-вие
 $\ldots$". Фактически такой указатель был использован только для
 приема, выполняющего формальное интегрирование путем обращения к
 нормализатору "нормИнтеграл".

 \item Иногда, наоборот, целесообразно зарегистрировать
 сопровождающие по о.д.з. условия для новых термов, даже не
 проверяя того, что они суть следствия старых условий и посылок
 (например, они могут возникнуть при вычислении пределов либо
 суммировании рядов как необходимые условия существования предела
 либо суммы ряда). Тогда вводится указатель "внешвывод" \ - он
 ини\-ции\-рует автоматическое перенесение всех новых утверждений из
 накопителя "коррекцияпосылок $\ldots$" \ в контекст замены
 (например, в список посылок).

 \item В определенных случаях сопровождение по о.д.з. может
 все-таки нарушаться. Это не означает, что в контексте требующего
 сопровождения терма отсутству\-ют утверждения, следствием которых
 являются необходимые условия на о.д.з. - просто усмотрение из них
 этих условий неочевидно, и в комментариях яв\-ных ссылок на эти
 утверждения как на сопровождающие по о.д.з. нет. Такая ситуация
 возникает, как правило, лишь в особых случаях - после обращения к
 вспомогательным задачам на описание. При редактировании ответа
 данной задачи все сопровождающие по о.д.з. утверждения могут быть
 явно разре\-ше\-ны относительно своих параметров (такова обычная
 стандартизация ответов), и тогда явное сопровождение становится
 неявным. Если полученный таким образом ответ используется далее в
 задаче, то явное сопровождение необходимо восстанавливать - без
 него будут заблокированы многие важные приемы. Вос\-ста\-нов\-ление
 обеспечивается специальными приемами, снабженными указателем
 "коррекцияодз". Эти приемы суть обычные приемы вывода в посылках
 либо ус\-ло\-виях; применение их начинается с усмотрения в задаче
 требующего со\-про\-вож\-дения по о.д.з. терма $A$ (например,
 квадратного корня) - он опре\-де\-ля\-ется указателем
 "контрольвывода($A$)". Кроме регистрации в посылках ли\-бо условиях
 сопровождающих утверждений, прием осуществляет соответ\-ству\-ющую
 коррекцию комментария "сопровождение" к текущей задаче.

 \end{enumerate}

 \subsubsection{Пополнение ответа задачи}

 Теорема приема "ответзадачи" \ явно перечисляет список условий на
 неизвестные, которые выдаются в качестве ответа. Иногда этот
 ответ целесообразно пополнить некоторыми утверждениями,
 отсутствующими в указанном списке, но являющи\-ми\-ся его
 следствиями. Тогда применяется указатель "плюс(условие($A$)$B_1
 \ldots B_n$)", где $A$ - фильтр, определяющий целесообразность
 присоединения к ответу утверждений $B_1, \ldots , B_n$ (фильтр
 может отсутствовать).

 \subsubsection{Расширение списков переменных, указанных в целях
 задачи}

 Вводимые при решении задачи новые переменные иногда бывает нужно
 заре\-гис\-три\-ро\-вать в тех или иных целях текущей задачи. Для этого
 можно использовать указатель "установка($A \ X$)". Переменная $X$
 заносится тогда в список $B_1 \ldots B_n$ цели, имеющей вид $(A \
 B_1 \ldots B_n)$. Этот же указатель можно применять и в ситуации,
 ког\-да заносимый в цель ($A \ldots $) объект - не переменная, а
 терм. Тогда вместо $X$ в указателе помещается запись "терм($T$)",
 где $T$ - заносимый терм.

 Для достаточно часто возникающей необходимости пополнять новыми
 пе\-ре\-мен\-ны\-ми цель "обозначение $X_1 \ldots X_k$" \ (она
 перечисляет вспомогательные переменные, которые не должны входить
 в ответ задачи на описание либо преобразование) пред\-ус\-мотрен
 специальный указатель "обозначения($x_1 \ldots x_p$)", где $x_1,
 \ldots , x_p$ - добавляемые к цели "обозначение $\ldots$" \
 переменные.

 \subsection{Указатели, уточняющие точку привязки приема}

 Приемы сканирования задачи инициализируются при рассмотрении
 вхождения в задачу некоторого логического символа. Это вхождение
 называется точкой привязки приема; для уточнения ее вида служат
 следующие указатели:

 \begin{enumerate}

 \item Если прием определяет вывод следствий в посылках либо
 условиях задачи, то инициализация попытки его применения не
 всегда связана с обнаружением при сканировании задачи явного
 вхождения одного из антецедентов теоремы приема. Иногда она может
 быть вызвана обстоятельствами весьма косвенного характера -
 обнаружением где - либо в задаче некоторого выражения либо
 утверждения $T$, при работе с которым могут понадобиться
 формулируемые приемом свойства входящих в $T$ объектов. Чтобы
 инициализация приема на\-чи\-на\-лась с обнаружения при сканировании
 терма $T$, используется указатель "контрольвывода($T$)". В
 качестве примера рассмотрим прием вывода следствий в посылках,
 записывающий соотношение для площади равнобедренного
 тре\-у\-голь\-ника:

 $l(AB)=l(AC) \ \& \ D \in
 \mbox{прямая}(BC) \ \& \ l(BD) = l(CD) \rightarrow
 2 S(\mbox{фигура}(ABC)) = l(AD)l(BC)$.

 Указатель "контрольвывода(площадь(фигура(набор($ABC$))))" \
 определяет в ка\-чест\-ве точки привязки приема вхождение выражения
 $S(\mbox{фигура}(ABC))$, кото\-рое в антецедентах теоремы не
 встречается.

 \item Чтобы явно указать логический символ $A$, к которому должна
 быть отнесена программа приема - тогда его срабатывание будет
 начинаться с усмотрения при сканировании некоторого вхождения
 символа $A$ - используется указатель "точкапривязки($A$)".

 \item Как правило, заменяемый терм теоремы для приема замены
 должен быть не\-вы\-рож\-денным, не сводящимся к обычной либо
 функциональной переменной, иначе трудно определить точку
 привязки. Однако, иногда бывает нужно иден\-ти\-фи\-ци\-ровать такой
 вырожденный терм однозначным образом - с условием текущей задачи
 на преобразование. В этом случае применяется указатель "ко\-рень".

 \item Если точку привязки требуется выбрать в антецеденте
 теоремы, имеющем но\-мер $i$, то вводится указатель
 "теквхожд($i$)". Фактически оказалось, что он стал использоваться
 лишь в сочетании с указателем "усм($i$)" \ для антецедента,
 имеющего вид утверждения о перпендикулярности. Исключение
 составляет ед\-ин\-ст\-вен\-ный случай, когда из соображений переключения
 внимания в приеме замены понадобилось точку привязки выбрать в
 обычном (идентифицируемом с посылкой задачи) антецеденте.

 \item Чтобы выделить в приеме "ответзадачи" \ тот конъюнктивный
 член теоремы, который желательно использовать в качестве точки
 привязки, применяется указатель "смответ($i$)", где $i$ -
 символьный номер данного конъюнктив\-но\-го члена; нумерация
 начинается с 1.

 \end{enumerate}

 \subsection{Указатели, определяющие преобразования ком\-мен\-та\-ри\-ев}

 \subsubsection{Ввод нового общего комментария в случае
 применения приема}

 Чтобы при срабатывании приема вводился новый комментарий к
 текущей задаче (в случае задач на исследование - комментарий к
 посылкам задачи) либо комментарий к пакетному оператору,
 используется указатель "замечание($A_1 \ldots A_n$)". $A_1$ -
 логичес\-кий символ, являющийся заголовком комментария; $A_2,
 \ldots, A_n$ - операторные вы\-ра\-жения для элементов комментария.
 Типы допустимых здесь выражений - те же, что при задании
 комментариев в фильтрах приемов. Возможен случай $n=1$, и тогда
 комментарий состоит из логического символа $A_1$. Комментарий
 вводится лишь непосредственно перед обращением к процедуре ЛОСа,
 выполняющей преобра\-зо\-ва\-ния приема. Однако, в определенных случаях
 блокировка срабатывания может произойти уже внутри последней
 процедуры - если преобразование оказалось вы\-рож\-ден\-ным, либо
 нарушающим сопровождение по о.д.з, либо вследствие учета
 каких-либо общих установок на решение задачи. Если в таких
 случаях важно не допус\-тить ввода комментария, то перед $A_1$ в
 указанной выше записи добавляется символ "результат". Комментарий
 формируется с отбрасыванием этого символа, и вводит\-ся только
 после фактического выполнения преобразования. Наконец, перед
 $A_1$ возмож\-но поместить терм "условие($B$)", где $B$ - фильтр,
 и тогда комментарий будет вводить\-ся только при истинности условия
 $B$.

 Если применяется прием нормализатора, но комментарий требуется
 ввести не для нормализатора, а для текущей задачи, то перед $A_1$
 в указателе "замечание($\ldots$)" \ помещается логический символ
 "текзадача".

 По умолчанию, разрешается вводить множество копий одного и того
 же коммен\-та\-рия. Иногда это используется для контроля глубины
 цепочки однотипных пре\-об\-ра\-зований (например, применений правила
 Лопиталя для вычисления пределов). В тех случаях, когда требуется
 предотвратить дублирование комментариев, для ввода нового
 комментария нормализатора либо анализатора, вместо "замечание($\ldots$)"
 \ при\-ме\-ня\-ется указатель "замечусловие($A_1 \ldots A_n$)".

 Если требуется ввести комментарий к посылкам текущей задачи (при
 применении приема сканирования задачи), то используется указатель
 "комментариипосылок($A_1 \\ \ldots A_n$)". Чтобы гарантировать ввод
 комментария только в случае фактического при\-ме\-не\-ния
 преобразования приема, перед $A_1$ помещается логический символ
 "резуль\-тат".

 \subsubsection{Ввод комментария к новому либо преобразованному
 терму задачи}

 Если требуется снабдить комментарием новую посылку либо условие,
 сфор\-ми\-ро\-ван\-ные при выводе следствий, либо преобразованный приемом
 терм задачи, либо новое утверждение, введенное анализатором, то
 используется указатель "примечание($A_1 \\ \ldots A_n$)" \ либо
 "примечание(условие($B \ A_1 \ldots A_n$))". Набор $A_1, \ldots ,
 A_n$ определяет ком\-мен\-тарий; $B$ - фильтр, указывающий
 дополнительное условие для ввода этого ком\-мен\-тария.

 \subsubsection{Ввод комментария к терму задачи,
 идентифицированному с задан\-ным антецедентом}

 Новым комментарием можно снабдить посылку либо условие задачи,
 иден\-ти\-фи\-ци\-ро\-ван\-ные с заданным антецедентом теоремы приема. Для
 этого используется указатель "примечпосылки($i \ A_1 \ldots
 A_n$)". $i$ - номер антецедента; набор $A_1, \ldots , A_n$
 определяет вводимый комментарий. Формат задания комментария -
 такой же, как в случае "замечание($\ldots $)".

 \subsubsection{Проверка отсутствия комментария с последующим его
 вводом}

 Комментарии могут играть роль "защелки", пропуская внутрь приема
 при первой попытке применения и блокируя повторные попытки. В
 таких случаях в процессе применения приема сначала
 предпринимается проверка отсутствия заданного ком\-мен\-та\-рия, а
 впоследствии, в зависимости от типа примененного указателя, его
 ввод. Используются указатели следующих типов:

 \begin{enumerate}

 \item Простейший тип защелки - ввод комментария (к задаче,
 нормализатору либо анализатору) непосредственно после проверки
 его отсутствия. Здесь при\-ме\-ня\-ется указатель "ключ($A_1 \ldots
 A_n$)", где $A_1$ - заголовок комментария; $A_2, \ldots , A_n$ -
 его элементы. Формат термов $A_2, \ldots , A_n$ при работе с
 защелками отличается от обычного, использованного в фильтрах и
 ранее описанных указателях. Каж\-дый из них представляет собой
 либо логический символ (при этом служебный символ "теквхожд" \
 обозначает текущий идентифицируемый в приеме под\-терм), либо терм
 в теоремных переменных, либо определяющий вхождение терм
 "вхо\-ж\-дение($C$)", где $C$ - операторное выражение.

 Проверка отсутствия комментария и его ввод происходят
 немедленно после идентификации всех переменных термов $A_2,
 \ldots , A_n$. Если этот момент нужно отложить до того, как
 дополнительно будут идентифицированы переменные $X_1, \ldots ,
 X_m$, то к списку $A_2, \ldots , A_n$ добавляется элемент
 "фикс($X_1 \ldots X_m$)" \ (он никак не изменяет самого
 комментария). Использование в $A_2, \ldots , A_n$ указателей
 вхождения в теорему не предусмотрено. Еще один способ отложить
 момент проверки отсутствия комментария и его ввода - размещение в
 конце списка $A_2, \ldots , A_n$ терма "посылки($i_1 \ldots
 i_k$)", перечисляющего номера тех антецедентов, истинность
 которых должна быть установлена до указанного момента.

 \item Следующий тип "защелки" \ - проверка отсутствия комментария
 и ввод его при откате, если прием оказался не реализованным.
 Указатель здесь имеет вид "попытка($A_1 \ldots A_n$)". Как и в
 предыдущем случае, проверка отсутствия комментария происходит
 сразу же после идентификации всех переменных, вхо\-дя\-щих в термы
 $A_2, \ldots , A_n$. Чтобы отложить этот момент, можно применять
 термы "фикс($X_1 \ldots X_m$)" \ и "посылки($i_1 \ldots i_k$)".

 \item Если проверка отсутствия комментария и его ввод должны
 происходить не\-по\-сред\-ст\-венно перед применением преобразования
 приема, то используется ука\-за\-тель "биключ($A_1 \ldots A_n$)".
 Записи "фикс($\ldots$)" \ и "посылки($\ldots$)" \ здесь излишни.

 \item Предшествующие указатели вводили общий комментарий задачи
 (в случае за\-дач на исследование - комментарий к посылкам задачи)
 либо пакетного опе\-ра\-то\-ра. Чтобы проверить отсутствие комментария
 к текущему терму задачи (внутри которого находится точка привязки
 приема) и сразу после этого ввести данный комментарий,
 применяется указатель "первыйключ($A_1 \ldots A_n$)". Про\-вер\-ка
 происходит сразу же после идентификации переменных термов $A_2,
 \ldots , A_n$; чтобы отложить этот момент, можно применять записи
 "фикс($X_1 \ldots X_n$)" \ и "посылки($i_1 \ldots i_k$)".

 \item Чтобы ввести комментарий к текущему терму задачи не сразу
 после проверки отсутствия этого комментария, а лишь при откате,
 если прием не был реали\-зо\-ван, применяется указатель "Попытка($A_1
 \ldots A_n$)". Он совершенно аналогичен приведенному выше
 указателю "попытка($A_1 \ldots A_n$)".

 \end{enumerate}

 \subsubsection{Коррекция ранее введенного комментария}

 Чтобы изменить ранее введенный комментарий, применяется указатель
 "изменение(\\ $A \ B_1 \ldots B_n \ C_1 \ldots C_k$)". Здесь $A$ -
 идентифицирующий терм "комментарий($\ldots$)" \ либо
 "комментарийпосылки($\ldots$)" \ либо "примечание($\ldots$)";
 $B_1, \ldots , B_n$ - фильтры, опре\-де\-ля\-ющие дополнительные
 условия на введенные в терме $A$ разряды преобразуемого
 комментария (могут отсутствовать); $C_1, \ldots , C_k$ - термы
 вида "замена($i \ P$)", где $i$ - номер изменяемой позиции
 комментария (номер 0 имеет заголовок комментария); $P$ -
 операторное выражение, значением которого является заменяющий
 объект.

 Часто встречается ситуация, в которой комментарий используется
 как накопитель объектов некоторого типа. При первом появлении
 такого объекта комментарий дол\-жен быть введен, а при каждом
 последующем появлении - список объектов в уже имеющемся
 комментарии должен быть пополнен. В случае комментариев к
 посылкам задачи данный режим вводится указателем "Примечание($A \
 B$)". $A$ - логический символ, являющийся заголовком комментария.
 Комментарий имеет вид ($A \ N$), где набор $N$ - накопитель
 объектов. Операторное выражение $B$ должно определять логический
 символ либо переменную.

 \subsubsection{Удаление комментария}

 При выполнении приема замены, реализуемого в сканировании задачи,
 можно уда\-лить заданный комментарий. Для этого используется
 указатель "удалениезамеча\-ния($A \ B_1 \ldots B_n$)".
 Здесь $A$ - идентифицирующий терм "комментарий($\ldots$)"
 \ либо "ком\-ментарийпосылки($\ldots$)" \ либо
 "примечание($\ldots$)"; $B_1, \ldots , B_n$ - фильтры,
 оп\-ре\-де\-ляющие дополнительные условия на введенные в терме $A$
 разряды удаляе\-мо\-го комментария (могут отсутствовать). В
 идентифицирующем терме $A$ допускается явное указание
 комментария, без каких-либо идентифицируемых переменных. Если же
 такие пе\-ре\-мен\-ные есть, то удаляются все комментарии выделенного
 типа.

 Аналогичным образом, для удаления комментария к нормализатору
 используется указатель "удалениезамечания($B \ A_1 \ldots A_n$)".
 Здесь $B$ - фильтр, определяющий усло\-вие, при котором происходит
 удаление комментария; $A_1, \ldots , A_n$ - набор, определя\-ю\-щий
 удаляемый комментарий - в стандартном формате, как для указателя
 "замеча\-ние($\ldots$)".

 \subsubsection{Ввод комментариев при обращении к проверочному
 оператору, син\-те\-за\-то\-ру либо задаче на доказательство,
 обрабатывающим заданный ан\-те\-це\-дент}

 \begin{enumerate}

 \item Если для проверки истинности заданного антецедента либо его
 реализации происходит обращение к вспомогательной задаче,
 проверочному оператору ли\-бо синтезатору, то при обращении им
 может быть передан заданный комментарий. Для этого используется
 указатель "комментарий($i$ условие($B$) $A_1 \ldots A_n$)". Здесь
 $i$ - номер антецедента; $B$ - фильтр, определяющий условие ввода
 комментария; $(A_1 \ldots A_n)$ - набор, определяющий
 комментарий. Формат задания комментария здесь стандартный (такой
 же, как в указателе "замечание($\ldots$)").

 \item Если происходит обращение к задаче на доказательство
 антецедента, имеющего вид кванторной импликации $\forall_{x_1
 \ldots x_n}(P_1 \ \& \ \ldots \ \& \ P_m \rightarrow P_0)$, то
 $P_1, \ldots , P_m$ ста\-но\-вят\-ся посылками данной задачи.
 Утверждение $P_i$ как посылку при этом можно снабдить заданным
 комментарием. Для этого используется указатель "комментарий($K$
 условие($B$)$A_1 \ldots A_n$)", аналогичный приведенному выше.
 Од\-на\-ко, здесь уже $K$ является не номером антецедента, а
 указателем вхождения в теорему приема утверждения $P_i$

 \item При обращении из пакетного оператора к проверочному
 оператору либо син\-те\-за\-тору, обрабатывающему некоторый антецедент,
 по умолчанию происходит передача комментариев текущего оператора
 к подоператору. Чтобы передавать не все такие комментарии, а
 только имеющие заголовки $A_1, \ldots , A_n$, исполь\-зу\-ет\-ся
 указатель "комментарии($i \ A_1 \ldots A_n$)", где $i$ - номер
 антецедента. Если нужно, наоборот, удалить все комментарии с
 данными заголовками, то используется указатель
 "удалениепримечания($i \ B \ A_1 \ldots A_n$)", где $B$ - фильтр,
 определя\-ю\-щий условия, при которых происходит удаление (может
 отсутствовать).

 \item Наконец, предусмотрено удаление конкретных комментариев при
 обращении из пакетного оператора к проверочному оператору либо
 синтезатору. Здесь используется указатель "исключение($i$
 условие($B$)$A_1 \ldots A_n$)", где $i$ - номер ан\-те\-це\-ден\-та; $B$
 - фильтр, определяющий условия, при которых происходит уда\-ле\-ние
 комментария; $A_1, \ldots , A_n$ - набор, задающий комментарий в
 стандарт\-ном формате (как для указателя "замечание($\ldots$)").

 \end{enumerate}

 \subsubsection{Ввод комментария к вспомогательной задаче,
 возникающей при попытке замены}

 Прием замены, имеющий указатель "попытказамены", не
 предпринимает, как уже говорилось выше, непосредственного
 изменения текущей задачи, а вводит вспо\-мо\-га\-тель\-ную задачу - копию
 текущей, в которой уже и реализуется данная замена (при неудаче
 решения последней происходит откат к прерванному решению те\-ку\-щей
 задачи). Возможна передача комментария этой вспомогательной
 задаче. Здесь применяется указатель "Замечание($A_1 \ldots
 A_n$)", где набор $A_1, \ldots , A_n$ определяет ком\-мен\-та\-рий в
 том же формате, как и для указателя "замечание($\ldots$)".

 \subsubsection{Специальные комментарии, используемые для учета
 взаимной вы\-во\-ди\-мос\-ти утверждений}

 Во многих случаях приемы вывода следствий в действительности
 определяют эк\-ви\-ва\-лентное преобразование одной из использованных
 посылок. Например, при по\-лу\-че\-нии линейной комбинации двух
 уравнений с ненулевыми коэффициентами возмо\-жен обратный
 логический переход от нее к одному из исходных уравнений, в
 пред\-по\-ло\-же\-нии истинности второго уравнения. Учет такого рода
 обратных переходов может существенно сократить трудоемкость
 решения задачи, устраняя проверку исходных уравнений. Для
 реализации его применяется указатель "прообраз($i$ посылки($A_1
 \ldots \\ A_n$) вывод($B_1 \ldots B_m$))". Здесь $A_1, \ldots , A_n$
 - дополнительно проверяемые прове\-роч\-ны\-ми операторами утверждения.
 Если удалось установить их истинность, то прием дополнительно
 выводит следствия $B_1, \ldots ,B_m$ и регистрирует в комментарии
 "про\-об\-раз $\ldots$" \ тот факт, что $i$ - й антецедент является
 следствием консеквента, прочих использованных при выводе
 утверждений из контекста идентификации, а также утверждений $B_1,
 \ldots , B_m$. Списки $A_1, \ldots , A_n$ и $B_1, \ldots , B_m$
 могут быть пустыми. За\-ме\-тим, что фактически указатель
 "прообраз($\ldots$)" \ применялся только в приемах анализаторов.

 \subsubsection{Использование фильтра, проверяющего существование
 объектов не\-ко\-то\-ро\-го типа, для сохранения в комментариях списка
 всех таких объектов}

 Если прием нормализатора должен не только проверить при оценке
 целесообразности своего срабатывания существование объектов,
 удовлетворяющих заданному условию, но также передать внешним
 приемам список всех таких объектов либо некоторых характеристик
 этих объектов, то можно разместить внутри фильтра
 "контекст($\ldots$)" \ (например, в качестве последнего операнда)
 указатель "буфер($A \ R$)". В этом случае данный фильтр не
 ограничится отысканием единственного набора значений своих
 внутренних парметров, при котором его условия истинны, а станет
 перечислять все такие значения. Для каждого из них будет
 определяться значение операторного выражения $R$, и это значение
 будет регистироваться в накопителе $N$ комментария $(A \ N)$;
 повторяющиеся элементы в накопитель не заносятся. При обращении к
 нор\-ма\-ли\-за\-то\-ру должен быть введен его комментарий с заголовком
 $A$. Фактически данный режим был использован в нормализаторе
 "повторчисло", обеспечивающем выделе\-ние в явном виде
 повторяющихся вхождений подвыражений с неизвестными. После того,
 как некоторый прием этого нормализатора изменяет одно из
 уравнений таким образом, чтобы в нем возникло выражение с
 неизвестными, встречающееся в другом уравнении, ссылка на такое
 внешнее уравнение заносится в специальный коммен\-та\-рий, который по
 окончании работы с текущим уравнением инициирует повторное
 рассмотрение зарегистрированных в нем уравнений.

 \subsubsection{Ввод комментариев к внешнему нормализатору}

 Иногда бывает нужно передать комментарий одной из внешних
 процедур - соглас\-но цепочке обращений, в конце которой находится
 текущая реализуемая проце\-ду\-ра. Например, это может быть связано с
 передачей сообщения о целесообраз\-нос\-ти разбора случаев, которая
 выяснилась лишь в текущей подпроцедуре. Если внеш\-няя процедура
 представляет собой нормализатор, то для такой передачи
 комментария предусмотрен указатель "нормализация($A \ B \ C_1
 \ldots C_n$)". Здесь $A$ - заголовок внеш\-не\-го нормализатора; $B$
 - фильтр, определяющий условие передачи комментария; $C_1, \ldots
 , C_n$ - набор, определяющий комментарий в стандартном формате. В
 фильтре $B$ можно ссылаться на текущий обрабатываемый внешним
 нормализатором $A$ терм посредством служебного логического
 символа "внешкорень". Если имеется несколь\-ко внешних
 нормализаторов с заголовком $A$, для которых выполняется условие
 $B$, то комментарий передается каждому из них. Фильтр $B$ может
 отсутствовать.

 Предусмотрен вариант, в котором комментарий передается не всем
 внешним нор\-ма\-ли\-заторам $A$ (если их несколько), а лишь тому из
 них, который ближе всего по цепочке обращений расположен к
 текущей процедуре. Здесь используется указа\-тель
 "учетнормализации($A \ B \ C_1 \ldots C_n$)".

\subsection{Указатели, определяющие переключение внимания}

После того, как был применен прием, может оказаться вероятным
срабатывание некоторых других приемов. Чтобы такое срабатывание
стало возможным, необходимо уменьшить веса тех посылок либо
условий, при рассмотрении которых эти другие приемы активизируются
- "переключить внимание". Наиболее вероятные точки, для которых
целесообразно осуществить переключение внимания, выявляются в
процессе обучения решателя на потоке задач (например, просто
сохраняются указания на переключение внимания, оказавшиеся
необходимыми для решения отдельных задач обучающей выборки). Ниже
приво\-дят\-ся типы указателей, обеспечивающих
пе\-ре\-клю\-че\-ние внимания.

\begin{enumerate}

\item Наиболее часто используемый указатель - "новаяпосылка($X \ A
\ N$)". В этом указателе $A$ представляет собой фильтр,
определяющий условие на посылку $X$ текущей задачи, вес которой
должен быть понижен до $N$ (если он уже не был меньшим или равным
$N$). $N$ - явно указываемое символьное число; $X$ - новая
переменная, используемая в контексте данного указателя - она
пробегает все посылки текущей задачи. Если перед $X$ размещается
запись "условие($P$)", то понижение весов будет предприниматься
только при истинности фильтра $P$.

\item Аналогичным образом используется указатель "новоеусловие($X
\ A \ N$)", у ко\-то\-ро\-го $X$ пробегает все условия текущей
задачи на описание. В приеме явно должно быть указано, что он
применяется к задаче на описание.

\item Если требуется понизить до величины $N$ вес посылки, с
которой был иден\-ти\-фи\-ци\-ро\-ван $i$ - й антецедент теоремы,
то применяется указатель "актив($i \ N$)".

\item По умолчанию, при компиляции приема сканирования задачи, в
начале его программы вставляется оператор "новый". Этот оператор
блокирует при\-ме\-не\-ние приема в циклах повторного сканирования
терма $T$ задачи, попавшего на некоторый период в "теневую зону" \
сканирования, предпринимаемых перед выходом его из "теневой зоны"
\ (т.е. когда текущий уровень задачи становит\-ся на 1 меньше веса
данного терма). Однако, если срабатывание приема су\-щест\-вен\-но
зависит от возможности появления за период пребывания в "теневой
зоне" \ терма $T$ новых посылок либо условий, такой оператор
нежелателен. Ус\-тра\-не\-ние его обеспечивается применением
указателя "новый". Заметим, что в предметных областях,
характеризующихся большими длинами списка посылок (например, в
геометрии) неосторожное применение указателя "новый" \ может
существенно замедлить работу решателя. Компенсировать его
отсутствие при\-хо\-дит\-ся явными указателями на переключение
внимания.

\item Чтобы понизить до 0 веса всех условий и посылок задачи,
содержащих не\-ко\-то\-рый терм $T$ (записанный в теоремных
переменных), используется указатель "внимание($T$)". Если вместо
$T$ использовать служебный символ "условие", то понижается до 0
вес условия задачи. Эту возможность следует применять лишь тогда,
когда в описании приема явно указывается, что он применяется для
задачи на преобразование либо на доказательство, т.е. ссылка на
условие зада\-чи корректна.

\item Если прием изменяет посылку либо условие, либо вводит новую
посылку или условие, то измененный либо новый терм задачи получает
вес 0, цикл ска\-ни\-ро\-ва\-ния прерывается и возобновляется с
нулевого текущего уровня. Если же прием изменяет только
комментарии задачи, то такого прерывания цикла сканирования не
происходит. Однако, иногда после ввода нового комментария
необходимо искусственно понизить до 0 вес текущего терма задачи и
возоб\-но\-вить сканирование с нулевого текущего уровня - чтобы
сработали те приемы, которым адресован комментарий. В этом случае
прием с заголовком "замеча\-ние" \ (изменяющий только комментарии
задачи) снабжается указателем "пе\-ре\-смотр".

\end{enumerate}

\subsection{Ограничитель трудоемкости}

Для предотвращения неоправданно длительных попыток применения
приема можно использовать несколько специальных указателей,
вводящих слежение за тру\-до\-ем\-костью попытки реализации приема
и обрыващих эту попытку в случае превышения установленного лимита.
В связи с обработкой заданного антецедента теоремы уже был описан
ограничитель трудоемкости "Обрыв($\ldots$)". Здесь приведен еще
один ука\-за\-тель такого типа - "лимит($N \ A_1 \ldots A_n$)". У
него $N$ - число шагов работы ин\-тер\-пре\-та\-то\-ра ЛОСа, по
превышении которого попытка применения приема обрывается. $A_1,
\ldots , A_n$ - термы, используемые для уточнения той позиции в
программе приема, после которой устанавливается лимит в $N$ шагов.
Именно, устанавливающий лимит оператор ЛОСа вводится сразу же, как
только оказываются идентифицированы все переменные данных термов.
Термы $A_1, \ldots , A_n$ могут отсутствовать.

\subsection{Отложенная фильтрация}

При применении приема не всегда удается сразу хорошо оценить
действительные последствия его действий. Однако, часто можно
сформулировать достаточно легко проверяемое условие $P$ на
желательные последствия. Тогда используется "отло\-жен\-ная" \
фильтрация для приема: проверка данного условия предпринимается не
сразу, а лишь через заданное число шагов $N$. Эта фильтрация
задается с помощью указа\-те\-ля "контроль($P$ лимит($N$) $K$)".
Если через $N$ шагов не будет выполнено условие $P$, то произойдет
откат к тому состоянию задачи, которое имелось до применения
приема. При этом задача будет снабжена комментариями,
определяемыми термами "за\-ме\-ча\-ние($A$)", перечисляемыми в
списке $K$ (этот список может быть пустым). Для организации режима
отложенной фильтрации вводится комментарий (контроль $\ldots$) к
списку посылок текущей задачи. Он анализируется процедурой
"Контроль($\ldots$)", обращения к которой происходят при каждом
выходе на программу логического символа - типа задачи при
сканировании.


\subsection{Специальные указатели пакетных операторов}

\subsubsection{Нормализаторы}

\begin{enumerate}

\item Уровень срабатывания приема нормализатора устанавливается не
фильт\-ром, как в случае приемов остальных типов, а указателем
"уровень($A$)". Здесь пред\-ус\-мат\-ри\-вается единственное
значение уровня.

\item Если в описании формата нормализатора содержится логический
символ "ко\-рень", то все его приемы будут применяться только к
корневому вхождению в преобразуемый терм. Для прочих
нормализаторов такое ограничение на сра\-ба\-ты\-ва\-ние приема
можно установить, введя указатель "корень". В частности, этот
указатель может оказаться необходимым, если заменяемый терм
пред\-став\-ляет собой функциональную переменную.

\item Достаточно часто входная информация логического уровня
предметной об\-лас\-ти передается нормализатору через комментарии.
Например, нормализатор разложения в ряд Тейлора получает указание
на переменную $x$, по которой ведется разложение, и на точку $a$,
в окрестности которой оно выполняется, через комментарий
(рядтейлора $x \ a$). Для дополнительной идентификации
тео\-рем\-ных переменных через такой комментарий используется
указатель "вход($A \\ x_1 \ldots x_n$)". Здесь $A$ - заголовок
комментария, который должен иметь вид ($A \ b_1\\ \ldots b_n$),
причем переменные $x_1, \ldots , x_n$ идентифицируются с $b_1,
\ldots , b_n$. Ком\-пи\-ля\-тор предполагает, что $b_1, \ldots
,b_n$ суть термы.

\item Если требуется, чтобы сразу после выполнения текущего
преобразования нор\-ма\-ли\-затор выдал полученный терм в качестве
окончательного результата, то прием снабжается указателем "выход".
В качестве примера использования та\-ко\-го указателя приведем
приемы группировки тригонометрических выражений при разложении на
множители (см. нормализатор "видумножение"). Прием, выполняющий
некоторую группировку, предпринимает попытку разложить
по\-лу\-чен\-ное выражение на множители, и если это удалось (а
тогда автоматически и каждый из множителей будет подвергнут
попыткам доразложения), то про\-дол\-же\-ние попыток разложения на
множители результирующего выражения бесполезно.

\item Как уже отмечалось, при выполнении преобразований приемами
сканирова\-ния задачи часто бывает необходимо обеспечивать
специальные действия по поддержанию сопровождения по о.д.з. -
иначе выполнение последующих при\-е\-мов будет заблокировано из-за
невозможности убедиться в выполнении самых элементарных требований
на о.д.з. для рассматриваемых выражений. Ана\-ло\-гич\-ные
действия необходимо выполнять и в случае применения нормализатора.
Для этого служит указатель "вывод(условие($P$)$A$
эквивалентно($i_1 \ldots i_n$))". Этот указатель дополняет
преобразование выводом следствия $A$, необходимого для поддержания
сопровождения по о.д.з. $A$ регистрируется в комментарии
"кор\-рек\-цияпосылок $B$" \ и заносится в список посылок
нормализатора (фактически заносятся конъюнктивные члены $A$). $P$
- фильтр, указывающий условие, при котором предпринимается вывод
следствия. $i_1, \ldots , i_n$ - номера антецедентов теоремы
приема, истинность которых является следствием утверждения $A$ и
остальных антецедентов теоремы. Фильтр $P$ и список $i_1, \ldots ,
i_n$ могут от\-сут\-ство\-вать. Заметим, что комментарий
"коррекцияпосылок $B$" \ по завершении применения нормализатора
используется для создания во внешней задаче, об\-ра\-тив\-шейся к
нормализатору, необходимых дополнительных посылок и
ком\-мен\-та\-риев, обеспечивающих сопровождение по о.д.з.

\item Если нормализатор обращается к преобразованиям
вспомогательного вы\-ра\-же\-ния, содержащего новую переменную
$x$, введенную в качестве обозначения для некоторого терма $t$, а
затем возвращается к исходным обозначениям, заменяя в результате
преобразований $x$ на $t$, то может понадобиться коррекция
со\-хра\-нен\-ной в комментарии "коррекцияпосылок $A$" \
информации о выводимости утверждений, содержащих $x$. Для этого
используется указатель "подст\-в\-по\-сыл\-ки($x \ t$)",
обеспечивающий подстановку $t$ вместо $x$ в таких утверждениях.

\item Иногда возникает необходимость таким образом подобрать
значения входя\-щих в выражение $A$ параметров, чтобы это
выражение оказалось возможным преобразовать к некоторому
специальному виду. Один из примеров этой си\-ту\-а\-ции - подбор
показателя степени, при котором степенная подстановка делает
правую часть дифференциального уравнения зависящей только от
отношения $y$ к $x$. В таких случаях целесообразно воспользоваться
нормализаторами, так как подбору параметра обычно предшествует
некоторая цепочка преобразований. В тот момент, когда становится
"видимой" \ подсказка относительно возможного подбора параметра,
применяется прием нормализатора, основанный на фик\-тив\-ном
тождестве. Левая (заменяемая) часть этого тождества
идентифицируется с содержащим "подсказку" \ о подборе параметров
фрагментом преобразуемого терма; правая часть представляет собой
конъюнкцию равенств, определяющих подбор параметров. Собственно
проверка допустимости данного подбора пе\-ре\-но\-сит\-ся в
обработку антецедентов псевдотеоремы приема (например, здесь может
быть предпринята явная подстановка параметров в терм и попытка
преобразования его к требуемому виду, выполняемая другим
нормализатором либо вспомогательной задачей). Прием оформляется
как обычный прием тож\-дест\-вен\-ной замены. Однако, в то время
как заменяемая часть его иден\-ти\-фи\-ци\-ру\-ется с подтермом
преобразуемого терма, заменяющая часть вводится вместо всего
преобразуемого терма. Этот режим обеспечивается указателем
"нормвывод". Заметим, что обычно такие приемы являются
завершающими, и в них используется также указатель "выход".

\end{enumerate}

\subsubsection{Проверочные операторы}

\begin{enumerate}

\item Как правило, прием проверочного оператора имеет
альтернативный харак\-тер: при неудаче его применения будут
предприниматься попытки выполнить про\-вер\-ку другими средствами.
Однако, иногда он сводит проверку истинности рассматриваемого
утверждения к проверке истинности других утверждений (конъюнкция
последних должна быть эквивалентна истинности первого), и при
неудаче одной из этих проверок сразу выдается отказ. Под выдачей
отказа здесь и далее понимаем, что значение проверочного
оператора, как оператора ЛОСа, становится равным "ложь"; никакого
логического символа "отказ" \ при этом не используется. Например,
проверка отличия от 0 произведения нескольких выражений сводится
указанным образом к проверке отличия от 0 каждого из сомножителей.
Чтобы ввести такой режим функционирования приема, служит указатель
"спуск". После проверки истинности "несущественных" \ антецедентов
теоремы, указывающих типы значений переменных и другие необходимые
эле\-мен\-ты сопровождения по о.д.з., включается установка на
выдачу отказа после неудачной проверки истинности хотя бы одного
из оставшихся антецедентов.

\item Последний режим может применятсья также в тех случаях, когда
экви\-ва\-лент\-ность проверяемого утверждения конъюнкции
подмножества антецедентов тео\-ре\-мы усматривается лишь после
проверки истинности части других ее анте\-це\-ден\-тов. Например,
если при проверке нечетности суммы двух целых чисел установлено,
что первое слагаемое четное, то проверка сводится к установлению
нечетности второго слагаемого. В этой ситуации применяется
указатель "спуск\\ ($i_1 \ldots i_k$)", перечисляющий номера $i_1,
\ldots , i_k$ тех антецедентов теоремы, после установления
истинности которых, а также установления истинности
"не\-су\-щест\-венных" \ антецедентов, включается установка на
выдачу отказа после не\-у\-дач\-ной проверки истинности хотя бы
одного из остальных антецедентов.

\item Наконец, прием проверочного оператора может сводить
выполняемую проверку к рассмотрению конкретного антецедента, и
если его истинность установить не удалось, то сразу будет выдан
отказ. Для этого применяется указатель "внешобрыв($i$)", где $i$ -
номер данного антецедента.

\item Иногда бывает достаточно найти хоть какую-нибудь
идентификацию части антецедентов теоремы приема проверочного
оператора, определив при этом значения $A_1, \ldots , A_n$
некоторых теоремных переменных $x_1, \ldots , x_n$, и проводить
оставшиеся действия внутри данного приема лишь для указанных
значений. Если эти действия довести до конца не удается, то
альтернативные возмож\-нос\-ти идентификации для $x_1, \ldots
,x_n$ не рассматриваются, и выполнение приема об\-ры\-ва\-ется.
Однако, в отличие от предыдущих случаев, здесь не происходит
выдачи отказа - просто проверку в таких случаях целесообразно
проводить другими средствами. Чтобы ввести данный режим,
используется указатель "откат($i$)", где $i$ - номер того
антецедента, после идентификации которого осу\-щест\-вля\-ется
фиксация определенных к текущему моменту теоремных
пе\-ре\-мен\-ных.

\item В определенных ситуациях возможно быстрое усмотрение
заведомой ложности проверяемого утверждения. Тогда, для ускорения
выхода из бесперспектив\-ной проверки, используются специальные
приемы проверочного оператора, имею\-щие указатель "не".
Консеквент теоремы такого приема имеет вид отрицания утверждения,
проверяемого рассматриваемым проверочным оператором. Если удается
установить истинность антецедентов теоремы и идентифицировать
про\-ве\-ря\-емое утверждение с отрицанием консеквента, то сразу
выдается отказ.

\item Можно обеспечить выход из проверочного оператора с выдачей
отказа, если не удалось установить (также с помощью проверочных
операторов) истин\-ность антецедентов, номера которых перечислены
в указателе "сброс($i_1 \ldots i_m$)".

\end{enumerate}

\subsubsection{Анализаторы}

Работа анализатора заключается в сканировании утверждений,
занесенных в его буфер, а также посылок текущей задачи на
исследование, и занесении в буфер следствий указанных посылок и
утверждений буфера. Возможно преобразование специальными приемами
ранее занесенных в буфер утверждений. В процессе вывода некоторые
заносимые в буфер утверждения могут снабжаться комментарием
"внеш\-вы\-вод" \ (вводимым с помощью стандартных указателей); по
окончании работы ана\-ли\-за\-тора такие утверждения будут
перенесены в список посылок текущей задачи на исследование -
собственно они и составляют результат применения анализатора.

Если прием анализатора выводит настолько ценное следствие, что
целесообразно безотлагательное перенесение его во внешнюю задачу и
возвращение к сканирова\-нию этой задачи, то используется
указатель "обрыв($A$)", где $A$ - фильтр, уточняющий условие
обрыва работы анализатора. В случае обрыва сформированное приемом
утверждение автоматически снабжается комментарием "внешвывод" \ и
таким об\-ра\-зом переносится во внешнюю задачу.

Если необходимо преобразовать ранее занесенное в буфер
утверждение, то исполь\-зу\-ют\-ся приемы, теорема которых
представляет собой эквивалентность. Левая часть этой
эквивалентности идентифицируется с преобразуемым утверждением, а
правая - определяет новый вид утверждения. Такие приемы снабжаются
указателем "внутр\-пре\-обр".

\subsection{Указатели, определяющие отбор и сохранение ссылок на
за\-да\-чи, рассмотрение которых представляет ин\-те\-рес для
развития приема}

Для усиления и оптимизации приема может оказаться полезным
накопление спис\-ков ссылок на задачи, при решении которых он
сработал либо, наоборот, был забло\-ки\-ро\-ван тем или иным из
своих фильтров. Имеется общий механизм, обеспечивающий сохранение
в архиве всех ссылок на задачи, при решении которых происходило
сра\-ба\-ты\-ва\-ние приема. Такие данные автоматически
обновляются при каждом запус\-ке серийного решения всех задач
выбранного раздела задачника, и использование их не предполагает
введения в приемы каких-либо специальных указателей.
Пред\-ус\-мот\-ре\-на, однако, возможность сохранения ссылок на
избранные задачи, в которых сработал прием, а также ссылок на
задачи, в которых он не сработал из-за специаль\-но указанных
причин.

Если требуется начать накопление закрепленного за приемом списка
ссылок на задачи, в которых он сработал, причем в момент
срабатывания выполнялось до\-пол\-ни\-тель\-ное условие,
определяемое фильтром $A$, то вводится указатель "задачи($i \
A$)". Здесь $i$ - произвольно определяемый номер установки на
отбор. Таких установок в приеме может вводиться несколько, и для
каждой будет создаваться свой список ссылок.

Если требуется создать список задач, в которых прием не сработал
из-за того, что срабатывание было заблокировано фильтром $A$, то
этот фильтр помещается в описании приема внутри записи "задачи($i
\ A$)", где $i$ - снова номер установки на отбор задач.

Для просмотра списка отобранных задач нужно выделить многоцветной
указкой вхождение рассматриваемого указателя либо фильтра
"задачи($\ldots$)" \ и нажать пра\-вую клавишу мыши либо клавишу
"з".

\subsection{Указатели, определяющие формирование информа-\\ ции для
трас\-си\-ров\-ки}

\subsubsection{Ввод новых элементов чертежа при дополнительных
построениях}

При решении геометрических задач, для которых изначально был
создан чертеж, возможно пополнение этого чертежа в процессе
дополнительных построений. Для такого пополнения используются
перечисляемые ниже указатели.

\begin{enumerate}

\item Чтобы ввести на чертеже точку $A$ - основание
перпендикуляра, опущенного из точки $B$ на прямую, проходящую
через точки $C$ и $D$, служит указатель "перпендикулярно($A \ B \
C \ D$)". Заметим, что сам перпендикуляр при этом не
прорисовывается - для его прорисовки необходимо добавить
приводимый ни\-же указатель "отрезок($A \ B$)".

\item Чтобы провести отрезок, соединяющий точки $A$ и $B$,
используется указатель "отрезок($A \ B$)".

\item Чтобы ввести на чертеже точку $A$ пересечения прямых,
проходящих через точки $B,C$ и $D,E$ соответственно, используется
указатель "точкапрямой($A \ B \\ C \ D \ E$)".

\item Чтобы выбрать произвольным образом точку $A$, лежащую на
отрезке с концами $B$ и $C$, используется указатель
"точкаотрезка($A \ B \ C$)".

\item Чтобы ввести точку $A$ внутреннего касания окружности с
центром $B$, про\-хо\-дя\-щей через точку $C$, и окружности с
центром $D$, проходящей через точку $E$, используется указатель
"внутркасаются($A \ B \ C \ D \ E$)". Аналогичным образом, в
случае внешнего касания указанных окружностей применяется
указатель "внешкасаются($A \ B \ C \ D \ E$)".

\item Чтобы ввести точку $A$ пересечения прямой, проходящей через
точки $B,C$, с прямой, проведенной из точки $D$ параллельно
прямой, проходящей через точки $E,F$, используется указатель
"параллельны($A \ B \ C \ D \ E \ F$)".

\item Чтобы нарисовать окружность с центром в точке $A$,
проходящую через точку $B$, используется указатель "окружность($A
\ B$)".

\item Чтобы ввести на чертеже центр $A$ окружности, описанной
около треугольника с вершинами в точках $B,C,D$, и прорисовать
саму окружность, используется указатель "описана($A \ B \ C \
D$)".

\item Чтобы отложить на отрезке с концами $B,C$ точку $A$,
отстоящую от $B$ на расстояние, равное расстоянию между точками
$D,E$, используется указатель "расстояние($A \ B \ C \ D \ E$)".

\item Чтобы ввести на чертеже точку $A$ пересечения перпендикуляра
к прямой, про\-хо\-дя\-щей через точки $B$ и $C$, восставленного в
точке $D$, с прямой, проходящей через точки $E$ и $F$,
используется указатель "перпендикулярны($A \ B \ C \ D \ E \ F$)".

\item Чтобы ввести точку $A$ на луче $BC$, расстояние которой до
точки $B$, выражен\-ное в пикселях, равно символьному числу $r$,
используется указатель "луч($A \ B \ C \ r$)". Явное указание
расстояния означает, что выбор на луче точки $A$ в некотором
смысле произволен (например, вводится конец координатного
вектора), а кон\-стан\-та $r$ подбирается из соображений
достаточной различимости точек на чер\-те\-же.

\item Тесно примыкает к предыдущему указатель "прямкоорд($A \ B \
C \ D \ r$)", вводя\-щий точку $A$ на перпендикуляре к прямой
$BC$, восставленном в точке $B$, ле\-жа\-щую от прямой $BC$ по ту
же сторону, что и точка $D$; расстояние от $A$ до $B$, выраженное
в пикселях, равно символьному числу $r$.

\end{enumerate}

\subsubsection{Ввод контрольного прерывания перед применением
приема}

Чтобы при отладке проще было отслеживать моменты срабатывания
приема, можно использовать указатель "стоп". Его наличие
обеспечивает выход в отладчик ЛОСа перед моментом выполнения
преобразований. Разумеется, после отладки этот ука\-за\-тель
следует удалить.

\subsubsection{Шаблоны и указатели текстформульного сопровождения
приема}

Если в описании приема не предусмотреть специальных средств для
вывода на экран пояснений при его срабатывании, то по умолчанию
будет выводиться текст того концевого пункта оглавления базы
приемов, в котором размещен этот прием. Во многих случаях это, в
сочетании с возможностью просмотра описания приема на ГЕНОЛОГе,
достаточно наглядно объясняет смысл выполняемых действий. Чтобы
получить более качественное сопровождение пошаговых действий
решателя, пред\-ус\-мот\-рена возможность создания в описании
приема специальных текстформульных шаблонов выводимых на экран
пояснений.

Собственно текстовая часть шаблона выводится при просмотре
описания приема на экран при нажатии клавиши "6". Эта часть
распадается на несколько незави\-си\-мых фрагментов, каждый из
ко\-то\-рых начинается с символа $\neg$, вслед за которым идет
номер фрагмента (по\-сле\-до\-ва\-тель\-ность цифр, завершающаяся
пробелом). Ну\-ме\-ра\-ция начинается с 1; если фрагмент всего
один, то запись $\neg 1$ отбрасывается. Для указания мест, на
которые должны вставляться формулы, используются па\-ры
расположенных подряд скобок $()$. Если фрагмент единственный и
запись $\neg 1$ отброшена, то при вводе текста следует отступить
от левого края на одну позицию, иначе первая буква пропадет.
Напомним, что для ввода символа $\neg$ текстовым редактором служит
кла\-ви\-ша "Ctr-n".


Чтобы указать, какие именно формулы следует вставлять, и какие
именно фраг\-мен\-ты в каких случаях использовать, служат
указатели "титр($P$)", размеща\-е\-мые вместе с прочими
указателями приема. Здесь $P$ - выражение, построенное при
помо\-щи условных выражений "вариант($\ldots$)" \ из атомарных
указателей текстформуль\-но\-го сопровождения. Каждый такой
атомарный указатель имеет вид "набор($A \ B_1 \ldots B_n$)", где
$A$ - символьный номер используемого фрагмента текстового шаблона,
связанно\-го с приемом; $B_1, \ldots , B_n$ - информация о
заполнении текстового шаблона. Если в некотором подслучае нужно
отменить отображение срабатывания приема, то ис\-поль\-зу\-ется
указатель "стоп". Условная конструкция "вариант($\ldots$)" \ может
отсутствовать, и тогда во всех случаях пояснение будет строиться
по одному и тому же шаблону; в противном случае для разных
ситуаций будут извлекаться различные шаблоны.

Информационные элементы $B_i$, уточняющие использование текстового
шаблона для создания текстформульного сопровождения срабатывания
приема, бывают сле\-ду\-ю\-щих двух типов:

\begin{enumerate}

\item терм($C_1 \ldots C_n$) - $C_1, \ldots , C_n$ суть
операторные выражения, определяющие тер\-мы, подставляемые
последовательно в текстовый шаблон вместо пар скобок $()$. Для
указания на теоремный терм $T$, не подлежащий обработке
норма\-ли\-за\-то\-рами, внутри $C_i$ можно использовать запись
"фикс($T$)".

\item параметры($X_1 \ldots X_m \ D$) - $X_1, \ldots , X_m$ суть
теоремные переменные, для кото\-рых при подстановке в термы $C_1,
\ldots , C_n$ информационного элемента "терм($C_1 \ldots C_n\\ $)"
\ вводятся новые переменные, обозначающие объекты типа $D$ (при
отсутствии $D$ берутся первые неиспользуемые большие буквы).

\end{enumerate}

Чтобы сопровождать пояснениями обращения к нормализаторам и другим
па\-кет\-ным операторам, эти обращения сопровождаются
комментариями "титр($P$)", ана\-ло\-гич\-ными приведенному выше
указателю "титр($P$)" \ (например, при обращении к нормализатору
используется запись "замечание(титр($P$))".

Для боле гибкого учета различных ситуаций можно использовать в
одном и том же описании приема несколько указателей
"титр($\ldots$)", вводящих располагаемые подряд независимо
определяемые текстформульные фрагменты.

\section{Нормализаторы приема}

При применении приема формируются различные термы - как
вспомогательные (например, необходимые для принятия решения или
представляющие собой про\-ме\-жу\-точ\-ные результаты вычислений),
так и основные (входящие в новую посылку или в новое условие, либо
в заменяющий терм при тождественной или эквивалентной замене, и
т.п.). Любой из таких термов может быть преобразован цепочкой
обращений к пакетным нормализаторам либо вспомогательным задачам.
Эта цепочка обращений определяется специальной группой служебных
термов ГЕНОЛОГа, называемых нор\-ма\-ли\-за\-торами приема. Каждая
группа нормализаторов связана с обработкой опре\-де\-лен\-ного
терма $A$, который выделяется либо непосредственно в теореме
приема, либо в некотором фильтре приема (в том числе в фильтре,
встречающемся внутри указателя). Заметим, что обработке заданной
группой нормализаторов подлежат все термы, равные $A$, независимо
от их вхождения в теорему или в фильтры - нет необходимости
связывать ее с каждым из таких вхождений $A$ (для выделе\-ния
вхождений терма $A$, не подлежащих нормализации, используется, как
отмечалось выше, указатель "копия"). Собственно для выделения $A$
служит специальный ин\-тер\-фейс: сначала в теореме или в фильтре
многоцветной указкой выбирается какое-либо вхождение $A$;
нажимается Enter, и в возникающем при этом окне текстово\-го
редактора набирается группа нормализаторов, относящихся к $A$.

Каждый нормализатор приема представляет собой либо обращение к
пакет\-но\-му нормализатору, либо обращение к задаче, либо
указатель коррекции посылок, относящийся сразу ко всей цепочке
преобразований (можно вводить либо удалять заданные посылки, в
предположении истинности которых будут проводиться
пре\-об\-ра\-зо\-ва\-ния). Преобразования выполняются в
соответствии с указанным порядком, слева направо. Разделители
между нормализаторами - пробелы.

\subsection{Обращения к пакетным нормализаторам}

Каждое обращение к пакетному нормализатору либо состоит из
названия $A$ этого нормализатора, либо имеет вид $A(B_1 \ldots
B_n)$. $B_1, \ldots , B_n$ - специальные термы, на\-зы\-ва\-емые
указателями обращения к нормализатору. Возможные типы таких термов
приводятся ниже:

\begin{enumerate}

\item "замечание($A_1 \ldots A_n$)" \ - вводится, если его не
было, комментарий $(A_1 \ldots A_n)$. Перед $A_1$ возможно
размещение терма "условие($B$)", уточняющего условие, при котором
вводится комментарий. В этом случае после $A_n$ можно разместить
терм "альтернатива($C_1 \ldots C_m$)", указывающий комментарий
$(C_1 \ldots C_m)$, вводимый при невыполнении условия $B$. Формат,
в котором здесь задаются комментарии - тот же, что и для указателя
приема "замечание($\ldots$)". Кроме того, можно явно задавать
комментарий посредством выражения "префикс($\ldots$)"; в этом
случае указатель обращения имеет вид
"замечание(префикс($\ldots$))". Заметим, что по умолчанию все
комментарии текущего пакетного оператора передаются
нормализаторам, используемым в приеме этого пакетного оператора.

\item "примечание($A_1 \ldots A_n$)" \ - вводится (даже если такой
комментарий уже был) новый экземпляр комментария $(A_1 \ldots
A_n)$. В остальном аналогично указателю "замечание($\ldots$)".

\item "удалениезамечания($A_1 \ldots A_n$)" \ - удаляется
комментарий $(A_1 \ldots A_n)$. Перед $A_1$ возможно размещение
терма "условие($B$)", уточняющего условие, при котором происходит
удаление.

\item "исключкоммент($A_1 \ldots A_n$)" \ - при обращении к
нормализатору отбрасыва\-ют\-ся все комментарии с заголовками
$A_1, \ldots A_n$

\item "условие($P$)" \ - $P$ есть фильтр, накладывающий
дополнительные ограничения на применение данного пакетного
нормализатора $A$.

\item "вариант($A_1 \ A_2$)" \ - при выполнении условия $A_1$
берется альтернативный па\-кет\-ный нормализатор, имеющий
заголовок $A_2$.

\item "комментарии($A_1 \ldots A_n$)" \ - при обращении
нормализатору передаются все ком\-мен\-та\-рии текущей задачи,
имеющие заголовки $A_1, \ldots , A_n$.

\item "лимит($N$)" \ - при превышении $N$ шагов обращение к
нормализатору обрыва\-ет\-ся (предпринимается откат к
установленному перед обращением оператору "лимит($\ldots$)"). Если
обращение к нормализатору не превысило $N$ шагов, то после него
установленный лимит сбрасывается. Этот указатель не отменяет
слишком долгого процесса нормализации, передавая далее
ненормализованный терм, а просто блокирует в этом случае
дальнейшее применение приема.

\item "расширениепосылок" \ - к списку посылок нормализатора
присоединяются след\-ст\-вия данного списка, введенные ранее
использованными в приеме нор\-ма\-ли\-за\-торами. Такое пополнение
списка посылок позволяет нормализатору ис\-поль\-зо\-вать
утверждения, введенные предшествующими нормализаторами для
со\-про\-вож\-дения по о.д.з. измененных выражений (эти
утверждения извлекаются из сквозного накопителя "коррекцияпосылок
$\ldots$", заполняемого нормализатора\-ми приема).

\end{enumerate}

\subsection{Обращения к вспомогательным задачам}

Нормализатор приема, обеспечивающий обращение к вспомогательной
задаче для преобразования нормализуемого терма, имеет вид
"задача($A \ B_1 \ldots B_n$)", где $A$ - уровень обращения к
вспомогательной задаче; $B_1, \ldots , B_n$ - указатели на
фор\-ми\-ро\-ва\-ние задачи. Те $B_i$, которые суть логические
символы (кроме указываемых далее служебных слов), определяют цели
новой задачи. Прочие типы указателей пе\-ре\-чис\-ля\-ют\-ся ниже.

\begin{enumerate}

\item По умолчанию, вводится задача на преобразование. Чтобы
ввести задачу на описание, используется указатель "тип(описать)".

\item Чтобы перенести в новую задачу все цели текущей задачи,
имеющие заголовки $A_1, \ldots , A_n$, используется указатель
"цель(повторение($A_1 \ldots A_n$))".

\item Если логический символ $A_2$ должен быть введен в качестве
цели новой задачи лишь при выполнении фильтра $A_1$, то
используется указатель "цель(условие($A_1 \\ A_2$))".

\item Чтобы ввести цель (неизвестные $x_1 \ldots x_n$), в которой
перечисляются все пе\-ре\-мен\-ные $x_1, \ldots , x_n$,
идентифицированные с переменными $X_1, \ldots , X_m$ либо
встре\-ча\-ю\-щиеся в идентифицированных с ними списках
переменных, служит ука\-за\-тель "цель(неизвестная($X_1 \ldots
X_m$))". Другую возможность ввести цель (не\-из\-вест\-ные $x_1
\ldots x_n$) дает указатель "цель(неизвестные($X_1 \ldots X_m$))".
Здесь $x_1, \ldots , \\ x_n$ суть все неизвестные текущей задачи
на описание, являющиеся параметрами подтермов, идентифицированных
с переменными $X_1, \ldots X_m$.

\item Аналогичным образом, чтобы ввести цель (параметры $x_1
\ldots x_n$), в которой пе\-ре\-чис\-ляются все переменные $x_1,
\ldots , x_n$, идентифицированные с переменными $X_1, \ldots ,
X_m$ либо встречающиеся в идентифицированных с ними списках
пе\-ре\-мен\-ных, используется указатель "цель(параметры($X_1
\ldots X_m$))".

\item Чтобы была введена цель $(A_1 \ldots A_n)$, используется
указатель "цель(набор($A_1 \ldots\\ A_n$))". Формат описания цели
здесь такой же, как при описании комментариев.

\item Для передачи вспомогательной задаче списка комментариев $A$
текущего па\-кет\-но\-го нормализатора, к которому относится
реализуемый прием, используется указатель "цель(нормализация)". Он
вводит в формируемую задачу цель (нор\-ма\-ли\-зация $A$).

\item Иногда бывает нужно разрешить нормализуемое утверждение
относительно заданного списка выражений $t_1, \ldots , t_n$,
которые были идентифицированы с те\-о\-рем\-ными переменными $x_1,
\ldots x_n$. Для этого используется указатель цели
вспо\-мо\-га\-тель\-ной задачи на описание
"цель(вспомописание($x_1 \ldots x_n$))". Условие этой задачи
получается из нормализуемого утверждения заменой в нем выражений
$t_1, \ldots , t_n$ на вспомогательные неизвестные $z_1, \ldots ,
z_n$, относительно которых и решается задача. В найденный ответ
вместо переменных $z_1, \ldots , z_n$ подствляются выражения $t_1,
\ldots, t_n$, и таким образом получается результат нормализации.

\item Для передачи формируемой задаче комментария ($A_1 \ldots
A_n$) используется ука\-за\-тель "комментарий(условие($P$)$A_1
\ldots A_n$)". Здесь $P$ - фильтр, определяющий условие ввода
комментария; подтерм "условие($P$)" \ может отсутствовать.
Ком\-мен\-тарий задается в стандартном формате - как в указателе
приема "замеча\-ние($A_1 \ldots A_n$)".

\item Указатель "лимит($N$)" \ определяет число шагов $N$, по
превышении которого выдается отказ на задачу. Как и в случае
пакетного нормализатора, такой отказ означает блокировку
дальнейшего выполнения приема и откат.

\item Если происходит обращение к вспомогательной задаче на
преобразование из приема пакетного нормализатора, то для
регистрации в списке посылок нор\-ма\-ли\-за\-тора всех новых
посылок, введенных при решении этой задачи, служит указатель
"учетодз".

\item Если нужно заблокировать ввод при обращении к
вспомогательной задаче ком\-мен\-та\-рия "коррекцияпосылок $A$" \
- накопителя информации, используемой для коррекции сопровождения
по о.д.з. после ее решения, то используется указатель
"коррекцияпосылок".

\end{enumerate}

\subsection{Указатели коррекции посылок}

Нормализатор приема "посылки($A_1 \ldots A_n$)" \ используется для
указания на то, что все обращения к пакетным операторам и
вспомогательным задачам, определяемые данной цепочкой
нормализаторов приема, выполняются при дополнительных по\-сыл\-ках
$A_1, \ldots , A_n$. Здесь $A_1, \ldots , A_n$ - утверждения в
теоремных переменных.

Для исключения заданных утверждений из списков посылок всех
пакетных опе\-ра\-то\-ров и вспомогательных задач, определяемых
рассматриваемой цепочкой нор\-ма\-ли\-за\-торов приема,
используется нормализатор приема "удалениепосылок($x \ A$)". Здесь
$A$ - фильтр, определяющий условие на исключаемое утверждение,
обозначенное в нем переменной $x$.

\chapter{Редактор приемов ГЕНОЛ\'{О}Га}

\section{Просмотр описаний приемов}

\subsection{Вход в редактор приемов}

Вход в просмотр и редактирование приемов, реализованных на
ГЕНОЛОГе, осу\-щест\-вля\-ется через оглавление приемов. Войти в
это оглавление можно из главного меню, нажав клавишу "г" \ или
выбрав левой кнопкой мыши окно "Оглавление приемов". Приемы
распределены в оглавлении, в целом, по тематическому принципу. Это
рас\-пре\-де\-ление нужно лишь для удобства поиска приема вручную
и самим решателем никак не используется.

В корневом меню оглавления приемов перечисляются основные разделы,
в кото\-рых происходило обучение. Начинается перечисление с
раздела "Логические прие\-мы", в котором собраны реализованные на
ГЕНОЛОГе общелогические приемы (под\-раз\-дел "Общие приемы"), а
также приемы вывода теорем и проч. Одним из послед\-них
размещается раздел "Словарь", в котором собраны приемы текстового
ана\-ли\-за\-тора. Он организован по принципу обычного словаря:
подразделы обозначены буквами от "А" \ до "Я". В зависимости от
того, были ли сохранены или сброшены данные о последних изменениях
в базе приемов, корневое меню может завершаться разделом "Буфер".
В трех его подразделах "Новые приемы", "Измененные приемы" \ и
"Удаленные приемы" \ указываются имевшие место изменения. Степень
прора\-бот\-ки различных разделов, представленных в базе приемов,
весьма различна. В некото\-рых случаях проработка лишь начата на
простейших единичных примерах, в других - доведена до более-менее
устойчивого решения стандартных задач.

После выбора нужного концевого пункта оглавления приемов
нажимается кла\-ви\-ша "курсор вправо" \ или Enter, и на экране
появляется запись приема, относящего\-ся к выбранному пункту.

Для выхода из просмотра приема обратно в оглавление базы приемов
нажимается клавиша "курсор влево" \ либо Esc.

К одному и тому же концевому пункту оглавления могут относиться
несколько приемов; смена этих приемов осуществляется клавишами
"курсор вверх" \ - "курсор вниз".

\subsection{Отображение приема на экране}

Описание приема размещается в четырех окнах, отделенных друг от
друга гори\-зон\-таль\-ными линиями; слева расположены номера этих
окон. В первом окне находит\-ся теорема приема; во втором -
заголовок приема; в третьем - список фильтров приема, и в
четвертом - список указателей приема. Обращения к нормализаторам
выводятся на экран с помощью описываемого ниже специального
интерфейса и при общем просмотре не видны. Если одно из окон пусто
(таким может быть либо третье, либо четвертое окно), то номер его
не прорисовывается, а верхняя и нижняя горизон\-таль\-ные линии
прорисовываются на расстоянии двух-трех пикселей друг от друга. В
исключительных случаях могут оказаться пустыми оба (третье и
четвертое) окна - таких случаев при создании новых приемов следует
избегать, так как здесь описание приема (та его часть, которая
остается за вычетом теоремы приема и его заголовка) может
оказаться пустым, и прием не будет сохранен в файлах.

В верхней части первого окна может быть размещен чертеж. Это
делается лишь для большей наглядности теоремы приема; компилятором
ГЕНОЛОГа чертеж не используется.

Если описание приема слишком велико, то содержимое третьего и
(или) четверто\-го окон разрезается на страницы. При просмотре
будет выдаваться лишь одна из таких страниц, причем интерфейс
позволяет перелистывать страницы двух окон независимо друг от
друга. Признаком наличия предыдущей страницы служит за\-пя\-тая в
начале текста окна; признаком наличия следующей страницы - запятая
в конце окна.

Кроме того, для работы с большими описаниями приемов можно
временно уби\-рать с экрана одно или несколько окон. $i$ - е окно
убирается и восстанавливается на экране при нажатии клавиши
Ctr-Fi.

Иногда текстовый (в скобочной записи термов) вид теоремы приема
занима\-ет меньше места, чем стандартный, формульный. Тогда для
уменьшения размеров описания приема можно перейти к текстовому
режиму отображения теоремы. Это делается путем нажатия клавиши
"т". Для восстановления формульного режима нажимается "ф".

Если для каких-либо логических символов или сочетаний таких
символов не предусмотрен режим отображения формульным редактором,
то теорема приема про\-ри\-со\-вывается текстовым редакторов в
скобочной записи.

\subsection{Просмотр компонент описания приема}

\subsubsection{Применение цветовой указки для выделения элементов
описания приема}

Обычно все элементы описания приема размещены на экране
одновременно; это упрощает восприятие приема "в целом", однако при
чтении сколь-нибудь громоздких фрагментов описания бывает удобно
применять многоцветную указку, аналогичную той, которая
применялась при чтении программ ЛОСа. Эта же указка позволяет
получить справочную информацию относительно тех или иных терминов,
ис\-поль\-зо\-ван\-ных в описании приема.

Чтобы войти в режим применения многоцветной указки, следует прежде
всего выделить то окно, в котором предполагается ее использовать.
Для этого существует два способа - либо нажать клавишу "курсор
вправо", и тогда будет выбрано окно номер 1 (номер выбранного окна
перекрашивается в малиновый цвет), либо сразу нажать клавишу $i$
для номера требуемого окна; $i$ - 1,2,3 либо 4. Смену номера
выбранного окна можно выполнять клавишами "курсор вверх - курсор
вниз". После того, как нужный номер выделен, нажатие клавиши
"курсор вправо" \ переводит собственно в просмотр элементов окна с
применением цветовой указки. Для третьего и четвертого окон такой
просмотр совершенно аналогичен применявшемуся в ре\-дак\-то\-ре
программ ЛОСа: смена терма выполняется клавишами "курсор вправо -
курсор влево"; вход в первый операнд текущей операции - "курсор
вниз"; выход обратно - "курсор вверх". По достижении "корневого" \
уровня выход из просмотра текущего окна и возвращение к режиму
выбора номера окна - тоже клавишей "курсор вверх". Во втором окне
многоцветная указка включается лишь тогда, когда заголовок
прие\-ма более чем односимвольный.

Просмотр теоремы приема, записанной в текстовом (скобочном) виде,
происходит так же, как просмотр термов третьего и четвертого окон.
Если же теорема изобра\-же\-на в формульном виде, то для выделения
ее подтермов используется одноцветный режим: выделенная часть
перекрашивается в малиновый цвет. В остальном принципы
использования клавиатуры - те же, что для многоцветной указки:
вход в первый операнд операции - "курсор вниз"; смена операнда -
"курсор влево - курсор вправо"; выход в надоперанд - "курсор
вверх".

Для быстрого выхода из режима цветовой указки используется клавиша
"пробел" \ - нажатие ее в любом контексте использования цветовой
указки сразу возвращает в режим общего просмотра приема.

Для быстрого выделения конкретного элемента описания приема,
расположен\-но\-го в третьем либо четвертом окнах, можно также
использовать мышь: если ее курсор разместить на представляющем
интерес элементе и нажать левую клавишу, то он будет выделен
многоцветной указкой. Этот же режим можно применять и для первого
окна. Если теорема записана в формульном виде, то мышью бывает
трудно выделить нужный подтерм для инфиксных операций - вместо
него выделяется какой-либо подфрагмент, например, переменная. В
таких случаях можно сначала выде\-лить мышью что-то близкое к
нужному подтерму, а затем скорректировать выбор подфрагмента
клавишами курсора.

Нажатие левой клавиши мыши вне элементов описания приема, как и
нажатие пробела, возвращает к режиму общего просмотра приема.

Если третье либо четвертое окно разрезано на несколько страниц, то
для перехода к следующей или предыдущей его странице нужно войти в
режим цветового вы\-де\-ле\-ния элементов этого окна и
использовать клавиши "PageDown", "PageUp". Можно также переместить
текущий указатель к запятой, расположенной в конце либо в начале
окна, и нажать клавишу "курсор вправо" \ либо, соответственно,
"курсор вле\-во". Смену страницы можно выполнить, не входя в
просмотр элементов окна - для этого нужно подвести курсор мыши к
соответствующей запятой и нажать левую кнопку мыши.

\subsubsection{Смена формульного и текстового режимов просмотра
теоремы}

Для просмотра теоремы приема предусмотрены два режима - обычный
формульный и технический текстовый, при котором отображается
используемая про\-грам\-ма\-ми ЛОСа скобочная запись. Чтобы ввести
формульный режим, следует нажать кла\-ви\-шу "ф"; чтобы ввести
текстовый режим - нажать клавишу "т". Выбранный режим сохраняется
на все время пребывания в оглавлении приемов и сбрасывается при
выходе из него; по умолчанию при входе в оглавление
устанавливается фор\-муль\-ный режим.

\subsubsection{Просмотр нормализаторов приема}

Для просмотра нормализаторов приема нажимается клавиша "5". После
этого под горизонтальной линией, завершающей четвертое оконо
приема, возникает набор нор\-ма\-лизаторов приема, обрабатывающих
некоторый его терм $A$. Одновременно терм $A$ выделяется цветовой
указкой в теореме приема либо, если он встречался не в теореме, а
в фильтрах либо указателях, в соответствующих текстах третьего
либо четвертого окон. Чтобы перейти к просмотру цепочки
нормализаторов, связанных со следующим термом $A$, нажимается
клавиша "PageDown"; чтобы вернуться обратно - клавиша "PageUp".
Выйти из данного режима просмотра цепочек нормализаторов,
связанных с различными термами $A$, можно только одним способом -
нажатием клавиши "End".

Если требуется внести изменения в текущую цепочку нормализаторов,
нажи\-ма\-ет\-ся клавиша "н" \ - тогда в начале записи
нормализаторов возникает курсор текстового редактора. После
завершения редактирования (нажатие Enter либо, в случае отказа от
изменения записи, - Esc) - восстанавливается указанный выше режим
просмотра. Вносимые здесь и в других случаях редактирования
фрагментов описания приема изменения не затрагивают хранящейся в
файлах записи приема; они лишь изменяют копию этой записи,
используемую для текущего отображения на экране. Для
фак\-ти\-чес\-кого изменения приема нужно после возвращения в
общий режим просмот\-ра нажать F3 либо F4. Другая возможность
изменять нормализаторы приема (по су\-щест\-ву, основная) будет
описана ниже - в разделах, относящихся к редактированию приема.

Если при просмотре нормализаторов приема нажать клавишу Ctr-Del,
то про\-изо\-й\-дет удаление текущей цепочки нормализаторов - как
и выше, без изменения записи приема в файлах до тех пор, пока не
будет нажата F3 либо F4.

\subsubsection{Просмотр текстформульного шаблона, используемого
для формирования поясняющего срабатывание приема текста}

Для входа в просмотр и редактирование текстформульного шаблона,
используемого при отображении срабатывания приема в протоколе
решения, нажимается клавиша "6". После этого в области,
расположенной под нижней горизонтальной линий чет\-вер\-то\-го
окна, отображается текст ранее введенного текстформульного шаблона
(ес\-ли он имелся) и включается обычный режим текстформульного
редактора.

\subsection{Получение справочной информации при про\-смот\-ре\\ при\-ема}

Чтобы получить справочную информацию о том или ином логическом
символе, встречающемся в третьем либо четвертом окне описания
приема, достаточно вы\-дел\-ить этот символ цветовой указкой (с
помощью клавиатуры либо поместив на него курсор мыши и нажав левую
клавишу) и далее нажать правую клавишу мыши. Вместо последнего
действия можно нажать: в случае третьего окна - Ctr-у (здесь у -
кириллица),а в случае четвертого окна - Ctr-х (х - кир.).
Справочный текст поя\-вит\-ся под нижней линией четвертого окна;
если для него не хватило места, то следует убрать одно или
несколько неиспользуемых окон с помощью Ctr-Fi; $i$ = 1,2,3,4 -
как указано выше.

Иногда для одного и того же логического символа имеется несколько
различных справочных текстов, соответствующих различным случаям
его использования. Эти тексты могут быть двух типов - пояснения к
фильтрам и пояснения к указателям приема. Переходить от одного
такого текста к другому внутри текстов одного типа, после выдачи
на экран некоторого из них, можно с помощью клавиш "курсор вверх -
курсор вниз". Переход к текстам следующего типа - нажатием любой
другой кла\-ви\-ши (например, "пробел") либо кнопкой мыши. При
использовании клавиш Ctr-у, Ctr-х такого рода неоднозначность
уменьшается, так как в первом случае выда\-ют\-ся только тексты,
связанные с фильтрами приема, а во втором случае - только тексты,
связанные с указателями.

Справочный текст убирается нажатием любой не используемой при его
просмотре клавиши (например, клавиши "пробел") либо нажатием
клавиши мыши вне окон приема.

Чтобы получить во время создания нового приема необходимую
информацию о конструкциях, используемых в ГЕНОЛОГе, нужно выйти в
исходную ситуацию просмотра приема либо нажать клавишу F1 (тогда
появится оглавление общего опи\-са\-ния системы), либо нажать одну
из клавиш Ctr-з (оглавление заголовков прие\-мов), Ctr-у
(оглавление фильтров приемов), Ctr-х (оглавление указателей
приемов).

Чтобы при просмотре приема получить доступ к информационным
текстам, свя\-зан\-ным с заданным логическим символом, нужно
нажать клавишу "с". Тогда по\-яв\-ля\-ет\-ся курсор текстового
редактора, с помощью которого набирается название дан\-но\-го
символа. После набора символа нажимается Enter, и на экране
появляется первая страница указанных информационных текстов. Эти
тексты - те же самые, что и просматриваемые из редактора программ
ЛОСа. При нажатии любой не использу\-е\-мой в интерфейсе просмотра
информационных текстов клавиши - возвращение в просмотр приема.

Начато создание сводного оглавления логического языка решателя. С
его помо\-щью можно будет получать информацию о логических
символах, встречающихся в теоремах приемов. Вызов оглавления из
просмотра приема осуществляется нажати\-ем клавиши "Ctr-я". Если
выделить подфрагмент теоремы приема в режиме фор\-муль\-но\-го
просмотра и нажать правую клавишу мыши, то внизу появится
справоч\-ная информация относительно заголовка подфрагмента, при
условии, что она уже имеется в данном оглавлении.

С приемом можно связывать набираемые текстовым редактором
примечания, облегчающие регулировку системы приемов "вручную". Для
входа в просмотр таких примечаний следует нажать клавишу "э". Если
в примечания нужно внести изме\-не\-ния, то после этого нажимается
Enter (возникает курсор текстового редактора), Нажатие Enter по
окончании редактирования приводит к немедленному сохранению
изменений в примечаниях.

\subsection{Указатели на степень готовности приема}

Если прием только что введен либо изменен, но изменения не
сохранены в файлах, хранящих описания приемов, то нижняя линия
четвертого окна имеет голубой цвет. В этой ситуации нельзя
выходить куда-либо из просмотра приема - все изменения (а в случае
нового приема и сам прием) будут утеряны.

Если прием (новый либо после изменения старого) сохранен в файлах,
хранящих описания приемов, но не откомпилирован в программу ЛОСа,
то нижняя линия четвертого окна имеет красный цвет. В этом случае
можно выходить из редактора приемов в другие разделы и выключать
систему, не теряя описания приема.

Наконец, если описание приема сохранено в файлах и прием
оттранслирован в программу ЛОСа, то нижняя линия четвертого окна
имеет черный цвет. Заметим, что если изменения в описание были
внесены для уже откомпилированного приема, то при сохранении
изменений в файлах без перекомпиляции приема (это достигается
нажатием клавиши F4) нижняя линия четвертого окна останется
черной, хотя фак\-ти\-чес\-ки программа приема на ЛОСе не будет
соответствовать новой версии описания приема. Чтобы не создавать
такого рода рассогласований, нужно либо использовать при
изменениях приема клавишу F3 сохранения с перекомпиляцией, либо
изменять отключенный прием с удаленной ЛОСовской программой (она
удаляется нажатием клавиши F7).

\subsection{Переход от просмотра описания приема к просмотру
других разделов системы}

От описания откомпилированного приема можно перейти к просмотру
его про\-грам\-мы на ЛОСе, нажав клавишу Home. Далее можно
произвольным образом пере\-ме\-щать\-ся по фрагментам ЛОСовской
программы (не выходя в главное меню сис\-те\-мы) - из любой
текущей позиции для возвращения в просмотр приема достаточно
нажать клавишу End.

Для быстрого возвращения в главное меню системы из просмотра
описания при\-ема предусмотрена клавиша End. При этом в оглавлении
базы приемов будет сохра\-нен путь, ведущий к просматриваемому
приему, и при возвращении в это оглавле\-ние будет выделен синим
цветом содержащий данный прием концевой пункт. Если в концевом
пункте было несколько приемов, то при входе в просмотр данного
пункта будет выдан прием, из которого в последний раз был
предпринят выход по End.

Если несколько приемов созданы на основе одного и того же
представления тео\-ре\-мы в файлах (такое представление называется
узлом теоремы в базе приемов), то для перехода от одного из них к
другим служат клавиши PageDown, PageUp. Впрочем, в решателе крайне
редко один и тот же узел теоремы обслуживает несколько различ\-ных
приемов; даже если теоремы двух приемов совпадают, они, как
правило, имеют различные узлы.

Возможен прямой переход от просмотра приема к оглавлению программ
либо к оглавлению задачника. В первом случае нажимается Shift-1;
во втором случае Shift-3.

Для возвращения в данный прием из просмотра другого приема
предусмотрен буфер перехода. Чтобы занести в него ссылку на прием,
достаточно при просмотре приема нажать клавишу "минус". Для
возвращения к приему из просмотра другого приема нажимается
клавиша "равно". Одновременно последний прием сам за\-но\-сит\-ся
в буфер перехода, так что еще одно нажатие "равно" \ восстановит
ситуацию.

Предусмотрена возможность связывать прием с той теоремой из базы
теорем, на основе которой он создан. Это можно делать не для всех
приемов - некоторые из них основаны на псевдотеоремах, не имеющих
ничего общего с теоремами предметной области и представляющих
собой чисто технические записи. Однако, большинство приемов
действительно имеют своим источником конкретную "обычную" \
теорему. В этих случаях теорема приема возникает из
соответствующей ей теоремы предметной области несложными
преобразованиями, в настоящей версии системы
авто\-ма\-ти\-зи\-ро\-ван\-ными лишь частично. Имеется интерфейс
для установления соответствия между теоремой приема и ее
прототипом в базе теорем вручную. Установление такого
со\-от\-вет\-ст\-вия является одним из первых шагов в расшифровке
процедур автоматического синтеза приемов, дающим исходный материал
для анализа. Чтобы перейти от про\-смот\-ра приема к просмотру той
теоремы в базе теорем, которая служит источником приема, служит
клавиша F9. Если источник еще не был выбран, то после нажатия F9
возникает оглавление базы теорем, в котором можно выбрать нужный
источник - войти в просмотр теоремы и нажать "И".

\section{Редактирование приемов}

\subsection{Ввод нового приема}

\subsubsection{Инициализация приема и ввод его теоремы}

Для ввода нового приема следует прежде всего найти в оглавлении
базы приемов тот концевой пункт, в котором предполагается
зарегистрировать прием, либо создать такой концевой пункт. Затем
следует войти в просмотр данного концевого пункта (клавиша "курсор
вправо"). Если в пункте уже имелись какие-либо приемы, то на
экране будет отображен один из них, и для создания нового приема
нужно нажать клавишу Ctr-п. В случае пустого концевого пункта
клавиша Ctr-п не нажима\-ет\-ся. Далее в обоих случаях начинается
заполнение окон нового приема.

Если прием должен сопровождаться чертежем, то прежде всего
нажимается кла\-ви\-ша Ctr-ч, которая вводит в геометрический
редактор. По окончании набора чер\-те\-жа нажимается Enter, если
теорема будет набираться формульным редактором, и Ctr-Enter, если
ее нужно набрать текстовым редактором. Вслед за этим возник\-нет
курсор формульного либо текстового редактора для набора теоремы
приема (чертеж на экране сохраняется).

Если чертеж не создается, то для начала ввода теоремы приема
следует либо нажать клавишу Ctr-ф (тогда теорема будет вводиться
формульным редактором), либо нажать клавишу Ctr-т (тогда теорема
будет вводиться в скобочной записи текстовым редактором; здесь "т"
\ - кириллица). По окончании ввода теоремы на\-жи\-ма\-ется Enter
- под теоремой прорисовывается горизонтальная линия. Если
теоре\-ма вводилась текстовым редактором, но возможна ее
прорисовка в формульном виде, то эта прорисовка осуществляется
вместо скобочной записи. В левом верхнем углу теоремы появляется
номер окна - цифра 1.

Если теорема выдана в формульном виде, то непосредственно под ней
раз\-ме\-ща\-ет\-ся выделенная голубым цветом строка обозначений
переменных - пар вида ($x$ - х$n$), где $x$ - обозначение
переменной в формульной записи, а х$n$ - обозначение этой же
переменной во внутреннем скобочном представлении. Эти обозначения
необходимы для ввода фильтров и указателей приема, так как в них
используется только ско\-боч\-ное представление термов.

После набора теоремы под ней проводится нижняя горизонтальная
линия. Да\-лее возможен ручной ввод описания приема либо
автоматическое создание его исход\-ной версии. В первом случае
следует нажать Enter - после этого появляются цифра "2" \ - номер
второго окна приема, а также курсор текстового редактора для ввода
заголовка приема. Во втором случае, для входа в оглавление типов
приемов, на\-жи\-ма\-ет\-ся "а" \ (кир.). Заметим, что пока
автоматическое создание приема исполь\-зу\-ет\-ся только для
приемов стандартных справочников, хотя существующие процедуры
могут предлагать какие-то исходные версии приема и в других
случаях.

Интерфейс ручного ввода нового приема устроен так, что по
окончании ввода каждого из окон 1 - 3 появляется приглашение для
ввода следующего окна (в левом углу прорисовывается его номер, и
возникает курсор текстового редактора для набо\-ра содержимого
окна). Этот режим, однако, можно в любой момент прервать, нажав
клавишу Esc. Уже набранные к этому моменту окна приема будут
сохранены на экране (но пока не в файлах, так что выход из
просмотра приема обратно в оглав\-ле\-ние либо смена приема
клавишами "курсор вверх - куроср вниз" \ ПРИВЕДУТ К ПОТЕРЕ
набранной его части). Для возобновления набора приема далее нужно
поступать так же, как при изменении ранее введенного приема -
нажать клавишу Ctr-$i$, где $i$ - номер того окна, в котором
предполагается продолжать набор приема; $i = 2,3,4$.

\subsubsection{Ввод заголовка приема}

Заголовок приема набирается тек\-сто\-вым редактором обычным
образом. Если для выбора заголовка здесь понадобится справочная
информация, то ее можно получить, нажав клавишу Ctr-з. Тогда
появляется оглавление типов заголовков приемов. Вы\-брав нужный
концевой пункт в этом оглавлении, следует нажать клавишу "курсор
вправо" \ - текст шаблона заголовка приема будет прорисован во
втором окне ав\-то\-ма\-ти\-чески. В нижней части экрана появится
текстовое пояснение к этому шаблону. После преобразования шаблона
заголовка в заголовок нажимается Enter. Ав\-то\-ма\-тически
появляется приглашение к набору 3-го окна.

\subsubsection{Ввод фильтров и указателей приема}

Третье и четвертое окна (соответственно, фильтры и указатели)
набираются тек\-сто\-вым редактором. Если при наборе третьего окна
нажать клавишу Ctr-у (кир.), то появляется оглавление фильтров;
если при наборе четвертого окна нажать кла\-ви\-шу Ctr-х, то
появляется оглавление указателей. При выборе нужного концевого
пункта одного из этих оглавлений и нажатии на нем клавиши "курсор
вправо" \ произойдет прорисовка шаблона соответствующего фильтра
либо указателя начиная с той по\-зи\-ции окна, на которой
находился курсор при обращении к оглавлению (содержи\-мое окна при
выходе из оглавления восстанавливается). По окончании набора окна
нажимается Enter.

Если при наборе третьего либо четвертого окна появляется
необходимость ввести указатель вхождения в теорему, то нажимается
Shift-1. Вслед за этим в первом окне включается режим выбора
подтерма теоремы цветовой указкой. Выбранный подтерм
прорисовывается малиновым цветом в случае формульной прорисовки
теоремы либо, при скобочной прорисовке, выделяется группой цветов,
как в редакторе программ ЛОСа. После выбора подтерма,
расположенного на нужном вхождении, нажимается "ф". Тогда, начиная
с той позиции, на которой во время нажатия Shift-1 находился
курсор, прорисовывается указатель вхождения "фикс($\ldots$)". Если
при просмотре под\-тер\-мов стало ясно, что указатель вхождения не
нужен, то нажимается Esc. Следу\-ет заметить, что в особых случаях
формульный редактор не позволяет непосредственно выходить на
цветовое выделение части подтермов теоремы; тогда для
автома\-ти\-чес\-ко\-го набора указателя вхождения рекомендуется
нажатием Enter выйти из ре\-дак\-ти\-ро\-вания окна, поменять
формульный режим отображения теоремы на текстовый, и снова войти в
редактирование окна.

По окончании набора предварительной версии приема нажимается
клавиша F4. Это приводит к сохранению в файлах набранной части
приема. Далее можно на\-чи\-нать цикл коррекций исходной заготовки
приема, присоединяя к ней необходимые фильтры, указатели,
нормализаторы и т.п.

\subsubsection{Ввод нормализаторов приемов}

Для ввода нормализаторов приема необходимо выделить цветовой
указкой в теоре\-ме либо в некотором терме третьего или четвертого
окон нормализуемый терм. Если после этого нажать Enter, то под
нижней линией четвертого окна появляется курсор текстового
редактора. Если для выделенного подтерма уже были введены
нормализаторы, то они будут прорисованы начиная с позиции курсора.
Далее пред\-при\-ни\-мается ввод либо изменение нормализаторов и
нажимается Enter (в случае отказа от редактирования - Esc). После
этого восстанавливается режим цветовой указки, и можно переходить
к выбору нового нормализуемого подтерма.

Как и в случае автоматического набора указателя вхождения, следует
учитывать, что не во всех случаях возможно корректное выделение
подтерма теоремы в ре\-жи\-ме формульного редактора. В тех
случаях, когда оно не обеспечено, следует переходить к текстовому
режиму отображения теоремы.

Группа нормализаторов приема, связанная с обработкой некоторого
подтерма, вводится лишь однократно - по произвольному вхождению
этого подтерма в теорему, фильтр либо указатель.

Иногда бывает нужно связывать группу нормализаторов приема с
термом $A$, встречающимся в других нормализаторах приема
(например, в дополнительных по\-сыл\-ках либо в фильтрах,
встречающихся в нормализаторах приема). Если такие термы не
встречаются в 1,3,4 окнах, то в 4-м окне вводится фиктивный
указатель "фикс($A$)", и после этого для $A$ указывается цепочка
нормализаторов. Заметим, что данный фиктивный указатель при
сохранении приема в файлах отбрасывается, и при последующих
просмотрах приема (если его не ввести снова) появляться не будет.

Как и для любых изменений приема, после коррекции нормализаторов
нужно нажать клавишу F4 для сохранения изменений в файлах либо
клавишу F3 для сохранения изменений и перекомпиляции.

\subsection{Сохранение описания приема и компиляция}

По окончании ввода приема следует по крайней мере сохранить его
описание в файлах системы (оно сохраняется в 8-м информационном
блоке). Для этого на\-жи\-ма\-ется клавиша F4. Если введенная
версия приема не требует какой-либо доработки, то вместо F4 можно
нажать F3 - тогда кроме сохранения описания приема сразу же будет
выполнена компиляция его в программу на ЛОСе.

В целях отладки иногда бывает нужно временно удалять программу
приема, сохраняя его описание в файлах. Для этого используется
клавиша F7. Чтобы снова откомпилировать программу такого приема,
нажимается F5.

Для отладки компилятора ГЕНОЛОГа предусмотрен вход в компиляцию с
ус\-та\-нов\-кой прерывания через оглавление программ ЛОСа. Здесь
используется клавиша Ctr-F5, после нажатия которой возникает
некоторый пункт оглавления программ. В этом оглавлении нужно войти
в подраздел "Компилятор ГЕНОЛОГа"; выб\-рать нужный концевой пункт
и нажать на нем "курсор вправо". Как только при ком\-пи\-ля\-ции
будет достигнут соответствующий данному концевому пункту оператор
"прием(\\ $N$)", будет включен пошаговый режим отладчика ЛОСа.

\subsection{Изменение приема}

Чтобы изменить теорему приема, обычно применяется режим текстового
редактора, так как в нем можно скорректировать произвольный
подфрагмент теоремы, не пе\-ре\-пи\-сы\-вая заново всей теоремы.
Для входа в такой режим достаточно нажать клави\-шу Ctr-т (кир.).
Разумеется, для работы в текстовом редакторе следует
заблаговре\-мен\-но уточнить обозначения теоремных переменных во
внутреннем "скобоч\-ном" \ представлении, используя располагаемый
под "формульной" \ записью теоремы вы\-де\-лен\-ный голубым цветом
список таких обозначений. По окончании редактирова\-ния нажимается
Enter, после чего (если только не был специально установлен
тексто\-вый режим просмотра) измененная теорема будет перерисована
в формульном виде. Как и во всех случаях изменения приема, для
сохранения изменений здесь следует нажать F4 либо (для
одновременной перекомпиляции) F3.

Для изменения теоремы приема формульным редактором имеется
несколько воз\-мож\-нос\-тей. Первая из них - войти в набор
теоремы "с конца" \ (нажатие клавиши "Ф" \ из общего просмотра
приема), отбросить с помощью Backspace старую версию конце\-вой
части, и затем перенабрать эту часть в требуемом виде. Другая
возможность - выделить курсорами либо мышью подтерм теоремы,
который нужно изменить, нажать "Ф", ввести формульным редактором
новую версию, и нажать "Enter". Ес\-ли нужно добавить новый
антецедент теоремы, то выделяется тот антецедент, пе\-ред которым
выполняется вставка, нажимается "в", и формульным редактором
вводит\-ся добавляемый антецедент. Если выделить антецедент и
нажать "В", то вставка ново\-го антецедента будет осуществлена
непосредственно после выделенного. Если выделить антецедент и
нажать "Ctr-Del", то он будет удален. Перечисленные операции можно
выполнять не только с антецедентами, но также с операндами любой
коммутативно-ассоциативной операции, встречающейся в теореме.
Наконец, упомянем совсем ра\-ди\-кальный способ изменения теоремы
приема - полный перенабор ее формульным редактором. Для этого
нажимается клавиша Ctr-ф, вводящая в ре\-жим формуль\-но\-го
редактора. Для удобства во время набора новой версии старая версия
теоре\-мы сохраняется в верхней части экрана - кроме случаев,
когда места для обе\-их версий сразу недостаточно.

Для коррекции чертежа - как и для ввода нового чертежа -
нажимается клавиша Ctr-ч, вводящая в геометрический редактор.

Если нужно изменить содержимое окна с номером 2,3 либо 4, то
нажимается, соответственно, клавиша Ctr-2, Ctr-3 либо Ctr-4. По
завершении редактирования нажимается Enter.

Для изменения нормализаторов, связанных с некоторым подтермом
теоремы, фильтра либо указателя приема, следует поступать так же,
как для ввода новых нормализаторов - выделить этот подтерм
цветовой указкой и нажать Enter. Для удаления ранее введенных
нормализаторов следует войти в просмотр всего их списка (Ctr-5, и
далее PageDown - PageUp), выделить ненужную группу нормализаторов
и нажать Ctr-Del. Из просмотра списка нормализаторов,
инициируемого нажатием клавиши Ctr-5, можно также изменять
нормализаторы. Для этого на текущей про\-смат\-риваемой группе
нормализаторов нажимается "н". Наконец, для удаления во\-об\-ще
всех нормализаторов данного приема нажимается Ctr-End. Последняя
опера\-ция бывает необходима, если была существенно изменена
теорема или удалены некото\-рые фильтры либо указатели, с
подтермами которых были связаны нормализаторы (в этих случаях
попытка просмотра нормализаторов с помощью Ctr-5 может приводить к
сообщениям о некорректном обращении к операторам ЛОСа). Еще раз
напоминаем о необходимости использовать F4 либо F3 для сохранения
изменений.

\subsection{Буфер базы приемов}

Чтобы можно было контролировать вводимые в приемы изменения,
используется буфер базы приемов. Этот буфер создается
автоматически; в нем регистрируются новые, измененные и удаленные
приемы. Каждый раз при его создании в корневом меню оглавления
базы приемов добавляется последним пунктом подменю "Буфер". В этом
подменю вводятся далее подменю "Новые приемы", "Измененные приемы"
\ и "Удаленные приемы" \ (в зависимости от наличия таковых). При
добавлении, изме\-не\-нии либо удалении приема в соответствующем
(одном из указанных трех) подменю вводится концевой пункт,
подзаголовок которого копируется с подзаголовка
со\-от\-вет\-ствующего (содержащего либо содержавшего прием)
концевого пункта основной части оглавления. Через этот концевой
пункт происходит выход в просмотр старой (в случае нового приема -
основной) версии приема.

Для перехода от просмотра в буфере старой версии к просмотру новой
версии используется клавиша "о"; для возвращения от просмотра
основной версии к про\-смот\-ру старой версии - клавиша "б".

При просмотре версии приема, находящейся в буфере, не
рекомендуется вносить какие-либо изменения в описание приема (!) -
это может привести к необходимости "ремонта" \ оглавления базы
приемов. Однако, при просмотре версии в буфере воз\-мож\-на ее
компиляция либо уничтожение ее программы - как и обычно, с помощью
клавиш F5 и F7. Указанный выше ремонт оглавления состоит в том,
чтобы через технический просмотр 8-го информационного блока (см.
подраздел "Ресурсы и ус\-та\-нов\-ки" главного меню системы) выйти
в корень оглавления базы приемов (метки "оглавление", "прием") и
изменить содержимое логического терминала "позиция" \ на "число(0
0)". После выхода из технического просмотра - вернуться в просмотр
оглавления приемов и сразу же нажать в нем клавишу "О" \ (кир.)
для сброса не\-при\-год\-ного далее буфера.

Если необходимо для целей отладки временно откомпилировать старую
версию приема, удалив программу новой версии, то из просмотра
новой версии приема нажимается клавиша "И". Обратно, для удаления
программы старой версии и ком\-пи\-ля\-ции программы новой (снова
из просмотра новой версии) нажимается клавиша "Т". Наконец, если
новая версия не оправдала надежд и нужно вернуться к старой
вер\-сии, нажимается "Б".

Время от времени буфер следует расчищать: если в нем накопилось
слишком много приемов, то будут заблокированы изменение приемов,
ввод новых приемов и удаление старых. Расчистка буфера происходит
при нажатии в любом месте оглав\-ле\-ния базы приемов клавиши "О"
\ (если это происходило в момент просмотра пунк\-тов буфера, то
произойдет выход в главное меню, иначе - сохранится просмотр
оглавления), Если после расчистки буфера и возвращения из главного
меню в оглав\-ле\-ние базы приемов экран оказался пустым, то это
означает, что пункты оглавления оказались "прокручены вверх". Для
их возвращения используется PageUp.

Для удобства работы с буфером предусмотрен автоматический переход
в него из любого места оглавления базы приемов - по нажатию
клавиши "ф".

\subsection{Перенесение приема в другой концевой пункт
оглав\-ле\-ния}

Чтобы перенести прием в другой концевой пункт оглавления базы
приемов, следу\-ет войти в его просмотр, нажать Insert, выйти
обратно в оглавление, перейти к нужному концевому пункту и (не
входя в него) снова нажать Insert. Перед вторым нажатием Insert
следует убедиться, что необходимый концевой пункт действительно
выделен в качестве текущего (т.е. имеет голубой цвет).

\subsection{Удаление приема}

Для удаления ненужного приема нажимается клавиша Ctr-Del. Заметим,
что в этом случае прием сохраняется в буфере базы приемов и при
необходимости может быть оттуда извлечен обычной процедурой
перенесения приема из одного пункта оглав\-ле\-ния в другой пункт:
на переносимом приеме нажимается Insert, далее по оглавлению базы
приемов находится нужный концевой пункт и (без входа в этот пункт,
но после выделения его голубым цветом) снова нажимается Insert.
После расчистки буфера (нажатием клавиши "О") происходит
окончательное удаление ранее исключенных приемов.

Особой осторожности требует удаление приемов пакетных
нормализаторов. Если удаляется или даже просто перекомпилируется
единственный оставшийся прием та\-ко\-го оператора, то происходит
нарушение архитектуры его программы, для вос\-ста\-нов\-ления
которой нужно обязательно (!) удалить клавишей F7 и затем снова
откомпилировать прием "окончание" \ этого нормализатора, играющий
роль пе\-ре\-клю\-ча\-теля уровней срабатывания. Лишь затем можно
подключать к программе этого оператора другие приемы - вводя новые
или компилируя временно отключенные старые. Если нормализатор
имеет более одного приема, то удаление приема и
пе\-ре\-ком\-пи\-ляция возможны без ограничений.

\subsection{Автоматическое пополнение описания приема}

Процедуры, созданные для автоматического синтеза приемов на
ГЕНОЛОГе, имеют пока предварительный характер, однако даже и в
таком виде они могут существенно ускорить процесс ввода элементов
описания приема и подсказать полезные добав\-ле\-ния к этому
описанию.

Если после ввода теоремы нажать "а", то возникает оглавление типов
приемов. Фактически это ветвь оглавления программ для подраздела
"Справочник ЗАГО\-ЛО\-ВОКПРИЕМА" \ раздела "Генератор приемов".
Переходя в этом оглавлении к концевому пункту (точка после номера
пункта) для приемов требуемого типа и заходя в этот пункт,
инициируем работу генератора приемов. Если был создан хотя бы один
прием, то на экране появится описание первого из таких приемов,
огра\-ни\-чен\-ное снизу голубой линией. Это описание, после
необходимой коррекции, можно сохранить в базе приемов (F4) или
даже сразу откомпилировать (F3). Если было создано несколько
приемов, то каждый следующий прием из серии вызывается на экран
нажатием клавиши "ш"; его также можно сохранить либо
откомпилировать. По исчерпании серии, нажатия клавиши "ш" \
каких-либо изменений на экране вы\-зы\-вать не будут. Заметим, что
данный режим создания приемов пока применяется исключительно для
приемов справочников - согласно первом пункту "Справочники и
сопровождающие их простейшие приемы" \ оглавления типов приемов.

Значительно более употребительным (практически постоянно) является
ав\-то\-ма\-ти\-ческое пополнение списков указателей и
нормализаторов приема. Для такого по\-пол\-нения нажимается
клавиша "н". Если процедура предлагает ввести новый эле\-мент либо
удалить старый, то он прорисовывается под нижней линией четвертого
окна. В случае, если этот элемент является нормализатором приема,
одновременно выделяется цветовой указкой нормализуемый им подтерм.
Нажатием клавиши Insert можно ввести предлагаемый элемент в
описание приема, нажатием клавиши Delete - отказаться от его
ввода. Если процедура предлагает добавить новый элемент, то в
левой части прорисовываемого вверху экрана меню написано "Новый
указатель"; если она предлагает удалить старый элемент, то в левой
части прорисовываемого вверху экрана меню написано "Старый
указатель". В последнем случае нажа\-тие Delete приведет к
удалению элемента, а нажатие Insert - к его сохранению.
Пред\-ло\-же\-ния выдаются последовательно, по мере нажатия клавиш
Insert - Delete. Этот процесс можно в любой момент оборвать, нажав
Esc. Введенные до этого изменения сохранятся (но не в файлах, а
только в текущем отображении приема).

Заметим, что, как правило, предложения по удалению старых
указателей вызваны не какими-то специальными мотивировками, а
просто тем, что процедура не ге\-не\-ри\-рует именно эти типы
указателей - они находятся вне ее компетенции. Автоматичес\-кое
создание обращений к нормализаторам общей стандартизации
существенно об\-лег\-чает ручной ввод приемов - ведь такими
указателями обычно снабжаются прак\-ти\-чес\-ки все отличные от
переменных и констант подвыражения формируемых приемом термов.


\section{Дополнительные возможности редактора при\-е\-мов}

\subsection{Разрезание окна на несколько час\-тей ли\-бо скле\-й\-ка
час\-тей ок\-на}

Если третье либо четвертое окно становится слишком большим и
затрудняет работу с приемом (например, не оставляет места для
просмотра нормализаторов), то его можно разрезать на несколько
частей. Для этого нужно войти в просмотр тер\-мов окна цветовой
указкой, выбрать тот терм, который будет последним в первой
половине разрезаемого окна, и нажать клавишу "р" \ (кир.). Другой
способ разрезать окно - войти в режим его редактирования и
поместить запятую в точке разрезания.

Чтобы склеить текущую часть окна с непосредственно следующей за
ней, нужно войти в просмотр термов окна цветовой указкой и нажать
F6. Другой способ - войти в редактирование окна и убрать запятую в
его конце.

\subsection{Копирование приема либо его фрагментов}

При программировании на ГЕНОЛОГе иногда возникают серии похожих
приемов, для ускоренного ввода которых можно применять копирование
первого приема се\-рии с последующими исправлениями.

Для полного копирования приема имеются две возможности - с
регистрацией в файлах и компиляцией для вводимой копии, либо без
регистрации и компиляции. Во втором случае нажимается клавиша
Ctr-д, после чего возникает заготовка для редактирования
альтернативной версии приема (старая версия приема сохраняется;
под новой версией проведена голубая линия). Эту версию приема
после завершения редактирования можно сохранить и откомпилировать
обычным образом (F4 либо F3). В первом случае нажимается клавиша
"д", и созданная копия приема сразу же сохраняется и
компилируется. Эта возможность, в отличие от предыдущей,
прак\-ти\-чес\-ки не применяется.

Иногда бывает нужно многократно использовать в различных приемах
одни и те же фильтры. Чтобы ускорить их ввод, можно выделить такой
фильтр цветовой указкой и нажать клавишу "у". Если затем войти в
просмотр другого приема и, не входя в режим цветовой указки,
нажать "у" \ снова, то данный фильтр (а если указанным образом
ранее было отобрано несколько фильтров, то все они сразу) будет
занесен в третье окно приема. Далее нужно сохранить введенное
таким образом изменение, нажав F4 либо F3. Чтобы сбросить
накопитель фильтров, вводимых в приемы по нажатии клавиши "у",
используется клавиша "У".

Вообще, для перенесения каких-либо фрагментов из приема в прием
можно ис\-поль\-зо\-вать обычный буфер текстового редактора:
сначала нужно войти в режим редактирования текстовым редактором
того окна, которое содержит копируемый фрагмент (в том числе
первого окна); затем занести этот фрагмент в буфер нажа\-ти\-ем
PageDown в начале и конце фрагмента; перейти в другой прием либо в
дру\-гое окно того же самого приема, и извлечь фрагмент из буфера
нажатием PageUp.

Можно создавать различные приемы, используя одну и ту же теорему.
Для этого сначала нужно войти в прием, имеющий данную теорему, и
для занесения ее в специальный буфер нажать Ctr-б. Далее, при
создании нового приема можно на\-чи\-нать цикл его ввода с нажатия
Ctr-и либо Ctr-к (кир.). В обоих случаях будет прорисована
отобранная в буфер теорема. В первом случае прием будет сохранен в
файлах на основе уже имеющейся в них записи теоремы  - "узла
теоремы"; во втором - будет введен новый узел той же теоремы.
Вторая возможность используется, если с первым узлом уже был
связан прием, имеющий тот же самый заголовок: выход из узла
теоремы на структуру данных приема по заголовку этого приема
должен происходить однозначным образом.

\subsection{Изменение логического символа, за которым закреплен
прием}

Иногда бывает удобно изменить логический символ, за которым
первоначально был закреплен прием (например, прием был создан на
основе копии аналогичного приема, относившегося к другому
понятию). В этом случае нажимается клавиша Ctr-й; вво\-дит\-ся
текстовым редактором необходимый символ, и нажимается Enter.
Произойдет закрепление приема за новым символом, перенесение его
описания в файлах на но\-вое место и перекомпиляция.

\subsection{Поиск приемов заданного вида в базе приемов}

Для быстрого просмотра всех приемов базы приемов ГЕНОЛОГа,
удовлетворяю\-щих заданному условию, предусмотрен специальный
режим, использующий оператор ЛОСа "текприем($\ldots$)". Задание на
отбор приемов формулируется в виде ЛОСов\-ской программы этого
оператора. Все, что нужно для этого сделать - разместить после
начального оператора "метка(икс(десять))" \ этой программы и до
послед\-не\-го ее оператора "ответ(набор(См))" \ систему условий
на отбираемые для просмот\-ра приемы. В описании оператора
"текприем($\ldots$)" \ уточняется, какую информацию о текущем
приеме несут различные входные переменные оператора
"текприем($\ldots$)". Основные из них: х3 - теорема приема; х4 -
заголовок приема; х5 - описание приема. Описание приема
представляет собой набор указателей приема, к которому добав\-лен
терм "условие(и($A_1 \ldots A_n$))", где $A_1, \ldots , A_n$ - все
фильтры приемы, а также добавлены термы "быстрпреобр($B_1 \ldots
B_m$)", определяющие нормализаторы приема ($B_1$ определяет
нормализуемый подтерм - прямо либо через указатель вхожде\-ния
"фикс($\ldots$)"; $B_2, \ldots , B_m$ суть нормализаторы приема,
связанные с этим подтермом).

После того, как установлена необходимая программа оператора
"текприем($\ldots$)", следует выйти из редактора программ ЛОСа и
перейти в произвольный раздел оглавления базы приемов. Далее
нажатие клавиши F8 запускает цикл просмот\-ра всех (вне
зависимости от раздела, где была нажата F8) приемов системы,
удовлетво\-ря\-ю\-щих заданному ограничению. Чтобы перейти от
текущего приема к просмотру следующего, нажимается клавиша "курсор
влево". Чтобы оборвать просмотр, на\-жи\-ма\-ется Esc, переводящее
в главное меню. После этого можно вернуться в оглавление базы
приемов - текущими окажутся те конечный пункт оглавления и прием
этого пункта, на котором был оборван просмотр. Если в процессе
просмотра приемы ис\-чер\-па\-ны либо их вообще не было, то
система выходит в отладчик ЛОСа на оператор "трассировка(стоп 0)"
\ - далее нажатие Esc возвратит ее в главное меню. Заметим, что
оператор "текприем($\ldots$)" \ можно запрограммировать так, чтобы
он не только отбирал нужные приемы для просмотра, но и вносил в
них те или иные изменения, с перекомпиляцией или без нее. Таким
образом, появляется возможность с разумными затратами сил
осуществлять при необходимости различные глобальные
пре\-об\-ра\-зо\-вания всей базы приемов. Отметим также, что
изменять просматриваемые в ука\-зан\-ном выше цикле приемы можно и
обычным образом, вручную. Единственное ограничение здесь -
невозможность проконтролировать результаты перекомпиляции путем
перехода к редактору программ ЛОСа (клавиша Home). Чтобы изменить
найденный прием с возможностью такого контроля, следует оборвать
на нем про\-смотр с помощью Esc, а затем снова зайти в базу
приемов и выполнить ре\-дак\-ти\-рование приема.

При регулировке решателя те или иные приемы иногда отключаются с
помощью клавиши F7. Чтобы выявить все такие отключенные (не
откомпилированные) приемы базы приемов, следует нажать клавишу
Ctr-F8 и далее действовать, как в указанном выше цикле просмотра
(переход к следующему отключенному приему - "курсор влево"; обрыв
цикла просмотра - Esc).

\subsection{Перенесение приемов из версии системы, находящейся в
ди\-рек\-тории ALT}

Чтобы переносить приемы ГЕНОЛОГа из одной версии системы в другую,
следует разместить ту версию, приемы которой будут копироваться, в
поддиректории ALT рабочей директории той версии, в которую нужно
скопировать приемы. После запуска последней версии и входа в
просмотр какого - либо ее приема следует нажать клавишу Ctr-а
(кир.). Произойдет переход в просмотр ог\-лав\-ле\-ния приемов
версии из поддиректории ALT. В этой версии следует выбрать
представляющий интерес прием и, войдя в его просмотр, нажать Ctr-о
(кир.). Прои\-зой\-дет возвращение в оглавление приемов основной
версии. Далее нужно войти в тот концевой пункт оглавления, куда
должен быть перенесен прием (или создать новый такой пункт). Войдя
в него, следует нажать Ctr-ъ. Появится описание скопирован\-но\-го
приема. Далее его нужно сохранить обычным образом - нажав клавишу
F4 либо F3.

Имеется также другая возможность перенесения из одной версии в
другую эле\-мен\-тов логической системы - через контейнер, роль
которого играет 12-й ин\-фор\-ма\-ци\-онный блок (файлы $Cijkl$).
Контейнер заполняется в одной версии системы, затем его файлы
переносятся в другую версию, и в ней извлекается их содержимое.

\section{Анализ применений приема на обучаю\-щем ма\-те\-риа\-ле}

Почти любой новый прием, заносимый в решатель, требует уточнений,
выявляемых в процессе прогонки решателя по тем или иным разделам
задачника. Для такой прогонки после ввода приема предпринимается
выбор необходимого раздела в оглав\-ле\-нии задачника и нажатие
Ctr-з в корневом меню данного раздела. По окончании цикла решения
задач данного раздела нажимается клавиша "з" \ и анализируется
статистика процессов решения - так, как об этом говорилось выше в
разделе "Запуск решения задачи и его пошаговый просмотр" \ 4-й
главы. В первую очередь, здесь выявляются задачи, ответ которых
изменился, либо решение которых существенно замедлилось, либо
которые вообще перестали решаться после ввода приема или группы
новых приемов. Каждая такая задача далее анализируется отдельно.
Если была введена либо изменена группа приемов, то с помощью
буфера базы приемов приемы этой группы последовательно отключаются
либо восстанавливаются в своем исходном виде. Это позволяет
выявить конкретного виновника замедления, ошиб\-ки либо отказа.
Далее устанавливается прерывание при входе в найденный таким
образом прием, и на уровне отладчика ЛОСа анализируется его работа
в процессе решения задачи. Для более надежного выявления моментов
срабатывания приема рекомендуется перекомпилировать его, введя в
четвертое окно указатель "стоп" \ - тогда выход в отладчик ЛОСа
будет происходить непосредственно перед ре\-али\-за\-цией
преобразований приема.

На основе рассмотрения выявленных указанным способом особых
случаев сра\-ба\-ты\-вания приемов в группе задач происходит
выработка новых его эвристических решающих правил. Чтобы
впоследствии можно было быстро находить все те задачи задачника, в
которых прием сработал хотя бы однажды (это может понадобиться при
проверке того, что усиление фильтров приема не нарушило процессов
решения таких задач), информация о данных задачах автоматически
сохраняется при запуске очередной прогонки в специальном
информационном блоке - архиве задачника. Впо\-след\-ст\-вии можно
получить список таких задач, расположенных в заданном разделе
задачника, используя следующую процедуру:

\begin{enumerate}

\item Выделить в некотором меню задачника тот пункт, который
вводит в требуе\-мый раздел;

\item Нажать клавишу Shift-2 для перехода в оглавление базы
приемов;

\item Войти в просмотр нужного приема и нажать клавишу "А" \
(кир.);

\item Нажать клавишу Shift-3 для перехода в оглавление задачника;

\item Нажать клавишу "ф" \ для перехода в буфер задачника.

\end{enumerate}

В буфере задачника будет создано новое подменю, заголовок которого
копирует текст концевого пункта базы приемов, к которому относился
прием. В этом подменю размещаются дубликаты указанных выше задач
(регистрируются не более 50 первых задач - в случае большего числа
задач нужно по отдельности анализировать под\-раз\-де\-лы
рассматриваемого раздела). Из просмотра дубликата задачи можно
перейти к просмотру оригинала нажатием клавиши "б". Однако, все
тестовые запуски (в том числе групповой запуск для данного подменю
буфера) можно выполнять не\-по\-сред\-ст\-вен\-но на дубликатах. В
действительности здесь дублируются не сами задачи, а только ссылки
на них из оглавления. Поэтому данные об измененных результатах
решения задачи будут просматриваться одновременно из буфера и из
того раздела оглавления, в котором расположена основная версия
задачи.

При вводе нового приема можно сокращать прогонку по задачнику,
отбирая лишь те задачи, при решении которых возникают логические
символы, необходимые для срабатывания этого приема. Для
организации такой сокращенной прогонки следует применять следующую
процедуру:

\begin{enumerate}

\item Войти в просмотр приема и нажать клавишу "С";

\item Нажать Shift-F3 для перехода в оглавление задачника
(заметим, что в этот момент в буфере задачника будет находиться
пустой подраздел, заголовок ко\-то\-рого копирует текст концевого
пункта базы приемов, содержащего ана\-ли\-зи\-ру\-емый прием; в
этом подразделе при прогонке будут накапливаться дубликаты задач,
в которых прием сработал хотя бы однажды;

\item Выбрать нужный раздел задачника и нажать "З".

\end{enumerate}

Начнется сокращенный цикл решения задач раздела; по окончании его
выпол\-ня\-ет\-ся обычный анализ статистики.

Для оптимизации решателя предусмотрена возможность определения
"холосто\-го хода" \ приема на заданном разделе задачника -
средней трудоемкости попыток при\-ме\-не\-ния приема на одно его
срабатывание. Чтобы получить такую характеристику, следует
запустить цикл решения задач из выбранного раздела задачника не
клавишей Ctr-з, а клавишей "а" \ (кир.). Процесс решения чуть-чуть
замедлится, так как для приемов, в попытки применения которых
система будет входить при решении задач, начнется накопление пар
(суммарная трудоемкость попыток применения приема - число
применений приема). Моментом входа в попытку применить прием здесь
считается прохождение через оператор "контрольприема($\ldots$)",
размещаемый ком\-пи\-ля\-тором в начале программы приема. По
окончании прогонки следует войти в просмотр статистики, где будут
указаны случаи наибольшей средней трудоемкости; нажатием клавиши
"х" \ (кир.) можно перейти в режим просмотра соответствующих
приемов (переход к каждому следующему приему - нажатием "ш"),
упорядоченных по убыванию этой трудоемкости. Чтобы на экран была
выдана пара (суммарная трудоемкость - число применений), при
просмотре приема следует нажать клавишу "Х" (кир.).

Предусмотрена некоторая автоматизация анализа избыточности
применений при\-ема. Чтобы выявить те задачи раздела, где отказ от
приема приводит к ускорению решения, следует прежде всего создать
в буфере задачника список дубликатов задач этого раздела, в
которых прием срабатывает (выбрать раздел задачника; нажать Ctr-2;
выбрать прием; нажать "А" \ (кир.); нажать Ctr-3 для возвращения в
задачник). После этого нажатие клавиши "й" \ инициирует цикл
попыток решить отобран\-ные в буфере задачи без данного приема.
Трудоемкости решения с приемом и без него сравниваются; если
задача быстрее решается без приема, то в оглавлении буфера после
ее номера ставится знак вопроса.

\section{Расширение списка символов, прори\-со\-вы\-ва\-е\-мых фор\-муль\-ным
ре\-дак\-то\-ром}

Чтобы формульный редактор мог прорисовывать тексты задач в
произвольных пред\-метных областях, приходится постоянно пополнять
его словарь. Для упрощения понимания обозначений, названия новых
логических символов переносятся в фор\-мульный редактор без
каких-либо изменений. Однако, это происходит не
ав\-то\-ма\-тически - сначала нужно сопроводить новое понятие $A$
несколькими приемами спра\-воч\-ников формульного редактора. Все
эти приемы создаются по одной и той же теореме - "формредактор($A$
$B_1 \ \ldots \ B_n$)". Здесь $B_1, \ldots, B_n$ - указатели,
уточняющие способ прорисовки. Обязательными являются указатели
"префикс" \ и "логсим\-вол". Они означают, что будет
использоваться запись $A$($t_1 \ldots t_m$), причем заголовок
пред\-ставляет собой текст названия логического символа $A$. Если
операция (отноше\-ние) $A$ многоместное, причем операнды
отделяются запятыми, то вводится указатель ",". Если $A$ -
многоместное, но операнды суть переменные, не разделяемые
запя\-ты\-ми, то вместо этого берется указатель "кортеж". Если $A$
есть символ констан\-ты, то используется указатель "конст".
Наконец, если нужно обеспечить возмож\-ность набора символа двмуя
нажатиями клавиш, то вводится указатель "ключ($K_1 \ K_2$)". Здесь
$K_1, K_2$ - логические символы, кодирующие выбранные клавиши,
причем в латинском регистре. Чтобы при наборе теоремы приема
текстовым редактором ввес\-ти такие символы, нажимается клавиша
F12, переводящая в латинский регистр, затем нажимается F8 (режим
ввода названий кодов клавиш), и далее нажимается требуемая
клавиша. При переходе к очередному $K_i$ повторное нажатие F12 не
тре\-бу\-ет\-ся, но повторное нажатие F8 необходимо. Для
возвращения из латинского ре\-гист\-ра в кириллицу, по окончании
ввода символов $K_i$ нажимается F11.

Если указатель "ключ($\ldots$)" \ отсутствует, то название $A$
придется вводить фор\-муль\-ным редактором через вспомогательное
обращение к текстовому редактору (Ctr-Enter). Это не так удобно,
как ввод названия двумя касаниями, однако приходится учитывать,
что пар клавиш не так уж много, и вводить их лишь для сравнительно
часто используемых понятий.

Как только теорема приема введена и нажата клавиша Enter,
завершающая рабо\-ту текстового редактора, нажимается клавиша "а"
\ (кир.). Она переводит в оглавле\-ние типов приемов. Здесь
следует выбрать первый пункт - "Справочники и сопро\-вождающие их
простейшие приемы". Далее нажимается клавиша "курсор вправо",
после чего на экране появляется автоматически сгенерированный
первый из необ\-хо\-ди\-мых приемов. Для сохранения и компиляции
его нажимаем F3. Для извлечения очередного приема справочника
формульного редактора нажимаем "ш". Затем - снова F3, и так до тех
пор, пока генератор приемов не исчерпает новые приемы.

Если указатель "ключ($\ldots$)" \ не использовался, то на этом
присоединение поня\-тия $A$ к словарю формульного редактора
завершается. В противном случае нужно проверить, не была ли уже
использована предложенная комбинация $K_1, \ K_2$. Для этого в
серии новых приемов находим прием с заголовком "префикс(2)" \ и
переходим к просмотру его программы (клавиша "Home"). Здесь нужно
рассмотреть ту ветвь программы справочника "префикс", к которой
относится текущий фрагмент про\-грам\-мы, чтобы убедиться, что в
ней уже не было другого фрагмента, содержа\-ще\-го оператор
"равно(конец(х1) $K_2$)" \ или эквивалентный ему оператор,
связываю\-щий х1 с $K_2$. Иногда новый и старый фрагменты
оказываются занесены в общую ветвь, идущую после указанного
оператора. Если такой фрагмент был, то сочета\-ние клавиш уже
использовано. Тогда нуж\-но вернуться в редактирование теоремы
прие\-ма (только данного), выбрать другое сочетание клавиш,
перекомпилировать при\-ем, и снова предпринять указанную проверку.

\section{Инициализация пакетных операторов}

Перед тем, как создавать приемы нового пакетного оператора,
необходимо провести определенную подготовительную работу - выбрать
название оператора и создать приемы справочников, описывающих
формат этого оператора. Предусмотрены два способа такой
инициализации оператора - вручную либо с применением
специаль\-но\-го интерфейса.

\subsection{Инициализация оператора вручную}

\subsubsection{Проверочный оператор}

Для ввода нового проверочного оператора необходимо прежде всего
выбрать (либо ввести новый) логический символ - название этого
оператора. Затем вводится прием справочника "легковидеть",
определяющий формат оператора (см. выше подраздел "Приемы
справочников" \ раздела "Типы заголовков приемов"). После ввода
псев\-до\-тео\-ре\-мы справочника "легковидеть" \ рекомендуется
нажать "а", выбрать первый пункт оглавления типов приемов (курсор
вправо), и вводить далее серию приемов, нажимая поочередно F3 и
"ш" \ - пока такие приемы будут появляться. Кроме
спра\-воч\-ни\-ка "легковидеть", будут также введены прием
справочника "очевидно" \ и два простейших приема самого
проверочного оператора - прием "быстрпроверка",
обес\-пе\-чи\-вающий непосредственное обнаружение в контексте
проверяемого утверждения, а также ряд других простейших способов
проверки, и прием "контрольбуфера", предпринимающий попытку
извлечь готовый результат из буфера предыдущих об\-ра\-ще\-ний.

\subsubsection{Синтезатор}

Для ввода нового синтезатора определяется его название, и вводятся
приемы спра\-воч\-ни\-ков "синтезатор" \ и "значения",
определяющие формат синтезатора. После вво\-да псевдотеоремы
справочника "синтезатор" \ рекомендуется нажать "а" \ и выбрать
первый пункт оглавления типов приемов - это приведет к
автоматической генерации приема данного справочника, справочника
"значение" \ и первого приема синтезатора, осуществляющего попытку
извлечь готовый результат из буфера результатов об\-ра\-ще\-ния к
данному синтезатору. Как и в случае проверочных операторов, здесь
последовательно нажимаются F3 и "ш".

\subsubsection{Нормализатор}

Для ввода нового нормализатора выбирается его название и вводится
прием спра\-воч\-ни\-ка "быстрпреобр", определяющий формат
оператора. В случае нормализатора общей стандартизации термов с
заданным заголовком вводятся также приемы спра\-воч\-ников
"нормализатор" \ и "ключ\-опе\-ратора". Как и в предыдущих
случаях, после ввода псевдотеоремы справочника "быстрпреобр" \
рекомендуется нажать "а" \ и ис\-поль\-зовать оглавление типов
приемов - тогда, кроме приема данного справочника, будет также
введен первый фиктивный прием нормализатора, обеспечивающий
сме\-ну текущего уровня его работы (его заголовок - "окончание").
В случае нормали\-за\-то\-ра общей стандартизации нужно не забыть
ввести после этого также приемы справочников "нормализатор",
"ключоператора".

\subsubsection{Анализатор}

Для ввода нового анализатора выбирается его название и вводится
прием справоч\-ни\-ка "анализатор", определяющий формат оператора.
Это делается с помощью ог\-лав\-ле\-ния типов приемов, причем
одновременно создается прием для переключения текущего уровня
анализатора (его заголовок - "внешвывод").

\subsubsection{Оператор фильтра}

Для ввода нового оператора фильтра выбирается его название и
вводятся приемы справочников "блок", "блокпроверок", определяющие
формат оператора.

\subsection{Интерфейс ускоренной инициализации оператора}

Для упрощения процесса создания нового пакетного оператора создан
специаль\-ный интерфейс. Чтобы создать с его помощью оператор,
выбирается тот раздел оглавления базы приемов, из которого будет
сделана ссылка на ветвь данного опе\-ра\-то\-ра. Затем нажимается
клавиша Ctr-п.

После нажатия на экране возникает диалоговый блок для ввода
названия опе\-ра\-то\-ра и выбора его типа. Чтобы ввести название,
предпринимается нажатие левой клавиши мыши внутри верхнего окна
("Название оператора"). Тогда появляется курсор текстового
редактора, с помощью которого и вводится название. Это назва\-ние
может быть либо новым, либо старым, но не использованным ранее в
качестве названия оператора ЛОСа. В случае нового названия оно
сразу же регистрируется в файлах словаря. Если вводится
нормализатор общей стандартизации выражений с заданным заголовком,
то его название можно вообще не вводить, а сразу нажать левую
кнопку мыши в окне "Нормализатор". Иначе - нажатие левой кнопки
мыши в одном из окон "Нормализатор", "Проверочный оператор",
"Синтезатор", "Ана\-ли\-за\-тор", "Оператор фильтра" \
предпринимается после ввода названия. После это\-го нажатия
появляется новый диалоговый блок. В зависимости от типа оператора,
далее выполняются следующие действия:

\begin{enumerate}

\item Нормализатор. Если вводится нормализатор общей
стандартизации выражений с заданным заголовком, то этот заголовок
набирается в левом верехнем окне (предварительно нажимается
клавиша "с" \ либо на этом окне нажимается левая кнопка мыши).
Если набрано название "$\ldots$", то оператор будет называться
"усм$\ldots$". Автоматически устанавливается ряд значений в других
окнах, так что в данном случае сразу можно нажать Enter. Если же
вводимый нормализатор не является нормализатором общей
стандартизации выражений с заданным заголовком, то левое верхнее
окно не заполняется, но уточняются прочие па\-ра\-мет\-ры
оператора (число уровней срабатывания, наличие списка посылок,
использование буфера и т.д. - все эти пункты соответствуют
стандартным эле\-мен\-там из описания формата оператора). Далее
также нажимается Enter.

\item Проверочный оператор. Здесь в верхнем окне вводится
текстовым редактором в скобочной записи вид проверяемого
утверждения. В окне, расположенном ниже, перечисляются формульным
редактором входные переменные из шаб\-ло\-на проверяемого
утверждения, расположенные в том порядке, в котором они будут
располагаться при обращении к оператору. Далее указывается число
уровней срабатывания (обычно больше 1), и нажимается Enter.

\item Синтезатор. В верхнем окне набирается одно или несколько
утверждений, пред\-став\-ляющих собой те условия, которым должны
удовлетворять подбираемые синтезатором выходные значения. Затем в
окнах, расположенных ниже, пе\-ре\-чис\-ляются входные и выходные
переменные, а также указывается число уров\-ней срабатывания.
Нажатия левой клавиши мыши на окнах, указываю\-щих возможные
уточнения типа синтезатора, приводят к появлению либо удалению
знаков "плюс" \ справа от этих окон. По завершении ввода
нажимается Enter.

\item Анализатор. В верхней части экрана расположены друг под
другом 5 пар окон. В левом окне пары указывается уровень
сканирования задачи на исследование, по достижении которого будет
происходить обращение к анализатору; в пра\-вом окне -
максимальный уровень соответствующего обращения к анализатору, по
превышении которого работа анализатора будет прервана. Обычно
указывается не более одной - двух таких пар (например, одна - для
предварительного об\-ра\-ще\-ния, имеющего целью быстро усмотреть
нужные следствия, и другая - для более длительного анализа). По
завершении ввода нажимается Enter.

\item Оператор фильтра. В верхнем окне текстовым редактором
набирается краткое описание смысла входных и выходных переменных
оператора. Оно будет ис\-поль\-зо\-ваться в качестве текста того
пункта оглавления базы приемов, в котором расположатся задающие
формат оператора справочники. Оно же будет вы\-во\-дить\-ся вместо
фиктивной теоремы приема "блок" \ при просмотре приемов оператора.
Далее перечисляются (как термы "вхождение($\ldots$)",
"тип($\ldots$)" \ и т.п.) типы значений входных и выходных
переменных, уточняется тип обращения к оператору, и нажимается
Enter.

\end{enumerate}

По окончании указанных действий будут созданы все необходимые
приемы, ини\-ци\-али\-зи\-рующие работу с оператором, причем эти
приемы автоматически ре\-гис\-три\-руются в новых подпунктах
оглавления приемов, созданных внутри ветви операто\-ра.

\chapter{Примеры записи приемов на ГЕНОЛОГе и упражнения}

Не все приведенные в предыдущих разделах элементы языка ГЕНОЛОГ
исполь\-зу\-ются одинаково часто. Некоторые из них возникали для
весьма специфических случаев, и более подробно о таких элементах
будет сказано во второй книге данной монографии, посвященной опыту
обучения решателей задач. Фактически, эта книга и будет
представлять собой настоящее введение в программирование на
ГЕНОЛОГе. Здесь же, чтобы возникло хотя бы предварительное
представление о стандартах такого программирования, разберем
несколько десятков приемов, записанных на ГЕНОЛОГе, и
проиллюстируем на них ряд наиболее часто встречающихся элемен\-тов
языка.

\section{Примеры записи приемов}

Приводимые в данном разделе примеры имеются в реальной базе
приемов решателя. Рекомендуется при ознакомлении с очередным
приводимым примером приема вой\-ти в просмотр его оригинала в базе
приемов, и находить в этом оригинале те элементы, о которых далее
пойдет речь.


\subsection{Приемы тождественной замены}

Начнем с приема, осуществляющего переход от логарифма произведения
к сумме логарифмов (путь к нему в оглавлении базы приемов -
"Элементарная алгебра", "Логарифмы", "Общая стандартизация
выражений", "Логарифм произведения"). Сразу ясно, что здесь
возможны различные варианты приема - в зависимости от того,
усматриваются ли из контекста знаки сомножителей: случай, когда
усматривается неотрицательность одного сомножителя и произведения
остальных; случай, когда усматривается неположительность одного
сомножителя и произведения остальных; случай, когда при
преобразовании вводятся модули, и т.п. Остановимся лишь на первом
из них. Теорема приема здесь может быть представлена в следующем
виде:

$$\forall_{abc}(0 \le a \ \& \ 0 \le b \rightarrow \log_c(ab) =
\log_ca+\log_cb).$$

Сразу заметим, что в ней опущены условия на область допустимых
значений: $0<c, \neg(c=1), \mbox{число}(a), \mbox{число}(b),
\mbox{число}(c)$. Это - простейшее проявление принципа контекстной
корректности для теорем приемов: отбрасываются проверки тех
усло\-вий, которые, при соблюдении некоторых необременительных
требований на "пра\-вильную" \ постановку задачи и на фактически
допускаемые решающими правила\-ми приемов преобразования,
автоматически будут выполняться в контексте примене\-ния приема.

Заголовок приема определяет направление замены слева направо, т.е.
представ\-ля\-ет собой логический символ "второйтерм" \ (в приемах
замены заголовок указы\-ва\-ет на заменяющий терм равенства либо
эквивалентности).

Первый из фильтров приема - "уровень(1)" \ - определяет уровень
срабатывания приема при сканировании задачи. Ясно, что в
большинстве стандартных ситуаций целесообразно бывает почти сразу
переходить к логарифмам сомножителей, чтобы после приведения
подобных членов добиться упрощения выражения. После такой
стандартизации, на этапе редактирования ответа, можно будет
предпринять об\-рат\-ную свертку в логарифм произведения.
Разумеется, прием можно было бы сделать более избирательным,
блокируя данное преобразование, если оно заведомо ничего не дает.
Впрочем, такие дополнительные фильтры при обучении вводятся лишь
по мере надобности, и на рассматривавшихся задачах для данного
приема не возникли.

Следующий фильтр приема имеет вид "или(не(тип(преобразовать))
посылка ком\-мент(длина))". Он блокирует применение приема для
изменения условия задачи на преобразование, если эта задача уже
имеет комментарий "длина". Такой коммента\-рий вводится после
завершающей обработки преобразуемого терма процедурой
"све\-рт\-ка", обращающейся к пакетным нормализаторам сокращенной
записи - очевидно, на этом этапе развертка логарифма произведения
в сумму логарифмов нецеле\-со\-об\-раз\-на.

Наконец, последний фильтр имеет вид
"не(контекст(подтерм(равно(теквхожд х4\\ )) тип(описать) условие)
не(известно(теквхожд)) известно(х4))". Он блокирует
пре\-об\-разование логарифма в сумму, если этот логарифм содержит
неизвестные и яв\-ля\-ет\-ся левой частью уравнения, правая часть
которого известна. В такой ситуации целесообразнее сразу провести
потенцирование.

Оба антецедента теоремы приема обрабатываются с помощью
проверочных опе\-ра\-то\-ров (именно, "усмменьшеилиравно"). Для
задания такого способа их обработки служит указатель
"блокпроверок(1 2)".

Чтобы предусмотреть случай, когда перед произведением стоит минус,
в прием введен указатель идентификации "заменазнака(минус х1)".
При наличии минуса он будет передан сомножителю х1; проверка
неотрицательности выполняется для модифицированного таким образом
х1.

Наконец, указатель "заменавхождений" \ определяет режим
одновременной замены всех вхождений в задачу данного логарифма (с
контролем возможности усмотрения в контексте замены
неотрицательности сомножителей); указатель "нормализатор" \ -
выделяет прием как выполняющий преобразование общей
стандартизации. Он акти\-ви\-зи\-рует попытку общей стандартизации
надтермов преобразуемого выражения пос\-ле выполнения замены.

Подтермы заменяющего терма приема снабжены указателями
нормализации, обе\-спечивающими их общую стандартизацию. Сам
заменяющий терм $\log_ca+\log_cb$ снаб\-жен нормализатором
"нормплюс"; выражения $\log_ca$,$\log_cb$ - нормализаторами
"норм\-логарифм". Например, если основание логарифма $c$ совпадало
с множителем $b$, то нормализатор "норм\-логарифм" \ заменит
выражение $\log_cc$ на 1, и в качестве за\-ме\-ня\-ющего терма
будет использовано выражение $\log_ca+1$.

\par\medskip

Разобранный только что пример весьма прост; для сравнения приведем
другой, более сложный (хотя далеко не самый сложный из имеющихся в
решателе) прием тождественной замены. Он осуществляет
стандартизацию тригонометрических вы\-ра\-жений с помощью
тождества $(\sin x)^2+(\cos x)^2 =1$. Мы специально используем
здесь обозначение $(\sin x)^2$ вместо $\sin ^2 x$, так как в
формульном редакторе решателя при\-ня\-та именно эта запись.

Прежде всего, предпримем некоторое обобщение данного тождества,
чтобы им можно было пользоваться даже в неявных ситуациях. Первый
шаг обобщения - введение коэффициента $a$ перед слагаемыми левой
части: $a(\sin x)^2 + a(\cos x)^2 = a$. Следующий шаг - учет
возможных множителей в $a$, представляющих степени синуса либо
косинуса $x$. Если такие множители есть, то фактически в задаче
будут усматриваться не вторые, а какие-то другие степени синуса и
косинуса $x$; именно, здесь понадобится теорема вида $m - p = 2 \
\& \ q - n = 2 \rightarrow a(\cos x)^m(\sin x)^n + a(\cos
x)^p(\sin x)^q = a(\cos x)^p(\sin x)^n$. Она получена из
предыдущей выделением в $a$ сомножителей $(\cos x)^p$, $(sin
x)^n$; для остатка множителей снова использована буква $a$. Чтобы
такая обобщенная теорема давала необходимую идентификацию и в
прос\-тей\-шем случае, когда никаких дополнительных множителей
указанного вида в общем коэффициенте не было, придется
использовать указатели приема, объясняющие ком\-пи\-лятору, что
значения $p$ и $n$ могут равняться 0, а соответствующие множители
$(\cos x)^p$, $(\sin x)^n$ - отсутствовать. Следующий шаг
обобщения теоремы - учет случая, когда коэффициенты при слагаемых
различны и применяется частичное исключение квадратов синуса и
косинуса - например, при переходе от $5(\sin x)^2 + 3(\cos x)^2$ к
$2(\sin x)^2 + 3$. Если выделять константу на основе того
численного коэффициента, который меньше по модулю, причем делать
это только в случае совпадения знаков слагаемых, то окончательно
возникает теорема вида:

$m - p = 2 \ \& \ q - n = 2 \ \& \ (0<r \ \& \ 0<s \ \& \
t=\min(r,s) \vee r<0 \ \& \ s<0 \ \& \ t=\max(r,s)) \ \& \ g = r-t
\ \& \ h = s-t \rightarrow ra(\cos x)^m(\sin x)^n + sa(\cos
x)^p(\sin x)^q = ga(\cos x)^m(\sin x)^n + ha(\cos x)^p(\sin x)^q +
ta(\cos x)^p(\sin x)^n$.

Здесь $r,s$ - числовые коэффициенты; $a$ - произведение прочих
общих у рас\-смат\-ри\-ва\-емых слагаемых множителей (если они
есть); $t$ - определяемый в третьем ан\-те\-це\-денте числовой
коэффициент с наименьшим модулем; $g,h$ - остатки числовых
коэффициентов слагаемых после выделения из них $t$. Заметим, что
хотя бы один из этих остатков всегда равен 0, но для упрощения
записи теоремы оба они явно фигурируют в заменяющем выражении.
Применение к данному выражению нор\-ма\-ли\-за\-торов общей
стандартизации сразу же отбросит нулевые слагаемые, и в итоге
заменяющий терм будет выглядеть вполне неизбыточным образом.
Замедление, про\-ис\-те\-ка\-ющее из такого, на первый взгляд не
очень экономного способа вычислений, в действительности
пренебрежимо мало по сравнению с паузами сканирования меж\-ду
применениями приемов. Поэтому исключение разбора случаев за счет
применения заменяющих термов избыточно общего вида, в сочетании с
обработкой их нор\-ма\-ли\-за\-торами, устраняющими в конкретных
случаях всю возможную избыточность - это стандарт программирования
на ГЕНОЛОГе.

Заметим, что в приведенной выше записи для краткости опущен
квантор общ\-нос\-ти по всем переменным, встречающимся в
тождестве. При фактическом вводе теоремы приема наличие такого
квантора является обязательным. В большинстве случаев пропуск в
кванторной приставке нескольких переменных особой роли играть не
будет, однако иногда это может привести к неправильной компиляции
приема (в особенности там, где перед компиляцией выполняется
преобразование теоремы приема - например, в геометрии).

Прием, имеющий теорему указанного выше вида, можно найти в разделе
("Эле\-мен\-тарная алгебра","Тригонометрия", "Синус", "Общая
стандартизация выраже\-ний", "Стандартизация тригонометрических
многочленов с применением тождества $\ldots$"). В концевом пункте
этого раздела расположено несколько приемов (кроме
рас\-смат\-риваемого здесь применения тождества для суммы
квадратов синуса и косинуса, обобщаются также замены вида $1 -
(\cos x)^2 = (\sin x)^2$ и $1 - (\sin x)^2 = (\cos x)^2$, а кроме
того, рассматривается стандартизация с участием четвертых степеней
синуса и косинуса). К нужному нам приему можно перейти, нажимая
клавишу "курсор вниз" \ до последней точки цепи приемов.
Переменные в его теореме обозначены иначе, чем в приведенной выше,
однако в остальном эти теоремы идентичны.

Заголовок приема - "второйтерм"; фильтры - "уровень(1)" \
(тождество при\-ме\-ня\-ется почти сразу же, как только
предоставляется такая возможность); "натураль\-ное($m$)",
"натуральное($n$)", "натуральное($p$)", "натуральное($q$)";
"десчисло($r$)", "дес\-число($s$)". Последние фильтры ограничивают
применение приема лишь теми слу\-ча\-ями, когда показатели
степеней при синусе и косинусе суть десятичные записи натуральных
чисел, а коэффициенты $r,s$ также суть десятичные записи числовых
констант.

Указатель "программа(1 2 3 4 5)" \ означает, что все антецеденты
являются про\-грам\-мно реализуемыми; это возможно из-за того, что
встречающиеся в них пе\-ре\-мен\-ные идентифицированы, согласно
фильтрам, с числовыми константами, и со\-от\-вет\-ству\-ющие
операции вычитания, определения минимума и максимума, а также
проверка неравенств реализуются непосредственно.

Указатели "перечень($r$ десчисло($r$))" \ и "перечень($s$
десчисло($s$))" \ заставляют ком\-пи\-ля\-тор сразу
идентифицировать $r,s$ с произведениями всех числовых множителей
рассматриваемых слагаемых. В действительности, благодаря
предшествующей стан\-дар\-ти\-зации, заключающейся в перемножении
числовых констант, таких множите\-лей может быть не более одного;
при их отсутствии переменная идентифицируется с единицей
рассматриваемой ассоциативно-коммутативной операции, т.е. в данном
слу\-чае с обычной единицей. В принципе, данные указатели здесь не
обязательны - они лишь препятствуют отнесению числовых
коэффициентов к произведению $a$ остальных общих множителей.

Указатели "единица(1 $m$ $n$ $p$ $q$ $r$ $s$ $a$)" \ и
"заменазнака(минус $r$ $s$)" \ определяют возможность вырожденных,
единичных значений степеней и коэффициентов, а также возможность
наличия знаков "минус" \ перед слагаемыми, которые будут отнесены
к числовым коэффициентам.

Указатели "подстановка(фикс(0 1 1 4) $n$ 0)" \ и
"подстановка(фикс(0 1 2 3) $p$ 0)" \ определяют возможность
отсутствия множителей $(\sin x)^n$ и $(\cos x)^p$, причем в этом
случае показатели степени $n,p$ идентифицируются с нулем.

Указатель "пустоеслово($a$)" \ означает, что список оставшихся
общих множителей может быть пустым - он нужен, чтобы компилятор не
вставил проверку непустоты такого списка. Указатель
"пересечениесписков(фикс(0 1 1)фикс(0 1 2))" \ означает, что
заголовки слагаемых (даже после отбрасывания возможных знаков
"минус") не обязательно должны быть символами умножения. При
отсутствии данного указателя компилятор вставил бы проверку
наличия заголовка "умножение" \ несмотря на на\-ли\-чие указателя
"единица($\ldots$)", так как произведения слишком длинны и
автома\-ти\-чес\-кое распознавание возможности вырожденного случая
здесь пока не предусмотрено.

Указатель "титр(набор(1 терм(фикс(0 1 1)фикс(0 1 2))))" \
определяет поясняю\-щий срабатывание приема текст. Шаблон этого
текста можно просмотреть и при необходимости отредактировать,
нажав из просмотра приема клавишу "6". В данном случае появится
следующий текст: "Преобразуем слагаемые () и (), используя
фор\-му\-лу для суммы квадратов синуса и косинуса". Вместо скобок
в него будут вставлены выражения, определяемые указателем, т.е. в
точности рассматриваемые слагаемые - их указатели вхождения в
теорему суть "фикс(0 1 1)" \ и "фикс(0 1 2)".

Нормализаторы приема просматриваем, нажав сначала клавишу "5" \ и
ис\-поль\-зуя для смены нормализатора клавиши PageDown, PageUp
(выход из просмотра - по End). Все подвыражения заменяющей части с
заголовками "степень", "умножение", "плюс", снабжены
нормализаторами общей стандартизации "нормстепень",
"норм\-ум\-но\-же\-ние", "нормплюс". Кроме того, сами
преобразуемые слагаемые также снаб\-же\-ны нормализаторами
"нормумножение". Это сделано для того, чтобы в
со\-про\-вож\-да\-ющий текст подставлялись выражения, у которых
устранены умножения на коэффициенты 1, возникшие при
идентификации.

\subsection{Приемы эквивалентной замены}

Приемы эквивалентной замены обычно используются либо для общей
стандартиза\-ции утверждений, либо для разрешения относительно
неизвестных условий задачи на описание (уравнения, неравенства и
т.п.).

Рассмотрим прием, предназначенный для решения квадратных
уравнений. В ог\-лав\-ле\-нии базы приемов к нему ведет путь
"Элементарная алгебра", "Степени", "Ре\-ше\-ние уравнений",
"Решение квадратного уравнения"; далее нажатиями клавиши "курсор
вниз" \ переходим к последнему приему группы приемов данного
концевого пункта.

При формулировке теоремы приема следует учитывать, что приемы
пред\-ва\-ри\-тель\-ной стандартизации уравнений переводят все
известные слагаемые в пра\-вую часть уравнения, оставляя в левой
части только неизвестные слагаемые. Со\-от\-вет\-ст\-вен\-но,
квадратное уравнение будет иметь вид $ax^2+bx=c$, а не
традиционный вид $ax^2+bx+c=0$. Теорема приема записывается в
следующем виде (для удобства ссылок в ней взяты обозначения
переменных из базы приемов - неизвестная вместо $x$ обозначена
$d$):

\par\medskip

$\forall_{abcde}(e=b^2+4ac\rightarrow ad^2+bd=c\leftrightarrow
(\neg(a=0) \ \& \ 0 \le e \ \& \ (d = \frac{\sqrt e-b}{2a} \vee d
= - \frac{\sqrt e+b}{2a})$

\par\medskip

$ \vee bd=c \ \& \ a=0))$.

\par\medskip

Единственный антецедент теоремы служит для того, чтобы можно было
ввести вспомогательное обозначение $e$ для дискриминанта
трехчлена. Фактически, как будет видно из дальнейшего, он не
только вводит обозначение для дискриминанта, но и вычисляет этот
дискриминант, обращаясь для преобразований его к вспомогатель\-ным
пакетным операторам.

Заголовок приема - "второйтерм". Фильтры "уровень(1 2)",
"условие", "тип(опи\-сать)", "известно($a$)", "известно($b$)",
"известно($c$)", "не(известно($d$))", "корень" \ ука\-зы\-вают,
что прием применяется при сканировании задачи на описание для
известных $a,b,c$ и не известном $d$, причем уровень сканирования
должен быть равен 1 либо 2, а преобразуемое равенство должно иметь
корневое вхождение, т.е. собственно являться уравнением.

Фильтр "альтернатива(неизвестные(2)уровень(1)уровень(2))" \
уточняет, что в за\-да\-чах, имеющих более одной неизвестной,
уровень срабатывания приема равен 1, а в задачах с одной
неизвестной он равен 2. Такого рода фильтры возникают, если в тех
или иных примерах желательно обеспечить опережающее срабатывание
одних приемов и отложить срабатывание других. Они имеют сугубо
эвристический характер и могут при последующем обучении
многократно изменяться или отбрасываться - если локаль\-ные
"конфликты" \ между приемами, из-за которых эти фильтры
воз\-ник\-ли, были устранены другими методами.

Последние два фильтра -
"или(равно(числонеизвестных(корень)1)не(контекст(ус\-ловие(х6)заголовок(х6
целое натуральное)первыйсимвол(х6 х7)неизвестная(х7)вхо\-дит(х7
$d$))))" \ и "не(контекст(ключ(цели связка х6)пересекаются(х6
$d$)))" \ - отсекают случаи уравнений, решаемых средствами других
разделов. В первом из них бло\-ки\-ру\-ет\-ся применение формулы
корней квадратного уравнения для уравнения в целых числах,
имеющего более одной неизвестной; во втором - применение этой
формулы при рассмотрении дифференциального уравнения (для решения
дифференциальных уравнений, не разрешенных явно относительно
производной, используется спе\-ци\-аль\-ный прием, который
обозначает производную новой переменной - неизвестной,
относительно которой и выполняется разрешение в рамках некоторой
вспо\-мо\-га\-тель\-ной задачи). Такие фильтры возникают по мере
того, как обучение реша\-те\-ля рас\-про\-стра\-няется на новые
разделы. Часто при этом бывает нужна некоторая рас\-чист\-ка для
блокировки срабатываний ненужных приемов из ранее
рассматривав\-ших\-ся разделов; обычно для нее бывает достаточно
рассмотрения нескольких пер\-вых примеров.

Указатель "идентификатор(1)" \ определяет, что первый антецедент
теоремы ис\-поль\-зуется для ввода вспомогательного обозначения
$e$. Указатели "единица(1 $a$ $b$)" \ и "заменазнака(минус $a$
$b$)" \ определяют, что коэффициенты $a,b$ могут принимать
вырожденное значение 1 и что минус перед соответствующими членами
передается данным коэффициентам.

Наконец, указатель "примечание(условие(меньше(1
число(условие(х6)заголовок(\\ х6 равно)))разборслучаев))" \ вводит
комментарий "разборслучаев" \ к преобразо\-ван\-но\-му уравнению,
учитывая свозможность, что оно после преобразования может
ока\-зать\-ся дизъюнкцией, если число уравнений в задаче больше
одного. Такой ком\-мен\-та\-рий форсирует разбор случаев по данной
дизъюнкции - для предотвращения возникновения новых дизъюнкций,
которые могли бы появиться при независимом преобразовании
остальных уравнений.

Перечислим нормализаторы приема. Для вычисления дискриминанта
исполь\-зу\-ет\-ся цепочка обращений к нормализаторам "нормплюс",
"стандплюс", "видумноже\-ние". Первый предпринимает общую
стандартизацию сумм; второй выполняет рас\-кры\-вание скобок;
последний - пытается разложить дискриминант на множители, чтобы
впоследствии упростить извлечение из него квадратного корня.
Утвержде\-ние $a=0$ из заменяющей части обрабатываемого
нормализатором "нормусм" \ (этот нормализатор предпринимает
попытку усмотрения истинности либо ложности
об\-ра\-ба\-ты\-ваемого им утверждения путем применения
проверочного оператора, и в слу\-чае удачи заменяет данное
утверждение на логическую константу "истина" \ либо "ложь"), а
также нормализатором "нормчисло" \ (он служит для простейшей
стан\-дар\-ти\-зации числовых равенств). Если удается усмотреть
истинность либо ложность утверждения $a=0$, то в заменяющей части
вместо него сразу же вводится со\-от\-вет\-ству\-ющая логическая
константа.

Аналогично, утверждение $0 \le e$ из заменяющей части
преобразуется нор\-ма\-ли\-за\-торами "нормусм" \ и
"нормменьшеилиравно" \ (простейшая стандартизация нестро\-гих
неравенств). Если его истинность либо ложность очевидна, то вместо
него сразу же будет подставлена логическая константа. При
обращении к указанным нор\-ма\-ли\-за\-то\-рам вводится
дополнительная посылка $\neg(a=0)$.

При преобразовании квадратного корня из дискриминанта используются
нор\-ма\-ли\-за\-торы "нормстепень" \ и "сбросмодуля". Последний
нормализатор отбра\-сы\-ва\-ет модули у сомножителей
преобразуемого им выражения - в данной ситуации модуль не нужен,
так как все равно при определении корней берутся два значения
корня из дискриминанта, отличающиеся знаком. При обращении к
нормализаторам вводится дополнительная посылка $0 \le e$.

Выделим, далее, цепочки "нормплюс", "видумножение", "посылки($0
\le e$)", ис\-поль\-зу\-емые для разложения на множители
числителей $\sqrt e - b$, $\sqrt e + b$, а также нормализатор
"видумножение", обеспечивающий разложение на множители
ко\-эф\-фи\-ци\-ента $a$. Наконец, заметим, что ко всему
заменяющему терму применяется нор\-ма\-ли\-за\-тор "нормлог",
обеспечивающий общелогическую чистку утверждения, в част\-нос\-ти,
устраняющий содержащиеся в нем логические константы.

\par\medskip

Следующий пример приема эквивалентной замены - интегрирование
диф\-фе\-рен\-циального уравнения с разделяющимися переменными.
Этот прием может быть най\-ден в разделе ("Дифференциальные
уравнения", "Уравнения первого порядка", \\ "Уравнение с
разделяющимися переменными", "Интегрирование уравнения с
раз\-де\-ля\-ющимися переменными"). Берется последний прием из
группы приемов дан\-но\-го концевого пункта - переход к нему
осуществляется путем нажатий клавиши "курсор вниз". Напомним, что
дифференциальное уравнение с одной неизвестной записывается как
равенство с производными и формально представляет собой усло\-вие
не на саму неизвестную функцию $y$, а лишь на значения ее и
производных в некоторой "текущей" \ точке $x$. Более аккуратная в
логическом отношении запись потребовала бы ввода явного
обозначения для функций, определяемых левой и пра\-вой частями
равенства, и оказалась бы более громоздкой и непривычной. Поэтому
в логическом языке решателя (как и в обычной практике) здесь
применяется кон\-текст\-ная семантика: равенство для значений в
точке $x$ в действительности понимается по умолчанию, как
равенство для функций, причем такое понимание определяется
специальной целевой установкой задачи - наличием цели (связка $x_1
\ldots x_n$), пере\-чис\-ля\-ющей все аргументы неизвестных
функций, встречающихся в условиях задачи. Эта цель является как бы
вынесенной за скобки логической конструкцией, свя\-зы\-ва\-ющей
встречающиеся в задаче переменные $x_1, \ldots x_n$. Учитывая
такое соглашение о записи дифференциальных уравнений в условиях
задачи, для решения диф\-фе\-рен\-ци\-аль\-ного уравнения с
разделяющимися переменными, приведенного предваритель\-ной
стандартизацией к виду
$$a(x)b(y(x))\frac{dy(x)}{dx}+c(x)e(y(x))=0,$$
будем иметь следующую теорему приема:
$$\begin{array}{l}
\forall_{abcexyhv}(\int \frac{b(z)}{e(z)}dz =
\lambda_z(h(z),\mbox{число}(z)) \ \& \ \int \frac{c(x)}{a(x)}dx =
\lambda_x(v(x),\mbox{число}(x))\rightarrow \par\medskip \\
a(x)b(y(x)) \frac{dy(x)}{dx} + c(x)e(y(x)) = 0 \leftrightarrow
\exists_p(\mbox{число}(p) \ \& \ h(y(x))= -v(x)+p) \par\medskip \\
\ \& \ \neg(e(y(x))=0) \vee e(y(x))=0 \ \& \
a(x)b(y(x))\frac{dy(x)}{dx} = 0 \ \& \
\mbox{число}(\frac{dy(x)}{dx})).
\end{array}$$

Первый и второй антецеденты теоремы будут определять вычисление
со\-от\-вет\-ству\-ю\-щих интегралов; возникающие после
интегрирования функции $h(z)$ и $v(x)$ (где вспомогательная
переменная $z$ введена на период интегрирования вместо $y(x)$)
ис\-поль\-зу\-ются для описания параметрического семейства решений
с произвольной по\-сто\-ян\-ной $p$. Особо учтен подслучай
обращения в 0 второго слагаемого, причем ут\-вер\-жде\-ние
"$\mbox{число}(dy(x)/dx)$" из этого подслучая введено как
эквивалент условия диф\-фе\-рен\-ци\-руемости функции $y(x)$ в тех
точках, где она рас\-смат\-ри\-вается.

Заголовок приема - "второйтерм". Фильтры "условие(2)", "условие",
"тип(опи\-сать)", "корень", "неизвестная($y$)" \ означают, что
прием срабатывает на втором уров\-не сканирования (сразу после
простейшей стандартизации уравнения), причем пре\-об\-ра\-зуется
условие задачи на описание, у которого $y$ - неизвестная функция.
Фильтры "известно(фикс(0 1 1 1 1))", "известно(фикс(0 1 1 2 1))" \
означают, что выраже\-ния $a(x)$, $c(x)$ не содержат неизвестных.

Указатель "идентификатор(1 2)" \ определяет рассмотрение первого и
второго ан\-те\-це\-ден\-тов как равенств, определяющих значения
вспомогательных выражений. В каждом из них изначально
идентифицированы все переменные левой части; эта часть будет
сформирована и обработана сопровождающими ее нормализаторами (они
и вычислят интегралы). Затем полученное выражение будет
идентифицироваться с правой частью равенства, что и позволит
получить $h(z)$,$v(x)$ для дальнейшего их использования.

Указатель "отображение($a$ $b$ $c$ $e$ $h$ $v$)" \ означает, что
для перечисленных в нем переменных $Y$ выражения $Y(X)$ - в
скобочной записи они выглядят как "значение($Y$ $X$)" \ - будут
идентифицироваться с произвольными выражениями. При отсутствии
данного указателя $Y(X)$ идентифицировалось бы только с выражением
вида "зна\-че\-ние($\ldots$)".

Указатель "примечание(серия)" \ сопровождает преобразованное
уравнение ком\-мен\-та\-рием "серия", означающим, что возникший в
нем квантор существования дает параметрическое описание ответа.

Указатели "перечень($b$ не(известно($b$)))", "перечень($e$
не(известно($e$)))" \ опре\-де\-ля\-ют идентификацию $b(y(x))$,
$e(y(x))$ со всеми содержащими неизвестные множите\-ля\-ми
соответствующих слагаемых. Указатели, определяющие выделение
указанных в те\-о\-ре\-ме двух слагаемых путем группировки всех
членов суммы, имеющих производную, и всех членов, имеющих
множителем неизвестную функцию, отсутствуют, так как эти
группировки заблаговременно осуществляются другими приемами.

Указатели "единица(1 $a$ $b$ $c$)" \ и "заменазнака(минус $a$
$c$)" \ означают возмож\-ность вырожденных значений 1 для $a(x)$,
$b(y(x))$, $c(x)$, а также передачу знаков "минус" \ перед
слагаемыми выражениям $a(x)$,$c(x)$.

Указатели "новаргумент($b$ $x$ фикс)", "новаргумент($e$ $x$ фикс)"
\ определяют способ идентификации $e(y(x))$, $b(y(x))$. Перед
идентификацией этих выражений пере\-мен\-ные $y,x$ должны быть уже
идентифицированы. Компилятор создает обращение к про\-це\-ду\-ре
"новаргумент", проверяющей, что вхождения переменной $x$ внутри
иден\-ти\-фи\-ци\-руемых с $e(y(x))$, $b(y(x))$ выражений
расположены только внутри $y(x)$. Все такие вхождения выделяются,
и при формировании $b(z),e(z)$ вместо них будет подстав\-ле\-на
новая переменная $z$. То, что эта переменная - новая, следует
пояснить компилятору отдельно, что и делает указатель
"новаяпеременная($z$)". Логический символ "фикс" \ в приведенных
выше указателях введен, чтобы показать, что идентифици\-ру\-е\-мые
выражения не подвергаются предварительной обработке
нормализаторами, ори\-ен\-ти\-ро\-ванными на приведение всех
подвыражений с $x$ к виду $y(x)$ - очевидно, здесь это излишне.

Указатель "конец(1 2)" \ отодвигает на конец трудоемкую обработку
первого и второго антецедентов (т.е. фактически интегрирование
уравнения) до того, как бу\-дут проверены все остальные условия
срабатывания приема.

Наконец, указатель
"удалениеусловия(число(производная(отображение(х4 чис\-ло(\\
х4)значение($y$ х4))$x$)))" \ удаляет из списка условий
утверждение о существовании производной $dy(x)/dx$, которое после
интегрирования уравнения не нужно.

Оба интеграла из антецедентов снабжены нормализатором
"нормИнтеграл". Это - чрезвычайно большой пакетный нормализатор,
осуществляющий в решателе фор\-маль\-ное интегрирование. Перед
обращением к нему подынтегральные выраже\-ния обрабатываются
нормализатором "упрощинтеграл", выполняющим некоторые
не\-слож\-ные предварительные преобразования. Этому нормализатору
передается ком\-мен\-тарий (переменная $X$), указывающий
переменную интегрирования $X$. Для пред\-ва\-ри\-тельного
упрощения параметрического описания, возникающего после
ин\-те\-гри\-ро\-вания уравнения, применен нормализатор
"уравндифф". Впрочем, и нор\-ма\-ли\-за\-тор "упрощинтеграл", и
нормализатор "уравндифф" \ - очень маленькие, поч\-ти вырожденные
пакеты, которые при последующем развитии системы, возможно,
бу\-дут отброшены. Прочие используемые в приеме нормализаторы
осуществляют об\-щую стандартизацию подтермов заменяющего терма.

\subsection{Приемы вывода в посылках задачи}

Рассмотрим один из простейших приемов вывода, связанный с
прямоугольным тре\-уголь\-ником, у которого проведена высота к
гипотенузе (см. в оглавлении базы при\-емов путь "Элементарная
геометрия", "Фигуры", "Треугольник", "Прямоугольный треугольник",
"Высота прямоугольного треугольника, проведенная из прямого угла",
"Соотношение для длин катета, гипотенузы и отрезка гипотенузы
между основанием высоты и вершиной треугольника"). В этом случае
прием уже снабжается чертежом:

\begin{picture}(500,90)

\put(120,5){\line(0,1){60}} \put(120,5){\line(1,0){120}}
\put(240,5){\line(-2,1){120}}\put(120,5){\line(1,2){24}}
\put(110,5){A} \put(110,65){B} \put(147,57){D} \put(243,5){C}

\end{picture}

Теорема приема имеет вид:

\par\medskip

$\forall_{ABCD}(\mbox{прямая}(AB) \bot \mbox{прямая}(AC) \ \& \ D
\in \mbox{прямая}(BC) \ \& \ \mbox{прямая}(AD) \bot
\mbox{прямая}(\\ BC) \rightarrow l(BD)\cdot l(BC) = (l(AB))^2)$.

Прием имеет заголовок "вывод"; он позволяет в тех случаях, когда
длины от\-рез\-ков $BD$,$BC$,$AB$ уже введены в рассмотрение либо
их ввод в рассмотрение пред\-став\-ля\-ет\-ся целесообразным,
присоединить к посылкам задачи связывающее эти длины соотношение,
указанное в теореме.

Фильтр "уровень(5 7)" \ определяет два возможных уровня
срабатывания приема - пятый и седьмой. Хотя один из последующих
фильтров уточняет, в каких случаях срабатывание на пятом уровне
нецелесообразно, но он сравнительно слабый, и ос\-та\-ет\-ся
достаточно много ситуаций, при которых срабатывание возможно как
на пятом, так и на седьмом уровнях. Такая избыточность иногда
создается в приемах вывода, чтобы срабатывание было возможным,
даже если необходимые для него посылки появляются в задаче не
сразу, а лишь на достаточно высоких уровнях сканирования.
Напомним, что другая возможность обеспечить срабатывание приема
после появления недостававших ранее посылок - уменьшить вес его
"опорной" \ по\-сыл\-ки тем приемом, который ввел представляющую
интерес для ее пересмотра ин\-фор\-ма\-цию.

Фильтры "посылка" \ и "или(тип(доказать)тип(исследовать))" \
встречаются прак\-ти\-чес\-ки во всех геометрических приемах, так
как обычно геометрические задачи на вычисление решаются путем
вывода следствий в посылках их блока анализа. Иног\-да здесь
добавляется возможность срабатывания в посылках задач на
преобразование, что бывает нужно для задач на нахождение
геометрических мест точек.

Фильтры "не(равно($D$ $B$))" \ и "не(равно($D$ $C$))" \
представляют собой ускорители отсечения: они позволяют в процессе
идентификации сразу отбрасывать положения точки $D$, совпадающие с
$B$ и $C$, не выполняя в этих случаях дальнейших проверок. Опыт
показывает, что отсутствие в геометрическом приеме фильтров,
отсекающих вырожденные положения точек, может существенно
замедлить работу решателя, так как прием начнет при сканировании
задачи предпринимать повсюду множество бессмысленных проверок.
Поэтому они обычно вводятся еще до оптимизации приема на примерах.

Фильтры "усм(актив(расстояние($A$ $B$)))",
"усм(актив(расстояние($B$ $C$)))", "усм(\\ актив(расстояние($D$
х5)))" \ означают, что в посылках задачи должны встречаться
расстояния $l(BC)$,$l(AB)$, а также расстояние от точки $D$ до
какой-либо другой точ\-ки. Эти фильтры обрабатываются
идентифицирующими операторами - ввод фильт\-ра "усм($F$)" \
эквивалентен присоединению $F$ к списку антецедентов теоремы
приема и указанию на обработку этого антецедента идентифицирующим
оператором. Фильтры вида "усм($\ldots$)", кроме ввода определенных
ограничений на срабатывание приема, играют роль ускорителей
идентификации, так как позволяют переходить от одного объекта к
другому с использованием буферов идентифицирующих операторов -
фак\-ти\-чески это эквивалентно применению сетевого представления.
Так, фильтр "усм(ак\-тив(расстояние($A$ $B$)))", если бы точка $A$
была уже идентифицирована, а $B$ - еще нет, позволил бы искать
последнюю лишь среди тех точек, для которых явно введено в
рассмотрение их расстояние до точки $A$.

Ввод в рассмотрение расстояний $l(AB)$,$l(BC)$ должен быть
обеспечен до попытки применения данного приема; впрочем, можно
создавать несколько различных версий одного и того же приема,
имеющих различную фильтрацию и срабатывающих на различных уровнях.
Одна из такиз версий данного приема (с уровнем срабаты\-ва\-ния
13) приведена в том же концевом пункте оглавления базы приемов,
что и описываемый прием.

Фильтры "конец(или(известно(терм(расстояние($A$$B$)))
Неизв(терм(расстояние($A$\\ $B$)))))" \ и
"конец(или(известно(терм(расстояние($B$$C$)))
Неизв(терм(расстояние( $B$$C$)\\ ))))" \ означают, что каждое из
расстояний $l(AB)$,$l(BC)$, после обработки нормали\-за\-то\-ром
"нормрасстояние", должно быть либо выражено термом без
неизвестных, либо представлять интерес для определения неизвестных
внешней задачи на описание. Последнее условие выражается при
помощи фильтра "Неизв($\ldots$)" \ (как в данном случае), либо при
помощи фильтра "неизв($\ldots$)", накладывающего несколько более
сильные требования и применяемого чаще, чем "Неизв". Каждый из
этих фильтров прослеживает цепочку равенств в посылках задачи,
начинающуюся равенством, со\-дер\-жащим заданное выражение, и
заканчивающуюся равенством, содержащим не\-из\-вестные внешней
задачи на описание; связи между равенствами в такой цепочке - по
вхождению общего выражения вида "расстояние($\ldots$)" \ либо
"угол($\ldots$)". Подробнее - см. описания операторов
"Неизв($\ldots$)", "неизв($\ldots$)". Указатели "конец($\ldots$)"
\ в при\-ве\-ден\-ных выше фильтрах отодвигают их проверку на
конец программы приема - чтобы сравнительно трудоемкие процедуры
определения нормализованных расстояний при\-ме\-ня\-лись лишь
после установления необходимой конфигурации чертежа.

Фильтр "конец(не(равно(терм(расстояние($A$$B$))
терм(расстояние($A$$C$)))))" \ ука\-зы\-ва\-ет, что треугольник
$ABC$ не должен быть равнобедренным - иначе вводимое при\-е\-мом
соотношение дублирует соотношения, вводимые другими, более
простыми при\-е\-ма\-ми.

Следующие два фильтра -
"конец(или(известно(терм(расстояние($A$$B$)))
из\-вест\-но(терм(расстояние($C$$D$)))
Неизв(терм(расстояние($C$$D$))) комментпосылок(тре\-у\-го\-ль\-ник
степень треугольник($A$$B$$C$))))" \ и "или(уровень(7)
комментпосылок(треугольник степень треугольник($A$$B$$C$))
внешнеизв(терм(расстояние($A$$B$)))
известно(терм(рас\-сто\-я\-ние($A$$B$)))меньше(число(разряд(результат
расстояние х6))2))" \ - возникли при попытке несколько ограничить
применение данного приема, если для рас\-смат\-ри\-ва\-емого
прямоугольного треугольника уже выписывалось соотношение теоремы
Пи\-фа\-го\-ра. Ввод этого соотношения сопровождается добавлением
комментария "тре\-у\-голь\-ник степень треугольник($A$$B$$C$)" \ к
посылкам задачи. Оба фильтра чисто эв\-ри\-сти\-ческие;
формулировки их извлечены из сравнения двух классов задач, в одном
из которых срабатывание приема было необходимым, а в другом -
избыточным.

Наконец, последний фильтр "не(известно(результат))" \ - блокирует
выписывание соотношения, если все его переменные суть известные
параметры задачи.

Указатели приема суть "усм(1 2 3)" \ и "теквхожд(1)"; они
определяют приме\-не\-ние идентифицирующих операторов для
обработки антецедентов теоремы. Активизация приема начинается с
усмотрения в посылках задачи некоторого утверждения о
пер\-пен\-ди\-ку\-лярности, отправляясь от которого программа
приема и идентифици\-ру\-ет первый антецедент.

\par\bigskip

В качестве следующего примера вывода в посылках рассмотрим
геометричес\-кий прием, выполняющий простейшее дополнительное
построение - проведение высоты в треугольнике. Собственно говоря,
имеется много различных приемов, выполняющих именно это действие -
каждый применяется в некоторой своей специфической си\-ту\-а\-ции.
Мы выберем одну из наименее громоздких версий - лежащую в разделе
("Элементарная геометрия", "Фигуры", "Треугольник", "Отрезок,
соединяющий вер\-ши\-ну треугольника с точкой на противоположной
стороне или на ее продолжении", "Высоты треугольника", "Проведение
высоты в треугольнике"). В данном разделе находится два приема;
берем последний, переходя к нему при необходимости нажа\-ти\-ем
клавиши "курсор вниз". Чертеж приема несложен:

\begin{picture}(600,100)

\put(100,5){\line(1,0){213}} \put(100,5){\line(2,1){160}}
\put(260,5){\line(0,1){80}}\put(260,85){\line(2,-3){54}}
\put(90,5){A} \put(266,12){D} \put(263,90){B} \put(320,5){C}

\end{picture}

Теорема этого приема - один из возможных примеров используемых в
ГЕНО\-ЛО\-Ге псевдотеорем:

\par\medskip

$\forall_{ABCD}(\mbox{актив}(l(AB)) \ \& \ \mbox{актив}(l(BC)) \
\& \ \mbox{актив}(l(AC))\rightarrow \mbox{точка}(D) \ \& \ D \in
\mbox{прямая}(\\ AC) \ \& \ \mbox{прямая}(BD) \bot
\mbox{прямая}(AC) \ \& \ \mbox{актив}(l(BD)))$.

\par\medskip

Она не является формулировкой какого - либо свойства
геометрических кон\-фи\-гу\-ра\-ций, а лишь определяет ту
ситуацию, в которой нужно выполнить дополнительное построение (это
делают антецеденты теоремы приема) и перечисляет те
утверж\-де\-ния (в консеквенте), занесение которых в список
посылок означает выполнение построения. Как и обычно, фильтры
приема накладывают ряд дополнительных ус\-ло\-вий на ситуацию, в
которой это построение будет делаться.

Антецеденты теоремы означают, что к моменту применения приема
расстояния $l(AB)$, $l(BC)$, $l(AC)$ уже должны в явном виде
упоминаться в посылках задачи. В геометрии такое упоминание
расстояний, углов и площадей приводит к немедленному срабатыванию
приемов, регистрирующих их в посылках вида "актив($X$)", где $X$ -
данное расстояние, угол, площадь, и т.п.

Консеквент теоремы представляет собой конъюнкцию утверждений о
новой точ\-ке $D$ - основании высоты, проводимой приемом. Здесь
указывается, что новый объект $D$ представляет собой точку,
лежащую на прямой $AC$, что прямые $BD$ и $AC$
пер\-пен\-ди\-ку\-лярны, и что расстояние $l(BD)$ - длина высоты -
далее рассматривается как представляющее интерес.

Заголовок приема - "вывод". Фильтры "уровень(8)", "посылка",
"или(тип(до\-ка\-зать)тип(исследовать))" \ - стандартные для
планиметрии.

Следующий фильтр - "контекст(усм(принадлежит(х5 отрезок($A$$B$))
принад\-ле\-жит\\ (х6 отрезок($A$$C$)) перпендикулярно(прямая(х5
х6)прямая($A$$C$)) актив(расстояние(х5 х6))) не(равно(х5 $A$))
не(равно(х5 х6)) не(равно(х5 $C$)))" \ - раскрывает подлин\-ную
мотивировку срабатывания приема: на одной из сторон $AB$,$BC$ уже
имеется точка, из которой опущен перпендикуляр на сторону $AC$,
причем длина этого перпендикуляра явно упоминается в посылках.
Разумеется, это обстоятельство делает данное до\-пол\-ни\-тельное
построение гораздо более объяснимым.

Фильтр "не(контекст(усм(перпендикулярно(прямая(х7
$B$)прямая($A$$C$)))))" \ оз\-на\-ча\-ет отсутствие ранее
проведенного перпендикуляра к прямой $AC$, проходящего через точку
$B$ - он необходим, чтобы прием не начал бесконечный процесс ввода
все новых и новых обозначений для основания такого перпендикуляра.

Фильтр "конец(или(контекст(усм(равно(расстояние($A$$B$)
расстояние($B$$C$)))) не(\\ контекст(список(х5
терм(расстояние($A$$B$)) терм(расстояние($B$$C$)))
не(известно(х5))\\ ))))" \ требует, чтобы либо треугольник $ABC$
был равнобедренным, с вершиной $B$, либо чтобы расстояния
$l(AB),l(BC)$ уже были вычислены. В этих случаях попыт\-ки связать
с помощью теоремы Пифагора длины сто\-рон треугольника и длину
высоты $l(BD)$, ради которых и введен прием, становятся достаточно
осмыслен\-ны\-ми.

Указатель "усм(1 2)" \ определяет обработку первого и второго
антецедентов с помощью идентифицирующих операторов; точка
инициализации приема при ска\-ни\-ро\-вании задачи - третий
антецедент. Он дает точки $A$ и $C$, а точка $B$ далее извлекается
из пересечения множеств точек, для которых выделены расстояния их
до $A$ и $C$.

Указатель "новыйсимвол($D$ фикс(0 1)фикс(0 2)фикс(0 3))" \
означает, что для $D$ выбирается новая переменная, а в посылки
внешней задачи на описание передаются утверждения "точка($D$)",
"$D \in \mbox{прямая}(AC)$", "$\mbox{прямая}(BD)\bot
\mbox{прямая}(AC)$".

Указатели "новаяпосылка(х5 контекст(вид(х5 принадлежит(х6
отрезок(х7 $B$))))\\ 2)", "новаяпосылка(х5 контекст(вид(х5
актив(расстояние(х6 х7)))усм(принадлежит\\ (х6 прямая($A$
$C$))))3)" \ определяют переключение внимания после проведения
вы\-со\-ты: веса посылок, указывающих принадлежность точки отрезку
с концом в $B$, уменьшаются до 2, а веса посылок, выделяющих
расстояния до точек прямой $AC$, уменьшаются до 3. Такие указатели
вводятся по мере надобности в процессе про\-гон\-ки решателя по
задачнику - там, где указанное переключение внимания было
совершенно необходимо для решения задачи либо позволяло
существенно его ус\-ко\-рить. По существу, пока они представляют
собой лишь обучающий материал для анализа подходов к
автоматическому созданию в приемах средств переключения внимания.
Однако, даже при накоплении их по указанному выше принципу (в
общем, укладывающемуся в рамки концепции обучения методом
"поощрений и наказаний"), решатель достаточно часто начинает
замечать новые возможности, возника\-ю\-щие после срабатываний
приемов.

Указатели "перпендикулярно($D$ $B$ $A$ $C$)" \ и "отрезок($B$
$D$)" \ определяют по\-пол\-не\-ние чертежа; первый из них вводит
на чертеже точку $D$ как основание пер\-пен\-ди\-ку\-ля\-ра,
опущенного из $B$ на $AC$, второй - соединяет $B$ с $D$ отрезком.

\par\bigskip

Следующий пример - тоже геометрический. Он связан с ситуациями, в
кото\-рых вводится численный параметр, обозначающий некоторую
характеристику чертежа - расстояние, угол, и т.п. Такой параметр
нужен лишь для промежуточных вычислений и в ответ включаться не
будет. Однако, если временно рассматривать его как из\-вест\-ную
величину, то будет инициировано срабатывание многих полезных
приемов, и шансы найти ответ задачи, в котором вспомогательные
параметры, "сократившись" \ так или иначе, не встретятся,
существенно возрастут.

Рассматриваемый прием вводит обозначение для длины катета
прямоугольного треугольника, если нужно определить угол такого
треугольника. Он расположен в оглавлении базы приемов по адресу
("Элементарная геометрия", "Перпенди\-ку\-ляр\-но", "Ввод
вспомогательного параметра - длины перпендикуляра, опущенного из
точки на прямую"); как и ранее, берется последний прием из
концевого списка, к кото\-ро\-му переходим, нажимая клавишу
"Курсор вниз" \ до прекращения изменений на экране.

Чертежа этот прием не имеет - ввиду простоты ситуации его
применения. Тео\-ре\-ма приема имеет вид:

$\forall_{ABCab}(\angle(ABC)=a \ \& \ \mbox{прямая}(AB)\bot
\mbox{прямая}(AC)\rightarrow b=l(AB))$.

Заголовок приема - "вывод". Фильтры "уровень(6)",
"тип(исследовать)", "цель(\\ известно)" \ определяют срабатывание
его на сравнительно большом (шестом) уров\-не в задаче на
исследование.

Фильтр "внешнеизв($a$)" \ означает, что выражение $a$ не известно,
и все входящие в него неизвестные являются теми неизвестными
внешней задачи на описание, которые следует вычислить. В
частности, в $a$ не могут входить обозначения точек чертежа -
обычно все эти обозначения суть неизвестные задачи на исследование
и одновременно рассматриваются как известные во внешней задаче на
описание, ибо входят в ее посылки. Данный фильтр указывает, что
вычисление угла $ABC$ в текущем контексте представляет интерес.
Ясно, что для определения угла достаточно знать лишь
от\-но\-ше\-ние длин катетов, и поэтому временное рассмотрение
длины $l(AB)$ одного из них, как известной, в рассматриваемой
задаче перспективно.

Фильтр "контекст(посылка(х3)заголовок(х3 равно)вхождениетерма(х3
терм(рас\-сто\-яние($A$$B$))х4)не(контекст(операнд(х5 х4)символ(х5
равно))))" \ означает, что рас\-стояние $l(AB)$, для которого
вводится вспомогательное обозначение, до этого уже было введено в
рассмотрение в некотором равенстве, связывающем между собой
параметры чертежа, причем это равенство не было явно разрешено
относительно $l(AB)$.

Фильтр "не(контекст(равно(х3 терм(расстояние($A$$B$)))
или(известно(х3)внешне\-изв(х3))))" \ отбрасывает действие приема,
как заведомо бессмысленное, если рас\-сто\-яние $l(AB)$ либо уже
вычислено, либо выражено только через те неизвест\-ные, которые
суть вычисляемые во внешней задаче параметры. В этих случаях
необхо\-ди\-мая инициализация приемов будет выполняться и без
ввода специального обозна\-че\-ния для данного расстояния.

Фильтр "не(контекст(посылка(х3) вид(х3 равно(х4
расстояние($A$$B$))) пере\-мен\-ная(х4)))" \ блокирует ввод
обозначения, если рассматриваемое расстояние уже равно некоторой
переменной. Фильтр "не(Входит(вспомпараметр комментариипосылок))"
\ блокирует применение приема, если до этого уже был введен
какой-либо вспо\-мо\-га\-тель\-ный числовой параметр. Возможно,
это и чересчур жесткое ограничение - вполне можно представить себе
задачу, в которой нужно ввести несколько вспомогательных числовых
параметров. В общем-то, некоторые из приемов решателя, вводящих
такие параметры, лишены этого ограничителя, и при дальнейшем
обучении может по\-на\-до\-бить\-ся несколько ослабить его и в
данном приеме, однако пока такой надобности не возникало.

Фильтры "усм(актив(прямая($A$$B$)))" \ и
"усм(актив(прямая($A$$C$)))" \ указывают, что прямые $AB$,$AC$ уже
были явно выделены в задаче.

Указатель "усм(2)" \ определяет применение идентифицирующего
оператора при проверке условия перпендикулярности. Указатель
"вспомпараметр($b$ фикс(0))" \ оп\-ре\-де\-ля\-ет выбор новой
переменной $b$ в качестве обозначения для $l(AB)$ и регистрацию ее
в качестве временно известного параметра. Указатель вхождения
"фикс(0)", ссы\-ла\-ю\-щий\-ся на заносимое в посылки задачи на
исследование утверждение $b = l(AB)$, также определяет перенесение
его в список посылок внешней задачи на описание.

Чтобы в указанных фильтрах выражение "терм(расстояние($A$$B$))" \
для уже вы\-чис\-лен\-но\-го расстояния заменялось на его
величину, в приеме введен нормализатор "нормрасстояние" \ для
$l(AB)$. Одновременно он может затронуть и результирую\-щее
утверждение теоремы приема, однако в тех случаях, когда фильтры
истинны, это несущественно.

\par\bigskip

Приведем теперь примеры приемов вывода в посылках, не относящиеся
к пла\-ни\-мет\-рии.

В режиме логического вывода решаются задачи на качественное
ис\-сле\-до\-ва\-ние графика функции вещественной переменной.
Исследуемая функция и связываемые с ней вспомогательные функции
обозначаются переменными, и в по\-сыл\-ках задачи на исследование
происходит накопление различной информации об этих функциях.
Например, расмотрим прием вывода, вычисляющий множество корней
производной исследуемой функции (см. раздел "Математический
анализ", "Общие свойства чис\-ло\-вых функций", "Исследование
функций", "Качественное описание графика функ\-ции", "Определение
корней производной"). Его теорема имеет вид:

\par\medskip

$\forall_{afgb}(a = \lambda_x(g(x),f(x))\rightarrow
\mbox{roots}(a, \mbox{Dom}(a)) = set_x(f(x) \ \& \ g(x)=0))$.

\par\medskip

Здесь $a$ - обозначение для производной исследуемой функции (что
будет видно из фильтров приема). Правая часть равенства в
консеквенте обрабатывается вспо\-мо\-га\-тельной задачей, в
которой решается уравнение $g(x)=0$; на основе результата решения
создается новая посылка, дающая явное выражение для множествак
корней производной на ее области определения. Конечно, данная
теорема приема - это еще один пример псевдотеоремы, или почти -
псевдотеоремы.

Фильтры "уровень(2)", "посылка", "тип(исследовать)",
"цель(исследовать)" \ стан\-дарт\-ные; новым является лишь
последний из них, указывающий на то, что реша\-ет\-ся задача на
качественное описание графика функции. Фильтр
"контекст(посылка(х3)\\ вид(х3 Производная(х4 $a$)))" \ означает
наличие посылки, характеризующей функ\-цию $a$ как производную
некоторой функции х4. Фильтр "комментпосылки(1 корни)" \ выражает
отсутствие комментария к задающему функцию $a$ равенству,
озна\-ча\-ю\-ще\-го, что корни этой функции уже ранее вычислялись.
Указатель "примечпосылки(1 корни)" \ создает такой комментарий в
случае применения данного приема.

Указатель "примечание(ориентацияравенства)" \ снабжает вводимое
равенство для множества корней производной пометкой, блокирующей
перестановку его левой и правой частей. Уточнение ориентации
равенства позволяет управлять последующими заменами, которые оно
порождает. В данном случае выражение "roots($a$,Dom($a$))" \ будет
заменяться на явное описание множества корней, а не наоборот.
Указатель "примечание(равно)" \ снабжает новую посылку пометкой,
блокирующей замену его подтермов с помощью других равенств.
Указатель "примечание(упростить)" \ вводит пометку, блокирующую
последующие попытки упрощать новое равенство.

Указатель "отображение($f$$g$)" \ определяет идентификацию
$f(x),g(x)$ с про\-из\-воль\-ными выражениями; Указатель
"точкапривязки(отображение)" \ уточняет, что ини\-ци\-али\-зация
применения приема при сканировании будет начинаться с усмотрения
символа "отображение" \ в равенстве для $a$. Наконец, указатель
"лимит(20000000)" \ ограничивает трудоемкость попыток нахождения
корней производной.

Нормализаторов приема всего два. Прежде всего, это обработка
пакетным нор\-ма\-ли\-за\-тором "нормкласс" \ всей правой части
нового равенства. Такой нормализатор предпринимает попытку
избавиться от описателя "класс", перейдя к более простым средствам
задания множеств. Однако, еще до обращения к нему, условия
при\-над\-леж\-нос\-ти классу $f(x) \ \& \ g(x)=0$ преобразуются
вспомогательной задачей на описание, в которой, собственно, и
осуществляется основная работа данного приема.
Нор\-ма\-ли\-за\-тор приема, организующий обращение к этой задаче,
имеет вид "задача(6 тип(опи\-сать) цель(неизвестная($x$)) полный
явное прямойответ корни одз упростить)". Он сопровождается
дополнением "удалениепосылок(х3 входит($x$ х3))", отбрасывающим из
контекста применения приема все утверждения с $x$. Применение его
происходит путем решения вспомогательной задачи на описание,
условиями которой служат условия принадлежности классу, посылками
- урезанный указанным образом кон\-текст, а неизвестной - $x$,
причем эта задача решается до максимального уровня 6. Ответ задачи
и берется в качестве результата применения нормализатора приема.

\par\medskip

В качестве последнего примера приемов вывода рассмотрим прием из
ана\-ли\-ти\-ческой геометрии, извлекающий из условия
параллельности прямой и плоскости соотношение для коэффициентов
уравнений, задающих эти прямую и плоскость. Прием размещен в
разделе ("Аналитическая геометрия", "Уравнение прямой в
прос\-т\-ранстве", "Условие параллельности прямой и плоскости").

Теорема приема имеет вид:

\par\medskip

$\forall_{ABCDEKabcdefpqrs}(\mbox{прямая}(AB) \|
\mbox{плоскость}(CDE) \ \& \ \mbox{коорд}(\mbox{прямая}(AB),K) =$
\smallskip \\ \smallskip $\mbox{set}_{xyz}(\mbox{пропорцнаборы}((x+a,y+b,z+c),(d,e,f)) \ \&
\ \mbox{число}(x) \ \& \ \mbox{число}(y) \ \& \ \mbox{число}(z)) \
\&$\\ \smallskip $\mbox{коорд}(\mbox{плоскость}(CDE),K) =
\mbox{set}_{uvw}(pu+qv+rw+s=0 \ \& \ \mbox{число}(u) \ \& \
\mbox{число}(v)\ \& \ \\ \mbox{число}(w))\rightarrow pd+qe+rf =
0)$.

\par\medskip

Используемый в теореме предикат
"пропорцнаборы($(x+a,y+b,z+c),(d,e,f)$)" оз\-на\-чает линейную
зависимость указанных в нем двух трехмерных векторов и
оп\-ре\-де\-ляет, таким образом, прямую, проходящую через точку
$(-a,-b,-c)$ и имеющую направляющий вектор $(d,e,f)$. Значением
переменной $K$ служит та аффинная сис\-те\-ма координат, в которой
выписываются уравнения.

Заголовок и фильтры приема - обычные; указатель "усм(1)" \
определяет провер\-ку параллельности прямой и плоскости с помощью
идентифицирующих операторов - так, как они использовались в
элементарной геометрии. Указатели "единица(0 $a$ $b$ $c$ $s$)" \ и
"единица(1 $p$ $q$ $r$)" \ допускают вырожденные нулевые и
единичнеы значения слагаемых и коэффициентов. Указатель
"заменазнака(минус $p$ $q$ $r$)" \ учитывет воз\-мож\-ность знака
"минус" \ перед коэффициентами. Указатели "подстановка(фикс(3 2 4
1 1 1)$p$ 0)", "подстановка(фикс(3 2 4 1 1 2)$q$ 0)" \ и
"подстановка(фикс(3 2 4 1 1 3)$r$ 0)" \ определяют возможности
пропуска в уравнении плоскости слагаемых с каждой из переменных
$u,v,w$.

Уравнение плоскости идентифицируется непосредственно с некоторым
равенст\-вом в посылках, в то время как для второго антецедента,
определяющего уравнение прямой , введен указатель
"идентификатор(2)". Это означает, что сначала выраже\-ние
$\mbox{коорд}(\mbox{прямая}(AB),K)$ обрабатывается нормализатором,
определяющим неко\-то\-рое уравнение прямой, а затем уже найденное
уравнение идентифицируется с правой частью второго антецедента.
Указатель "точкапривязки(коорд)" \ выбирает для инициализации
срабатывания приема при сканировании символ "коорд" \ из
ура\-в\-не\-ния плоскости.

Кроме уже упомянутого выше нормализатора "нормкоорд", в приеме
исполь\-зу\-ют\-ся обычные нормализаторы общей стандартизации, а
также нормализатор "станд\-рав\-но", упрощающий новое равенство
для блокировки вывода дублирующих со\-от\-но\-ше\-ний - в таких
случаях равенство заменяется на константу "истина" \ и вывод не
происходит.

\subsection{Приемы вывода в условиях задачи на описание}

Приемы вывода следствий в условиях задачи на описание применяются
очень ред\-ко, так как они лишь увеличивают объем записей в списке
условий, а этот список должен быть постепенно преобразован к виду
ответа. При получении в списке условий явных выражений для
неизвестных будет выполнена подстановка этих выражений в
ос\-тав\-ши\-еся условия, и далее начнутся преобразования по
проверке их истинности. Всякое добавление новых утверждений к
списку условий будет, как правило, лишь усложнять данную проверку.
Поэтому основными средствами решения задач на опи\-са\-ние
являются, во-первых, эквивалентные преобразования условий,
постепенно при\-водящие их к виду ответа, и, во-вторых,
использование логического вывода в бло\-ке анализа задачи на
описание, с сохранением указаний на взаимную выводимость
получаемых утверждений. Эти указания, в случае нахождения в блоке
анализа явных выражений для неизвестных, позволяют хотя бы
частично исключить из списка условий задачи на описание те
условия, которые являются следствиями найденных выражений для
неизвестных.

В ряде случаев, однако, прием вывода настолько явно приближает
задачу к ответу, что его целесообразно применить непосредственно
для пополнения списка условий, не откладывая до рассмотрения
посылок блока анализа. Мы приведем здесь два примера такого рода.
Первый из них связан с возведением в куб уравнения с тремя
кубическими радикалами. Он может быть найден в разделе
("Элементарная алгебра", "Степени", "Решение уравнений",
"Уравнение с радикалами", "Возведение в куб уравнения с тремя
кубическими радикалами").

Теорема приема имеет вид:

\par\medskip

$\forall_{abcdef}(a\sqrt[3]{d} + b\sqrt[3]{e} + c\sqrt[3]{f} =
0\rightarrow a^3d + b^3e + c^3f -
3abc\sqrt[3]{d}\sqrt[3]{e}\sqrt[3]{f} = 0)$.

\par\medskip

При ее получении последнее слагаемое левой части переносится в
правую часть; далее обе части возводятся в куб; после группировки
в левой части выделяется выражение
$3ab\sqrt[3]{d}\sqrt[3]{e}(a\sqrt[3]{d} + b\sqrt[3]{e})$, в
котором сумма в скобках заменяется, с учетом уравнения, на
$-c\sqrt[3]{f}$.

Формально такой переход не является эквивалентным (результирующее
урав\-не\-ние будет, в частности, выполнено при равенстве трех
слагаемых исходного уравне\-ния, а исходное при этом может быть не
выполнено). Поэтому он реализован как прием вывода следствия в
условиях задачи. Заголовок приема - "выводусловия". Прием
уменьшает число слагаемых с кубическими радикалами с трех до
одного, что создает благоприятные предпосылки для быстрого решения
нового уравнения. После его решения остается старое уравнение, в
которое подставляется найденный корень, и далее полученное
равенство "проверяется" \ - упрощается эквивалентными
преобразованиями до получения логической константы "истина" \ либо
"ложь", либо сводится к некоторому переносимому в ответ условию на
параметры задачи.

Фильтры приема - простейшие: "уровень(5)" \ определяет
срабатывание на пятом уровне; "условие", "тип(описать)" \ и
"корень" \ - указывают, что рассматривается уравнение в условиях
задачи на описание; "не(известно($d$))", "не(известно($e$))" \ и
"не(известно($f$))" \ - указывают, что выражения $d,e,f$ под
радикалами содержат не\-из\-вест\-ные.

Так как прием не исключает "старого" \ уравнения, то для
блокирования его мно\-го\-крат\-ных срабатываний нужно принимать
специальные меры. Это делается с помо\-щью указателя "первыйключ(3
фикс($a$$b$$c$$d$$e$$f$))". После идентификации переменных $a, b,
c, d, e, f$ этот указатель инициирует проверку наличия комментария
"3" \ к воз\-во\-димому в куб уравнению (т.е. к условию текущей
задачи на описание). Если такой комментарий имеется, то применение
приема прерывается, иначе данный ком\-мен\-та\-рий вводится, и
последующие попытки применить прием оказываются
заблоки\-ро\-ва\-ны.

Указатели идентификации "единица(1 $a$ $b$ $c$)" \ и
"заменазнака(минус $a$ $b$ $c$)" \ раз\-ре\-ша\-ют коэффициентам
$a,b,c$ принимать вырожденное единичное значение, а также передают
этим коэффициентам знак минус перед соответствующим слагаемым,
если он имеется.

Для обработки подтермов нового уравнения используются
нормализаторы общей стандартизации. Кроме того, для обработки
левой части нового уравнения при\-ме\-ня\-ет\-ся нормализатор
"стандплюс", обеспечивающий раскрывание скобок и приведение
подобных членов после возведения в куб.

Прием имеет текстформульный шаблон, используемый для пояснения
пре\-об\-ра\-зований: "Переносим слагаемое () уравнения () в
правую часть и возводим обе части уравнения в куб. После этого в
сумме утроенных произведений из левой части вы\-де\-ля\-ем
сомножитель - левую часть возводимого в куб уравнения, и заменяем
его на правую часть данного уравнения. Далее все ненулевые
слагаемые группируем в левой части". Указатель "титр(набор(1
терм(фикс(фикс(1 1 3))фикс(1))))" \ определяет под\-ста\-нов\-ку в
данный шаблон выражения $c\sqrt[3]{f}$ и исходного уравнения
вместо скобок.

\par\bigskip

Многие приемы вывода в условиях задачи на описание служат для
инициализации разбора случаев, вводя некоторую дизъюнкцию,
определяющую такой разбор случа\-ев. В качестве примера рассмотрим
прием решения целочисленных уравнений либо неравенств, который при
появлении неравенства $x \le n$ для натурального выражения $x$ с
неизвестными выводит дизъюнкцию $x=1 \vee \ldots \vee x=n$,
перечисляющую все его возможные значения. Этот прием находится в
разделе ("Элементарная алгебра", "Неравенства", "Меньшеилиравно",
"Неравенства с целочисленной неизвест\-ной", \\ "Разбор случаев
для выражения, принимающего натуральные значения"). Теорема приема
имеет вид:

\par\medskip

$\forall_{xn}(x \le n \ \& \ \mbox{натуральное}(x)\rightarrow
\exists_m(m \in \{1, \ldots , n\} \ \& \ x = m))$.

\par\medskip

Фильтры "уровень(2)", "условие", "тип(описать)",
"неизвестная($x$)", "нату\-раль\-ное($n$)" \ определяют общий
контекст срабатывания приема. Заметим, что последний из фильтров
не просто требует, чтобы выражение $n$ имело натуральное значение,
но чтобы $n$ было десятичной записью конкретного натурального
числа. Разумеется, в этом случае можно выписать конечную
дизъюнкцию указанного выше вида. Однако, чтобы эта дизъюнкция не
оказалась слошком большой, введен дополнительный филь\-тр
"меньше(числзначение($n$)6)", ограничивающий ее не более чем 6
членами. Этот фильтр - не более чем временная заглушка; при
дальнейшем развитии приема можно будет, вероятно, выделить случаи,
когда нужно выписывать и значительно большее число членов, либо
создать дубликат данного приема, выписывающий длинные дизъ\-юнкции
на более высоких уровнях, когда прочих средств решения задачи не
хватило.

Фильтр "контекст(условие(х1)заголовок(х1
натуральное)первыйсимвол(х1 х2)не\-из\-вест\-ная(х2)входит(х2
$x$))" \ обеспечивает наличие принимающей натуральные зна\-че\-ния
неизвестной, встречающейся в выражении $x$.

Указатель "или(фикс(0)фикс(0 2 1))" \ нужен для того, чтобы
квантор су\-щест\-во\-вания из теоремы приема определял при
заменах дизъюнкции. Ссылка "фикс(0)" \ - на вхождение этого
квантора общности; "фикс(0 2 1)" \ - на подкванторное утверждение
$m \in \{1, \ldots , n\}$, определяющее перечисление значений
параметра $m$ при выписке дизъюнктивных членов. Это утверждение
обрабатывается компилятором в точности так же, как программно
реализуемые антецеденты.

Указатель "блокпроверок(2)" \ означает, что проверка
"натуральности" \ значений выражения $x$ выполняется проверочным
оператором. Указатель "примечание(раз\-бор\-слу\-чаев)" \ снабжает
новую дизъюнкцию комментарием "разборслуча\-ев",
ини\-ци\-иру\-ющим немедленный разбор случаев. При его отсутствии
перед разбором слу\-ча\-ев возникала бы пауза, которая здесь могла
бы привести к повторным срабатываниям того же самого приема.

\subsection{Приемы нормализаторов}

Существует множество различных типов нормализаторов, значительно
отлича\-ю\-щих\-ся друг от друга своим назначением и архитектурой.
Приведем здесь примеры при\-емов для основных их типов.

\subsubsection{Нормализаторы общей стандартизации}

Нормализаторы общей стандартизации вводятся практически для всех
функ\-ци\-о\-наль\-ных логических символов; иногда - также для
предикатных символов. Они обес\-пе\-чи\-вают простейшую
стандартизацию выражений, заголовком которых служат
со\-от\-вет\-ству\-ющие символы. Все такие нормализаторы -
корневые, то есть их приемы могут заменить только весь
преобразуемый терм целиком. За редкими исключе\-ни\-я\-ми,
нормализаторы общей стандартизации не должны вводить новых
выражений, требущих специального сопровождения по области
допустимых значений. При соз\-да\-нии нового приема любого типа
все новые выражения (быть может, кроме каких-то особых случаев)
подвергаются обработке нормализаторами общей стандартизации, что
позволяет устранять цепочки срабатываний простейших
стандартизирующих приемов вслед за срабатыванием какого-либо более
существенного приема. Так дос\-ти\-га\-ет\-ся весьма значительное
ускорение преобразований.

Заголовок нормализатора общей стандартизации для логического
символа $F$ по\-лу\-ча\-ется добавлением приставки "норм" \ к
названию этого символа. Это соглашение упрощает ручную вставку
обращений к нормализаторам общей стандартизации (хотя обычно
обращения к ним можно добавлять к набранному вручную приему
ав\-то\-ма\-ти\-чески).

В качестве примера рассмотрим прием нормализатора общей
стандарти\-за\-ции "нормумножение", осуществляющий перемножение
степеней с одинаковыми ос\-но\-ва\-ни\-ями. Путь к приему в
оглавлении базы приемов - ("Элементарная алгебра", "Умножение",
"Нормализатор общей стандартизации НОРМУМНОЖЕНИЕ", "Ум\-но\-жение
степеней с одинаковыми основаниями"). Берется второй из двух
пред\-став\-лен\-ных в этом разделе приемов. Теорема его имеет вид
$$\forall_{abc}(0 \le a \rightarrow a^ba^c = a^{b+c}).$$

Прием имеет заголовок "замена(второйтерм нормумножение)", что
соответ\-ству\-ет замене слева направо.

Указанная замена, хотя и применяется практически всегда, когда это
только возможно, все же имеет некоторые ограничения. Прежде всего,
здесь следует от\-ме\-тить использование записей вида $2\sqrt{2}$,
которые обычно не преобразуются к виду $2^{3/2}$. Для блокировки
такого рода замен в приеме служат фильтры "или(не(символ($b$
1))не(десчисло($a$))не(констдробь($c$)))" \ и "или(не(символ($c$
1))не(десчисло($a$))не(конс\-тдробь($b$)))". Они не разрешают
проведение замены, если $a$ есть числовая констан\-та, один из
показателей степени равен 1, а другой имеет вид простой числовой
дроби.

Другое ограничение заключается в том, что при решении уравнений
специально могло быть предпринято выделение в отдельный множитель
степени с суммой всех неизвестных слагаемых исходного показателя
(при известном основании степени). Например, это могло бы быть
полезно для усмотрения квадратного уравнения от\-но\-си\-тельно
такого множителя. В этой ситуации необходимо заблокировать
обратное преобразование, что и достигается с помощью фильтра
"или(коммент(нормуравн) и(известно($b$)известно($c$)))". Здесь
комментарий "нормуравн" \ указывает на наличие ранее предпринятого
специального выделения множителя.

Фильтр "постпозиция(фикс(0 1 2)фикс(0 1 1))" \ используется для
оптимиза\-ции; он отбрасывает попытки рассмотрения случаев, когда
вторая степень располо\-же\-на в произведении до первой, так как
эти случаи избыточны.

Указатель "блокпроверок(1)" определяет обработку антецедента
теоремы про\-ве\-роч\-ным оператором; указатель "единица(1 $b$
$c$)" \ разрешает вырожденные случаи, когда вместо соответствующей
степени $a$ имеется само $a$.

Наконец, указатель "комментарий(1 множители)" \ вводит комментарий
"мно\-жи\-те\-ли" \ при обращении к проверочному оператору,
блокирующий попытку разложе\-ния $a$ на множители - для
нормализатора общей стандартизации такая попытка уже является
слишком дорогостоящей.

\subsubsection{Нормализаторы вычисления}

Ряд нормализаторов общей стандартизации оказались чрезвычайно
большими и пре\-вра\-тились в нормализаторы, осуществляющие уже не
предварительную стан\-дар\-ти\-за\-цию, а символьное вычисление.
Таковы, например, нор\-ма\-ли\-заторы "нормпроиз\-вод\-ная",
"нормпредел" \ и "нормИнтграл", используемые, соответственно, для
вы\-чис\-ле\-ния производных, пределов и неопределенных
интегралов. Хотя они и имеют такие же названия, как прочие
нормализаторы общей стандартизации, их формат попол\-нен рядом
существенных элементов. В первую очередь, это указатели
"контроль\-нор\-ма\-ли\-зации" \ и "коррекцияпосылок". Первый из
них означает, что результаты обращений к нормализатору будут
сохраняться в специальном буфере, и при каждом новом обращении
сначала будет предприни\-мать\-ся попытка извлечь готовый
результат из буфера. Преобразования нормализаторов, формат которых
имеет такой указатель, отображаются на экране при пошаговом
просмотре решения. Второй указатель означает, что нормализатор
может пополнять свой список посылок, и новые посылки будут
переданы внешней задаче.

Будем рассматривать прием нормализатора "нормпроизводная",
выполняющий диф\-фе\-рен\-ци\-рование выражения степенного вида, у
которого и основание, и показа\-тель зависят от переменной
дифференцирования. Этот прием находится в раз\-де\-ле
("Математический анализ", "Производная", "Нормализатор
НОРМПРОИЗВОД\-НАЯ", "Производная степени"). Он является последним
в группе приемов дан\-но\-го раздела.

Теорема приема имеет вид: $$ \begin{array}{l} \forall_{abfgx}(a =
\frac{df(x)}{dx} \ \& \ \mbox{число}(a) \ \& \ b =
\frac{dg(x)}{dx} \ \& \ \mbox{число}(b) \rightarrow
\frac{d((f(x))^{g(x)})}{dx} = (f(x))^{g(x)}\cdot \smallskip \\
(b\ln f(x)+\frac{g(x)a}{f(x)})). \end{array}$$

В ее первом и третьем антецедентах вычисляются производные
основания и по\-ка\-за\-теля; второй и четвертый антецеденты
проверяют, что производные удалось вычислить - лишь после этого
можно усмотреть, что полученные выражения имеют числовые значения.

Заголовок приема - "замена(второйтерм нормпроизводная)". Фильтров
прием не имеет, если не считать формально отнесенного к указателям
условия "уровень(4)" \ на уровень его срабатывания. Кроме данного
приема, имеется еще несколько приемов для дифференцирования
степени в частных случаях (константное основание либо константный
показатель), уровни срабатывания которых меньше 4.

Указатели "идентификатор(1 3)" \ и "блокпроверок(2 4)" \
определяют уже объ\-яс\-нен\-ное выше использование антецедентов.
Указатель "отображение($f$ $g$)" \ означает, что функциональные
переменные $f(x),g(x)$ идентифицируются с произвольными
выражениями.

Указатель "вывод(условие(коммент(нормпредел))меньше(0 значение($f$
$x$)))" \ оп\-ре\-де\-ляет занесение новой посылки о
положительности основания степени, не\-об\-хо\-ди\-мой для
сопровождения по о.д.з. из-за появившегося логарифма. Эта посылка
впоследствии будет передана во внешнюю задачу.

Нормализаторы "нормпроизводная", которыми сопровождаются правые
части равенств в антецедентах, суть рекурсивные обращения к тому
же самому пакету для вычисления соответствующих производных.
Подтермы заменяющего терма снаб\-же\-ны обращениями к обычным
нормализаторам общей стандартизации. Кроме того, новая посылка
обрабатывается нормализатором общей стандартизации стро\-гих
не\-ра\-вен\-ств и нормализатором, обеспечивающим стандартное
упорядочение операн\-дов коммутативных операций.

\par\bigskip

Следующий пример - прием нормализатора "нормпредел", вычисляющий
предел дроби по правилу Лопиталя. Нормализатор "номпредел" \
представляет собой па\-кет\-ный оператор, значительно более
крупный, чем оператор "нормпроизводная". Он насчитывает более 200
приемов и имеет 9 уровней срабатывания.

Среди указателей формата этого оператора имеется элемент
"разборслучаев", который позволяет при вычислении предела
инициировать разбор случаев для па\-ра\-мет\-ров рассматриваемого
выражения, если в разных ситуациях предел вычисляется по-разному.
Результаты разбора отдельных подслучаев потом объединяются в одно
условное выражение. При принятии решения о разборе случаев
происходит откат к рассмотрению исходного выражения (быть может, с
подстановкой в него значений тех параметров, которые фиксированы в
текущем подслучае). Новые случаи относятся к последнему
выделенному для рассмотрения надслучаю. При откате сохраняются
только результаты рассмотрения ранее разбиравшихся подслучаев и
схема этих под\-слу\-чаев, а весь промежуток вычислений от начала
рассмотрения надслучая до ини\-ци\-али\-зации разбора случаев
пропадает. На первый взгляд, это может показаться не очень
экономным способом вычислений. Однако, так как все результаты
последних обращений к пакетным операторам сохраняются в буферах,
то при повторе они просто берутся оттуда в готовом виде, и
существенных потерь не происходит.

Прием для правила Лопиталя расположен в разделе ("Математический
анализ", "Предел", "Нормализатор НОРМПРЕДЕЛ", "Предел дроби",
"Правило Лопиталя"). Теорема этого приема имеет следующий вид:
$$\begin{array}{l} \forall_{fgabcdehui}(d = \lim_{y \to a
\backslash b}f(y) \ \& \ e = \lim_{y \to a \backslash b}g(y) \ \&
\ (d=0 \ \& \ e=0 \vee (d=\infty \vee d = -\infty)\smallskip \\ \
\ \& \ (e = \infty \vee e = -\infty)) \ \& \ h = \lambda_y
(\frac{df(y)}{dy}, \mbox{число}(y)) \ \& \ u =
\lambda_y(\frac{dg(y)}{dy}, \mbox{число}(y)) \ \& \ c = \smallskip
\\ \lim_{y \to a \backslash b}\frac{h(y)}{u(y)} \ \& \
(\mbox{число}(c) \vee c=\infty \vee c=-\infty) \ \& \ i=c
\rightarrow \lim_{y \to a \backslash
b}\frac{f(y)}{g(y)}=i)\end{array}$$

Первые два антецедента вычисляют пределы числителя и знаменателя
дроби; третий проверяет, что либо оба эти пределы равны 0, либо
бесконечны. Четвертый и пятый антецеденты вычисляют производные;
шестой - находит предел отношения производных; седьмой -
проверяет, что предел действительно найден - либо конечен, либо
бесконечен. Наконец, восьмой антецедент нужен для обращения к
вспо\-мо\-га\-тель\-ной задаче на упрощение найденного для предела
выражения.

Запись $y \to a \backslash b$ означает, что $y$ стремится к $a$,
причем $b$ - тип стремления (дву\-сто\-ронний, слева либо справа).
Это - общая форма указания типа предела для фор\-муль\-ной записи.
В конкретных случаях вместо нее используются обычные $y \to a$, $y
\to a+0$, $y \to a-0$. Указатель $b$ при двустороннем пределе
равен 0, при пределе слева - 1, и при пределе справа - 2. Однако,
такое кодирование используется лишь на уровне внутреннего,
скобочного представления термов.

Заголовок приема - "замена(второйтерм нормпредел)". Фильтры его, в
основ\-ном, эвристические, и предназначены для блокировки
применения в особо сомнитель\-ных ситуациях. Первым идет фильтр
"не(контекст(операнд(фикс(0 1 1 3) х11) не(дли\-на\-ме\-нее(х11
конъюнктчлен))))", который отсекает случаи чрезмерно длинных
(более 80 символов) числителя либо знаменателя. Некоторым
оправданием этому служит то, что часто дифференцирование приводит
к дальнейшему усложнению выражений. Заметим, что число 80
представлено в фильтре как символьная константа
"конъ\-юнк\-тчлен". Использование символьных констант упрощает
компиляцию, но несколько усложняет ручную работу с приемом; по
мере усовершенствования интерфейса ре\-дак\-то\-ра приемов
предполагается его устранить. Пока этого не сделано, для того,
что\-бы найти нужную символьную константу для большого числа либо
определить число, которое она представляет, приходится
пользоваться интерфейсом "Ресурсы и установки" \ из главного меню.
Если есть символьная константа, то находится номер ее логического
символа и вычитается 260; если есть число, то к нему прибавляется
260, и находится логический символ с данным номером.

Следующий фильтр - "не(контекст(операнд(фикс(0 1 1 3)х11)вид(х11
умножение(\\ х12 степень(х10 х13)))входит($y$
х10)не(константа(х13))единица(1 х12)контекст(рав\-но(х14
терм(предел(отображение($y$ число($y$)х10)х2 х1)))заголовок(х14 0
плюс\-беск ми\-нусбеск))))". Он проверяет наличие сомножителя
числителя либо знаме\-на\-те\-ля, име\-ющего вид степени с
неконстантным показателем х13 и содержащим переменную $y$
основанием х10. Фильтр предпринимает попытку вычислить предел х14
этого ос\-но\-ва\-ния (используя нормализатор "нормпредел",
применяемый к со\-от\-вет\-ст\-ву\-ющему выражению внутри данного
фильтра). Если предел оказался равен 0 либо бес\-ко\-неч\-ности,
то применение приема блокируется. Эвристической моти\-ви\-ров\-кой
фильтра является то, что дифференцирование не устраняет наличия
множителя указанного вида, причем этот множитель влияет на
стремление числителя либо знаменателя к 0 или к бесконечности.

Дальше идет фильтр "не(контекст(позиция(х10 корень)символ(х10
факториал)\\ входит($y$ х10)))". Он отменяет заведомо
бессмысленную попытку диф\-фе\-рен\-ци\-ро\-вания, если выражение
содержит целочисленную функцию "факториал", зависящую от $y$.

Следующий фильтр служит для предотвращения многократных
после\-до\-ва\-тель\-ных дифференцирований. Он имеет вид
"контекст(равно(х13 число(комментарий(\\ х11)заголовок(х11
частнпроизв)))или(меньше(х13 2)контекст(операнд(фикс(0 1 1 3)\\
х11)вид(х11 плюс(х12 умножение(х10 $y$)))единица(0 х12)единица(1
х10)заменазнака(\\ минус х10)не(входит($y$ х10)))и(меньше(х13
3)не(контекст(операнд(фикс(0 1 1 3)х11)\\ не(длинаменее(х11
соединение))))))не(контекст(тригаргумент(корень х15)
подчине\-но(х15 х16)контекст(вид(х16 степень(х17 х18))
альтернатива(меньше(х13 2) не(кон\-станта(х18))
не(целое(х18))))входит($y$ х15))))". При каждом обращении к
оператору "нормпредел" \ с целью вычислить предел отношения
производных вводится новый экземпляр комментария "частнпроизв",
которым снабжается это обращение. Таким образом, число этих
комментариев равно числу внешних применений правила Ло\-пи\-таля.
Фильтр находит данное число х13 и проверяет выполнение хотя бы
одного из следующих условий:

а) х13 менее 2;

б) Числитель либо знаменатель имеет слагаемое, линейное по $y$, и
тогда х13 игнорируется;

в) х13 менее 3, причем числитель и знаменатель имеют каждый не
более 40 символов.

Если одно из этих условий выполнено, то далее фильтр проверяет
отсутствие тригонометрической функции от выражения с вхождением
$y$, расположенной внутри степенного выражения, у которого при х13
большем 1 показатель степени не является десятичной записью целого
числа, а при х13 меньшем или равном 1 - не является константой.

Разумеется, перечисленные условия не являются неоспоримыми и не
претендуют на полноту - просто они возникли на тех примерах,
которые до сих пор были рас\-смот\-рены. При продолжении обучения
решателя эвристический образ "перспективной для применения правила
Лопиталя ситуации", вероятно, будут развиваться дальше.

Фильтр "коммент(производная)" \ проверяет отсутствие комментария
"про\-из\-вод\-ная", который предназначен специально для отмены
применения правила Лопи\-та\-ля и вводится там, где нужна
ускоренная попытка вычисления предела. Фильтр
"или(длинаменее(значение($h$ $y$)конецприставки)
длинаменее(значение($u$$y$)ко\-нец\-при\-став\-ки))" \ проверяет,
что хотя бы одна из производных числителя и знамена\-те\-ля имеет
не более 70 символов в своей записи. Наконец, фильтр
"или(коммент(целое)не(\\ контекст(позиция(х10 корень)вид(х10
степень(х11 х12))входит($y$ х12))))" \ проверяет, что при наличии
комментария "целое" \ выражение под пределом не имеет степен\-ных
подвыражений с показателем, зависящим от $y$. Комментарий "целое"
\ вводится приемом, который предпринимает попытку сведения
вычисления предела по\-сле\-до\-ва\-тель\-ности к вычислению
предела числовой функции; вероятность того, что правило Лопиталя
здесь окажется полезным в ситуациях с комбинаторного типа
"по\-ка\-за\-тель\-ными" \ подвыражениями, невелика.

Указатель "уровень(5)" \ определяет пятый уровень срабатывания
приема (из воз\-можных девяти). Указатель "идентификатор(1 2 4 5 6
8)" \ выделяет те равенства в антецедентах, которые обрабатываются
компилятором как присвоения значений соответствующим переменным.
Указатель "блокпроверок(3 7)" \ определяет ис\-поль\-зо\-ва\-ние
проверочных операторов для антецедентов, анализирующих
промежуточные результаты $c,d,e$ вычисления пределов. Заметим, что
эти антецеденты построены из элементарных утверждений с помощью
конъюнкций и дизъюнкций. Такие ситуации поддерживаются
компилятором, обеспечивающим необходимую логику обращений к
операторам, проверяющим отдельные элементарные утверждения. В тех
случаях, когда утверждение имеет вид равенства переменной $X$
константе $A$, компиля\-тор вместо обращения к проверочному
оператору просто вставляет оператор ЛОСа, рас\-по\-зна\-ющий
наличие заголовка $A$ у терма, идентифицированного с $X$.

Указатель "отображение($f$ $g$ $h$ $u$)" \ определяет возможность
идентификации функ\-ци\-о\-наль\-ных переменных $f(y)$, $g(y)$,
$h(y)$, $u(y)$ с произвольными выражениями.

Указатель "лимит(вариант(контекст(список(х10 значение($f$ $y$)
значение($g$ $y$)) вид(\\ х10 степень($y$ х11)) единица(1
х11)натуральное(х11)) 7000000 1500000)))" \ определяет органичение
числа шагов интерпретатора, отводимых на попытку применения
при\-ема. Если оно оказывается превышено, попытка обрывается.
Лимит шагов оп\-ре\-де\-ля\-ется условным выражением, учитывающим
контекст: если числитель либо зна\-ме\-на\-тель представляет собой
степень переменной $y$, имеющую константный натуральный
показатель, то он берется значительно большим.

Указатель "титр(вариант(заголовок($d$ 0)набор(1)набор(2)))" \
нужен для выбора текстового пояснения, соответствующего конкретной
ситуации. Текстформульный шаблон для создания сопровождающих
пояснений имеет у данного приема сле\-ду\-ю\-щий вид:

"$\neg 1$ Так как пределы числителя и знаменателя равны 0,
применяем прави\-ло Лопиталя $\neg 2$ Так как пределы числителя и
знаменателя бесконечны, применяем правило Лопиталя $\neg 3$
Производная числителя $\neg 4$ Производная знаменателя $\neg 5$
Пре\-дел отношения производных".

В этом шаблоне первые два фрагмента (начинающиеся с $\neg 1$,
$\neg 2$) дают общий поясняющий текст. Указатель "титр($\ldots$)"
\ определяет выбор первого из них при $d=0$ и второго - при
бесконечном $d$. Остальные фрагменты шаблона нужны для пояснения
обращений к нормализаторам (см. ниже).

Среди нормализаторов приема выделим, прежде всего, рекурсивные
обращения к вычислению пределов числителя и знаменателя. Они имеют
вид "нормпредел(за\-ме\-ча\-ние(производная)
замечание(титр(стоп)))". Запись "титр(стоп)" \ определяет
ком\-мен\-та\-рий к нормализатору, означающий, что обращение к
нему вообще не будет выводиться на экран при просмотре
срабатывания приема.

Обе производные снабжены нормализаторами
"номпроизводная(замечание(норм\-пре\-дел)
замечание(титр(набор($i$))))", где $i$ есть 3 для первой
производной и 4 для второй. Запись "титр(набор($i$))" \ определяет
комментарий к нормализатору, оз\-на\-ча\-ю\-щий, что при обращении
к нему на экран будет выводиться поясняющий фрагмент
текстформульного шаблона, имеющий номер $i$.

Отношение производных обрабатывается нормализатором общей
стандартизации "нормдробь", к посылкам которого добавляется
утверждение $y \to a \backslash b$. Оно может оказаться полезным
при сокращении дроби - для усмотрения отличия множителя от нуля.
Предел отношения производных обрабатывается нормализатором
"нормпре\-дел(примечание(частнпроизв)замечание(титр(набор(5))))",
где комментарий "час\-тн\-произв", как уже говорилось выше, играет
роль счетчика числа вложенных при\-ме\-не\-ний правила Лопиталя, а
запись "титр(набор(5))" \ извлекает из текстформульно\-го шаблона
пятый фрагмент для сопровождения обращения к нормализатору.

Наконец, переменная $i$ в последнем антецеденте обрабатывается
нормализатором "задача(5 упростить одз
цель(условие(длинатекста(списокпеременных(теквхожд)1)\\ ответ)))".
Это - обращение к вспомогательной задаче на преобразование,
решае\-мой до 5-го уровня. Если выражение под пределом не имело
параметров, то упрощение в рамках приема считается излишним -
тогда задача сопровождается целью "ответ", инициирующей
немедленную выдачу ответа без каких-либо преобразований.

\par\bigskip

Для нормализатора "нормпредел" \ рассмотрим также пример приема,
ини\-ци\-иру\-ющего разбор случаев. Такой разбор случаев может
понадобиться, если дробное выражение зависит от параметров и
априрори не усматривается отличие предела его знаменателя от 0.
Соответствующий прием находится в подразделе "Разбор случаев по
равенству нулю предела знаменателя" \ того же раздела, где был
расположен подраздел "Правило Лопиталя". Теорема приема имеет вид:
$$\begin{array}{l} \forall_{axfbcd}(a = \lim_{x \to c \backslash b}f(x) \ \& \
\mbox{число}(a) \ \& \ d = \lim_{x \to c \backslash b}g(x) \ \& \
\mbox{число}(d) \rightarrow \lim_{x \to c \backslash
b}\frac{f(x)}{g(x)} = \smallskip \\ \mbox{разборслучаев}(d = 0
\vee \neg(d = 0))).\end{array}$$

Разумеется, это еще один пример псевдотеоремы; равенство предела
условной записи "разборслучаев($\ldots$)" \ является лишь удобным
для компиляции техническим трюком. Впрочем, этот трюк выходит за
рамки одного лишь пакета "нормпредел" \ и допустим в любом
пакетном нормализаторе, описание формата которого снабжено
элементом "разборслучаев".

Прием имеет заголовок "замена(второйтерм нормпредел)" \ - так, как
будто он является обычным приемом замены. Указателем на то, что
вместо замены происходит инициализация разбора случаев, служит
правая часть "разборслучаев($\ldots$)" \ равенства в теореме
приема - никаких других указателей для этого не требуется.

Фильтры "не(заголовок($d$ 0))", "не(константа($d$))",
"конец(не(легковидеть(не(рав\-но($d$ 0)))))" \ отсекают ситуации,
когда предел знаменателя не содержит парамет\-ров либо очевидно
ненулевой. Заметим, что проверка последнего условия, сравнительно
трудоемкая, проводится после идентификации остальных элементов
ситуации - для этого соответствующий фильтр снабжен пометкой
"конец($\ldots$)".

Указатель "уровень(3)" \ фиксирует уровень срабатывания приема;
"иден\-ти\-фи\-ка\-тор(1 3)" \ - определяет использование равенств
в антецедентах для вычисления пределов числителя и знаменателя.
Указатель "блокпроверок(2 4)" \ определяет ис\-поль\-зо\-вание
проверочного оператора для усмотрения того, что пределы удалось
вычислить. Наконец, указатель "отображение($f$ $g$)" \ разрешает
идентификацию функ\-циональных переменных $f(x),g(x)$ с
произвольными выражениями.

Правые части равенств в антецедентах обрабатываются
нормализаторами "норм\-пре\-дел". Условие равенства предела
знаменателя нулю обрабатывается простейшим нормализаторами
числовых равенств "нормчисло". Заметим, что нецелесообразно
применять нормализатор общей стандартизации логических связок
"нормлог" \ к вво\-ди\-мой для разбора случаев дизъюнкции, так как
она, очевидно, тавтологична и бу\-дет им заменена на константу
"истина".

\par\bigskip

Следующий пример относится к нормализатору "нормИнтеграл",
обеспе\-чи\-ва\-ю\-щему вычисление неопределенных интегралов. Он
имеет несколько более простой формат, чем нормализатор
"нормпредел", так как не предполагает режима разбора случаев.
Число уровней срабатывания этого нормализатора равно 8, а число
приемов - около полутора сотен, т.е. меньше, чем у нормализатора
вычисления пределов. Однако, сами программы приемов здесь более
громоздки, так как используется мно\-жест\-во стан\-дарт\-ных
формул и подстановок. На этом материале преимущество
про\-грам\-миро\-ва\-ния на ГЕНОЛОГе особенно наглядно - вместо
набора вручную про\-грам\-мы на ЛОСе, занимающей несколько полных
"экранов", с помощью формульного редактора рисуется средней
сложности формула с интегралом, сопровождаемая, как правило,
весьма небольшим списком фильтров и указателей.

Рассмотрим сначала пример приема, основанного на табличном
интеграле для дроби, числитель и знаменатель которой суть линейные
комбинации синуса и ко\-си\-ну\-са. Этот прием находится в разделе
("Математический анализ", "Интегралы", "Нор\-ма\-ли\-затор
нахождения первообразной нормИнтеграл", "Тригонометрические
функции", "Дроби с линейными комбинациями синуса и косинуса").
Прием является третьим от начала в списке приемов данного раздела.
Теорема его имеет вид: $$\forall_{abcde}(e=d^2+c^2 \rightarrow
\int\frac{a\sin x + b\cos x}{c\sin x + d\cos x}dx =
\lambda_x(\frac{(bd+ac)x+(bc-ad)\ln|c \sin x + d\cos
x|}{e}$$,$\mbox{число}(x)))$

\par\bigskip

Фильтров у приема нет; указатель "идентификатор(1)" \ определяет
вычисление в первом антецеденте вспомогательного выражения $e$ -
суммы квадратов коэффи\-ци\-ен\-тов знаменателя. Указатели
"единица(1 $a$ $b$ $c$ $d$)" \ и "заменазнака(минус $a$ $b$ $c$
$d$)" \ определяют возможность вырожденных коэффициентов и наличия
минуса перед коэффициентом. Указатели "подстановка(фикс(0 1 1 3 1
1)$a$ 0)" \ и "подстановка(фикс\\ (0 1 1 3 1 2)$b$ 0)" \
определяют возможность отсутствия в числителе слагаемого с синусом
либо косинусом. Наконец, указатель "пересечениесписков(фикс(0 1 1
3 1))" \ нужен для того, чтобы обратить внимание компилятора на
возможное отличие за\-го\-лов\-ка числителя подынтегрального
выражения от символа "плюс" \ - иначе ком\-пи\-ля\-тор потребует,
чтобы числитель обязательно был суммой, и этим отсечет указанные
выше вырожденные случаи отсутствия одного из слагаемых.

Кроме нормализаторов общей стандартизации, расставляемых, по
существу, ав\-то\-ма\-тически, можно выделить нормализатор
"стандинтеграл(замечание(переменная $x$))", которым обрабатывается
результирующее выражение для первообразной. Этот нормализатор
возник для предварительного упрощения результатов интегрирования -
чтобы учесть специфику возникающих здесь типичных подвыражений, а
также чтобы добиться ускорения по сравнению с решением
вспомогательной задачи на преобразование. Постепенно развиваясь,
он достиг сейчас достаточно больших раз\-ме\-ров - свыше 100
приемов, некоторые из которых попросту дублируют стандартные общие
приемы упрощения, а некоторые ориентированы на частные случаи,
появление которых при интегрировании представляется сравнительно
вероятным. Обращение к нормализатору должно сопровождаться вводом
комментария (переменная $x$), ука\-зы\-ва\-ющим на переменную
интегрирования.

Если сравнить объем программы приема на ЛОСе (перейти к ней можно
нажатием Home, а вернуться - нажатием End) и на ГЕНОЛОГе, то
видно, что первый в 4-5 раз больше второго. При этом запись на
ГЕНОЛОГе существенно нагляднее.

\par\bigskip

Следующий пример приема нормализатора "нормИнтеграл" \ -
простейшая ло\-га\-риф\-ми\-ческая замена переменной
интегрирования. Прием расположен в подразделе ("Замена переменной
интегрирования", "Логарифмическая функция", "Простей\-шая замена")
корневого раздела нормализатора; берется последний прием списка
при\-емов данного подраздела. Усматривая в знаменателе
подынтегрального выражения не\-ко\-то\-рый множитель $f(x)$, прием
пытается перейти к новой переменной $y = \ln f(x)$. Теорема его
имеет вид:
$$\begin{array}{l}\forall_{fghuv}(\lambda_x(\frac{g(x)}{h(x)\frac{df(x)}{dx}},
\mbox{число}(x)) = \lambda_x(u(\ln f(x)),\mbox{число}(x)) \ \& \
\int u(x)dx = \lambda_x(v(x),\medskip \\ \mbox{число}(x))
\rightarrow \int \frac{g(x)}{f(x)h(x)}dx = \lambda_x(v(\ln f(x)),
\mbox{число}(x))).\end{array}$$

Смысл первого равенства в антецедентах - убедиться в том, что
выражение, остающееся после сокращения подынтегрального выражения
на производную за\-ме\-ня\-ю\-щей функции $\ln f(x)$, можно
выразить только через эту функцию, как некоторое $u(\ln f(x))$.
Далее в теореме приема предпринимается экономия на вводе новой
пе\-ре\-мен\-ной $y$, и интеграл для $u(y)$ записывается как
интеграл для $u(x)$. В возникающую после интегрирования функцию
$v(x)$ подставляется обратно $\ln f(x)$.

Фильтр "контекст(подчинено(х1 фикс(0 1 1 3)) символ(х1 логарифм)
контекст(\\ под\-чи\-нено(х2 х1) равно(х2 значение($f$ $x$))))" \
определяет проверку того, что под\-ын\-тег\-ральное выражение
содержит логарифм, внутри которого имеется вхождение выражения,
идентифицированного с $f(x)$. Эта проверка предшествует обработке
первого антецедента и служит для отсечения случаев, в которых он
почти наверняка не будет реализован.

Первый и второй антецеденты выделены указателями "идентификатор(1
2)" \ - у каждого из них сначала формируется левая часть, а затем
происходит идентифика\-ция ее с правой частью. Левая часть первого
антецедента теоремы имеет вид \ $\lambda_x(A(x),\\
\mbox{число}(x))$, где $A(x)$ - результат обработки указанного в
теореме выражения нор\-ма\-ли\-за\-торами "задача(5 упростить
одз)", "посылки(число($x$))". Указатель "новаргу\-мент($u$ $x$
извлечение)" \ определяет применение к выражению $A(x)$, перед
иден\-ти\-фи\-ка\-цией его с $u(\ln f(x))$, нормализатора
"извлечение". Этот нормализатор пытается преобразовать $A(x)$ к
виду $B(x)$, в котором переменная $x$ встречается только внутри
подвыражений $\ln f(x)$. Если это удается, то далее $u(t)$
понимается компилятором как результат замены всех таких
подвыражений в $B(x)$ на терм $t$.

Левая часть второго антецедента обрабатывается нормализатором
"нормИн\-тег\-рал" \ - предпринимается попытка вычисления
интеграла после замены переменной. Результирующее выражение $v(\ln
f(x))$ упрощается с помощью нормализатора "станд\-интеграл".

\subsubsection{Нормализаторы усмотрения зависимости от заданного
выражения}

Приемы замены переменной при интегрировании либо при решении
диф\-фе\-рен\-ци\-альных уравнений часто связаны с усмотрением
возможности представить некото\-рое выражение $A$ в таком виде,
чтобы все вхождения заданной переменной $x$ в $A$ были расположены
только внутри вхождений заданного подвыражения $t$. Не всегда
изначально $A$ представлено в таком виде явно, и тогда
предварительно приходит\-ся выполнять преобразования, приводящие
его к данному виду. Здесь используют\-ся специальные
нормализаторы, наиболее развитым из которых является нормализатор
"извлечение". Кроме преобразуемого терма, нормализатору должны
быть переданы также $x$ и $t$. Это делается с помощью вводимого
при обращении комментария (нов\-ар\-гу\-мент $t$ $x$), у которого
$x$ представлено в формате терма.

Рассмотрим простой прием нормализатора "извлечение", выражающий
четную степень косинуса через тангенс. Этот прием расположен в
разделе ("Математичес\-кий анализ", "Общие свойства числовых
функций", "Нормализатор ИЗВЛЕЧЕНИЕ", "Выражение через тангенс");
он является четвертым от конца списка приемов этого раздела.
Теорема приема имеет вид:

$$\forall_{ab}((\cos a)^{2b} = \frac{1}{((\tg a)^2 +1)^b}).$$

Заголовок приема - "замена(второйтерм извлечение)"; фильтров прием
не имеет. Ука\-затель "единица(1 $b$)" \ разрешает принимать
параметру $b$ вырожденное единичное значение. Указатель
"вход(новаргумент $c$ $d$)" \ определяет дополнительную
иден\-ти\-фи\-кацию, состоящую в том, что находится комментарий
(новаргумент $A$ $B$), и пере\-мен\-ные $c,d$ идентифицируются,
соответственно, с $A$ и $B$. Указатель "контекст(вид($c$
тангенс($a$)))" \ также определяет дополнительную идентификацию;
если заголовком выражения, идентифицированного с $c$, является
"тангенс", то переменная $a$ иден\-ти\-фи\-цируется с аргументом
тангенса. После того, как прием убедился, что требуется переходить
к тангенсам заданного аргумента, и идентифицировал вхождение
четной степени косинуса этого аргумента, он применяет указанное
выше тождество. В его заменяющей части лишь знаменатель
обрабатывается нормализатором общей стан\-дар\-ти\-зации
"нормстепень". Вообще, обработка нормализаторами заменяющих
тер\-мов в случаях перехода к специальным подвыражениям должна
предприниматься осторожно, чтобы эти подвыражения после нее не
пропали.

\subsubsection{Нормализаторы приведения к заданным заголовкам}

В некоторых случаях нормализатор бывает нужен для преобразования
терма к виду, у которого заголовок или примыкающая к нему корневая
часть терма удовлетворяют специальному условию. Типичный пример -
разложение выражения на множители, когда требуется получить один
из заголовков "умножение", "степень", "дробь", быть может, после
отбрасывания корневого минуса. Формально, такое преобразова\-ние
всегда можно ввести фиктивными средствами (например, умножив
выражение на единицу). Однако, имеются определенные эвристические
ограничения на разумные средства, применяемые при переходе к
заданным заголовкам. По-видимому, их мож\-но выделить из анализа
примеров и объяснить генератору приемов, который
само\-сто\-я\-тельно отбирал бы тождества для создания новых
приемов таких нормализаторов. Пока же, при обучении решателя
вручную, например, тому же разложению на мно\-жи\-те\-ли, подобные
вопросы не возникают, так как каждому "очевидно", какого рода
переходы к произведениям, дробям и степеням здесь полезны, а какие
- бессмысленны.

Приведем несколько примеров приемов нормализатора разложения на
множители. Этот нормализатор получил название "видумножение",
оставшееся за ним после серий экспериментов по автоматическому
комплектованию нормализаторов пре\-об\-ра\-зо\-вания к заданным
заголовкам. Список заголовков в них определялся по имеющим\-ся
теоремам для декомпозиции уравнений с заданным заголовкам одной из
своих частей (для равенств нулю произведения, дроби либо степени
такие теоремы как раз имеются). Нормализатор имеет 6 уровней
срабатывания; в описание его формата входят упоминавшиеся выше
указатели "контрольнормализации" \ и "коррекция\-по\-сы\-лок". В
частности, они предопределяют сохранение результатов обращений к
нор\-ма\-ли\-за\-тору (как удачных, так и неудачных) в специальном
буфере, и повторные попытки разложения на множители одного и того
же выражения в идущих под\-ряд попытках применения различных
приемов оказываются почти бесплатными. Это - очень большой
нормализатор; число его приемов более 320. Почти все
три\-го\-но\-мет\-рические тождества при обучении оказались
отнесенными именно к нему.

В качестве первого примера рассмотрим разложение на множители по
формуле суммы кубов. Прием расположен в разделе ("Элементарная
алгебра", "Умножение", "Нормализатор разложения на множители
ВИДУМНОЖЕНИЕ", "Тождества для непосредственного разложения на
множители", "Сумма кубов"). Берется второй из двух приемов данного
раздела. Теорема приема имеет вид:
$$\forall_{ab}(a^3+b^3 = (a+b)(a^2-ab+b^2)).$$
Прием имеет заголовок "замена(второйтерм видумножение)",
указывающий на заме\-ну слева направо.

Так как заменяемая часть симметрична, используется фильтр,
отсекающий по\-ло\-ви\-ну попыток применения приема:
рассматриваются только случаи, когда выражение $a$
лексикографически предшествует выражению $b$. Этот фильтр имеет
вид "лек\-си\-ко\-пред\-шествует(фикс(0 1 1)фикс(0 1 2))".

Фильтр "коммент(числоценка)" \ блокирует применение приема в
ситуациях, когда разложение на множители предпринято для упрощения
неравенства с нулем в одной из частей: здесь целесообразнее
перенести один из кубов в противоположную часть неравенства и
извлечь кубический корень. Комментарий "числоценка" \ создается
тем приемом, который предпринял указанную попытку упрощения
неравенства.

Фильтр "или(входит(нормИнтеграл комментарии)
не(контекст(комментарий(но\-рмИнтеграл х3) тригаргумент(корень
х4)входит(х3 х4))))" \ блокирует применение приема при
предварительном преобразовании подынтегрального выражения, если
сумма кубов содержит тригонометрическую операцию от аргумента,
содержащего переменную интегрирования. Это - эвристическое
соображение, основанное на том, что обычно при интегрировании
степени тригонометрических функций преобра\-зу\-ют\-ся к функциям
кратного аргумента. Другие приемы разложения на множители в таких
ситуациях оказались сравнительно безвредны, и лишь приемы для
суммы и разности кубов начали приводить к нежелательным
последствиям. Далее распо\-ло\-же\-но еще несколько аналогичных
эвристических фильтров, блокирующих применение данного приема в
тех специальных случаях, когда водимое им довольно ощутимое
усложение выражения нежелательно. Все эти фильтры были подсказаны
совсем небольшим числом примеров, имеют достаточно грубый
характер, и при продолже\-нии обучения возможен цикл их уточнений.

Надо сказать, что любой сколь-нибудь сомнительный или непонятный
фильтр легко можно проанализировать заново, определив все те
задачи, в которых он бло\-ки\-ру\-ет срабатывание приема, или в
которых прием срабатывает несмотря на этот фильтр. Для этого
применяется прокрутка по разделам задачника, в которых
воз\-мож\-но применение приема, после чего возникает исчерпывающая
информация, на основании которой можно отбросить фильтр,
скорректировать его либо вообще пред\-ло\-жить другую схему
решения рассматриваемых задач. Таким образом, несмотря на огромное
число приемов в решателе, он вполне допускает локальную
оптимизацию, и изменения любого элемента любого приема обычно
легко контролируются, не при\-во\-дя к разрушению регулировки базы
приемов в целом. В приводимых ниже упраж\-не\-ни\-ях мы
проиллюстрируем технику анализа ранее созданных
эв\-рис\-ти\-ческих филь\-тров.

Указатель "уровень(4)" \ определяет размещение программы приема в
группе при\-емов данного нормализатора, срабатывающих на четвертом
уровне. Указатель "знак\-суммы(минус фикс(0 1))" \ вводит попытку
одновременного изменения знака всех слагаемых при применении
данного приема. Указатель "модификатор" \ вводит про\-вер\-ку
того, что преобразуемая сумма не имеет других слагаемых - иначе
вместо разложения на множители произошла бы попытка группировки,
для которой пред\-ус\-мот\-рен другой прием.

Указатель "замечание(6 фикс(0 2 2))" \ вводит комментарий к
данному нор\-ма\-ли\-за\-тору, означающий, что второй множитель
заменяющего терма не должен подвергать\-ся попыткам разложения на
множители по формуле квадратного трехчлена (дис\-кри\-ми\-нант
неположителен). Прием нормализатора, осуществляющий разложение по
формуле квадратного трехчлена, имеет фильтр, учитывающий этот
комментарий.

Указатель "замечание(условие(и(входит(нормчислитель комментарии)
контекст\\ (тригаргумент(корень х4)))) фильтрудвоения)" \ вводит
комментарий "фильтрудвое\-ния", если преобразуемое выражение
содержит тригонометрическую операцию, при\-чем попытка разложения
на множители относится к числителю дроби, возникшей после сложения
двух дробей. Этот комментарий блокирует попытки перехода к
двой\-но\-му тригонометрическому аргументу, так как в данной
ситуации они могут привести к нежелательным последствиям,
например, измененить множитель числителя, име\-ю\-щийся в
знаменателе, и сделать невозможным сокращение дроби. При
необходимости переход к двойному тригонометрическому аргументу
будет выполняться после вы\-хода из рассматриваемого
нормализатора.

Расстановка нормализаторов в приеме стандартная; в ряде случаев
применение нормализатора общей стандартизации сопровождается
применением нормализатора, упрощающего выражение относительно
неизвестных: могут быть приведены по\-доб\-ные члены с известными
коэффициентами либо выполнена группировка сомно\-жи\-те\-лей под
общий неизвестный показатель степени - действия, ускоряющие
последующие рассмотрения уравнений. Если обращение к разложению на
множители произошло не из задачи с неизвестными, то такой
нормализатор ничего не изменяет.

\par\bigskip

Следующий пример - разложение на множители путем попыток
группировки пар слагаемых. Имеется множество приемов такого типа,
двойственных приемам непосредственного разложения на множители.
Рассмотрим один из них - группировку при усмотрении разности
квадратов. Прием расположен в подразделе ("Частичные группировки",
"Разность квадратов") корневого раздела нормализатора
"видум\-но\-же\-ние". Теорема его имеет вид:

$$\forall_{abcde}(e = a(b-c)(b+c)+d \rightarrow ab^2 - ac^2 +d =
e).$$

Выглядит она несколько искусственно, так как сочетает в себе два
преобразования - переход от $ab^2 - ac^2$ к $a(b-c)(b+c)$ и
разложение на множители суммы, полу\-чен\-ной после данной
группировки. Это разложение (с учетом указателей нормализа\-ции)
выполняется первым антецедентом; если результат $e$ действительно
имеет вид произведения, дроби либо степени, то прием заменяет на
него преобразуемое вы\-ра\-же\-ние. Таким образом, прием прибегает
к рекурсии, и по завершении ее сразу выдает результат разложения
на множители.

Заголовок приема - "замена(второйтерм видумножение)". Фильтр
"или(за\-го\-ло\-вок($e$ умножение степень дробь) и(заголовок($e$
минус) первыйсимвол($e$ умножение \\ сте\-пень дробь)))" \
проверяет, что выражение $e$ - результат разложения на
мно\-жи\-те\-ли после группировки - действительно имеет требуемый
вид "обобщенного про\-из\-ве\-де\-ния".

Фильтр "или(коммент(группировка) контекст(вид($d$ плюс(х6
умножение(х7 сте\-пень(плюс($b$ минус($c$))х8)))) единица(1 х7 х8)
за\-ме\-на\-зна\-ка(минус х7) единица(0 х6)) контекст(вид($d$
плюс(х6 умножение(х7 степень(плюс($b$ $c$) х8)))) единица(1 х7 х8)
за\-ме\-на\-зна\-ка(минус х7) единица(0 х6)))" \ регулирует
применение приема после того, как уже были предприняты какие-то
другие группировки. Заметим, что при обраще\-нии к разложению на
множители после группировки, выполняемое в первом антеце\-ден\-те,
сопровождается комментарием "группировка". При наличии такого
комментария рассматриваемый фильтр проверяет, что некоторое
слагаемое преобразуемого вы\-ра\-же\-ния уже имеет своим
множителем степень суммы либо разности $b$ и $c$ - чтобы данная
группировка продолжала начатую попытку выделения сквозного общего
мно\-жи\-те\-ля.

Фильтр "или(не(коммент(группировка)) не(меньше(
количествооперандов( тек\-вхожд) 4)))" \ проверяет, в случае
первой группировки пары слагаемых, что общее число слагаемых не
менее 4 - для малого числа слагаемых разложение на множители
обеспечивается другими приемами, без предварительных группировок.

Фильтр "меньше(количествооперандов(теквхожд)8)" \ введен для
блокировки за\-мед\-ля\-ющих действия решателя попыток разложения
на множители слишком длин\-ных сумм путем группировок. Фильтр
"не(константа(корень))" \ блокирует при\-ме\-не\-ние группировок
при разложении на множители константных выражений. Фильтр
"коммент(нормуравнение)" \ проверяет отсутствие комментария
"нормуравне\-ние" \ - этот комментарий используется для указания
на ослабленный режим разложения.

Фильтр "не(контекст(вид($d$ плюс(дробь(х6 х7)х8))единица(0
х8)заменазнака(ми\-нус х6)))" \ проверяет, что сумма не имеет
дробных слагаемых - в этом случае речь идет о сложении дробей, а
не о разложении на множители, и применяется другой прием
нормализатора.

Фильтр "или(не(константа($b$))не(константа($c$)))" \ блокирует
группировку для по\-доб\-ных членов $ab^2,ac^2$, если $b,c$
оказались константами.

Фильтры "не(контекст(вид($b$ степень(х6 х7)) не(известно(х7))))" \
и "не(контекст(\\ вид($c$ степень(х6 х7)) не(известно(х7))))" \
блокируют группировки при разложении на множители разности частей
показательного уравнения, так как обычно в этих случаях
показательное выражение заменяется на новую неизвестную.

Наконец, фильтр "коммент(тригонометрия)" \ проверяет отсутствие
комментария "тригонометрия", вводимого нормализатором после того,
как было принято решение о попытке разложения на множители путем
перехода от степеней тригонометри\-чес\-ких функций к функциям
кратного аргумента.

Указатель "уровень(4)" \ откладывает применение приема до
четвертого уровня - на случай, если имеется более простой способ
разложения, чем группировки. Указа\-тель "идентификатор(1)" \
объясняет, что первый антецедент нужен для ввода
вспо\-мо\-га\-тель\-ного выражения $e$; указатель "единица(1 $a$)"
\ - что возможно вырожденное единичное значение коэффициента $a$.

Кроме обычных нормализаторов общей стандартизации, в приеме
применяется обработка правой части первого антецедента
нормализатором "видумножение(заме\-ча\-ние(группировка) замечание(
титр( набор(2))))". Организация текстформульно\-го со\-провождения
срабатывания приема с помощью указателя "титр($\ldots$)" \ здесь
ана\-ло\-гич\-на ранее разобранной.

\par\bigskip

Для разложения на множители многочленов с целыми коэффициентами,
степень которых не превосходит 5, нормализатор "видумножение" \
применяет (если не\-при\-ме\-нимы более простые средства) метод
неопределенных коэффициентов. В качест\-ве примера рассмотрим
прием для разложения многочлена степени 3 на линейный и
квадратичный множители. Этот прием размещен в подразделе
("Разложение мно\-го\-чле\-нов путем подбора целочисленных
коэффициентов", "Представление многочле\-на третьей степени в виде
произведения линейного множителя и квадратного трехчле\-на")
корневого раздела нормализатора. Берется второй из двух имеющихся
в раз\-де\-ле приемов. Теорема приема имеет вид:

\par\medskip

$\forall_{abcdefghijk}(fh=d \ \& \ gj=a \ \& \ 0<g \ \& \ gi=b-fj
\ \& \ gh+fi=c \rightarrow ae^3+be^2k+cek^2+dk^3 =
(fk+ge)(hk^2+iek+je^2))$.

\par\medskip

Она возникла из следующих соображений. Для разложения на множители
од\-но\-род\-ного многочлена $ae^3+be^2k+cek^2+dk^3$ степени 3
относительно переменных $e,k$ с целыми коэффициентами $a,b,c,d$
рассматривается произведение линейного и квадратичного множителей
$fk+ge$, $hk^2+iek+je^2$ с неопределенными целыми коэффициентами
$f,g,h,i,j$. После раскрывания скобок, для неопределенных
ко\-эф\-фи\-циентов возникают соотношения $fh=d, gj=a, gi+fj=b,
gh+fi=c$. Первое из них позволяет организовать перечисление
всевозможных $f$ как делителей из\-вест\-но\-го $a$, при этом
определяется и $h$. Второе, аналогичным образом, позволяет
перечислять $g,j$. После того, как определены $f,j$, третье
соотношение, переписанное в виде $gi=b-fj$, позволяет перечислять
всевозможные $g,j$. Для текущих найденных значений следует
проверять выполнение последнего, четвертого соотношения. Таким
образом получаем первый, второй, четвертый и пятый антецеденты
теоремы. Третий антецедент нужен для отсечения избыточных случаев
- всегда можно поменять знаки всех неопределенных коэффициентов
так, чтобы $g$ оказалось положительным (при нулевом $g$ многочлен
можно разложить и без данного приема).

Прием имеет заголовок "замена(второйтерм видумножение)". Фильтры
"целое(\\ $a$)", "целое($b$)", "целое($c$)", "целое($d$)" \
требуют, чтобы коэффициенты были иден\-ти\-фи\-цированы с
десятичными записями целых чисел.

Ускоряющий фильтр "постпозиция(фикс(0 1 4)фикс(0 1 1))" \
отбрасывает сим\-мет\-рич\-ные случаи при идентификации - всегда
член с третьей степенью переменной $k$ должен идти после члена с
третьей степенью переменной $e$. Фильтр
"меньше(ко\-ли\-чест\-во\-операндов(теквхожд) 5)" \ также
ускоряющий - он блокирует попытки иден\-ти\-фи\-ка\-ции, если
число слагаемых больше 4, и таким образом многочлен заведомо не
имеет рассматриваемого вида.

Фильтр "коммент(группировка)" \ блокирует попытки воспользоваться
приемом, если реализуется попытка разложения на множители после
предпринятой ранее груп\-пи\-ров\-ки слагаемых.

Фильтр "контекст(разряд(теквхожд степень х12) не(второйсимвол(х12
2)))" \ так\-же ускоряющий - он отменяет попытку применения
приема, если выражение не име\-ет степеней, отличных от второй.
Фильтр "коммент(6 теквхожд)" \ блокирует бес\-пер\-спек\-тивную
попытку применения приема, если имеется комментарий, указывающий,
что многочлен был получен как "длинный" \ множитель в разложении
суммы либо разности кубов.

Фильтр "не(константа(корень))" \ блокирует попытку применения
приема при об\-ра\-бот\-ке константных выражений. Этот фильтр,
конечно, может отсечь какие-то случаи, в которых прием мог бы
оказаться полезен. Однако, потребность в раз\-ло\-же\-нии
константных выражений на множители возникает сравнительно редко, а
замедление попытки такого разложения вносят ощутимое. Поэтому
данный фильтр просто означает, что для тех особых случаев, когда
разложение константной суммы на множители все-таки необходимо,
нужно создать специальный прием, пе\-ре\-обоз\-на\-чающий какие-то
константные подвыражения на вспомогательные переменные, и затем
обращающийся к разложению на множители уже неконстантной суммы.

Фильтр "коммент(нормуравнение)" \ блокирует применение приема,
если есть ука\-за\-ние о применении ослабленных средств
разложения. Фильтр "меньше(2
коли\-чест\-во\-опе\-рандов(теквхожд))" \ отсекает вырожденные
случаи, когда число слагаемых ме\-нее трех.

Указатель "уровень(3)" \ определяет третий уровень применения
приема; "мо\-ди\-фи\-катор" \ - требует, чтобы многочлен не имел
слагаемых, кроме приведенных в теореме. Указатель "программа(1 2 3
4 5)" \ означает, что все антецеденты теоремы являются программно
реализуемыми. Первый, второй и четвертый из них исполь\-зу\-ют
программу, перечисляющую все множители целого числа. Интересен тот
факт, что трудоемкость даже такого неэкономичного перечисления, на
фоне трудоемкости об\-ще\-го процесса сканирования задач,
невелика, и срабатывание приема выглядит обыч\-но почти
мгновенным. Это является следствием того, что архитектура
со\-вре\-мен\-ных процессоров хорошо приспособлена к численным
процедурам и никак не при\-спо\-соб\-ле\-на к логическим
процессам.

Указатели "подстановка(фикс(0 1 2)$b$ 0)" \ и "постановка(фикс(0 1
3)$c$ 0)" \ оп\-ре\-де\-ля\-ют возможность отсутствия второго и
третьего слагаемых многочлена, причем в этих случаях коэффициенты
$b,c$ берутся равными 0.

Указатели "перечень($a$ десчисло($a$))", "перечень($d$
десчисло($d$))" \ упрощают ра\-бо\-ту компилятора, фиксируя
идентификацию коэффициентов $a,d$ как чис\-ло\-вых
мно\-жи\-те\-лей соответствующих слагаемых.

Указатель "пересечениесписков(фикс(0 1 2)фикс(0 1 3))" \ объясняет
компиля\-то\-ру, что второе и третье слагаемые не обязательно
имеют своим заголовком (после отбрасывания возможного минуса)
символ умножения. Такое пояснение нужно здесь из-за того, что эти
слагаемые имеют по три множителя, и компилятор пока не способен
анализировать эту ситуацию самостоятельно.

Указатели "единица(1 $a$ $b$ $c$ $d$)" \ и "заменазнака(минус $a$
$b$ $c$ $d$)" \ определяют воз\-мож\-ность вырожденных единичных и
отрицательных значений коэффициентов.

Прием использует только нормализаторы общей стандартизации; его
указа\-тель "титр($\ldots$)" \ обычным образом вводит
текстформульное сопровождение.

\subsubsection{Нормализаторы утверждений с неизвестными}

В некоторых случаях для ускорения разрешения условия задачи на
описание от\-но\-си\-тель\-но неизвестных можно вводить
специальные нормализаторы. Обычно это имеет смысл делать тогда,
когда условия задачи слабо взаимодействуют меж\-ду собой, и
сранительно длительное изолированное преобразование одного из них
не нарушает общего хода решения. Например, так бывает при решении
неравенств - обычно каждое из них преобразуется к разрешенному
относительно неизвестной виду без использования других. В качестве
примера рассмотрим прием нормализатора решения строгих неравенств.
Этот нормализатор называется "уравнменьше". Он имеет три уровня
срабатывания и снабжен буфером сохранения результатов
по\-след\-них обращений. Шаги его применения в обычной трассировке
отображаются на экране. Число приемов этого нормализатора равно 74
- не очень много, так как в него включены лишь простейшие
переходы, позволяющие ускорять работу решателя при разборе
случаев, часто воникающем во время решения неравенств.

Выберем прием решения простейших неравенств вида $ax < b$. Он
расположен в разделе ("Элементарная алгебра", "Неравенства",
"Меньше", "Нормализатор ре\-ше\-ния строгих неравенств УСММЕНЬШЕ",
"Решение неравенств $XA<B$,$B<XA$"). Берется последний из приемов
раздела.

Теорема приема имеет вид:

$$\forall_{abc}(ac<b\leftrightarrow c<0 \ \& \ \frac{b}{c}<a \ \vee
\ 0<c \ \& \ a<\frac{b}{c} \ \vee \ c=0 \ \& \ 0<b).$$

Заголовок приема - "замена(второйтерм уравнменьше)". Фильтры
"не(из\-вес\-т\- но($a$))", "известно($b$)", "известно($c$)" \
указывают, что выражение $a$ содержит неизвест\-ные, а выражения
$b,c$ - не содержат. Заметим, что список переменных, которые
нор\-ма\-ли\-за\-тор будет считать неизвестными, определяется его
комментарием (неизвест\-ные $x_1 \ldots x_n$), автоматически
вводимым при обращении к нормализатору из задачи, име\-ю\-щей
неизвестные, либо из внешнего пакетного оператора, обладающего
таким ком\-мен\-та\-рием. Такая передача нормализатору списка
неизвестных обуславливается на\-ли\-чи\-ем в описании его формата
указателя "неизвестные".

Указатель "перечень($a$ не(известно($a$)))" \ фиксирует способ
идентификации вы\-ра\-жения $a$ путем выделения всех неизвестных
множителей левой части неравенства. Указатель "заменазнака(минус
$a$)" \ разрешает относить минус в левой части не\-ра\-вен\-ства к
выражению $a$.

Выражения $b$,$c$ при формировании заменяющего утверждения
обрабатываются нормализатором "видумножение" \ - это делается,
чтобы чаще происходило со\-кра\-ще\-ние нормализатором "нормдробь"
\ дроби $b/c$. Последнему нормализатору, при\-ме\-ня\-е\-мо\-му в
первом и втором подслучаях заменяющей дизъюнкции, придается
до\-пол\-ни\-тель\-ная посылка $c \ne 0$, истинная в обоих этих
подслучаях. Неравенства $c<0$, $0<c$ и $0<b$, не содержащие
неизвестных, обрабатываются нормализатором "нормменьше" \ общей
стандартизации строгих неравенств. Аналогичным образом, равенство
$c=0$ обрабатывается нормализаторами "нормусм" \ и "нормчисло",
первый из которых предпринимает попытку усмотрения истинности либо
ложности утверждений с по\-мо\-щью проверочных операторов, заменяя
их после этого на логическую константу, а второй - служит
нормализатором общей стандартизации для числовых равенств.
Наконец, неравенства с неизвестными $b/c<a$, $a<b/c$
обрабатываются рекурсивным образом - к ним применяется
нормализатор "уравнменьше", которому передается дополнительная
посылка - неравенство для $c$. Чтобы исключить логические
кон\-стан\-ты, которые могут возникнуть в заменяющем утверждении
после работы пе\-ре\-чис\-лен\-ных нормализаторов, ко всему этому
утверждению применяется нормализатор "нормлог".

Текстформульный шаблон, сопровождающий применение приема, имеет
вид:

\par\medskip

 "$\neg 1$ Так как множитель () положителен, делим на него обе
части неравенства, и далее преобразуем полученное неравенство
$\neg 2$ Так как множитель () отрицателен, делим на него обе части
неравенства и меняем знак неравенства. Далее преобразуем
полученное неравенство $\neg 3$ Рассматриваем случаи в зависимости
от знака множителя () $\neg 4$ Дальнейшее преобразование
неравенства в случае отрицательного множителя $\neg 5$ Дальнейшее
преобразование неравенства в случае положительного множителя".

\par\medskip

Кроме общей ситуации, в нем предусмотрены случаи однозначно
определяемого в контексте знака множителя $c$ - тогда
нормализаторы исключат в заменяющей дизъюнкции все случаи, кроме
одного, вводя для невыполнимых членов дизъюнкции логическюу
константу "ложь", которая затем отбрасывается нормализатором
"норм\-лог". Первый фрагмент текстформульного шаблона ориентирован
на случай по\-ло\-жи\-тель\-ного $c$, второй - на случай
отрицательного, третий - соответствует общему случаю
неустановленного знака $c$. Четвертый и пятый фрагменты
используются при рекурсивных обращениях к нормализатору
"уравнменьше" \ - эти обраще\-ния сопровождаются элементами
"замечание(титр(набор(4)))", "замечание(титр(набор(5) ))".

Указатель "титр(вариант(заголовок(фикс(0 2 2 1)истина)набор(1
терм($c$))вари\-ант(заголовок(фикс(0 2 1 1)истина)набор(2
терм($c$)))набор(3 терм($c$))))" \ является диспетчером,
выбирающим из текстформульного шаблона нужный фрагмент и
пе\-ре\-да\-ющим ему для подстановки вместо скобок выражение $c$.

\subsubsection{Нормализатор выделения повторяющихся подвыражений
с неизвестными}

При решении систем уравнений с несколькими неизвестными часто
помогает прием перехода к новым неизвестным. Он основан на
обнаружении некоторой группы под\-вы\-ра\-жений с неизвестными,
через которые можно выразить все рассматриваемые уравнения. Чтобы
такую группу подвыражений можно было усмотреть, обычно
при\-хо\-дит\-ся прибегать к предварительным преобразованиям
уравнений, явным образом выделяя в них повторяющиеся вхождения
одного и того же подвыражения. Для этих преобразований
используется специальный нормализатор "повторчисло". Этот
нормализатор имеет 6 уровней срабатывания. Буфера для сохранения
результатов обращений к нему не предусмотрено; при пошаговом
показе решения его действия не отображаются. Тем не менее, он
относится к числу сравнительно больших нор\-ма\-ли\-за\-торов,
насчитывая более сотни приемов.

Нормализатор "повторчисло" \ используется в итеративном цикле
обработки вы\-де\-лен\-ной группы утверждений с неизвестными $A$,
для которых нужно усмотреть список подвыражений, выбираемых в
качестве новых неизвестных. Здесь возможны два случая - несколько
уравнений либо одно неравенство. Нормализатору передается текущее
утверждение, которое он и будет изменять, но при этом сообщается и
весь список утверждений - через комментарий (внешвхождение $A$), в
котором позиция набора $A$, соответствующая обрабатываемому
утверждению, заменяется на 0. Кроме того, нор\-ма\-ли\-за\-тору
передается комментарий (новыенеизвестные $B$), у которого $B$ -
изначально пустой накопитель для заполнения его ссылками на те
утверждения из $A$, к рас\-смот\-ре\-нию которых следует вернуться
после обработки текущего утверждения.

В качестве примера рассмотрим прием нормализатора, выражающий
сумму квад\-ра\-тов двух выражений через сумму и произведение этих
выражений. Такого рода переход может быть полезен, если в
обрабатываемых утверждениях уже встречались (быть может, в слегка
замаскированном виде) данные сумма и произведение. Прием
расположен в разделе ("Элементарная алгебра", "Число",
"Нормализатор выделения повторяющихся вхождений числовых выражений
ПОВТОРЧИСЛО", "Плюс", "Сум\-ма и разность квадратов", "Выражение
суммы квадратов через сумму и произве\-де\-ние"). Берется
последний прием раздела. Теорема приема имеет вид:

$$\forall_{bc}(b^2+c^2 = (b+c)^2 - 2(bc)).$$

Заголовок приема - "замена(второйтерм повторчисло)". Фильтры
"не(из\-вест\-но($b$) )", "не(известно($c$))" \ указывают на то,
что выражения $b,c$ содержат неизвестные; фильтр "неизвестные(2)"
\ - что число неизвестных задачи не меньше 2. Последнее требование
является естественным, так как прием предполагает выделить для
по\-сле\-ду\-ю\-ще\-го обозначения новыми неизвестными сразу два
выражения - сумму и произведение $b$ и $c$.

Фильтр "лексикопредшествует($b$ $c$)" \ отбрасывает избыточный, в
силу симметрии, случай обратного порядка выделения слагаемых $b^2,
c^2$.

Фильтр "контекст(внешвхождение(х4) вид(х4 умножение(х5 $b$ $c$))
единица(1 х5) буфер(новыенеизвестные базавхождения(х4)))" \
требует, чтобы хотя бы одно из рас\-смат\-риваемых для перехода к
новым неизвестным утверждений имело вхождение х4 произведения,
содержащего множители $b$,$c$. Идентифицирующий терм
"внеш\-вхож\-де\-ние(х4)" перечисляет вхождения х4, встречающиеся
вне текущего вхождения в об\-ра\-ба\-ты\-ваемом нормализатором
терме, а также вхождения х4 в другие термы, пе\-ре\-чис\-лен\-ные
в комментарии (внешвхождение $\ldots$). Указатель
"буфер(новыенеизвест\-ные базавхождения(х4))", расположенный в
данном фильтре, обеспечивает передачу в накопитель комментария
(новыенеизвестные $\ldots$) всех утверждений, в которых выделено
требуемое вхождение х4.

Таким образом, при применении приема будет сохранено указание на
повторный просмотр всех утверждений списка $A$, имеющих вхождение
произведения $b$ на $c$. Этот просмотр будет необходим, если
данный прием выделит произведение $bc$ в явном виде - тогда в
других утверждениях его тоже придется выделять в явном виде из
произведений, содержащих, кроме $b$ и $c$, дополнительные
множители.

Фильтр "контекст(внешвхождение(х4) вид(х4 плюс(х5 умножение(х6
$b$) ум\-но\-же\-ние(х6 $c$))) единица(0 х5) единица(1 х6)
буфер(новыенеизвестные базавхождения(х4) ))" \ аналогичен
предыдущему - он проверяет наличие в рассматриваемых
утвер\-жде\-ни\-ях суммы вида $kb + kc$.

Фильтр "не(контекст(внешоперанд(х4) вид(х4 степень(х5 2))
контекст(список(х6 $b$ $c$) контекст(внешвхождение(х7) вид(х7
умножение(х8 х5 х6)) единица(1 х8)) кон\-текст(внешвхождение(х7)
вид(х7 плюс(х8 умножение(х9 х5) умножение(х9 х6))) еди\-ни\-ца(0
х8) единица(1 х9)))))" \ проверяет, нельзя ли подобрать для $b$
либо $c$ другую пару - некоторое новое слагаемое $e^2$ той же
суммы, в которую входят $b^2,c^2$ , причем так, чтобы снова были
выполнены оба предыдущих фильтра. Если это сделать мож\-но, то
ситуация с преобразованием неоднозначная, и применение данного
приема тогда просто отменяется.

Указатель "уровень(3)" \ определяет третий уровень для попыток
применения при\-ема. Нормализаторами общей стандартизации
обрабатываются только явно вы\-де\-лен\-ные в правой части
равенства сумма и произведение выражений $b,c$. Заметим, что в
этой части возникает вложенное произведение - двойка умножается на
произведение $bc$. Это необходимо для последующего переобозначения
выделенных вхождений на новые неизвестные, и применение каких-то
других нормализаторов общей стан\-дар\-ти\-зации к правой части
может ее испортить.

\subsubsection{Нормализатор группировок}

В процессе развития решателя в ГЕНОЛОГ был введен еще один тип
нормализато\-ров, который впоследствии так и не был востребован.
Однако, в определенных си\-ту\-а\-ци\-ях он может оказаться
полезным, и здесь мы вкратце опишем его работу. При выполне\-нии
цепочки преобразований выражения, направленных на уменьшение
некоторого функционала, например, на уменьшение длины этого
выражения, можно перед каждым шагом изменения выражения сначала
накапливать множество раз\-лич\-ных альтернативных преобразований,
и лишь по исчерпании новых вариан\-тов принимать окончательное
решение. Это решение заключается в определении наи\-бо\-лее
ценных, с точки зрения принятого функционала, преобразований
обрабаты\-ва\-е\-мо\-го терма, причем отбирается максимальная
группа попарно не пересекающих\-ся наиболее ценных локальных
изменений, которые и выполняются одновременно. Такой режим работы
нормализатора задается указателем "группировка" \ в описа\-нии его
формата. Следует заметить, что нормализаторы данного типа обладают
ощутимо меньшим быстродействием по сравнению с обычными
нормализаторами, выполняющими свои преобразования сразу по
обнаружению их возможности. Эф\-фе\-кт отбора лучшего варианта
обеспечивается у последних распределением приемов по различным
уровням и уточнением логики принятия решения. Единственное
пре\-и\-му\-щест\-во нормализаторов с указателем "группировка" \
(будем называть их нор\-ма\-ли\-за\-торами группировки) -
возможность почти не заботиться о фильтрах их приемов. По
существу, такой нормализатор представляет собой просто список
тождеств, край\-не слабо обработанных с точки зрения управления.
Разумеется, это удешевляет нор\-ма\-ли\-за\-тор, но сказывается на
качестве его работы.

По этой причине, единственным сохранившимся нормализатором
группировки в решателе является нормализатор "группмножество",
используемый для сокращенной переформулировки выражений из алгебры
множеств. Его можно найти в разделе ("Алгебра множеств",
"Множество", "Нормализатор группировки ГРУПП\-МНО\-ЖЕ\-СТВО").
Приемы его практически ничего, кроме теоремы, заголовка и
указа\-те\-ля уровня срабатывания, не содержат, и здесь мы их не
приводим.


\subsection{Приемы проверочных операторов}

Приемы проверочных операторов обычно просты; рассмотрим сначала
нес\-коль\-ко приемов оператора "усмменьшеилиравно",
предназначенного для проверки не\-стро\-гих неравенств. Это -
большой оператор, число приемов которого приближается к трем с
половиной сотням. Хотя формально он обслуживает произвольные
не\-стро\-гие неравенства $a \le b$, однако, если $a$ и $b$
ненулевые, один из его приемов сразу сводит проверку данного
неравенства к проверке неравенства $a-b \le 0$. Поэтому
практически все остальные приемы оператора имеют дело только с
неравенствами, одна из частей которых - нулевая. Выберем прием,
используемый для усмотрения неположительности произведения. Он
расположен в разделе ("Эле\-мен\-тар\-ная ал\-геб\-ра",
"Неравенства", "Меньшеилиравно", "Проверочный оператор
УСМ\-МЕНЬ\-ШЕ\-ИЛИ\-РАВНО", "Алгебраические операции", "Усмотрение
знака про\-из\-ве\-де\-ния"); берется последний прием раздела.
Теорема приема имеет вид:
$$\forall_{ab}(a \le 0 \ \& \ 0 \le b \rightarrow ab \le 0).$$

Заголовок приема - "спуск(усмменьшеилиравно)". Единственный фильтр
"уро\-вень(2)" \ определяет второй уровень срабатывания приема.
Указатель "блокпрове\-рок(1 2)" \ определяет рекурсивное
применение того же самого оператора для про\-вер\-ки первого и
второго антецедентов. Указатель "титр(набор(1 терм($b$ $a$)))" \
опре\-де\-ля\-ет подстановку выражений $b$ и $a$ вместо скобок в
шаблон текстформульно\-го сопровождения, имеющий вид
"Неположительность произведения неотрицательно\-го множителя () на
неположительный множитель ()".

Очевидно, что кроме данного приема, для проверки нестрогого знака
про\-из\-ве\-де\-ния необходимы еще прием, устанавливающий
неотрицательность произведения неположительных множителей, а также
прием, устанавливающий неотрицательность произведе\-ния
неотрицательных множителей. Оба эти приема расположены в том же
разделе. Последний из них ин\-те\-ре\-сен тем, что в нем все
сомножители рассматри\-ва\-ют\-ся одновременно, вместо выделения
их по одному, как в первых двух приемах. Так как это может
несколько ограничить способность усмотрения неотрицательности
(если по отдельности знаки множителей какого-либо фрагмента не
устанавливаются, а известен лишь знак всего фрагмента целиком), то
дополнительно введен прием усмотрения неотрицательности
произведения неотрицательных множителей, ана\-ло\-гич\-ный первым
двум - с увеличенным на единицу уровнем срабатывания.

Прием для усмотрения неотрицательности произведения группы
неотрицатель\-ных сомножителей имеет такого же вида теорему, как и
первые два приема:
$$\forall_{ab}(0 \le a \ \& \ 0 \le b \rightarrow 0 \le ab).$$

Хотя в ней всего два множителя, однако указатель
"дистрибразвертка(фикс(0 2))" \ обобщает ее на случай
произвольного числа множителей. В остальном этот прием ничем не
отличается от рассмотренного выше.

Иногда неотрицательность выражения нужно установить лишь в
произвольно малой окрестности заданной точки. Тогда к списку
посылок оператора "усм\-мень\-ше\-илиравно" \ добавляется
утверждение "стремится($x$ $a$ $b$)", или, в формульной записи, $x
\to a \backslash b$; здесь $b$ - указатель типа окрестности
(двусторонняя, левая, правая). Это утверждение - лишь техническая
условность, позволяющая избежать навешиваний кванторов на весь
текущий контекст. В качестве примера приема, учитывающего наличие
данного утверждения, рассмотрим прием, который для установления
не\-от\-ри\-цательности выражения в окрестности точки вычисляет
предел его в данной точке. Теорема приема имеет вид:
$$\forall_{abcx}(x \to a \backslash b \ \& \ c = \lim_{x \to a
\backslash b}f(x) \ \& \ (c = \infty \vee 0 < c)\rightarrow 0 \le
f(x)).$$ Заголовок приема - "спуск(усмменьшеилиравно)"; фильтр
"уровень(3)" \ определяет его применение на третьем уровне.

Фильтр "не(входит(предел $c$))" \ проверяет, что предел удалось
вычислить. Фильтр "входит($x$ фикс(0 2))" \ проверяет, что
переменная $x$, для которой задано стремление к $a$, входит в
рассматриваемое выражение - иначе вычисление предела ничего не
изменит. Фильтр "коммент(быстрпроверка)" \ блокирует применение
приема в си\-ту\-а\-циях, когда есть указание на проведение
ускоренной проверки неотрицательности, так как вычисление предела
может оказаться достаточно трудоемкой процедурой.

Комментарий "перестановка" \ вводится приемами, которые для
проверки не\-ра\-вен\-ства предпринимают попытку перестановки его
частей одновременно с измене\-ни\-ем знаков всех слагаемых этих
частей. В данном случае имеются два независи\-мых аналогичных
приема - один для проверки неотрицательности, другой для проверки
неположительности. Поэтому применение приема при наличии
комментария "пе\-ре\-ста\-новка" \ излишне, и отмена его
обеспечивается фильтром "коммент(перестанов\-ка)".

Фильтр "не(контекст(комментарий(слагаемое меньше $d$)))" \
аналогичен пре\-ды\-ду\-ще\-му. Комментарий (слагаемое меньше
$\ldots$) вводится, например, если проверка неравенства $0 \le a$
сводится, с помощью неравенства $0 \le a+b$ из посылок, к проверке
$0 \le b$, а также в ряде аналогичных случаев. Таких переходов
может оказаться достаточно много, и для ускорения проверок в этих
случаях вычисление предела блокируется.

Указатели "идентификатор(2)", "блокпроверок(3)",
"отображение($f$)" \ - стан\-дарт\-ные. Указатель "потвор(1)" \
отменяет ограничения на повторное использование ут\-вер\-ждения
"стремится($\ldots$)". Такие ограничения вводятся автоматически
для всех утверждений списка посылок, уже идентифицированных
некоторым внешним (по цепочке обращений) пакетным оператором. Это
делается лишь для предотвращения зацикливаний в рекурсивных
обращениях, и в особых случаях может отменяться.

Для вычисления предела правая часть второго антецедента
обрабатывается нор\-ма\-ли\-за\-тором "нормпредел".

\par\bigskip

Кроме проверочных операторов "усмменьшеилиравно" \ и "усмменьше",
обес\-пе\-чи\-ва\-ющих сравнительно быструю проверку нестрогих
либо строгих неравенств, введены еще два проверочных оператора -
"провменьшеилиравно" \ и "провменьше", пред\-наз\-на\-ченные для
усиленной проверки, с привлечением ряда специальных неравенств
типа неравенства для среднего геометрического и среднего
арифметического. Хотя число приемов в этих операторах и невелико,
но работают они в режиме перебора группировок, и обращаться к ним
слишком часто нецелесообразно. В качестве при\-ме\-ра
рас\-смот\-рим прием оператора "провменьшеилиравно", позволяющий
группиро\-вать в правой части неравенства неотрицательную сумму.
Эта сумма составляется из частично используемых двух положительных
членов, коэффициенты которых выбираются так, чтобы получилась
сумма квадратов некоторых выражений, а модуль третьего члена суммы
оказался равен удвоенному произведению этих выражений. Прием
расположен в разделе ("Элементарная алгебра", "Неравенства",
"Мень\-ше\-или\-равно", "Проверочный оператор ПРОВМЕНЬШЕИЛИРАВНО",
"Поглощение од\-ного слагаемого двумя с применением квадратичной
оценки"). Берется второй из двух приемов раздела. Теорема приема
имеет вид:

\par\medskip

$\forall_{abcdefghij}(0\le a \ \& \ 0\le b \ \& \ c^2=ab \ \& \
d=2e-|f| \ \& \ g=2h-|f| \ \& \ 0 \le d \ \& \ 0\le g \ \& \ 2j
\le da+gb+2i\rightarrow j \le ea+hb+fc+i)$

\par\medskip

Эта теорема возникла следующим образом. Для проверки неравенства
$j \le ea+hb+fc+i$, у которого $e,h,f$ - численные коэффициенты;
выражения $a,b$ не\-от\-ри\-ца\-тельны, причем $c$ равно
произведению квадратных корней из $a$ и $b$ (что
фор\-му\-ли\-ру\-ет\-ся в теореме приема как $c^2=ab$),
предпринимается представление правой части в виде
$$(e-\frac{|f|}{2})a+(h-\frac{|f|}{2})b + (\frac{|f|}{2}a
+\frac{|f|}{2}b + f \sqrt a \sqrt b)+i.$$ Третье слагаемое,
очевидно, представляет собой полный квадрат и поэтому
не\-от\-ри\-ца\-тельно. Обозначая коэффициенты первых двух
слагаемых через $d/2,g/2$ и от\-бра\-сы\-вая неотрицательное
третье слагаемое, получаем, что нужно установить не\-ра\-вен\-ство
$j \le (d/2)a+(g/2)b+i$, или, после устранения знаменателей, $2j
\le da+gb+2i$.

Заголовок приема - "спуск(провменьшеилиравно)". Фильтры
"десчисло($e$)", "дес\-число($h$)", "десчисло($f$)" \ указывают
компилятору, что $e,h,f$ должны иденти\-фи\-ци\-ро\-ваться с
десятичными числами. Фильтр "не(легковидеть(меньшеилиравно(0
ум\-но\-же\-ние($f$ $c$))))" \ блокирует применение приема в
случае, когда поглощаемое слагаемое $fc$ само является
неотрицательным. Фильтр "уровень(1)" \ определяет применение
приема на первом уровне сканирования. Обычно такой фильтр
размещался вначале, однако действительный порядок размещения
фильтров в программе приема не очень сильно зависит от порядка
размещения их в описании приема; в данном случае расположение
фильтра совершенно несущественно.

Фильтр "или(меньше(количествооперандов(фикс(0 2)) 6)меньше(1
число(вид(\\ фикс(0 2) плюс(х11 х12)) единица(0 х11)
не(легковидеть(меньшеилиравно(0 х12))\\ ))))" \ блокирует
применение приема, если число слагаемых правой части слиш\-ком
велико (больше пяти), а число тех из них, для которых не
усматривается неотри\-ца\-тель\-ность, не более одного. Фильтр
"контекст(входит(х11 параметры(фикс(0 2)))\\ меньше(1
число(разряд(фикс(0 2)х11 х12))))" \ требует, чтобы правая часть
неравен\-ства имела хотя бы одну переменную, встречающуюся
неоднократно.

Указатель "блокпроверок(1 2)" \ определяет использование
проверочного опера\-то\-ра для усмотрения неотрицательности
выражений $a,b$. Заметим, что здесь будет использован проверочный
оператор "усмменьшеилиравно". Оператор "провмень\-ше\-или\-равно",
как оператор усиленной проверки, требует указателя
"про\-вер\-ка($\ldots$)". Такой указатель "проверка(8)" \
определяет рекурсивное обращение для проверки результирующего
неравенства $2j \le da+gb+2i$. Напомним, что различие между
обычным и усиленным проверочными операторами заключается в
описании их фор\-мата. Первый задается термом вида
"легковидеть($\ldots$)", по которому создается спра\-вочник
"легковидеть"; второй - термом вида "проверка($\ldots$)", по
которому создается справочник "проверка".

Указатель "идентификатор(3)" \ определяет использование третьего
антецедента для идентификации переменной $b$ по уже
идентифицированным $a,c$. Указатель "про\-грамма(4 5 6 7)" \
определяет использование антецедентов, начиная с четвертого по
седьмой, для непосредственных вычислений с десятичными числами.
Указатели "еди\-ница(1 $b$ $e$ $h$ $f$)", "заменазнака(минус $e$
$h$ $g$)", "единица(0 $i$)" \ уточняют вырожденные случаи при
идентификации переменных.

Указатели "определено(фикс(0 2 2)$b$)" \ и "определено(фикс(0 2
1)$c$)" \ блоки\-ру\-ют идентификацию слагаемого $hb$ до тех пор,
пока переменная $b$ не будет иден\-ти\-фи\-ци\-ро\-вана из
третьего антецедента, а слагаемого $ea$ - пока не будет
идентифицировано $c$. Это уменьшает перебор в попытках применения
приема - сначала будет иден\-ти\-фи\-ци\-роваться слагаемое $fc$,
затем - слагаемое $ea$, далее будет рассматриваться третий
антецедент, который, во-первых, отсечет те слагаемые $ea$, у
которых $c^2$ не делится на $a$, а, во-вторых, определит $b$ для
однозначной идентификации слагаемого $hb$.

Указатель "пересечениесписков(фикс(3 2))" \ явно указывает
компилятору, что правая часть третьего антецедента может
идентифицироваться с выражением, за\-го\-ло\-вок которого отличен
от символа "умножение".

Указатели "перечень($f$ десчисло($f$))", "перечень($e$
десчисло($e$))" \ относят к $e,f$ все числовые множители
слагаемых, идентифицируемых с $ea$,$fc$, таким образом
по\-зво\-ляя однозначно выделить $e$ и $c$. Оставшиеся указатели
используются для фор\-ми\-ро\-ва\-ния текстформульных пояснений.

\par\bigskip

В заключение рассмотрим проверочный оператор из геометрии -
оператор "од\-на\-сторона" \ для усмотрения того, что две точки
плоскости лежат по одну сторону от заданной прямой. В случае
размещения точек по разные стороны имеется двой\-ст\-вен\-ный
оператор "разныестороны". Оба оператора - сравнительно большие,
имеют око\-ло сотни приемов каждый, и весьма часто используются в
геометрических приемах. Выберем прием оператора "однасторона",
усматривающий размещение двух точек по одну сторону от прямой из
соображений двукратного перехода через эту прямую при движении по
ломаной. Он расположен в разделе ("Элементарная геометрия",
"Однасторона", "Проверочный оператор ОДНАСТОРОНА", "Двойной
переход через прямую"). Опуская несложный чертеж, приведем сразу
теорему приема:

\par\medskip

$\forall_{ABCDEFG}(D \in \mbox{отрезок}(CE) \ \& \ F \in
\mbox{отрезок}(CG) \ \& \ D \in \mbox{прямая}(AB) \ \& \ F \in
\mbox{прямая}(AB) \ \& \ \mbox{разныеточки}(C,D) \rightarrow
\mbox{однасторона}(E,G,\mbox{прямая}(AB)))$.

\par\medskip

Здесь точка $E$ является концом отрезка $CE$, на котором лежит
точка $D$ рас\-смат\-ри\-ва\-емой прямой $AB$. Последний
антецедент требует, чтобы точки $C,D$ различались, так что либо
точка $E$ сама лежит на прямой, и тогда любая точка оказывается по
отношению к ней лежащей по ту же сторону от прямой (отношение
"однасторона" \ нестрогое), либо точка $E$ и точка $C$ не лежат на
прямой и находятся от нее по разные стороны. В любом случае конец
$G$ отрезка $CG$, пересекающегося с прямой в некоторой точке $F$,
будет лежать с точкой $E$ по одну сторону от прямой $AB$.

Прием имеет заголовок "спуск(однасторона)". Фильтр "уровень(3)" \
определяет уровень его срабатывания; фильтры "не(равно($C$ $D$))"
\ и "не(равно($C$ $F$))" \ - ус\-ко\-ря\-ющие. Первый из них
отбрасывает случаи совпадения точек $C,D$ еще до обращения к
проверочному оператору "разныеточки". Второй - отбрасывает
вырожденный случай совпадения точек $C,F$, в котором нет
надобности применять данный прием, так как здесь точка $E$ должна
будет лежать на прямой $AB$, и сработает другой прием.

Указатель "усм(1 2 3 4)" \ определяет использование
идентифицирующих опе\-ра\-то\-ров при обработке первых четырех
антецедентов, указатель "блокпроверок(5)" \ - обращение к
проверочному оператору для обработки последнего антецедента.

\subsection{Приемы синтезаторов}

Синтезатор представляет собой пакетный оператор для подбора
значений одного или нескольких операндов заданного отношения, при
которых это отношение становится истинным. Здесь возможна либо
однократная выдача результата, либо перечисление серии
результатов, отбираемых на основе каких-либо эвристических
соображений приемами синтезатора. Как уже говорилось ранее,
синтезатор является пакетным аналогом задачи на описание, причем
для случая, когда эта задача имеет единст\-вен\-ное условие -
реализуемое синтезатором отношение. Свое название синтезатор
получил из-за того, что обычно его прием сводит рассматриваемое
отношение к одному или нескольким более простым отношениям, и
после реализации их состав\-ля\-ет ("синтезирует") свой ответ из
полученных элементов.

В качестве первого примера синтезатора рассмотрим оператор
"верхняяоценка", используемый для нахождения константных верхних
оценок численных выражений. Реализуемое синтезатором утверждение
имеет вид $a \le b$, причем переменная $a$ рассматривается как
входная, а переменная $b$ - как выходная. Указатель
"пере\-чис\-ле\-ние" \ в описании формата оператора определяет
использование его в режи\-ме перечисления верхних оценок. В
действительности, такое перечисление обычно не очень велико и
зависит от того, сколько различных способов оценивания выраже\-ния
$a$ оказалось предусмотрено в приемах синтезатора. Какая именно из
версий найден\-ных верхних оценок окажется достаточной -
определяется внешним приемом, обратившимся к синтезатору.

Оператор "верхняяоценка" \ имеет четыре уровня срабатывания; он не
очень велик - насчитывает около 50 приемов. Рассмотрим прием этого
оператора, получающий верхнюю оценку для линейной комбинации
синуса и косинуса. Он расположен в разделе ("Элементарная
алгебра", "Неравенства", "Меньшеилиравно", "Синтезатор
ВЕРХНЯЯОЦЕНКА", "Линейная комбинация синуса и косинуса"). Теорема
приема имеет вид:

$$\forall_{abc}(a \sin b + c \cos b \le \sqrt{a^2+c^2}).$$

Заголовок приема - "значение(верхняяоценка)". Прием имеет два
фильтра - "кон\-станта($a$)" \ и "константа($c$)", так что
применим только к линейным комбинациям синуса и косинуса, имеющим
постоянные коэффициенты. При необходимости его легко обобщить на
случай неконстантных коэффициентов, обратившись рекурсивным
образом к получению верхней оценки для радикала в правой части
неравенства. Указатели и нормализаторы приема - стандартные.

Другой пример использования синтезатора - определение периода
числовой функ\-ции. Заголовок синтезатора - "период"; реализуемое
отношение - "периодична($a$ $b$)", истинное, если $b$ есть
какой-либо из периодов функции $a$. Приведем три простых приема
этого синтезатора. Первый из них определяет период синуса; второй
- от\-бра\-сы\-вает при определении периода внешнюю одноместную
операцию; третий - находит период результата двуместной операции.
Эти приемы расположены в разделе ("Ма\-те\-ма\-тический анализ",
"Общий свойства числовых функций", "Периодичность",
"Син\-те\-за\-тор определения периода ПЕРИОД") - соответственно, в
подразделах "Синус и косинус"; "Одноместная операция - общий
случай"; "Двуместная операция". Тео\-ре\-ма первого из них имеет
вид:
$$\forall_{abc}(\mbox{периодична}(\lambda_x(\sin
(\frac{ax}{b}+c),\mbox{число}(x)),\frac{2 \pi b}{|a|})).$$

Заголовок приема - "значение(период)"; единственный фильтр -
"уровень(1)". Указатели и нормализаторы - стандартные. Этот прием
относится к категории "за\-вер\-ша\-ющих" \ приемов,
предназначенных для немедленной выдачи результата. Вто\-рой и
третий приемы обеспечивают рекурсию, подготавливающую возможность
при\-ме\-не\-ния завершающих приемов. Теорема второго приема имеет
вид:
$$\forall_{fga}(\mbox{периодична}(\lambda_x(f(x),\mbox{число}),a)
\rightarrow
\mbox{периодична}(\lambda_x(g(f(x)),\mbox{число}),a)).$$ Указатель
"символ($g$)" \ определяет идентификацию переменной $g$ с символом
одно\-мест\-ной операции. Эта операция отбрасывается, и указатель
"значения(1)" \ опре\-де\-ля\-ет рекурсивное обращение для
определения периода "упрощенной" \ таким образом функции.

Теорема третьего приема имеет вид:

\par\medskip

$\forall_{fgabcdmn}(\mbox{периодична}(\lambda_x(f(x),\mbox{число}(x)),a)
\ \& \ \mbox{периодична}(\lambda_x(g(x),\mbox{число}(x)),b) \ \&
\\
a = nc/pd \ \& \ b = mc/qd \ \& \ \mbox{целое}(n) \ \& \
\mbox{целое}(m) \ \& \ \mbox{целое}(p) \ \& \ \mbox{целое}(q)
\rightarrow \mbox{периодична}\\
(\lambda_x(f(x)+g(x),\mbox{число}(x)), \mbox{нок}(mp,nq)c /
pqd))$.

\par\medskip

Для определения периода суммы двух функций определяются периоды
$a,b$ сла\-га\-е\-мых, и если эти периоды соизмеримы, то находится
их наименьшее общее кратное, которое и выдается в качестве
результата. Указатель "вариант(фикс(0 1 3)умножение дробь
степень)" \ обобщает этот прием на случай других двуместных
арифмети\-чес\-ких операций. Фильтры "входит($x$ фикс(1 1 3))" \ и
"входит($x$ фикс(2 1 3))" \ ограничивают применение приема лишь
случаями, когда оба слагаемых содержат переменную $x$. В случае
константного слагаемого применяется другой прием, просто
отбрасывающий это слагаемое. Указатели "значения(1)" \ и
"значения(2)" \ определяют рекурсивные обращения к нахождению
периодов слагаемых. Прочие указатели приема и его
нор\-ма\-лизаторы - стандартные.

В заключение рассмотрим геометрический синтезатор
"вычислениедлины", ко\-то\-рый используется для вычисления длины
некоторого расстояния. Он несколько отличается от разобранных
выше, так как результатом его примене\-ния служит не выражение для
искомого расстояния, а лишь конъюнкция соотношений, из которых
такое расстояние может быть найдено. Синтезаторы этого типа обычно
используются в контексте вывода следствий при анализе некоторой
системы утверждений. Фак\-ти\-чес\-ки, синтезатор здесь лишь
составляет план вычислений, а сами вычисления, после перенесения
найденной конъюнкции соотношений в список посылок текущей задачи
на исследование, реализуются обычными приемами сканирования
задачи. Это упрощает приемы синтезатора и делает планирование
вычислений более гибким.

В качестве примера рассмотрим прием синтезатора, использующий
теорему си\-ну\-сов для вычисления стороны треугольника по
известным стороне и двум углам. Этот прием расположен в разделе
("Элементарная геометрия", "Расстояние", "Синтезатор
ВЫЧИСЛЕНИЕДЛИНЫ", "Теорема синусов"). Берется первый прием
раздела.

Опуская чертеж (изображение треугольника $ABC$), приведем сразу
теорему при\-ема:

\par\medskip

$\forall_{ABC}(\mbox{актив}(\angle(ABC)) \ \& \
\mbox{актив}(\angle(ACB)) \ \& \ \mbox{актив}(l(AB))\rightarrow
\mbox{вычислениедлины}(\\ l(AC), \sin(\angle(ABC))l(AB) =
\sin(\angle(ACB))l(AC)))$.

\par\medskip

Заголовок приема - "значение(вычислениедлины)". Фильтр
"уровень(3)" \ оп\-ре\-де\-ляет уровень срабатывания. Фильтры
"конец(известно(терм(расстояние($AB$))))",
"конец(известно(терм(угол($A$ $B$ $C$))))",
"конец(известно(терм(угол($A$ $C$ $B$))))" \ ука\-зы\-ва\-ют, что
длина стороны $AB$ и углы $ABC$, $ACB$ известны. Размещение
выражений "расстояние($\ldots$)", "угол($\ldots$)" \ под символом
"терм" \ означает, что рассматриваться будут не сами эти
выражения, а результаты обработки их нормализаторами приема. В
данном случае это нормализаторы "нормрасстояние", "нормугол",
которые не делают практически ничего, кроме усмотрения в контексте
равенства, дающего своей правой частью выражение $R$ для
рассматриваемого расстояния либо угла, и замены преобразуемого
терма на $R$. Обработка фильтров отнесена на конец программы
приема - сначала выполняется идентификация антецедентов теоремы.
На это ука\-зы\-ва\-ет размещение фильтров под символом "конец".

Фильтры "усм(актив(прямая($AB$)))", "усм(актив(прямая($AC$)))",
"усм(актив(\\ прямая($BC$)))" \ означают, что прямые для сторон
треугольника должны быть вве\-де\-ны в рассмотрение.

Указатель "усм(1 2 3)" \ определяет обработку первых трех
антецедентов теоре\-мы идентифицирующими операторами.
Нормализаторы приема - стандартные.

\subsection{Приемы анализаторов}

Анализаторы представляют собой пакетные операторы для быстрого
вывода след\-ствий с определенной целью. По достижении данной цели
вывод обрывается, и ото\-бран\-ные утверждения переносятся из
накопителя анализатора в список посылок внешней задачи. Экономия
от использования анализатора состоит в том, что каждое новое
ут\-вер\-жде\-ние здесь рассматривается существенно меньшим числом
приемов, чем это было бы при занесении его в список посылок
задачи. В результате появляется возможность просматривать весьма
значительные списки следствий за умеренное время;
пере\-не\-се\-ние всех этих следствий в основную задачу привело бы
к непомерному замедлению ее решения - эффекту "увязания" \
решателя в массиве малополезных длинных ут\-вер\-жде\-ний. Роль
накопителя играет в анализаторе вспомогательная задача на
исследование, копирующая список посылок текущей задачи.

В качестве примера рассмотрим, прежде всего, анализатор
"сложениеуравнений", используемый для вывода следствий при решении
систем уравнений в элементар\-ной алгебре. Он имеет совсем немного
приемов (около десятка). Включение анализато\-ра предпринимается
дважды - сначала на третьем уровне текущей задачи на
иссле\-до\-ва\-ние он активизируется для применения приемов
нулевого и первого уровней; затем, по достижении седьмого уровня
сканирования задачи, активизируется уже до наибольшего своего
уровня, равного двум.

Выберем прием этого анализатора, предпринимающий создание линейных
ком\-би\-на\-ций двух уравнений, имеющих "подобные" \ неизвестные
члены. Этот прием рас\-поло\-жен в разделе ("Элементарная
алгебра", "Плюс", "Анализатор СЛО\-ЖЕ\-НИЕ\-УРАВ\-НЕ\-НИЙ",
"Линейная комбинация уравнений, имеющих неизвестные члены,
отличающиеся лишь известными коэффициентами"). Теорема приема
имеет вид:
$$\forall_{abcdefgh}(ag+b=c \ \& \ ah+d=e \ \& \
f=bh-dg-ch+eg\rightarrow f=0).$$ Здесь первый и второй антецеденты
суть исходные уравнения; коэффиценты $g,h$ предполагаются в приеме
не содержащими неизвестных, а выражение $a$ - содержащим. Из
второго уравнения, домноженного на $g$, вычитается первое,
домноженное на $h$; все члены переносятся в левую часть, и
определяется результат $f$ обработки этой части различными
нормализаторами (раскрывание скобок, и т.п.).

Заголовок приема - "внутрвывод(сложениеуравнений)". Фильтр
"не(известно($a$)\\ )" \ указывает, что общая часть двух подобных
членов $ag$,$ah$ должна содержать не\-из\-вест\-ные. Фильтр
"не(контекст(список(х9 $b$ $d$)вид(х9 плюс(х10 дробь(х11
х12)))за\-ме\-на\-зна\-ка(минус х11)единица(0 х10)))" \ означает,
что уравнения не должны иметь дробных слагаемых. Обычно для
уравнения с дробными слагаемыми в задаче на исследование выводится
следствие - результат устранения у него знаменателей.
Ест\-ест\-венно при получении линейных комбинаций уравнений
источники таких следствий отбрасывать.

Фильтр "не(заголовок($f$ 0))" \ отсекает случаи, когда
рассматриваемые уравнения были пропорциональны. Фильтр
"известно($h$)" \ требует, чтобы коэффициент $h$ не содержал
неизвестных. Аналогичное требование для коэффициента $g$ излишне,
так как он изначально формируется в виде произведения всех
известных множителей - согласно указателю "перечень($g$
известно($g$))".

Последним размещен фильтр, сравнивающий новое уравнение с
исходными. Он имеет вид "или($A_1 A_2 A_3$)", где $A_1$
 - подфильтр "упрощение(х9 и($f$ фикс(1 1) фикс(2 1))
число(вид(х9 плюс(х10 х11)) единица(0 х11) не(известно(х10))))";
$A_2$ - подфильтр "упрощение(х9 и($f$ фикс(1 1) фикс(2 1))
числонеизвестных(х9))"; $A_3$ - подфильтр "и(входит(полный
комментарии) контекст(неизвестная(х9) линейно($f$ х9)))". В этих
подфильтрах указатели вхождения "фикс(1 1)" \ и "фикс(2 1)" \
ссылаются на левые части первого и второго исходных уравнений; $f$
есть левая часть нового уравнения. Первый подфильтр означает, что
левая часть каждого из исходных уравнений имеет строго больше
неизвестных слагаемых, чем $f$. Второй означает, что левая часть
каждого из исходных уравнений имеет большее число неизвестных, чем
$f$. Наконец, третий означает, что при обращении к анализатору был
введен комментарий "пол\-ный", причем результат $f$ линеен хотя бы
по одной из неизвестных задачи, входя\-щих в $f$. Заметим, что
комментарий "полный" \ вводится автоматически в тех случаях, когда
максимальный уровень текущей задачи на исследование не менее 7.
При ре\-ше\-нии систем алгебраических уравнений это означает
вторую попытку вывода след\-ствий из объединенного списка условий
и посылок.

Указатели "единица(1 $g$ $h$)" \ и "единица(0 $d$)" \ разрешают
вырожденные единич\-ные значения коэффициентов $g,h$ и обращение в
0 суммы остальных членов левой части второго уравнения. Левая
часть хотя бы одного (пусть оно и будет первым) уравнения должна
иметь хотя бы два неизвестных слагаемых - иначе
резуль\-ти\-ру\-ющее равенство не будет содержать неизвестных.
Указатель "идентификатор(3)" \ определяет ис\-поль\-зо\-вание
третьего антецедента для вычисления $f$. Указатель
"за\-ме\-назнака(минус $g$ $h$)" \ разрешает отнесение минуса,
если он есть, к соответству\-ю\-ще\-му коэффициенту $g,h$.

Указатель "перечень($g$ известно($g$))" \ определяет идентификацию
коэффици\-ен\-та $g$ из совокупности всех сомножителей, не
содержащих неизвестных. Указатель "набороперандов(фикс(1 1
1)фикс(2 1 1))" \ введен для ускорения идентификации. Он отменяет
нахождение общей неизвестной части $a$ двух слагаемых $ag$, $ah$ с
ис\-поль\-зо\-ва\-ни\-ем трудоемкого оператора
"алгебрпересечение", находящего наибольший общий делитель двух
одночленов, и $a$ идентифицируется как пересечение двух групп
сомножителей этих слагаемых. Так как $g,h$ не должны содержать
неизвестных, то при отсутствии неизвестных показателей степеней
это не ограничивает общности идентификации.

Указатели вида "обрыв($\ldots$)" \ используются для формулировки
условий обрыва работы анализатора. При этом только что выведенное
утверждение снабжается ком\-мен\-та\-ри\-ем "внешвывод", и
происходит передача всех выделенных таким ком\-мен\-та\-ри\-ем
посылок анализатора во внешнюю задачу на исследование. В данном
приеме имеем следующие три условия обрыва вывода. Во-первых, это
"обрыв(равно(чис\-ло\-не\-из\-вест\-ных($f$)1))" \ - получение
уравнения с единственной неизвестной. Во вторых,
"обрыв(контекст(вид($f$ плюс(умножение(х9 степень(х10 х13))
умножение(х11 сте\-пень(х12 х13)))) единица(1 х9 х11 х13)
заменазнака(минус х9 х11) неизвестная(х10) неизвестная(х12)
известно(х9) известно(х11) известно(х13)))" \ - получение
уравнения, выражающего пропорциональность двух неизвестных $X,Y$:
$pX^n+qY^n=0$; $p,q,n$ - известны. В-третьих,
"обрыв(заголовок(результат или))" \ - при обработке
нор\-ма\-ли\-за\-торами левой части нового уравнения ее удалось
разложить на несколько не\-из\-вест\-ных множителей, что привело к
преобразованию этого уравнения к виду дизъюнкции более простых
уравнений.

Указатель "прообраз(1 посылки(не(равно($h$ 0))))" \ нужен для
регистрации в ком\-мен\-тариях того факта, что первое уравнение, в
случае ненулевого коэффицента $h$, является следствием второго
исходного уравнения и нового уравнения. Эта ин\-фор\-ма\-ция может
оказаться полезной, если при выводе следствий в блоке анализа
будут найдены значения неизвестных. Тогда будет предпринята
попытка установить с ее помощью, что текущие уравнения задачи на
описание являются следствиями равенств $R$, определяющих значения
неизвестных, а также, быть может, ряда других простых
сопровождающих утверждений $U$ блока анализа. В этом случае
проверка текущих уравнений задачи на описания будет излишней, и
они просто будут заменены на утверждения $R,U$. Указатель
"прообраз(2 посылки(не(равно($g$ 0))))" \ использу\-ет\-ся
аналогичным образом для второго уравнения.

Указатель "примечание(условие(и(не(контекст(неизвестная(х9)
список(х10 \\ фикс(1 1)фикс(2 1)) линейно(х10 х9)))
контекст(неизвестная(х9) линейно($f$ х9))) внешвывод))" \ помечает
новое уравнение комментарием "внешвывод", если оно
ока\-зы\-ва\-ется линейным по некоторой неизвестной, по которой
оба исходных уравнения были нелинейны. Такой комментарий
предопределяет перенесение данного уравнения в список посылок
внешней задачи на исследование по окончании работы анализатора,
без немедленного ее обрыва.

Следующий указатель "примечание(условие(и(контекст(неизвестная(х9)
список(\\ х10 фикс(1 1) фикс(2 1)) не(линейно(х10 х9)))
не(контекст(неизвестная(х9) не(линей\-но($f$ х9))))) внешвывод))"
\ - аналогичен. Он помечает новое уравнение комментарием
"внешвывод", если оно линейно по всем своим неизвестным, а хотя бы
одно из исходных уравнений - не линейно по какой-либо неизвестной.

Правая часть третьего антецедента теоремы обрабатывается
нормализаторами "нормплюс", "стандплюс", "уравнплюс". Первые два
из них обеспечивают рас\-кры\-ва\-ние скобок в линейной
комбинации; третий - приведение подобных членов с из\-вест\-ны\-ми
коэффициентами. После определения $f$ оно обрабатывается
нормализатором "факторизация" \ упрощенного разложения на
множители. Наконец, само новое урав\-нение $f=0$ обрабатывается
нормализатором "нормчисло", который, в частности, может
преобразовать его к виду дизъюнкции, если левая часть имеет вид
про\-из\-ве\-де\-ния.

\par\bigskip

Следующий пример анализатора - оператор "смплощадь", используемый
в ге\-о\-мет\-рии для вывода соотношений, связывающих между собой
площади выделяемых на чертеже фигур. В основном, здесь применяются
приемы, составляющие площадь фигуры из площадей подфигур, а также
приемы, усматривающие пропорциональ\-ность площадей. Анализатор
имеет 5 уровней срабатывания и около сорока приемов. Рассмотрим
один из простейших его приемов, разбивающий треугольник $ABC$ на
два подтреугольника $ABD$,$BDC$, если вершина $B$ соединена
отрезком с точкой $D$ на стороне $AC$, причем известно, в каком
отношении эта точка делит сторону $AC$. Прием расположен в разделе
("Элементарная геометрия", "Фигуры", "Площадь", "Анализатор
СМПЛОЩАДЬ", "Разбиение треугольника на два треугольника лини\-ей,
проведенной из вершины к противоположной стороне"). Берется первый
из при\-емов раздела. Опуская несложный чертеж, приводим сразу
теорему приема:

\par\medskip

$\forall_{ABCDab}(\mbox{актив}(S(\mbox{фигура}(ABC))) \ \& \ D \in
\mbox{отрезок}(AC) \ \& \ al(AD)=bl(CD) \ \& \ \\ \neg(a+b=0)
\rightarrow \mbox{актив}(S(\mbox{фигура}(ABD))) \ \& \
\mbox{актив}(S(\mbox{фигура}(BCD))) \ \& \ S(\mbox{фигура}(\\
ABD)) = bS(\mbox{фигура}(ABC))/(a+b) \ \& \ S(\mbox{фигура}(ABC))
= S(\mbox{фигура}(ABD)) + S(\\ \mbox{фигура}(BCD)))$.

\par\medskip

Заметим, что соотношения пропорциональности в теоремах
геометрических при\-емов обычно записываются так, как это сделано
в третьем антецеденте данной те\-о\-ре\-мы, т.е. $al(AD)=bl(CD)$
вместо $l(AD)/l(CD) = b/a$. Это объясняется, во-первых, тем, что
общая стандартизация посылок приводит к исключению дробей в
равенст\-вах, определяющих пропорциональность величин. Во-вторых,
для усмотрения про\-пор\-циональности используется синтезатор
"пропорциональны", определяющий ко\-эф\-фи\-циенты
пропорциональности $a,b$ по заданным величинам $A,B$, и его
вход\-ной шаблон имеет вид с исключенными дробями - $aB = bA$. В
качестве допусти\-мо\-го результата этот синтезатор может выдавать
только выражения $a,b$, не имею\-щие нечисловых переменных, причем
каждая переменная этих выражений должна быть либо известным
параметром задачи на исследование, либо неизвестной внешней
за\-дачи на описание.

 Первый антецедент означает, что площадь треугольника
$ABC$ уже входила в какую-либо из посылок. В этой ситуации
срабатывает прием, вводящий вспо\-мо\-га\-тельную посылку
"актив(площадь($\ldots$))", чтобы упростить последую\-щие ссыл\-ки
на явно рассматриваемые в задаче площади. Теорема приема вводит в
рассмотре\-ние площади треугольников $ABD$,$BCD$ и регистрирует в
посылках анализатора со\-от\-но\-шения, связывающие их с площадью
треугольника $ABC$.

Прием имеет заголовок "внутрвывод(смплощадь)". Его фильтр
"комментпо\-сыл\-ки(1 смплощадь $D$)" \ нужен для предотвращения
повторного срабатывания с тем же самым разбиением треугольника
$ABC$. После применения данного приема вводится комментарий
(смплощадь $D$) к посылке "актив($S$(фигура($ABC$))", - это делает
ука\-за\-тель "примечпосылки(1 смплощадь $D$)", - и повторные
срабатывания оказываются заблокированы.

Фильтры "не(равно($D$ $A$))", "не(равно($D$ $C$))" \ отсекают
неинтересные случаи совпадения точки $D$ с концами отрезка $AC$.
Наконец, фильтр "усм(актив(прямая($B$ $D$)))" \ требует, чтобы
прямая, соединяющая точки $B,D$, уже была введена в
рас\-смот\-рение. Заметим, что в том же самом разделе имеется
версия данного приема, у которой такая прямая еще не ведена в
рассмотрение; тогда вводится ряд до\-пол\-ни\-тель\-ных фильтров,
и уровень срабатывания приема повышается.

Указатель "уровень(1)" \ определяет первый уровень срабатывания
анализатора. Указатель "значения(3)" \ определяет использование
синтезатора "пропорциональны" \ для определения коэффициентов
$a,b$ в третьем антецеденте. Перед обращением к нему выражения
$l(AD),l(CD)$ обрабатываются нормализатором "норм\-расстояние".
Указатель "блокпроверок(4)" \ определяет использование
проверочного оператора для проверки отличия $a+b$, которое далее
выступает как знаменатель, от нуля. Указа\-тель "усм(2)" \
определяет обработку второго антецедента идентифицирующим
оператором.

Указатель "список(фикс(1 1 1 1))" \ нужен для того, чтобы
треугольник $ABC$ идентифицировался с произвольным порядком
перечисления его вершин в первом антецеденте. Заметим, что в
скобочном представлении этот антецедент имеет вид
"актив(площадь(фигура(набор($A$ $B$ $C$))))", так что указатель
вхождения "фикс(1 1 1 1)" \ относится к подвыражению
"набор($\ldots$)".

Указатели "копия(фикс(0 1 1))", "копия(фикс(0 2 1))" \ отменяют
обработку нор\-ма\-ли\-за\-тором "нормплощадь" \ выражений
$S(\mbox{фигура}(ABD))$, $S(\mbox{фигура}(BCD)$ в ут\-вер\-ждениях
"актив($\ldots$)" \ правой части теоремы. Если бы эти площади были
 вы\-ра\-жены через какие-либо параметры задачи, то утверждения
"актив($\ldots$)", как отметки о рассмотрении площадей конкретных
треугольников, оказались бы испорчены.

Указатель "титр($\ldots$)", обеспечивающий текст-формульное
сопровождение сра\-ба\-ты\-вания приема, и нормализаторы приема -
стандартные.

\subsection{Операторы фильтра}

Операторы фильтра используются в решателе крайне редко, и общее
число их едва ли насчитывает сейчас полтора десятка. Одна из
веских причин прибегнуть к опе\-ра\-то\-ру фильтра - появление
чрезмерно большой дизъюнкции, перечисляющей под\-слу\-чаи, в
которых применение приема допустимо. Помимо того, что эта
дизъюнкция может не поместиться в окне описания приема, успешная
компиляция ее также не гарантирована. В то же время, оператор
фильтра позволяет компилировать про\-грам\-мы проверки отдельных
подслучаев по отдельности, и каких-либо существен\-ных ограничений
на число его приемов нет. В качестве примера рассмотрим оператор
фильтра "фильтрквадратов", используемый для принятия решения о
переходе от произведения суммы двух выражений на их разность к
разности квадратов этих выражений. Он имеет всего 4 приема. Первый
из них проверяет наличие внешней дроби, у которой переход к
разности квадратов дает возможность сокращения. Вто\-рой -
проверяет, не являются ли слагаемые константами, хотя бы одна из
которых - радикал четной степени. Третий прием проверяет, не
является ли заменяемое вхож\-де\-ние корневым, и четвертый -
проверяет, не приводит ли данное преобразование к устранению нигде
более не встречающихся радикалов. При срабатывании хотя бы одного
из приемов оператор получает значение "истина". Рассмотрим запись
первого приема (см. раздел "Элементарная алгебра", "Умножение",
"Усмотрение разности квадратов", "Определение целесообразности
перехода к разности квад\-ра\-тов", "Возможность сокращения дроби
при переходе к разности квадратов").

Приемы операторов фильтра имеют фиктивную теорему - логический
символ "блок". Однако, эта теорема на экран не выводится (чтобы
посмотреть на нее, нуж\-но войти в режим редактирования теоремы
текстовым редактором, нажав Ctr-т). Вместо теоремы выводится текст
первого пункта оглавления для раздела оператора фильтра - он
содержит напоминание о том, какие переменные определены на момент
обращения к оператору и что они означают. В данном случае имеем
текст: "х1,х2 - вхождения суммы и разности выражений х3,х4. х5 -
результат нормализации разности квадратов".

Прием имеет заголовок "контекст(фильтрквадратов)". Его
единственный фильтр - "подтерм(дробь(умножение(х6
теквхожд(х1))умножение(х5 х7)))". Заметим, что для фильтров приема
оператора фильтра не обязательно размещение их внутри конструкции
"контекст($\ldots$)" \ - здесь она играет роль отбрасываемых по
умолчанию внешних скобок. Компилятор восстанавливает эти внешние
скобки автоматически. Поэтому указанный выше фильтр
"подтерм($\ldots$)" \ и не помещен внутри "контекст'а", хотя он
вводит новые переменные х6,х7. Смысл этого фильтра - усмотрение
внеш\-ней дроби, у которой преобразуемые выражения служат
множителями числите\-ля, а знаменатель имеет множитель х5, т.е.
разность квадратов. Указатель "дробь" \ (фактически возникший
из-под отброшенного "контекст'а") разрешает менять в этой
идентификации местами числитель и знаменатель. Указатель
"единица(1 х7)" \ раз\-ре\-шает отсутствовать множителю х7.

 \section{Упражения по работе с редактором прие\-мов}

 \subsection{Поиск приемов}

 Приемы решателя распределены по разделам подробного оглавления,
 устроенного по тематическому принципу. Ссылка на каждый прием
 осуществляется из единственного пункта оглавления, причем иногда
 бывают возможны различные естественные ре\-ше\-ния о выборе такого
 пункта. Поэтому для быстрой ориентации в накопленном материале
 полезна некоторая тренировка. Приведем ряд простых упражнений
 по поиску нужного приема либо раздела.

 \begin{enumerate}

 \item Найти корневое меню оглавления базы приемов. Найти разделы
 "Тригоно\-мет\-рия"; "Окружность"; "Эллипс"; "Вычисление определенных
 интегралов"; "Признаки сходимости знакопеременных рядов";
 "Степень матрицы"; "Урав\-нение в полных дифференциалах"; "Суммы и
 разности мощностей множеств"; "Закон Пуассона"; "Движение по
 наклонной плоскости".

 \item Найти приемы логарифмирования показательных уравнений.
 Выбрать те из них, у которых уравнение имеет ноль в правой части,
 а основанием логарифма служит основание неизвестной степени.

 \item Найти приемы решения строгих квадратных неравенств.
 Объяснить назначение каждого из них.

 \item Найти приемы, выводящие соотношение пропорциональности для
 длин сторон треугольника и длин отрезков, на которые биссектриса
 делит сторону тре\-уголь\-ника. Определить отличие контекстов,
 в которых срабатывают эти приемы.

 \item Найти приемы, выражающие площадь треугольника по формуле
 Герона. Объ\-яс\-нить контексты срабатывания этих приемов.

 \item Найти прием проверочного оператора "усмменьшеилиравно",
 усматривающий неотрицательность синуса угла, заключенного между 0
 и пи.

 \item Найти прием для доказательства индукцией по натуральному
 параметру.

 \item Найти приемы для вычисления суммы геометрической
 прогрессии.

 \item Найти приемы интегрирования с помощью подстановок Эйлера.

 \item Найти прием вычисления математического ожидания по
 известной плот\-нос\-ти распределения случайной величины.

 \item Найти все приемы вывода, теорема которых содержит символы
 "биссектриса" \ и "трапеция".

 \item Найти все приемы, вводящие комментарий "промежуток" \ к
 текущему терму задачи.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Из главного меню системы нажатием клавиши "г" \ войти в
 оглавление приемов. Затем нажимать клавишу "курсор влево" \ до
 тех пор, пока картинка не пере\-ста\-нет изменяться. Это и будет
 корневое меню оглавления базы приемов. Даль\-ней\-ший поиск ведется
 сообразно названиям разделов - например, к разделу "Тригонометрия" \
 через пункт "Элементарная алгебра". Раздел "Окружность" \ можно
 найти как в подразделе "Элементарная геометрия" \ (через
 подраздел "Фигуры"), так и в разделе "Аналитическая геометрия" \
 (через подраздел "Ли\-нии второго порядка"). Естественно, приемы
 последнего раздела связаны толь\-ко с уравнением окружности.

 \item Нужные приемы расположены в подразделе ("Элементарная
 алгебра", "Сте\-пе\-ни", "Решение уравнений", "Показательные
 уравнения", "Логарифмирование показательных уравнений").
 В этом разделе имеется около десяти различных приемов. При записи
 нового приема в раздел он попадает в начало раздела, поэтому
 просмотр приемов раздела "в хронологическом" \ порядке нужно
 на\-чи\-нать с конца раздела, перейдя к нему нажатиями клавиши
 "курсор вниз" \ - пока картинка не перестанет изменяться.

 Наличие нескольких различных приемов логарифмирования уравнения
 объ\-яс\-ня\-ет\-ся следующими причинами. Во-первых, по-разному можно
 выбирать ос\-но\-ва\-ние логарифма - иногда это основание одной из
 имеющихся в уравнении степеней с неизвестным показателем, иногда
 - основание другого логарифма, уже имеющегося в задаче, иногда, если
 из прочих соображений разумного ос\-но\-ва\-ния выбрать не удается, просто
 константа 2. Далее, по-разному может происходить группировка
 членов в уравнении. Если есть всего два неизвестных слагаемых, то
 оба они группируются в левой части, а правая часть - нулевая.
 Если одно слагаемое неизвестное, а другое - известное, то они
 находятся в разных частях уравнения. Наконец, выделено несколько
 особо простых случаев, для которых предусмотрены специальные
 приемы, срабатывающие на малом уровне.

 Приемы, которые требуется найти в упражнении - это второй и седьмой
 приемы, считая с конца.

 \item Приемы находятся в разделе ("Элементарная алгебра",
 "Неравенства", "Мень\-ше", "Решение неравенств", "Квадратные
 неравенства"). Их всего шесть. Про\-смотр их начинаем, как обычно,
 с конца списка.

 Первый и второй приемы относятся к случаю, когда
 вычисленный дискри\-ми\-нант $d$ оказался отличным от нуля, причем не
 удалось усмотреть его от\-ри\-ца\-тель\-ность. В первом приеме квадратный
 двучлен расположен справа от знака "меньше", во втором - слева
 от этого знака. Заметим, что известный свободный член при стандартизации
 неравенств попадает в противоположную часть неравенства. Оба приема
 совершенно аналогичны. Иногда в таких случаях удается создать один
 общий прием, используя указатели идентификации. Од\-на\-ко, не всегда для
 этого хватает возможностей текущей версии ГЕНОЛОГа. С другой стороны,
 интерфейс предоставляет возможность быстрого "тира\-жи\-ро\-вания" \ уже
 введенной версии приема - она копируется, и вводятся необходимые
 изменения. Таким образом могут появляться достаточно большие
 группы (де\-ся\-ток и более) однотипных приемов. Надобность в этом
 "ти\-ра\-жи\-ро\-вании" \ воз\-ни\-кает не очень часто, а на быстродействии
 решателя оно прак\-ти\-чес\-ки никак не отражается, так что особых стимулов в
 развитии указателей ГЕНОЛОГа для борьбы с ним пока не имеется.

 Третий и четвертый приемы относятся к случаю, когда удалось
 усмотреть равенство дискриминанта нулю; пятый и шестой - к случаю
 отрицательного дискриминанта. Хотя во всех этих приемах
 дискриминат вычисляется как бы заново, но в действительности он
 будет вычислен лишь однократно, а затем занесен в буфер, и все
 последующие приемы на протяжении достаточно боль\-шо\-го отрезка времени
 будут брать его прямо из буфера. Это же замечание относится и к
 проверке знака дискримината - результаты ее (в том числе при неудаче)
 тоже хранятся в буфере.

 \item Приемы расположены в разделе ("Элементарная геометрия",
 "Фигуры", "Тре\-угольник", "Отрезок, соединяющий вершину
 треугольника с точкой на про\-ти\-воположной стороне или ее
 продолжении", "Биссектрисы треугольника", "От\-рез\-ки, на которые
 основание биссектрисы делит противоположную сторону,
 пропорциональны боковым сторонам"). Всего имеется три таких
 приема. Пер\-вый прием (считая с конца) анализирует четыре
 участвующих в соотношении пропорциональности величины - длины
 боковых сторон и длины отрезков, на которые сторона делится
 биссектрисой. Если не менее трех из них выражены через числовые
 параметры, известные или неизвестные, то уровень сра\-ба\-ты\-ва\-ния
 приема равен 6; в противном случае прием срабатывает, если
 две из них известны, но уровень срабатывания тогда повышается до 8.
 Второй прием срабатывает, если удается усмотреть соотношение
 пропорциональности с из\-вест\-ными коэффициентами для длин боковых
 сторон; уровень срабатывания его равен 4. Третий прием аналогичен
 второму, но соотношение пропорци\-о\-наль\-нос\-ти усматривается для длин
 отрезков, на которые сторона делится бис\-сек\-три\-сой.

 \item Приемы находятся в разделе ("Элементарная геометрия",
 "Фигуры", "Пло\-щадь", "Тре\-угольник", "Формула Герона"). Число их
 равно трем. Первый при\-ем срабатывает, если все три длины сторон
 треугольника известны, а соот\-но\-ше\-ние для его площади еще не выписывалось;
 уровень срабатывания равен 6. Второй срабатывает, если выражения
 $a,b,c$ для длин сторон либо содержат неизвестную $y$ внешней задачи,
 входящую также в некоторое соотношение с площадью треугольника, либо
 известны, а указанная неизвестная $y$ входит в соотношение с площадью
 треугольника. Наконец, третий срабатывает, если площадь треугольника
 известна, а выражения для длин сто\-рон пропорцио\-наль\-ны некоторой
 неизвестной.

 \item Прием находится в разделе ("Элементарная алгебра",
 "Неравенства", "Мень\-ше\-илиравно", "Проверочный оператор
 УСММЕНЬШЕИЛИРАВНО", "Три\-го\-нометрические функции", "Синус"). Он
 является третьим с конца списка. Фи\-льтр этого приема - ускоряющий;
 он разрешает попытку применения приема лишь тогда, когда в посылках
 имеется обозначение какого - либо угла либо имеется неравенство,
 содержащее хотя бы одну общую переменную с аргумен\-том синуса.

 \item Прием находится в разделе ("Элементарная алгебра", "Целые
 числа", "До\-ка\-за\-тельство индукцией по целочисленному параметру",
 "Простейшая схе\-ма индукции по натуральному параметру").

 \item Приемы расположены в разделе ("Элементарная алгебра",
 "Комбинатор\-ные функции", "Суммавсех", "Сумма геометрической
 прогрессии и суммы, из\-вле\-ка\-емые из нее почленным
 дифференцированием"). Первый из них (с начала списка) дает общую
 формулу суммирования, включающую случай равенст\-ва знаменателя
 прогрессии единице; второй - рассчитан на случаи, когда
 ус\-мат\-ри\-вается отличие этого знаменателя от 1.

 \item Приемы расположены в разделе ("Математический анализ",
 "Интегралы", \\ "Нормализатор нахождения первообразной НОРМИНТЕГРАЛ",
 "Замена пе\-ре\-менной интегрирования", "Степенная функция",
 "Квадратичная функция под радикалом"). Для каждой из подстановок
 Эйлера выделен свой подраздел.

 \item Прием находится в разделе ("Теория вероятностей",
 "Случайные величи\-ны", "Математическое ожидание", "Вычисление
 математического ожидания слу\-чай\-ной величины, для которой известна
 плотность распределения"). Он является приемом вывода, заносящим
 в посылки равенство для математического ожи\-да\-ния. Если бы этот прием
 был реализован как прием замены, то при воз\-ник\-но\-ве\-нии того
 же самого математического ожидания в той же задаче (например, при
 вычислении дисперсии) выкладки пришлось бы повторять.

 \item Помимо оглавления базы приемов, для нахождения нужных
 приемов мож\-но использовать реализованную на ЛОСе процедуру
 "текприем". Собственно говоря, программа этой процедуры представляет
 собой бланк запроса на поиск приемов, и для очередного поиска
 переписывается. Обращения к ней происхо\-дят в цикле полного
 просмотра всех приемов решателя, реализованных на ГЕНОЛОГе.
 При рассмотрении очередного приема процедуре сообщаются сле\-ду\-ющие
 данные: х1 - логический символ, за которым закреплен прием; х2 -
 номер узла статьи этого символа в 8-м информационном блоке,
 хранящем описания приемов ГЕНОЛОГа; х3 - теорема приема; х4 -
 заголовок приема; х5 - описание приема. Кроме того, ей сообщаются
 некоторые дополнительные сведения о хранении компонент описания
 приема в 8-м информационном блоке. Подробнее о том, как
 организовано это хранение, будет рассказано в следующей главе.

 Программа процедуры "текприем" \ должна начинаться с операторов
 "обра\-ще\-ние(0) иначе 1 метка(икс(десять))", которые при написании
 очередного запроса на поиск изменять не следует. Заканчиваться
 эта программа должна операто\-ром "ответ(набор(См))", обращение к
 которому вызывает прерывание и выход в просмотр описания текущего
 приема. После этого продолжение поиска вы\-зы\-ва\-ется нажатием
 клавиши "курсор влево". Если же нужно прервать поиск и начать
 работу с найденным приемом, то нажимается клавиша "Esc",
 выводящая в главное меню, далее нажимается клавиша "г",
 возвращающая в оглавление базы приемов, причем в том именно
 концевой пункт, где находится найденный прием, и нажимается
 "курсор вправо" \ для входа в просмотр этого приема.

 В нашем случае нужно отобрать приемы, теорема которых содержит
 символы "трапеция" \ и "биссектриса". Для этого входим в просмотр
 программы ЛОСа для логического символа "текприем" \ (войти в
 просмотр и редактирование этой программы можно также нажатием F9
 из любой точки оглавления базы при\-е\-мов). Нажимаем "р" \ (кир.) и
 набираем текстовым редактором, после опера\-то\-ра "метка($\ldots$)",
 операторы "не(логсимвол(х3)) входит(трапеция х3)
 входит(бис\-сек\-триса х3)". Затем должен быть размещен указанный
 выше оператор "ответ(\\ $\ldots$)". Заметим, что значением
 переменной х3 служит теорема приема, однако для приемов
 операторов фильтра вместо нее используется логический
 сим\-вол "блок". Чтобы избежать замечаний о некорректном обращении
 к оператору, перед проверкой вхождения в х3 какого - либо
 символа, сначала нужно убе\-дить\-ся, что х3 действительно является
 термом, что и делает оператор "не(лог\-сим\-вол(х3))".

 По окончании ввода программы, завершаемого, как обычно, нажатием
 Enter, для возвращения в оглавление базы приемов (если мы вышди из нее
 по F9), достаточно нажать "End". Далее поиск активируется
 нажатием F8 из любого пункта оглавления. В нашем случае будут
 найдены три приема. По завершении поиска произойдет выход в
 отладчик ЛОСа на операторы "трассировка(стоп 0) трассировка(0)";
 далее для возвращения в главное меню нажимается Esc.

 \item Как и в предыдущем случае, используем процедуру "текприем".
 Примечание к текущему терму задачи вводится указателем приема
 "примечание($\ldots$)". Поэ\-то\-му в программе "текприем" \ помещаем
 единственный (кроме стандартных начала и конца программы) оператор -
 "входит(запись(примечание промежу\-ток) х5)". Напомним, что х5 - набор
 указателей приема, к которому добав\-лен элемент
 "условие(и($F_1 \ldots F_n$))", перечисляющий все фильтры приема
 $F_1, \ldots , F_n$. При просмотре обнаруживается единственный
 прием, вводящий коммента\-рий "промежуток".

 Заметим, что процедуру "текприем" \ можно использовать не только
 для поиска приемов нужного типа, но и для автоматического
 изменения всей базы приемов, согласно заданной программе.
 Это позволяет предпринимать различные гло\-баль\-ные преобразования
 решателя при его оптимизации. Впрочем, после любо\-го такого
 преобразования необходима полная прогонка по задачнику - для
 выявления остаточных случаев, требующих дополнительной проработки.
 Часто эти случаи возникают из-за небольших изменений траектории
 решения, при\-во\-дя\-щих к необходимости применять отсутствующий пока
 прием. Вообще, даже обычная перекомпиляция нескольких приемов не в том
 порядке, в каком они были скомпилированы изначально, может
 (хотя и достаточно редко) изменить поведение решателя.
 Разумеется, по мере развития исследований по вза\-имо\-дей\-ствию между
 приемами устойчивость поведения решателя (в том числе и по отношению
 к случайным изменениям порядка размещения приемов после
 перекомпиляций) будет повышаться. Даже сейчас она не так
 уж мала. Однако, единичные случаи потери или замедления решений задач
 могут возникать, и при перекомпиляции лучше либо сохранять
 первоначальное размещение при\-е\-мов, либо убеждаться прогонкой по
 задачнику, что нежелательные ситуации не возникли.

 \end{enumerate}

 \subsection{Просмотр описания приема}

 Первые упражнения этого раздела относятся к приему решения
 квадратного урав\-не\-ния. Поэтому перед их выполнением следует найти
 данный прием в оглавлении базы приемов, нажать клавишу "курсор
 вправо", и выбрать последний из приемов списка.

 \begin{enumerate}

 \item Перейти от формульного режима просмотра теоремы к
 текстовому и обрат\-но.

 \item Выделить цветовой указкой в теореме приема левую часть
 эквивалентнос\-ти. Убрать выделение, перейти в текстовый режим
 просмотра, и в нем снова вы\-де\-лить цветовой указкой данную часть.

 \item Активизировать для просмотра последовательно первое,
 второе, третье и чет\-вер\-тое окна приема.

 \item Убрать с экрана первое окно приема, затем восстановить его
 на экране.

 \item Выделить многоцветной указкой фильтр "альтернатива($\ldots$)".
 Внутри этого фи\-ль\-т\-ра выделить терм "неизвестные(2)". Прочитать
 пояснения к символу "не\-из\-вест\-ные". Прочитать пояснения к
 подтерму "числонеизвестных(корень)", вс\-тре\-чающемуся в фильтрах
 приема. Продолжить рассмотрение фильтров и ука\-зателей приема,
 получая информацию о всех встречающихся в них служеб\-ных словах
 ГЕНОЛОГа.

 \item Просмотреть нормализаторы к подтерму $0 \le e$ теоремы
 приема. Просмот\-реть все нормализаторы приема.

 \item Просмотреть текстформульный шаблон пояснений к срабатыванию
 приема. Найти ссылки на его фрагменты из различных точек описания
 приема.

 \item Прочитать пояснения к заголовку приема. Войти в оглавление
 заголовков при\-е\-мов ГЕНОЛОГа и найти в нем тот же поясняющий
 текст.

 \item Войти в оглавление типов фильтров ГЕНОЛОГа и найти в нем
 несколько типов фильтров, использованных в приеме. Аналогичное
 упражнение проделать для оглавления типов указателей приемов.

 \item Из просмотра приема перейти в просмотр справочной информации
 о логичес\-ком символе "целое", затем вернуться обратно.

 \item Перейти к просмотру программы приема. Прочитать несколько
 первых опе\-ра\-то\-ров этой программы и объяснить смысл выполняемых
 ими действий. Вер\-нуться к просмотру описания приема.

 \item Перейти из просмотра описания приема в оглавление
 задачника, затем сно\-ва вернуться к просмотру описания приема.
 Аналогичное упражнение - для перехода в оглавление программ.

 \item Найти последний из приемов раздела "Соотношение
 пропорциональности длин отрезков, отсекаемых параллельными
 прямыми". Просмотреть все фильтры этого приема, учитывая то, что
 список их разбит на несколько последовательно выдаваемых на экран
 фрагментов.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Для перехода к текстовому режиму нажимаем "т", для перехода
 к формульному - "ф". Текущий режим будет сохранен при переходе через
 оглавление базы теорем к другому приему. Однако, при возвращении
 в главное меню установка на него будет забыта, и при последующем
 переходе к просмотру приемов будет, по умолчанию, выбран
 формульный режим.

 \item Чтобы выделить цветовой указкой часть теоремы, нужно
 сначала иницииро\-вать ее просмотр - либо нажать левую кнопку
 мыши, курсор которой находится в первом окне, либо нажать клавишу
 "1", либо нажать два раза клавишу "курсор вправо". Первое нажатие
 клавиши выделит малиновым цветом номер "1" \ первого окна; второе
  - переведет в режим просмотра теоремы. Сначала малиновым цветом
 будет выделен первый антецедент. Используя клавишу "кур\-сор вправо",
 выделим сначала весь консеквент. Затем нажмем "курсор вниз", выделяя
 первый операнд консеквента, что и требуется. Для сброса режима
 просмотра теоремы нажимаем клавишу пробела. Чтобы перейти в
 текстовый режим просмотра, нажимаем далее "т". После этого можно
 либо войти в режим просмотра теоремы двумя нажатиями "курсор
 вправо", и далее манипулировать клавишами курсора для выделения
 нужного подтерма, либо сразу подвести курсор мыши к началу
 нужного подтерма теоремы и нажать левую кнопку мыши. Для сброса режима
 просмотра снова нажимаем клавишу пробела.

 \item Для входа в режим просмотра $i$ - го окна; $i=1,2,3,4$,
 можно нажать клави\-шу "$i$" \ номера этого окна. Другой способ -
 нажать сначала клавишу "кур\-сор вправо". Тогда будет выделен
 малиновым цветом номер "1" \ первого окна. С помощью клавиш
 "курсор вверх" \ - "курсор вниз" \ можно менять текущее окно.
 Однако, выделение номера окна - это еще не вход в режим просмотра
 окна. Для перехода к такому просмотру нужно, выделив текущее
 окно, нажать клавишу "курсор вправо". Заметим, что для второго
 окна, состоящего толь\-ко из заголовка приема, надобности в
 просмотре с применением цветовой указки не возникает, и в этом
 случае нажатие "курсор вправо" \ игнорируется. При входе в
 просмотр 1,3 либо 4 окон происходит выделение первого терма
 цветовой указкой (для первого окна выделяется малиновым цветом
 первый антецедент теоремы, для 3 и 4 - светло-голубым цветом
 выделяется первый фильтр либо первый указатель). Для выхода из
 просмотра нажимается клавиша пробела.

 \item Если описание приема не помещается на экране целиком, то
 можно убирать некоторые из окон. Для этого служат клавиши Ctr-Fi;
 $i$ - номер окна, $i=1,2,3,4$. Восстановление убранных окон -
 нажатием той же клавиши, либо за счет выхода в оглавление базы
 приемов и повторного входа в просмотр приема.

 \item Есть две возможности - либо выделить слово
 "альтернатива" \ курсором мыши и нажать ее левую кнопку, либо
 войти в просмотр третьего окна и выделить фильтр
 "альтернатива($\ldots$)", используя клавишу "курсор вправо".
 Подтерм "не\-известные(2)" \ теперь можно выделить, нажав клавишу
 "курсор вниз", либо переведя курсор мыши на слово "неизвестные" \
 и нажав ее левую кнопку. Мы\-шью можно было выделить этот подтерм и
 сразу, не выделяя "альтернатива(\\ $\ldots$)".

 Чтобы прочитать пояснения к выделенному терму, нажимаем либо правую
 кнопку мыши (безотносительно к тому, использовалась ли мышь при
 выделе\-нии), либо клавишу "Ctr-у" \ (кир.). Снизу, под четвертым окном,
 появляется текст пояснений. Иногда одно и то же служебное слово
 используется в различ\-ных контекстах, и тогда можно просмотреть
 пояснения ко всем возможным его использованиям. Сначала выдается
 какой - то один текст; для смены текстов списка используются
 клавиши "курсор вверх" \ - "курсор вниз". В нашем случае сначала
 будет выдан текст пояснений к использованию "неизвестные(х1)" \ в
 качестве фильтра, уточняющего число неизвестных задачи. После
 нажатия "кур\-сор вниз" \ появится другой текст - "неизвестные(х1)"
 \ может служить обо\-зна\-чением списка неизвестных задачи. Обычно
 такая неоднозначность легко устраняется из контекста. Очевидно,
 "неизвестные(2)" \ подпадает под первый текст пояснений.

 Чтобы убрать с экрана тексты пояснений, нажимаем либо
 произвольную кноп\-ку мыши, либо клавишу пробела. После этого
 выделяем слово "числонеиз\-вест\-ных" \ курсором мыши и нажимаем
 правую ее кнопку. Сначала появится текст "Число неизвестных
 задачи"; после нажатия "курсор вниз" \ - "Число неизвестных в
 терме, определяемом выражением х1". Так в нашем случае сим\-вол
 "числонеизвестных" \ относится к выражению "корень", то берем
 второй поясняющий текст. Можно посмотреть пояснения к слову
 "корень" \ - будут выданы тексты "Заменяемый подтерм является
 корневым" \ и "Текущий терм задачи". Первый из них явно относится
 к случаю использования слова "ко\-рень" \ как фильтра, у нас же оно
 используется как выражение. Поэтому берем вто\-рой текст.
 Окончательно получаем, что "числонеизвестных(корень)" \ означа\-ет
 число неизвестных в текущем терме задачи, т.е. в рассматриваемом
 квадрат\-ном уравнении.

 Чтобы привыкнуть к простейшим конструкциям ГЕНОЛОГа, можно
 реко\-мен\-довать последовательный просмотр фильтров и указателей приема
 с выде\-ле\-ни\-ем их левой клавишей мыши и вызывом сопровождающих текстов
 правой клавишей.

 \item Чтобы просмотреть нормализаторы к заданному вхождению в
 теорему, фильтр либо указатель, сначала нужно выделить это
 вхождение. Заметим, что не все вхождения в теорему могут быть
 выделены при формульном режиме. Поэтому в сомнительных случаях
 (они бывают сравнительно редко и связаны с раз\-лич\-ны\-ми
 специальными логическими конструкциями) лучше переходить в
 тек\-сто\-вый режим просмотра теоремы. В нашем примере можно выделить
 $0 \le e$ и непосредственно из формульного просмотра.

 После того, как нужное вхождение выделено, нажимается Enter.
 Тогда под четвертым окном возникает текст нормализаторов,
 относящихся к выделен\-но\-му вхождению. При этом появляется также
 курсор текстового редактора, чтобы при необходимости изменить
 нормализаторы. Если вхождение не сопровожда\-лось нормализаторами,
 то курсор текстового редактора возникает на пустой строке. Так
 как в данном упражнении не нужно изменять нормализаторы, то после
 просмотра нажимается Esc либо Enter (последнее - только при
 отсутствии изменений в тексте).

 Чтобы последовательно просмотреть все нормализаторы приема,
 следует на\-жать клавишу "5", и далее менять текущий выделенный
 подтерм клавишами "PageUp" \ - "PageDown". Как и ранее,
 нормализаторы будут прорисовываться под четвертым окном. Выход из
 такого просмотра - только по нажатию "End" \ (!).

 \item Просмотр текстформульного шаблона вызывается нажатием
 клавиши "6". Этот шаблон оказывается состоящим из двух
 фрагментов: "$\neg 1$ Решаем квадратное уравнение относительно
 (). Дискриминат равен ()"; "$\neg 2$ Разложение на мно\-жи\-тели
 дискриминанта". Очевидно, первый из них комментирует срабатывание
 приема "в целом", два последних - комментируют вспомогательные
 пре\-об\-ра\-зо\-вания, выполняемые приемом. Для первого легко находится
 относящийся к нему указатель "титр(набор(1 терм(х4 х5)))".
 Согласно этому указателю, вместо первых скобок будет
 подставляться неизвестное выражение $d$, вместо вторых -
 результат $e$ вычисления дискриминанта. Второй текст указывает на
 обращение к нормализатору разложения на множители дискриминанта
 $b^2+4ac$. Выделяя в теореме его вхождение, просматриваем список
 нормализаторов. В этом списке находим элемент "видумножение(замечание(
 нормстепень) за\-ме\-ча\-ние(новый) замечание(титр(набор(2))))", содержащий
 ссылку на второй фрагмент.

 \item Для просмотра пояснений к заголовку нужно выделить номер
 "2" \ окна заго\-лов\-ка малиновым цветом и нажать "Ctr-з" \ (кир.).
 Пояснение появится под четвертым окном. Для входа в оглавление
 типов заголовков нажимаем ту же клавишу " Ctr-з", но без
 выделения второго окна приема. Находим корень ог\-лав\-ле\-ния, и от
 него прослеживаем цепочку переходов ("Замена подтерма", "Замена
 слева направо"). Нажимая далее "курсор вправо", находим
 соответствующий заголовок "второйтерм".

 \item Для входа в оглавления типов фильтров и типов указателей
 используем, со\-от\-вет\-ственно, клавиши "Ctr-у" \ (кир.) и "Ctr-х".
 Заметим, что эти оглавления немного более полны, чем приведенные
 в книге списки типов фильтров и ука\-за\-те\-лей, так как они постоянно
 пополняются в процессе развития языка.

 \item Для получения общей справочной информации о логическом символе
 нажима\-ем клавишу "с", и далее вводим текстовым редактором этот
 логический символ. После нажатия Enter, завершающего ввод
 символа, появляется требуемая ин\-фор\-ма\-ция. По нажатии любой
 клавиши, отличной от используемых для про\-смот\-ра информации
 служебных клавиш (например, при нажатии пробела) - возвращение в
 просмотр описания приема.

 \item Для просмотра программы приема нажимаем клавишу Home. Сразу
 после это\-го появляется текст фрагмента программы, содержащий
 ключевой опера\-тор "контрольприема($\ldots$)", адресующий данный
 прием. В нашем случае это опера\-тор "контрольприема(степень
 набор(1 6 0) второйтерм)". Здесь логический сим\-вол "степень" \ и
 число 160 - координаты описания приема в восьмом инфор\-ма\-ци\-онном
 блоке. Заметим, что хотя прием закреплен в этом блоке за символом
 "степень", программа его закреплена за символом "плюс", и попытка
 приме\-не\-ния приема будет предприниматься при обнаружении вхождения
 в терм задачи последнего символа.

 Напомним, что при сканировании задачи имеются следующие
 стандартные зна\-че\-ния программных переменных: х1 - задача; х2 -
 вхождение текущего логи\-чес\-ко\-го символа; х3 - вхождение текущего
 терма задачи (посылки либо условия) в соответствующий список
 задачи; х4 - указатель посылки (0) либо условия (1); х5 - текущий
 уровень сканирования. Переменные, начиная с переменной х6,
 изначально не определены. Однако, до того момента, как программа
 обрати\-лась к фрагменту, содержащему оператор
 "контрольприема($\ldots$)", уже могли быть предприняты некоторые
 проверки и присвоения. Поэтому, для анализа той ситуации, которая
 сложилась на момент входа в фрагмент, прежде всего нужно
 просмотреть цепочку предшествовавших ему фрагментов. Это де\-ла\-ем,
 используя клавиши курсора: "курсор вверх" \ -  к надфрагменту;
 "кур\-сор влево - курсор вправо" \ - выделение желтым
 цветом того оператора пе\-ре\-хо\-да в текущем фрагменте, через который
 требуется войти в подфрагмент; "кур\-сор вниз" \ - вход в
 подфрагмент.

 В нашем случае, нажав "курсор вверх", оказываемся в фрагменте,
 имеющем начальные операторы "ветвь 1 уровень(1 2) новый равно(х4
 1) ветвь 2 тип(х1 описать) равно(второйоперанд(х2)
 последнийоперанд(х2)) ветвь 3", причем че\-рез "ветвь 3" \
 переходим обратно к начальному фрагменту приема. Эти нес\-коль\-ко
 операторов оказались общими у нашего приема с другими приемами,
 и они вынесены наружу. Оператор "уровень(1 2)" \
 проверяет равенство текущего уровня сканирования единице либо двойке;
 оператор "новый" \ блокирует по\-пыт\-ки применения приема при
 локальных циклах повторного сканирования, предшествующих переводу
 терма задачи из "теневой" \ зоны в активную; опе\-ра\-тор "равно(х4
 1)" \ проверяет, что символ "плюс" \ встретился в условии задачи.
 Оператор "тип(х1 описать)" \ фиксирует тип текущей задачи;
 оператор "рав\-но(вто\-ройоперанд(х2)последнийоперанд(х2))" \ -
 проверяет, что сумма имеет два слагаемых. Одно из них
 соответствует квадрату неизвестного выражения, дру\-гое - его
 первой степени. Если уравнение изначально имело несколько членов с
 квадратом либо с первой степенью, то после срабатывания приемов
 приведения подобных членов с известными коэффициентами слагаемых
 останется ровно два.

 Можно было бы просмотреть и фрагменты, предшествующие данному,
 однако в них ничего существенного не происходит - идет
 "главный ствол" \ программы символа "плюс", ответвления от
 которого соответствуют различным значениям уровня срабатывания.
 Поэтому возвращаемся через "ветвь 3" \ в начальный фрагмент
 приема. Пропуская фиктивный оператор "контрольприема", пе\-ре\-хо\-дим
 к следующим операторам. Оператор "равно(х6 неизвестные(х1))" \
 при\-сва\-и\-ва\-ет переменной х6 цель задачи х1, перечисляющую ее
 неизвестные. Эта цель имеет вид (неизвестные $x_1 \ldots x_n$).
 Оператор "альтернатива(не(длинаменее(х6 3)) равно(х5 1) равно(х5
 2))" \ проверяет, имеет ли задача одну неизвестную - тогда длина
 набора х6 будет меньше 3, или больше одной - тогда эта длина
 бу\-дет не менее 3. Соответственно, в первом случае текущий уровень
 сканирова\-ния должен быть равен 2, а во втором случае - 1.

 Оператор "операнд(х7 х2)" \ переводит от текущего символа "плюс"
 \ к внешнему символу, присваивая переменной х7 вхождение этого
 символа. Оператор "сим\-вол(х7 равно)" \ проверяет, что по
 вхождению х7 расположен символ "равно". Оператор "корень(х7)" \
 проверяет, что вхождение х7 - корневое, т.е. рас\-смат\-ри\-ва\-емое условие
 имеет вид равенства, и т.д.

 По окончании анализа программы можно вернуться в просмотр
 описания при\-ема, нажав клавишу End. Заметим, что нажатие End
 приведет к этому ре\-зуль\-та\-ту вне зависимости от того, в каком
 фрагменте программы символа "плюс" \ она была нажата. Если при
 просмотре окрестности начального фрагмента про\-грам\-мы нужно быстро
 вернуться к этому начальному фрагменту, то нажи\-ма\-ет\-ся клавиша F8.

 \item Для перехода к оглавлению задачника нажимаем Shift-3. Чтобы
 вернуться оттуда в оглавление приемов, нажимаем Shift-2. Для
 перехода к оглавлению программ далее нажимается Shift-1; обратно
 - снова Shift-2.

 \item Прием находится в разделе ("Элементарная геометрия",
 "Параллельны", "Про\-пор\-ци\-ональность отрезков, отсекаемых
 параллельными прямыми", "Соот\-но\-ше\-ние пропорциональности длин
 отрезков, отсекаемых параллельными прямы\-ми"). Нажимая "3", входим
 в просмотр окна фильтров. Перемещая с помощью клавиши "курсор
 вправо" \ выделенный текущий терм, доходим таким образом до запятой, и
 снова нажимаем "курсор вправо". В результате появляется второй
 фрагмент списка фильтров. Проходим через него аналогичным
 образом, и по\-па\-да\-ем в третий, последний фрагмент. Обратные
 переходы - с помощью "кур\-сор влево". Этот процесс можно ускорить,
 используя мышь: нажатие ее левой кнопки на запятой приводит к
 переходу через эту запятую - вперед либо (для запятой в начале
 фрагмента) назад.

 \end{enumerate}

 \subsection{Редактирование приема}

 На нескольких простых упражнениях продемонстрируем технику ввода нового
 при\-ема, изменения старого, а также тестирования приема после
 редактирования. Для ввода новых приемов следует сначала создать
 специальный концевой пункт оглав\-ле\-ния базы приемов, разместив его
 там, где покажется удобнее (можно и в соответствии с имеющейся
 классификацией разделов). При первом знакомстве с редактором
 при\-е\-мов лучше не размещать учебные приемы в "старых" \ концевых пунктах,
 чтобы случайно не удалить имеющиеся там приемы. Впрочем, такие
 случайности не очень страшны - первоначальная версия удаленного либо
 измененного приема попадает в буфер, откуда ее можно вернуть
 обратно.

 \begin{enumerate}

 \item Ввести прием, упрощающий тригонометрические выражения
 c помощью тож\-дества для суммы квадратов синуса и косинуса. Сначала
 набрать теорему при\-ема $\forall_{ax}(a(\sin x)^2 + a(\cos x)^2 = a)$.
 Затем ввести заголовок приема "второйтерм". Далее ввести единственный
 фильтр - "уровень(0)". Ввести указатели "едини\-ца(1 х1)" \ и
 "заменазнака(минус х1)". Сохранить введенный прием и
 от\-ком\-пи\-ли\-ровать его.

 \item Проверить, что прием работает, введя какую-либо тестовую задачу
 на упро\-ще\-ние, например, $2(\sin b)^2 + 2(\cos b)^2$, и найдя в
 трассировке по шагам решения задачи срабатывание введенного
 приема. Войти в просмотр описания приема из текущего шага трассировки.
 Перейти к просмотру текущего фрагмента про\-грам\-мы и найти программные
 переменные, значениями которых служат: а) вхождение косинуса; б)
 вхождение операции сложения; в) терм, иден\-ти\-фи\-ци\-рованный с квадратом
 синуса.

 \item После тестирования вернуться в редактор приемов и проделать
 следую\-щие действия: а) удалить программу приема, не удаляя самого
 приема; б) вос\-ста\-но\-вить программу приема; в) добавить фильтр
 "тип(преобразовать)" \ и со\-хра\-нить измененный прием, не изменяя
 пока его программу; г) еще раз пере\-ком\-пи\-ли\-ро\-вать прием, причем
 провести компиляцию так, чтобы при тестировании можно было
 определять те термы, с которыми идентифицируются переменные
 теоремы приема.

 \item После выполнения предыдущего упражнения снова войти в
 тестирование прие\-ма и, остановившись на моменте его применения,
 найти идентифициро\-ван\-ные с теоремными переменными термы, не
 переходя в отладчик ЛОСа.

 \item Создать в оглавлении базы приемов какой-нибудь новый
 концевой пункт и перенести в него созданный прием из того концевого
 пункта, где он находился до этого. Старый концевой пункт (если он после
 этого оказался пустым) удалить.

 \item Сбросить буфер базы приемов. Затем удалить введенный прием,
 после чего вернуть его на старое место из буфера базы приемов.
 Снова сбросить буфер базы приемов. Изменить прием, убрав из него
 фильтр "тип(преобразовать)". Посмотреть старую версию приема в буфере.
 Восстановить по буферу версию приема, имевшуюся до изменения.

 \item Создать копию приема, изменив в ней фильтр "уровень(0)" на
 "уровень(1)".

 \item Создать простую версию приема, использующего теорему
 Пифагора. Сна\-ча\-ла изобразить на чертеже прямоугольный треугольник
 $ABC$ с прямым углом $B$. Ввести теорему приема:
 $$\forall_{ABC}(\mbox{прямая}(AB) \bot \mbox{прямая}(BC)
 \rightarrow (l(AC))^2=(l(AB))^2 + (l(BC))^2).$$
 Затем ввести заголовок приема "вывод" \ и фильтры "уровень(1)",
 "посылка", "тип(исследовать)", "лексикопредшествует(х26 х28)",
 "усм(актив(расстояние(\\ х26 х28)))", "усм(актив(расстояние(х26
 х27)))", "усм(актив(расстояние(х27 х28\\ )))". Ввести указатели
 приема: "усм(1)", "теквхожд(1)", "биключ(перпенди\-ку\-ляр\-но х27
 интервал(х26 х28))". Ввести нормализаторы общей стандартиза\-ции для
 обработки подтермов выводимого утверждения. Ввести нормализатор
 "норминтервал" \ для обработки терма "интервал(х26 х28)",
 встречающегося в указателе. Сохранить прием и откомпилировать
 его.

 \item Разбить список фильтров приема на две части, оборвав первую
 часть на фильт\-ре "лексикопредшествует(х26 х28)". Найти в
 оглавлении базы приемов старый прием на теорему Пифагора,
 срабатывающий на уровне 10, и перенести из него в только что
 созданный прием фильтр "контекст(посылка(х1) заголовок(х1
 равно) вхождениетерма(х1 расстояние(х26 х28)))".

 \item Ввести простую геометрическую задачу на нахождение длины
 одного из катетов прямоугольного треугольника, у которого длина гипотенузы
 равна 5, а другого катета - 4. Протестировать на ней созданный
 прием, установивши прерывание при его применении.

 \item Удалить все нормализаторы приема, после чего ввести их в
 режиме авто\-ма\-ти\-чес\-кого пополнения описания приема.


 \item Ввести прием для сложения дробных выражений. Теорема приема
 имеет вид: $$\forall_{abcdef}(\neg(c=0) \ \& \ \neg(d=0) \ \& \
 \neg(f=0) \rightarrow \frac{ab}{cd} + \frac{ae}{cf} =
 \frac{a(bf+de)}{cdf}).$$ Заголовок приема - "второйтерм";
 фильтры - "уровень(1)", "условие", "тип(\\ пре\-об\-ра\-зовать)",
 "или(заголовок(фикс(0 1 1)дробь) и(заголовок(фикс(0 1
 1)ми\-нус) первыйсимвол(фикс(0 1 1)дробь)))", "или(заголовок(фикс(0
 1 2)дробь) и(заголовок(фикс(0 1 2) минус) первыйсимвол(фикс(0 1
 2) дробь)))". При вводе фильтров использовать автоматическое
 выписывание в третьем окне приема указателей вхождения "фикс($\ldots$)" \
 после выделения этих вхождений в теореме цветовой указкой, заметив, что "фикс(0 1
 1)", "фикс(0 1 2)" \ здесь ссылаются на вхождения первого и
 второго дробных слагаемых. Смысл этих фильтров в том, чтобы при обращении
 в единицу некоторых переменных из знаменателей не пропали дроби.
 Указатели приема - "блокпроверок(1 2 3)",
 "единица(1 х1 х2 х3 х4 х5 х6)", "заменазнака(минус х2
 х5)". Снабдить прием указателями нормализации, причем сумму в
 числителе результата снабдить, кроме обыч\-но\-го нормализатора
 "нормплюс", также нормализатором "видумножение", вы\-пол\-ня\-ющим
 попытку разложения на множители.
 Ввести в прием какое-либо текст-формульное сопровождение,
 поясняющее срабатывание приема. Создать тес\-то\-вую задачу для
 приема, выйти в точку срабатывания при трассировке и убедиться в
 том, что пояснение выдается.

 \item Удалить все приемы, введенные в перечисленных выше
 упражнениях.

 \end{enumerate}

 \subsubsection{Указания}

 \begin{enumerate}

 \item Выберем для нового приема какой-нибудь подходящий раздел.
 Например, в подразделе "Тригонометрия" \ раздела "Элементарная
 алгебра" \ выберем под\-раз\-дел "Синус", далее - "Общая
 стандартизация выражений", и здесь введем новый концевой пункт,
 нажав клавишу "к". При появлении курсора текстово\-го редактора
 нужно набрать какое-либо название пункта; пусть это будет "Тест". Далее
 нажимаем "курсор вправо" \ и попадаем в чистый экран - обычное
 начало ввода приема. Для набора теоремы формульным редактором
 нажимаем Ctr-ф. Возникает курсор формульного редактора, и далее
 набираем указанное выше тождество, не забыв начать его с квантора
 общности и перечислить в квантор\-ной приставке все переменные теоремы.
 Напомним, что неполное перечисление переменных в кванторной
 приставке может, хотя и редко, привести к не\-пра\-виль\-ной
 компиляции. Если переменная оказывается связана внутри
 теоремы, то она в общую кванторную приставку не выносится. Если
 при набо\-ре формулы нужно вспомнить какую-либо клавишу формульного
 редактора, нажимается F1, переводящее в справочник по системе, и
 нужная информация находится в подразделе "Формульный редактор" \
 корневого меню справочника. Чтобы продолжить набор формулы, далее
 нажимается End (сначала - для возвраще\-ния в оглавление
 справочника, затем - для возвращения в набор теоремы).

 По завершении набора теоремы нажимается Enter, и под теоремой
 про\-ри\-со\-вы\-вается горизонтальная линия. Далее нажимается Enter,
 и во втором окне набирается заголовок приема. После того, как
 заголовок введен и нажато Enter, появляется следующая
 горизонтальная линия, причем сразу же под ней появляется курсор
 текстового редактора для набора фильтров. Вводим фильтр
 "уровень(0)"; после завершающего набор нажатия Enter вводим
 указатели "еди\-ни\-ца(1 х1)" \ и "заменазнака(минус х1)", и снова
 нажимаем Enter. Под четвер\-тым окном появляется голубая линия,
 указывающая на то, что новый либо измененный прием еще не
 сохранен. Чтобы сохранить его без немедленной компиляции (что
 естественно делать, если прием еще не полностью прорабо\-тан),
 нажимается F4, и тогда голубая линия меняет цвет на красный. В
 нашем случае сохраняем прием и одновременно компилируем его,
 нажимая F3.

 \item Переходим из просмотра приема в задачник - либо через
 главное меню, либо за один переход, нажимая Shift-3. В задачнике
 выбираем какой-либо под\-хо\-дя\-щий раздел, например, ("Элементарная алгебра",
 "Упрощение выражений", "Тригонометрические выражения", "Упрощение
 выражений - 2"). Прокру\-тив меню номеров пунктов этого оглавления
 вверх так, чтобы внизу появилось свободное место, нажимаем "к" \
 (кир.). Тогда появляется поле для ввода новой задачи,
 ограниченное сверху горизонтальной линией. Нажимаем "ц" \ для
 входа в оглавление типов целевых установок, выбираем пункт
 ("Преобразовать вы\-ра\-же\-ние", "Упростить выражение в области
 допустимхы значений") и нажимаем "курсор вправо". Далее вводим
 упрощаемое выражение $2(\sin b)^2 + 2(\cos b)^2$ - сначала
 нажимаем Enter, и используем формульный редактор. После
 набора этого выражения начинаем трассировку процесса решения.
 Здесь имеются две возможности. Одна - начать нажатием "р" \ (кир.)
 и просмотреть все шаги решения задачи, нажимая каждый раз Enter для
 перехода к следующему шагу. В нашем тривиальном случае это сразу
 выведет на срабатывание тестируемого приема. Другая возможность -
 сразу установить прерывание при срабатывании нужного приема. Для
 этого нужно сначала нажать "г" \ - появится оглавление базы
 приемов, затем войти в просмотр нужного приема, и нажать
 либо Enter, либо Ctr-Enter. В первом случае прерывание произойдет
 после срабатывания приема, во втором - при выходе на начальный
 оператор "контрольприема($\ldots$)" \ программы приема, причем
 здесь включается отладчик ЛОСа и устанавлива\-ет\-ся пошаговый режим
 трассировки. При отладке применяется именно второй способ, так как
 он позволяет понять причины несрабатывания приема. Мы нажимаем
 Enter.

 Чтобы войти из просмотра текущего преобразования в просмотр
 описания при\-ме\-нен\-ного приема, нажимается клавиша "б". Это
 делается не только для при\-е\-мов, реализованных на ГЕНОЛОГе, но и
 для приемов, запрограммирован\-ных непосредственно на ЛОСе. В
 первом случае появится описание приема, во втором - пункт
 оглавления программ, соответствующий примененному приему.
 Чтобы вернуться в просмотр текущего преобразования, нажимаем End.
 Отсю\-да можно выйти в отладчик ЛОСа для просмотра текущего
 фрагмента програм\-мы - нажатием клавиши "ф".

 Чтобы теперь проанализировать значения программных переменных,
 нужно помнить смысл первых пяти переменных, определенных
 при сканировании за\-да\-чи: х1 - текущая задача; х2 - вхождение в нее
 текущего символа (название его прорисовано в верхней левой части экрана);
 х3 - вхождение текущего терма задачи (посылки либо условия) в его
 внешний список; х4 - указатель посылки (0) либо условия (1); х5 -
 текущий уровень сканирования. Сразу ясно, что вхождение косинуса
 является значением переменной х2 - так как прием ини\-ци\-али\-зи\-руется при
 обнаружении косинуса. Для получения предыстории текущего фрагмента
 нажимаем Home - переходим в просмотр фрагмента, из которого по
 "иначе 2" \ перешли в данный фрагмент. Замечая оператор "операнд(х6 х2)",
 запоминаем, что значением переменной х6 является вхождение
 внешней по отношению к косинусу операции. После этого нажимаем
 End и возвращаемся в первоначально выданный на экран фрагмент
 программы. Видно, что в нача\-ле этого фрагмента расположены
 операторы "символ(х6 степень)", "равно(х2 первыйоперанд(х6))",
 фиксирующие размещение косинуса в основании не\-ко\-то\-рой степени.
 Можно не читать программу оператор за оператором, а сразу искать
 оператор "символ($\ldots$ плюс)", находящий корневую сумму
 преобразу\-е\-мо\-го выражения. Такой оператор имеется - это "символ(х9
 плюс)", так что вхождение суммы является значением переменной х9.
 Аналогичным образом, не читая подробным образом всего текста
 программы, обнаруживаем опера\-то\-ры "заголовок(х19 степень)",
 "первыйсимвол(х19 синус)", что и дает нам программную переменную
 х19, значением которой служит терм  $(\sin x)^2$.

 \item Для обрыва трассировки нажимаем Esc, возвращаясь к
 просмотру исходного условия задачи. Возвращаемся в базу приемов -
 либо через главное меню, либо выйдя в оглавление задачника и нажа
 Shift-2. Переходим к просмотру нашего приема. Чтобы удалить его
 программу, не удаляя приема, достаточно нажать F7. Нижняя
 горизонтальная линия перекрасится из черного цвета в красный -
 сигнал об отключении приема. Для восстановления программы
 нажимаем F5. Надо заметить, что время на восстановление программы
 приема, затрачиваемое компилятором ГЕНОЛОГа, совсем невелико, и
 если сравнивать его со временем решения иных задач средней
 сложности, то станет ясно, что во многих случаях можно было бы
 прибегать к помощи компилятора и генератора приемов "в реальном
 времени", практически не замедляя хода решения задачи. Это
 оз\-на\-ча\-ет, что по мере развития техники автоматического синтеза
 приемов можно будет сохранить в базе приемов лишь малую ее часть
 - наиболее часто ра\-бо\-та\-ющие приемы, а остальные создавать по мере
 надобности на основе базы теорем для одноразового применения.

 Для вставки нового фильтра нажимаем Ctr-3 (это легко запомнить -
 Ctr и номер изменяемого окна, за исключением случая первого
 окна). В третьем ок\-не открывается текстовый редактор; с его
 помощью вводим фильтр "тип(пре\-об\-ра\-зовать)". В данном приеме этот
 фильтр, конечно, совсем не нужен, и вводится здесь лишь для
 знакомства с редактором приемов. Чтобы сохранить измененное
 описание приема, не изменяя его программы, нажимаем F4. Заметим,
 что при этом нижняя линия приема перекрасится из голубого цвета в
 черный - так как программа приема все-таки есть, хотя это и старая
 версия. Для приведения программы приема в соответствие с его
 описанием нужно было бы нажать F5. Однако, в упражнении требуется
 применить другой режим компиляции, после которого просмотр термов,
 идентифицированных с теоремными переменными, станет возможен без
 помощи отладчика ЛОСа. Такая компиляция включается нажатием
 клавиши F6. Внешне она ничем не отличается от обычной, но в
 специальном информационном блоке запоминается соответствие между
 теорем\-ны\-ми и программными переменными, устанавливаемое
 компилятором. Если впоследствии перекомпилировать прием с
 помощью F5, то эта информация сбрасывается.

 \item Начнем с того момента, как при трассировке появляется кадр
 преобразова\-ния, выполняемого нашим приемом. Заметим, что в
 отсутствии специально созданного текст-формульного сопровождения,
 при срабатывании приема будет выдаваться текст того концевого
 пункта оглавления базы приемов, где разме\-щен прием. Этот текст
 заключается в скобки и располагается после описания
 пре\-об\-ра\-зо\-вания.

 Для входа в просмотр описания примененного приема нажимаем "б",
 и после прорисовки приема нажимаем клавишу "п" \ ("переменные").
 Тогда все окна приема, кроме первого, удаляются с экрана, и под
 теоремой прорисовывается равенство $a=2$ - т.е. теоремная
 переменная $a$ идентифицирована с двойкой. Чтобы перейти к
 просмотру следующей переменной, нажимаем PageDown - появляется
 равенство $x=b$, т.е. теоремная переменная $x$ идентифицирована с
 термом $b$. Для возвращения к ранее просмотренным переменным
 используется клавиша PageUp. Для обрыва просмотра нажимаем любую
 другую клавишу, например, пробел. Описанная возможность уточнения
 идентификации пе\-ре\-мен\-ных при срабатывании приема - отладочная
 и обычно дополняется информа\-ци\-ей, предоставляемой отладчиком ЛОСа.
 При наличии подробного поясняюще\-го срабывание приема текста она
 становится излишней. По окончании упражнения выходим из трассировки и
 возвращаемся в просмотр приема.

 \item Чтобы перенести прием в другое место оглавления базы
 приемов, сначала на\-жи\-ма\-ем Insert. Это можно делать, даже если тот
 концевой пункт, куда пред\-по\-ла\-га\-ется перенести прием, еще не
 создан. Например, выйдя в оглавление, переходим в раздел
 ("Косинус", "Общая стандартизация выражений"), и вво\-дим новый
 концевой пункт "Тест" \ в этом разделе. Введя его и выделив
 голубым цветом, но не входя внутрь, снова нажимаем Insert. Теперь
 можно зайти внутрь пункта - наш прием окажется там. Из старого
 пункта он при этом удаляется. Возвращаемся к старому пункту
 "Тест", проверяем, что он пуст, выделяем его в оглавлении и
 нажимаем для удаления Ctr-Del.

 \item Для сброса буфера базы приемов нужно выйти в оглавление
 этой базы и нажать "О" \ (кир.). Если текущие пункты оглавления
 относились к сбрасываемому буферу, то после сброса буфера
 произойдет выход в главное меню, иначе - сохранится текущий пункт
 оглавления. Обычно буфер сбрасывается тогда, ког\-да все новые или
 измененные приемы уже протестированы - например, пред\-при\-нята
 прокрутка по тем разделам задачника, где они могут проявить
 активность. После сброса буфера возвращаемся в просмотр приема, и
 для удаления его нажимаем Ctr-Del. Прием будет удален, программа
 его - тоже. Однако, исходная версия удаленного приема будет
 сохранена в буфере базы приемов. Чтобы перейти к ней, нужно выйти
 в оглавление базы приемов и нажать "ф". Буфер представляет собой
 автоматически вводимую ветвь корневого меню оглавления базы приемов.
 Нажатие "ф" \ переводит в некоторый раздел этой ветви. В кор\-не\-вой части
 ветви находим раздел "Удаленные приемы", в нем - подраздел "Тест".
 Входим в подраздел и обнаруживаем в нем только что удаленный
 прием, причем нижняя его линия - красная, так как программа
 приема от\-сут\-ству\-ет. Далее обычными средствами переносим прием на
 старое место - сна\-ча\-ла нажимаем Insert в описании данного приема, затем
 выходим в оглавление, находим в разделе "Косинус" \ пустой
 теперь концевой пункт "Тест", и сно\-ва нажимаем Insert, выделив этот
 пункт.

 Чтобы еще раз сбросить буфер, перед входом в просмотр описания приема
 нажимаем "О".

 Войдя в просмотр описания приема, нажимаем Ctr-3 и удаляем
 текстовым редактором фильтр "тип(преобразовать)". Затем сохраняем
 прием и ком\-пи\-ли\-руем его, нажав клавишу F3. Чтобы просмотреть
 старую версию, сохраненную в буфере, далее нажимаем "б".
 Появляется старая версия приема, у которй нижняя линия -
 красная (программы это версии нет). Чтобы вернуться от нее к
 текущей (основной) версии, нажимаем "о" \ (кир.). Наконец, для
 восстановления старой версии приема нажимаем "Б". Новая версия
 уничтожается; старая из\-вле\-ка\-ется из буфера, компилируется и
 переносится на ее место. Нужно пред\-уп\-ре\-дить, что такое
 восстановление старой версии приема не гарантирует вос\-ста\-нов\-ления
 исходного размещения ее программы. Обычно компилятор при\-со\-еди\-ня\-ет
 ветвь новой программы, при прочих равных условиях, после ра\-нее
 введенных ветвей. Если точка входа в программу измененного приема
 рас\-по\-ла\-галась в середине некоторого линейного списка точек входа
 в другие приемы, то после перекомпиляции она попадет в конец
 этого списка. Чаще всего, это несущественно, однако иногда имеются
 "состязания" \ между приемами одного списка, и тогда
 перекомпиляция может существенно повлиять на поведение решателя в
 отдельных задачах (не всегда, впрочем, в худшую сторону). В
 особых случаях после перекомпиляции можно переставить ветви
 программ вруч\-ную, используя редактор ЛОСа, хотя более радикальный
 способ здесь - обычное уточнение решающих правил приемов.

 \item Чтобы создать копию приема, нажимаем из просмотра его
 клавишу Ctr-д. Появляется тот же самый текст описания, но нижняя
 его линия - синия. На самом деле, это уже копия приема. Сначала
 сохраняем ее без компиляции (F4). Затем нажимаем Ctr-3, входим в
 редактирование окна фильтров и изменяем первый фильтр на
 "уровень(1)". Далее сохраняем прием и компилируем (F3). Заметим,
 что можно было откомпилировать копию приема и не изменяя его -
 тогда программы приемов склеятся вплоть до последних операторов,
 вы\-пол\-ня\-ющих преобразование, а перед ними произойдет ответвление одной
 программы от другой.

 \item Прием поместим в том же самом разделе "Тест", что и предыдущий.
 Для инициализации его нажимаем "Ctr-п" \ (когда раздел был пустой,
 нажатия спе\-ци\-альной клавиши для инициализации приема не требовалось -
 можно было сразу вводить теорему). Появляется чистый экран, и начинается
 ввод ком\-по\-нент приема. Заметим, что если оборвать набор приема до его
 сохранения и выйти, например, в оглавление либо даже в просмотр соседних
 приемов того же самого концевого пункта (это делают клавиши "курсор
 вверх", "курсор вниз"), то вся работа по набору начальной части приема
 пропадет - как если бы клавиша Ctr-п не нажималась вовсе.

 В нашем случае новым является наличие чертежа. Он вводится до
 набора теоремы. Нажимаем Ctr-ч, после чего появляется синяя рамка
 геометрического редактора. Выбираем курсором мыши в верхней левой
 части экрана пункт меню "Точка" \ и на\-жи\-ма\-ем левую кнопку мыши.
 В правом верхнем окне рамки редактора возникает указатель режима
 "Точка". Теперь можно вводить точки чертежа. Выбираем подходящее
 место для вершины $A$ треугольника и на\-жи\-ма\-ем левую кнопку мыши.
 Кроме точки, появляется ее обозначение, авто\-ма\-ти\-чес\-ки вводимое
 редактором - берутся последовательные большие буквы латин\-ско\-го
 алфавита. Далее выбираем место для вершины прямого угла $B$ и
 место для вершины $C$, нажимая каждый раз левую кнопку мыши.
 Введя точки, вклю\-ча\-ем режим "Отрезок" \ (см. меню в верхней части
 экрана). Далее проводим стороны треугольника: подводим курсор к
 точке $A$ и нажимаем левую кнопку мыши; затем подводим курсор к
 точке $B$ и снова нажимаем левую кнопку мыши. Появляется отрезок
 $AB$. Таким же образом создаем отрезки $AC$ и $BC$. Если точки
 легли не очень удачно, то выбираем ту из точек, которую
 желательно сдвинуть - опять нажатием левой кнопки мыши. Для
 сдвига используем кла\-ви\-ши курсора - каждое нажатие сдвигает
 выделенную точку на один пиксел в соответствующем направлении.
 Чтобы одновременно сдвигать и букву, обоз\-на\-ча\-ющую точку,
 аналогичным образом используем клавиши "Ctr-курсоры". Наконец,
 чертеж сдвигаем в верхнюю часть экрана, чтобы как можно больше
 места оставить для прочих компонент описания приема. Для этого
 включаем режим "перемещение". Перемещение производится указанием
 начала и конца вектора перемещения - нажатиями левой кнопки мыши.
 Этот вектор можно откладывать от любой точки на экране, не связывая ее
 с чертежом. После указания конца вектора смещается все изображение,
 причем если места для сдвига не хватает, то он блокируется. Для
 инициализации нового сдвига - пов\-тор\-ное указание его вектора.
 Ввод чертежа завершается нажатием Enter, и сразу возникает курсор
 текстового редактора для ввода теоремы.

 Все остальные шаги по вводу приема аналогичны первому
 разобранному при\-ме\-ру - только при вводе нормализатора
 "норминтервал" \ придется выделять цветовой указкой не вхождение в
 теорему, а вхождение в указатель "биключ(\\ $\ldots$)" \ из четвертого окна приема. Когда
 это вхождение выделено, нажимается Enter и вводится нормализатор.

 \item Чтобы разрезать список фильтров на две части, выделяем
 нажатием ле\-вой кнопки мыши фильтр "лексикопредшествует(х26 х28)"
 \ и нажимаем "р" \ (кир.). После данного фильтра появляется
 запятая, а оставшиеся фильтры перено\-сят\-ся "на следующую
 страницу". Для перенесения фильтра из другого приема сна\-ча\-ла
 находим последний - это второй от конца прием раздела "Теорема
 Пифа\-го\-ра", расположенного в конце цепи ("Элементарная геометрия",
 "Фигуры", "Треугольник", "Прямоугольный треугольник"). Выделяем
 нужный фильтр "контекст($\ldots$)" \ левой кнопкой мыши и
 нажимаем "у" \ (кир.). Затем клавишей пробела сбрасываем выделение.
 Возвращаемся в просмотр "своего" \ приема и нажимаем клавишу "у"
 \ повторно, но не выделяя каких-либо окон или фильтров. Тогда
 фильтр "контекст($\ldots$)" \ автоматически добавится к списку
 фильтров рас\-смат\-ри\-ва\-емого приема. Так как наш список фильтров
 разрезан на две части, а новый фильтр заносится в конец
 списка фильтров, то на экране он не появится, пока не будет
 вызвана для просмотра последняя "страница" \ списка фильтров.
 Чтобы сохранить добавленный фильтр и перекомпилировать прием, лучше
 до этого нажать F3.

 \item Вводим посылки задачи - "прямая($AD$) $\bot$ прямая($DC$)";
 $l(AC)=5$; $l(AD)=4$. Входим в меню выбора целевой установки и
 выбираем пункт ("Найти значе\-ния неизвестных", "Выразить значения
 неизвестных через заданные параметры"). После подсказки
 "Выразить" \ набираем $x$ и нажимаем Enter. Так как извест\-ных
 параметров в задаче нет, подсказку "через" \ игнорируем и сразу
 нажимаем Enter. Под целевой установкой набираем условие: $x=
 l(CD)$. Чертеж вручную строить не нужно - для его автоматического
 создания нажимаем Ctr-ч. На точку срабатывания приема попадаем
 так, как это уже объяснялось выше.

 \item Для удаления нормализаторов входим в просмотр описания
 приема и нажимаем Ctr-End. Чтобы восстановить эти нормализаторы,
 нажимаем "н" \ (кир.). Тогда включается режим ручного анализа
 последовательности предложений, вно\-си\-мых генератором приемов.
 Здесь могут появляться предложения на добав\-ле\-ние либо удаление
 нормализаторов и указателей. Если предлагается добавить
 элемент, то первый пункт меню в левой верхней части экрана имеет
 вид "Новый указатель", иначе - вид "Старый указатель". Чтобы
 ввести новый элемент либо сохранить старый, нужно нажать Insert;
 чтобы отказаться от нового элемента либо удалить старый - нажать
 Delete. В нашем случае последовательно по\-яв\-ля\-ют\-ся нормализаторы,
 так что естественно все время нажимать Insert - пока предложения
 не будут исчерпаны. После этого нажимаем F3.

 \item Ввод теоремы приема сложения дробных выражений и его
 заголовка проис\-хо\-дит обычным образом. При наборе фильтра
 "или(заголовок($\ldots$)$\ldots$)" \ после открывающей
 скобки символа "заголовок" \ нажимаем клавишу Shift-1, при\-во\-дя\-щую
 к появлению цветовой указки в первом окне. Выбираем этой указкой
 первое слагаемое и нажимаем клавишу "ф". Сразу вслед за этим в
 третьем окне начиная с текущей позиции курсора будет прорисован
 указатель вхождения "фикс(0 1 1)", а цветовая указка в первом
 окне пропадет. Остальные указатели вхождения вводятся таким же
 образом. Нормализаторы приема можно создать частично с помощью
 клавиши "н", а частично - добавить вручную.

 Для ввода текст-формульного шаблона нажимаем
 клавишу "6" \ и вводим, на\-при\-мер, следующий
 текст: "Выражение () равно сумме дробей () и ()". Чтобы первая
 буква слова "Выражение" \ не пропала при выдаче на экран,
 отступаем при наборе этого слова от левого края экрана на один символ.
 По завершении набора нажимаем Enter. Если понадобится изменить
 текст шаблона, то снова нужно будет нажать "6", затем - Enter для
 входа в текстовый редактор.

 Чтобы определить выражения, подставляемые в шаблон вместо скобок,
 вводим указатель "титр(набор(1 терм(фикс(0 2))терм(фикс(0 1
 1))терм(фикс(0 1 2))))", в котором указатели вхождений выделяют,
 соответственно, правую часть тож\-дес\-тва и вхождения дробных
 слагаемых. Здесь снова применяется описанный выше интерфейс
 полуавтоматического набора указателей вхождения. Для те\-с\-ти\-рования
 приема вводим, например, задачу на упрощение выражения
 $a/3b+c/b^2d$. При срабатывании приема, кроме
 поясняющего текста, появятся также сообщения о вспомогательных проверках
 отличия от нуля знаменателей. При желании, эти проверки можно будет тут
 же повторить. Однако, ввиду три\-ви\-аль\-ности проверок, сообщения о них
 лучше вообще не выдавать. Чтобы убрать сообщения, следует вернуться
 в прием и добавить указатели "комментарий(1 титр(стоп))", "комментарий(2
 титр(стоп))", "комментарий(3 титр(стоп))", пе\-ре\-да\-ющие комментарии
 (титр стоп) проверочным операторам первых трех ан\-те\-це\-дентов.

\item Для удаления всех введенных в упраженениях приемов
последовательно на\-жи\-маем Ctr-Del из просмотра их описаний.
Затем убираем пустой концевой пункт "Тест", выходим в оглавление
базы приемов и нажимаем "О".

\end{enumerate}

\subsection{Анализ приема}

Разберем ряд простых упражнений на анализ описаний уже созданных
приемов. Так как многие компоненты приема имеют эвристический
характер, то чтобы понять их назначение, нужно прежде всего найти
задачи, ради которых они были введены. Если возникло предположение
о целесообразности изменения данных компонент, то необходимо
провести тестирование измененного приема на тех же задачах, а при
ослаблении ограничений на срабатывание - также и на
дополнительных.

\begin{enumerate}

\item Найти раздел "Углы при параллельных прямых и секущей", и в
этом раз\-де\-ле войти в просмотр описания третьего с конца
приема. Объяснить фильтры этого приема. Найти в разделе задачника
("Элементарная геометрия", "Задачи на вычисление") \ все задачи, в
которых данный прием срабатывает. Определить, для каких из них его
сра\-ба\-ты\-вание избыточно. Предложить дополнительный фильтр,
блокирующий хотя бы часть ненужных срабатываний.

\item Найти раздел "Произведение в основании степени", и в этом
разделе войти в просмотр описания последнего приема. Объяснить
фильтры этого приема. Найти в разделе задачника "Исследование
сходимости числовых рядов - 3" \ задачу, для которой удаление
фильтра "не(контекст($\ldots$))" \ приводит к за\-цик\-ливанию
процесса решения.

\item Найти раздел "Потенцирование логарифмических уравнений", и в
этом разделе войти в просмотр второго с конца приема. Объяснить
фильтры этого приема. Найти в задачнике задачу, в которой данный
прием срабатывает, и выйти на точку его срабатывания.

\item Найти раздел "Возведение в квадрат уравнения с одним
неизвестным ра\-ди\-ка\-лом", и в нем войти в просмотр последнего
приема. Объяснить фильтры этого приема. Придумать систему
уравнений, в которой фильтр
"или(равно(чис\-ло\-не\-из\-вестных(корень)1)$\ldots$)" \ ускоряет
получение ответа. Найти такую систему в задачнике.

\item Найти в ветви раздела "Плюс" \ концевой подраздел "Вычитание
уравнения, домноженного на известный коэффициент, с целью
получения линейного урав\-не\-ния, либо уравнения с одной
неизвестной, либо разложения на множители левой части уравнения",
и войти в просмотр единственного приема этого под\-раз\-де\-ла.
Объяснить фильтры приема. Придумать задачу, в которой прием
сра\-бо\-тал бы, занести ее в задачник, и выйти на точку
срабатывания приема.

\item Чтобы найти прием, суммирующий квадраты синусов элементов
арифме\-ти\-чес\-кой прогрессии, занести в задачник пример на
такое суммирование, выйти при трассировке на срабатывание искомого
приема, и определить его место в оглав\-ле\-нии базы приемов.

\item Найти в ветви раздела "Описанная около фигуры окружность" \
концевой под\-раз\-дел "Теорема синусов". Рассмотреть последние
четыре приема этого под\-раз\-дела, и для каждого из них найти все
задачи на вычисление по планиметрии, в которых он срабатывает.
Определить, в каких задачах срабатывание приема являлось
избыточным. Предложить фильтры, отсекающие хотя бы часть таких
срабатываний.

\item Найти в ветви раздела "Касательная" \ концевой подраздел
"Длина касательной и длины отрезков секущей". Рассмотреть
последние три приема этого под\-раз\-де\-ла, и для каждого из них
найти все планиметрические вычислительные задачи, в которых он
срабатывает. Объяснить различия между контекстами срабатывания
этих приемов. Определить, в каких задачах срабатывание приема было
избыточным.

\item Найти раздел ("Тангенс", "Уравнения", "Переход к тангенсу
половинного ар\-гу\-мен\-та") и войти в просмотр его последнего
приема. Объяснить фильтры этого приема. Придумать задачу, в
которой прием сработал бы; занести ее в задачник, и выйти на точку
срабатывания.

\item В ветви раздела "Плюс" \ найти концевой подраздел "Выражение
неизвест\-ной $X$ из уравнения $X+A=B$" \ и войти в просмотр
единственного приема этого подраздела. Определить последствия
удаления фильтра "или(и(тип(описать)\\ уровень(5))$\ldots$)".

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Прием находится в разделе ("Элементарная геометрия",
"Параллельны", "Уг\-лы при параллельных прямых и секущей").
Уровень срабатывания его равен 9, причем срабатывание происходит
при рассмотрении некоторой посылки задачи на доказательство либо
на исследование. Заметим, что почти все приемы по элементарной
геометрии предназначены для срабатывания в списке посылок задач
этих типов. Задачи на вычисление либо на построение, изначально
офор\-мля\-емые как задачи на описание, решаются (в особенности
первые) с помощью вывода следствий в своем блоке анализа.

Фильтр "неизв($\ldots$)" \ означает, что величина угла $DFE$ между
касательной и секущей должна быть не известной и связанной с
"основными" \ неизвестными, т.е. неизвестными внешней задачи на
описание. Такая связь понимается либо как вхождение неизвестной в
выражение $t$ для величины угла, либо как наличие цепочки
уравнений, в первое из которых входит какой-либо угол или
расстояние из $t$, в последнее - неизвестная, а любые два соседних
уравнения имеют какое - либо общее расстояние либо угол. Заметим,
что выражение $t$ для величины угла $DFE$ находится в приеме с
помощью нормализатора "нормугол".

Следующий фильтр отсекает вырожденный случай совпадения
рассмат\-ри\-ва\-е\-мых параллельных прямых (хотя и не гарантирует
этого несовпадения, так как совпадающие прямые могут иметь
различные обозначения).

Последний фильтр отсекает случаи, когда отрезок секущей является
стороной параллелограмма, трапеции либо ромба - для углов этих
фигур имеются свои приемы. Квадрат и прямоугольник не
рассматриваются потому, что для них угол $DFE$ известен.

В общем-то, этот фильтр не доведен до конца - нужно было бы еще
уточнить, что смежные стороны не лежат на наших параллель\-ных
прямых. Такого рода недоработок в текущей версии решателя имеется
нема\-ло; обычно они легко устраняются, хотя иногда для этого
может понадобить\-ся дальнейшее пополне\-ние ГЕНОЛОГа. Наличие их
объясняется, во-первых, объ\-емом системы, а во-вторых, теми
целями, которые ставились при ее развитии - проверкой и
уточ\-не\-нием общих принципов моделирования логических
процес\-сов, выявлением общих архитектурных и технологических
подходов. На этом этапе работы ре\-ша\-тель должен рассматриваться
не как готовый продукт, а лишь как первая черновая версия
проработки предметных областей, которая могла бы стать
организующим началом для последующего систематического их
освоения. Впро\-чем, принцип преодоления при обучении решателя
"всех задач из задачника подряд" \ делает свое дело - в тех
случаях, где недоработки действительно ощу\-ти\-мы на реальном
потоке задач, они достаточно быстро обнаруживаются и, так или
иначе, подправляются. Это приводит к тому, что даже данная версия
уже может рассматриваться как некоторая заявка на создание системы
компьютер\-ной математики нового типа, в особенности если
сравнивать ее возможности по решению плохо алгоритмизируемых задач
с возможностями других систем компьютер\-ной математики.

Следующий пункт упражнения - поиск задач, на которых прием
срабатывает. Чтобы можно было выполнить быстрый поиск в заданном
разделе задачника всех таких задач, должна была иметь место хотя
бы одна прокрутка реша\-те\-ля на этом разделе после того, как
прием был введен. Если после прокрутки прием был изменен, то поиск
даст задачи, в которых прием срабатывал до изменения. Для
инициализации поиска следует перейти от просмотра приема к
задачнику, нажав клавишу Shift-3. Затем следует выделить тот
раздел, для которого будет выполняться поиск, нажать Shift-2 и
таким образом снова оказаться в оглав\-ле\-нии базы теорем. Здесь
нужно войти в просмотр приема и нажать "А" \ (кир.). Если нужно
получить данные для серии приемов, то после нажатия "А" \ мож\-но
перейти к другим приемам, нажимая при просмотре каждого из них на
"А". После нажатия на "А" \ происходит просмотр протоколов
задачника, который может создавать небольшую паузу (обычно только
для первого нажатия "А"). По завершении указанных действий
нажимается клавиша Shift-3, снова пе\-ре\-во\-дя\-щая в оглавление
задачника. Данные просмотра сохраняются в буфере задачника, и для
перехода к нему нажимается "ф".

В нашем примере, после выполнения перечисленных действий, находим
в бу\-фе\-ре раздел "Углы при параллельных прямых и секущей" \ - в
нем и будут собраны все найденные задачи. Нажимаем "курсор вправо"
\ и обнаруживаем номера 8 отобранных задач. В действительности это
лишь повторные ссылки на задачи, уже имеющиеся в основных разделах
задачника. Поэтому изменять задачи в буфере не следует. Однако,
можно запускать процессы решения их так же, как для основной части
задачника - поштучно либо сразу серией из 8 задач.

Нам нужно определить, в каких из 8 задач рассматриваемый прием в
дей\-ст\-ви\-тель\-ности не нужен. Чтобы сделать это, можно было
бы зайти в оглавление базы приемов, отключить прием нажатием
клавиши F7, запустить процессы решения отобранных задач, и
посмотреть, каковы будут результаты. Для нача\-ла рекомендуем
реализовать этот способ. Здесь надо иметь в виду, что при решении
задачи с отключенным приемом решение ее может замедлиться
на\-столь\-ко, что для перехода к следующей задаче серии нужно
будет нажать последовательно Break и Esc (впрочем, в нашем примере
этого делать не нуж\-но). Напоминаем, что серийный запуск
выполняется, после возвращения в бу\-фер, нажатием Ctr-з.

По окончании серийного решения просматриваем его итоги, нажав
клавишу "з". Видно, что одна задача вообще не решена, а решение
трех - очень сильно замедлилось. Для выхода на задачу с утерянным
решением нажимаем "у", для просмотра серии задач с замедлением
решения (упорядоченных по убыванию замедления) - нажимаем "з", и
для перехода к каждой очередной задаче - "ш". Любую из этих задач
можно выбрать для пошагового просмотра решения и анализа
возможностей его доработки. Впрочем, нам известна причина
пе\-ре\-чис\-лен\-ных ухудшений; интерес представляют в первую
очередь другие задачи - те, где ответ не изменился, а решение
ускорилось. Если анализ точек срабатыва\-ния приема в этих задачах
покажет, что оно бессмысленно или крайне слабо мотивировано, то
появится возможность ввести дополнительный фильтр,
от\-се\-ка\-ющий данные точки. Разумеется, после этого нужно будет
еще проверить, не оказались ли отсечены срабатывания приема в тех
задачах, которые без него не решаются либо замедляются. Здесь
могут появиться еще какие-то коррекции фильтра, и т.д. В этом
итеративном процессе нужно помнить, что замедление либо потеря
решения после отключения приема, вообще говоря, еще не
озна\-ча\-ют, что он действительно необходим. К сожалению,
достаточно часто задача решается из-за случайного "рикошета",
возникшего после срабатывания при\-ема, и тогда приходится
продолжать работу с ней до выявления тех средств, которые в
действительности ей нужны.

Мы не будем использовать данные серийной прокрутки, полученные
указан\-ным выше способом. Вместо этого восстановим программу
приема нажатием клавиши F5 (из просмотра приема) и повторим
прокрутку отобранных 8 задач при подключенном приеме - для
восстановления исходной ситуации. Дело в том, что анализ
избыточности приема на отобранных задачах можно выпол\-нить
автоматически. Для этого достаточно нажать клавишу "й",
иницииру\-ю\-щую серийный запуск с блокировкой срабатываний нашего
приема без удаления его программы. Если время решения задачи с
заблокированным приемом оказы\-ва\-ет\-ся значительно больше
исходного, то процесс ее решения обрывается авто\-ма\-ти\-чески, и
начинается рассмотрение следующей задачи. За ходом процесса можно
следить по тому, как выделенный синим цветом номер текущей задачи
перемещается вниз. В тех случаях, когда ответ на задачу
сохранился, а время решения сократилось, после номера задачи
ставится знак вопроса - здесь при\-ме\-не\-ние приема не нужно.

После прокрутки возникают знаки вопроса на третьей, четвертой и
шестой задачах. Чтобы теперь анализировать контексты срабатывания
приема, лучше всего дополнить его указателем "стоп" \ и
перекомпилировать. Тогда при каждом его применении,
непосредственно до выполнения преобразования, будет
про\-ис\-хо\-дить выход в отладчик ЛОСа. Чтобы просмотреть
преобразование, доста\-точ\-но будет в этой ситуации нажать
"пробел" \ для перехода в трассировку по шагам решения задачи и
Enter - для начала такой трассировки. На первом же шаге будет
выведена информация о текущем применении приема. В дальнейшем, по
завершении работы с приемом, указатель "стоп" \ следует удалить -
вручную либо, если не было внесено других изменений в прием,
нажатием "Б" \ для восстановления исходной версии.

Чтобы понять, какие фильтры можно было бы ввести для отсечения
найденных трех ненужных срабатываний, сначала стоит посмотреть на
те задачи, в ко\-то\-рых преобразование оказалось нужным.
Возможно, при этом выяснятся какие-то дополнительные связи
величин, входящих в выводимое приемом соотно\-ше\-ние, с прочими
объектами задачи, при наличии которых увеличивается
ве\-ро\-ят\-ность извлечь пользу из соотношения. Просматривая
контексты срабатыва\-ния приема в пяти задачах, не помеченных
знаком вопроса, обнаружим, например, что в каждой из них вершина
$E$ нового угла $BEF$, вводимого приемом, уже являлась вершиной
некоторого рассматриваемого в задаче угла. Просматривая после
этого контексты срабатывания в остальных трех задачах,
обнаруживаем, что для них это условие выполнялось не всегда. Это
уже дает основание для ввода нового фильтра
"контекст(усм(актив(угол(х2 х30 х3))))", означающего наличие
выделенного в задаче угла с вершиной $E$; здесь вместо переменной
$E$ формульного редактора используем ее обозначение х30 текстовым
редактором. Вводим данный фильтр в третье окно описания приема,
удаляем указа\-тель "стоп" \ и перекомпилируем прием нажатием F3.
После тестовой прокрутки восьми задач из буфера обнаруживаем, что
решение четвертой задачи ощути\-мо ускорилось - вместо 53
млн.шагов интерпретатора оно стало требовать лишь 40 млн. шагов.

Разумеется, проведенный здесь анализ весьма поверхностный, и в
данном при\-ме\-ре можно было бы попытаться продолжить оптимизацию
решения вы\-де\-лен\-ных задач, добиваясь более веской мотивировки
применения приема. В тех случаях, когда эта мотивировка неясна, а
без приема задача решается хуже, нужно искать другие хорошо
мотивированные действия, идущие в обход при\-ме\-не\-ния данного
приема, и создавать для них новые приемы. Материала для подобной
оптимизации в решателе более чем достаточно. Продолжение ее
нуж\-но не только ради получения эффективной системы для
пользователя, но глав\-ным образом для создания средств
автоматического синтеза приемов. Многие ком\-по\-нен\-ты описаний
приемов вынужденным образом имеют эвристический ха\-рак\-тер,
однако даже в них прослеживается определенная логика.
Рас\-шиф\-ров\-ка такой логики неразрывно связана с оптимизацией
решателя, отсечением "пред\-рассудков" \ и выявлением тех
взаимодействий между приемами, которые ре\-аль\-но нужно учитывать
при принятии решений. Можно надеяться, что про\-дви\-же\-ние в
этом направлении позволит постепенно перейти к автоматическому
развитию решателей.

\item Путь к разделу в оглавлении базы приемов - ("Элементарная
алгебра", "Сте\-пени", "Общая стандартизация выражений",
"Простейшие свойства степени", "Произведение в основании
степени"). Прием предназначен для преобразо\-ва\-ния степени
произведения двух неотрицательных сомножителей в произведение их
степеней. Он срабатывает сразу же, как только предоставляется
такая воз\-мож\-ность - на уровне 0. Переход к степеням с более
простыми ос\-но\-ва\-ни\-ями рассматривается в решателе как
направление общей стандартизации выраже\-ний, принимаемое на
промежуточных этапах решения задачи. Как пра\-вило, перед выдачей
ответа выполняется обратный переход - группировка под об\-щий
показатель степени. Однако, в ряде случаев разгруппировка степени
про\-из\-ве\-де\-ния в про\-из\-ве\-дение степеней сомножителей
блокируется, и для оз\-на\-ком\-ле\-ния с тем, когда это признано
целесообразным, рассматриваем фильтры приема.

Прежде всего, идет фильтр, запрещающий срабатывание приема в
условии задачи на преобразование, имеющей комментарий "длина".
Такой комментарий означает, что в задаче уже предпринималась
итоговая компактная пере\-фор\-му\-ли\-ровка результата; в
частности, могла быть предпринята группировка со\-мно\-жи\-телей
под общую степень. После этого срабатывание данного приема,
конечно, нежелательно. Аналогичным образом объясняется следующий
фильтр: срабатывание приема блокируется при завершающем
редактировании ответа задачи на описание. Исключение могут
составлять лишь случаи, в которых цель "редакция" \ появляется не
на завершающем этапе поиска неизвестных, а для специального
преобразования списка утверждений. В фильтре и указан один из
таких случаев - наличие цели "редуцирование", используемой при
логичес\-ком выводе в базе теорем.

Далее идет ускоряющий фильтр: если число сомножителей равно двум,
то в силу симметрии можно потребовать, чтобы тот из них, который
идентифи\-ци\-ру\-ет\-ся с $a$, лексикографически предшествовал
идентифицированному с $b$. Таким образом вместо двух случаев будет
рассматриваться только один. Заметим, что если число сомножителей
более двух, то один из множителей (какой именно - решает
компилятор) будет идентифицроваться как одиночный операнд
про\-из\-ве\-де\-ния, а другой - как произведение всех оставшихся
операндов.

Далее - фильтр, запрещающий разгруппировку основания степени, если
по\-ка\-за\-тель $c$ ее связан внешним описателем "класс" \ либо
"отображение", а основание не имеет связанных этим описателем
переменных. В таких случаях выгоднее упрощать выражение в первую
очередь относительно переменных связывающей приставки описателя,
так как это может позволить устранить описатель. На\-при\-мер,
применение разгруппировки степени при рассмотрении суммы
гео\-мет\-ри\-ческой прогрессии нецелесообразно - выражение
потеряет "явный" \ вид геометрической прогрессии, и прием ее
суммирования может не сработать.

Следующий фильтр аналогичен только что рассмотренному - он
блокирует разгруппировку степени при рассмотрении показательных
уравнений, если ос\-но\-ва\-ние не содержит неизвестных, а
показатель содержит. Общая эвристичес\-кая мотивировка похожая - в
уравнениях выгодно, при отсутствии особых со\-об\-ра\-же\-ний,
упрощать выражения по числу вхождений неизвестных. Для
рас\-смат\-ри\-ва\-е\-мо\-го приема такие конкурирующие
соображения в задачах не возникали, что и нашло свое отражение в
данном фильтре.

Наконец, последний фильтр нужен для указания на разделение труда
между различными приемами. Данный прием срабатывает, если
усматривается не\-от\-ри\-ца\-тельность обоих сомножителей
основания степени. Однако, если бы по\-ка\-за\-тель степени имел
вид числовой дроби с нечетным знаменателем, то проверки
неотрицательности были бы излишни, и для этого случая предусмотрен
другой прием (в данном разделе он идет вторым от конца). Так как
уровни сраба\-ты\-ва\-ния обоих приемов одинаковы (равны 0), то
приходится вставлять фильтр, блокирующий применение данного приема
в ситуациях, подпадающих под об\-ласть действия другого.
Разумеется, этот фильтр имеет лишь ускоряющий характер - при его
отсутствии задачи все равно решались бы, но с несколько большей
трудоемкостью.

Чтобы протестировать фильтр "не(контекст($\ldots$))", нужно найти
такие задачи, в которых степенное выражение входит в определение
функции, причем по\-ка\-затель степени содержит варьируемую
переменную, а основание - не содержит. Удалим этот фильтр из
описания приема и перекомпилируем прием; затем (как сказано в
задании) войдем в раздел задачника ("Математический анализ",
"Ряды", "Исследование сходимости числовых рядов - 3"). Для
серийного за\-пус\-ка решателя в этом разделе нажимаем Ctr-з.
Через некоторое время одна из задач "залипает" \ на экране.
Нажимаем Break и выходим в просмотр отладчи\-ком ЛОСа какого-то
момента выполнения программы. Для выхода на уровень трассировки
"по шагам решения" \ нажимаем клавиши "пробел" \ и Enter.
Ис\-поль\-зуя для смены кадров нажатия Enter, обнаруживаем
зацикливание: снача\-ла срабатывает анализируемый прием,
заменяющий $(2(\sin x)^2)^i$ на $2^i(\sin x)^{2i})$, затем -
прием, устраняющий возникающие после такой замены вложенные
ум\-но\-же\-ния, и далее - прием, группирующий под общий
показатель степени $i$ два только что возникших множителя.
Последний прием при суммирова\-нии действительно бывает нужен -
например, для выявления геометрической про\-грес\-сии либо
каких-либо других стандартных сумм с "показательными" \
под\-вы\-ра\-жениями, а значит, рассматриваемый фильтр в этих
ситуациях тоже придет\-ся вводить - без него решатель будет
зацикливаться.

Для обрыва серийного решения возвращаемся в отладчик ЛОСа (нажатие
"ф") и на\-жи\-ма\-ем Ctr-з, Esc. Затем возвращаемся в просмотр
нашего приема и на\-жи\-ма\-ем "Б" \ для восстановления его
исходного вида.

\item Прием находим в разделе ("Элементарная алгебра",
"Логарифмы", "Решение уравнений", "Потенцирование логарифмических
уравнений"). Прием имеет в качестве возможных уровней срабатывания
значения от 1 до 5. Он применяет\-ся для преобразования условия
задачи на описание либо посылки задачи на исследование. Вообще,
посылки задачи на исследование, содержащие неиз\-вест\-ные, часто
преобразуются так же, как условия задачи на описание, хотя полного
совпадения здесь нет. Теорема приема выделяет логарифмический
множитель слагаемого левой части уравнения, причем этот множитель
должен содержать неизвестную - либо в основании логарифма, либо в
выражении под логарифмом. Если решается система уравнений (число
неизвестных более одной), то уровень срабатывания 2 отбрасывается,
иначе - отбрасывается уровень 3. С учетом ограничений на уровень
срабатывания, определяемых дальнейшими фильтра\-ми, это означает,
что для систем уравнений прием не спешит с потенцированием - здесь
имеются возможности решить задачу и другими средствами, в то время
как для одного уравнения его необходимость более вероятна.

Далее идет фильтр, учитывающий наличие комментария "логарифм".
Такой комментарий к задаче вводится приемом, выполняющим
логарифмирование показательного уравнения. Чтобы понять это, можно
было бы, например, вос\-поль\-зоваться оператором "текприем",
занеся в него условие проверки наличия указателя
"замечание(логарифм)" \ и просмотрев все приемы, имеющие данный
указатель. Ясно, что если уже был предпринят шаг перехода от
показатель\-ных уравнений к логарифмическим, то обратный переход
нужно как-то заблоки\-ро\-вать. Но даже и здесь, когда
потенцирование очевидным образом приводит к упрощению ситуации,
его все же следует разрешать. Фильтр допускает
по\-тен\-ци\-рование уравнения при наличии комментария "логарифм"
\ лишь в тех случаях, когда левая часть уравнения представляет
собой линейную комбинацию ло\-га\-риф\-мов, у которой все
основания и коэффициенты известны - тогда после потенцирования
неизвестные не будут входить в показатели степени.

Далее располагается фильтр, разрешающий срабатывание данного
приема в двух случаях:

а) Под логарифмом находится степенное выражение с неизвестным
показате\-лем. Тогда исключение логарифма может привести к
обычному показательно\-му уравнению. Уровень срабатывания 1 выбран
здесь потому, что маловероятно решение такого "двухэтажного" \ по
логарифмическим и показательным кон\-струкциям уравнения другими
средствами.

б) Каждое неизвестное слагаемое остатка $d$ левой части уравнения,
имеющее общую неизвестную с выделенным логарифмом, является
произведением ло\-га\-риф\-ма по основанию $a$ на известный
коэффициент. При этом уровень сраба\-ты\-ва\-ния 1 разрешается
лишь для системы уравнений, в которой другие уравнения не имеют ни
логарифма выражения $b$, ни степени с основанием $b$. Если бы
такое уравнение нашлось, то имелась бы некоторая вероятность
решить систему без потенцирования - рассмотрением линейных
комбинаций уравнений и ло\-га\-риф\-ми\-рованием других уравнений.

\par\medskip

Далее идет фильтр, запрещающий наличие неизвестных логарифмов
внутри выражения $c$ - здесь либо возможно упрощение
логарифмических выражений до потенцирования, либо потенцирование
приводит к столь же сложной для решения уравнения ситуации, что и
исходная.

Два последних фильтра связаны с задачами, возникающими в
математическом анализе и дифференциальных уравнениях; их пока
рассматривать не будем. Чтобы распознавать такие фильтры, заметим
только, что обычно в них встре\-ча\-ют\-ся символы "связка",
"нормИнтеграл", "диффильтр".

Чтобы найти задачу, в которой данный прием срабатывает, выходим в
оглав\-ле\-ние задачника, выделяем раздел "Элементарная алгебра",
нажимаем Shift-2 для перехода в оглавление приемов, входим в
просмотр приема, нажима\-ем из этого просмотра "А" \ (кир.), и
далее нажимаем Shift-3 (после небольшой паузы, в течение которой
происходит просмотр архива задачника). Тогда снова возникает
оглавление задачника, в котором нажимаем "ф" \ для перехода к
буферу. В буфере обнаруживаем список всех задач раздела
"Элементарная алгебра", в которых срабатывает рассматриваемый
прием. Этот список нахо\-дит\-ся в разделе, заголовок которого
воспроизводит заголовок раздела приема в базе приемов. Выбираем,
например, первую задачу списка, нажимаем "г" \ для запуска ее
решения через оглавление приемов, входим в просмотр приема и
нажимаем Enter. Первое срабатывание приема отображается на экране,
и далее устанавливается режим трассировки по шагам решения задачи.
По завершении упражнения расчищаем буфер задачника - в
произвольном месте его оглавле\-ния нажимаем "О" \ (кир.).

\item Искомый прием находится в разделе ("Элементарная алгебра",
"Степени", "Ре\-шение уравнений", "Уравнение с радикалами",
"Возведение в квадрат урав\-не\-ния с одним неизвестным
радикалом").

Он используется для возведения в квадрат уравнения, имеющего в
левой части ровно одно слагаемое, среди множителей которого есть
неизвестные радикалы четной степени. Известно, что возведение в
квадрат позволяет уменьшать число слагаемых с неизвестными
радикалами лишь для малого числа таковых. Если их нельзя
перегруппировать так, что в каждой части будет не более двух
радикалов, то возведение в квадрат нецелесообразно. Поэтому в
решателе от\-дель\-но рассмотрены все 4 случая для возможного
числа слагаемых с ради\-ка\-ла\-ми - от 1 до 4. В случае
нескольких радикалов в приемы вводится учет осо\-бых
обстоятельств, позволяющих рационально сгруппировать радикалы
перед возведением в квадрат. Уровень срабатывания приемов
достаточно высок - начиная с 5. Это сделано для того, чтобы перед
возведением в квадрат был, хотя бы бегло, рассмотрен блок анализа
задачи и, по мере возможности, использо\-ва\-ны более простые
средства решения. Например, в случае системы уравнений более
эффективным может оказаться использование для исключения
радика\-ла линейных комбинаций урав\-не\-ний; в случае одной
неизвестной уравнение может быть решено как квадратное
относительно радикала, и т.п.

Первые фильтры рассматриваемого приема фиксируют общий контекст
сра\-ба\-ты\-ва\-ния: уровень 5; уравнение является условием
задачи на описание; вы\-ра\-же\-ние под радикалом содержит
неизвестные; правая часть уравнения из\-вест\-на. Далее идет
фильтр, требующий, чтобы среди остальных слагаемых левой части не
имелось ни одного, чьим множителем был бы радикал четной степени.
Фактически в фильтре сформулировано немного более общее условие -
отсутствие показателя степени, коэффициент знаменателя которого
делился бы на 2.

Далее расположено несколько странное, на первый взгляд, условие -
если урав\-не\-ние имеет более одной неизвестной, а число
слагаемых его левой части более одного, то не должно иметься
другого уравнения, в левой части которого на\-хо\-дит\-ся не менее
двух слагаемых с неизвестными радикалами. Оно возникло при
рассмотрении задачи, где после возведения в квадрат второго
уравнения появился такой же радикал, как и в первом, и далее для
исключения неиз\-вест\-но\-го радикала удалось использовать
линейную комбинацию уравнений. Эта ситуация подсказала, что
разумнее начинать возведение в квадрат с уравнений, имеющих более
одного радикала. Разумеется, такой фильтр можно было бы сделать
более точно учитывающим возможность получения в разных
уравне\-ни\-ях "подобных" \ членов с неизвестными радикалами после
возведения в квад\-рат, но и в приведенной выше упрощенной версии
он оказался пока вполне достаточным.

Следующий фильтр запрещает наличие в оставшихся слагаемых левой
части неизвестных логарифмов при отсутствии неизвестного логарифма
под ра\-ди\-ка\-лом. Он возник из рассмотрения уравнений, которые
вообще элементарными средствами не решаются. Такие уравнения часто
появляются, например, при отыскании корней производной.
Рассматриваемый фильтр ускоряет выдачу от\-каза в этих ситуациях,
позволяя решателю переключиться во внешней задаче на другие пути
решения.

Наконец, последние фильтры, судя по встречающемуся в них символу
"связка", нужны при рассмотрении дифференциальных уравнений, и мы
их пропускаем.

Подбираем уравнение для проверки полезности указанного в
упражнении филь\-тра согласно приведенным выше объяснениям.
Например, можно расмотреть систему $\sqrt{2x+3} \sqrt{2y+1} + y =
45/8; \sqrt{2y+1} + \sqrt{2x+3} - x= 5$. Отключая
рас\-смат\-риваемый фильтр, убеждаемся, что система не решается, в
то время как при использовании фильтра находим корни
$x=-3/2,y=5+5/8$.

\item Раздел приема находим, следуя вдоль пути ("Элементарная
алгебра", "Плюс", "Решение уравнений", "Системы уравнений"). Прием
срабатывает на втором уровне и предназначен для преобразования
уравнения - условия задачи на описание путем перехода к линейной
комбинации его с другим уравнением. Применяется в ситуациях, когда
задача имеет более одной неизвестной. Фильтр "не(цель(редакция))"
\ блокирует попытки применения его на том этапе, ког\-да
происходит завершающее редактирование найденного ответа.

Выражение $a$ идентифицируется как произведение всех неизвестных
мно\-жи\-те\-лей некоторого слагаемого второго уравнения, причем
оно же, домноженное на некоторый известный коэффициент $h$,
встречается и среди слагаемых первого (преобразуемого) уравнения.
Левые части уравнений не должны иметь дробных слагаемых - так как
для устранения таких слагаемых имеются другие приемы.

Фильтр "или(числонеизвестных($\ldots$)$\ldots$)" \ требует, чтобы
результирующее урав\-не\-ние либо имело единственную неизвестную,
либо, после разложения на мно\-жи\-тели его левой части $f$,
распалось на несколько уравнений, соединенных связкой "или", либо
было линейным по всем своим неизвестным, либо его ле\-вая часть
имела меньшее число слагаемых с неизвестными дробными степенями,
чем преобразуемое уравнение. Любая из этих ситуаций является
некото\-рым эвристическим "достижением", ради которого и
выполняется преобразование.

Фильтр "не(входит(независит цели))" \ относится к ситуациям, в
которых зна\-че\-ния неизвестных не должны зависеть от явно
указанных "варьируемых" \ параметров задачи. Обычно в этих
ситуациях значения неизвестных под\-би\-ра\-ют\-ся так, чтобы при
подстановке их пропадала зависимость условий от варь\-иру\-емых
параметров (например, содержащее эти параметры выражение бы\-ло бы
домножено на 0). Поэтому надобность в данном приеме,
ориентированном на обычные системы уравнений, отпадает.

Следующий фильтр -
"или(равно(число(неизвестная($\ldots$)$\ldots$)$\ldots$)$\ldots$)"
\ - ус\-ко\-ря\-ю\-щий. Его проверка предшествует вычислению левой
части $f$ нового уравне\-ния, и здесь происходит предварительная
оценка преобразования. Он анализирует выражения $b,d$, которые
составлены из слагаемых левых частей уравнений, остающихся в
линейной комбинации. Будем называть их "остальными
слага\-е\-мы\-ми". Фильтр разрешает продолжение действий в
следующих случаях: об\-щее число неизвестных в остальных слагаемых
равно 1 (тогда и $f$ будет иметь единственную неизвестную);
остальные слагаемые линейны относительно вхо\-дя\-щих в них
неизвестных (тогда и $f$ будет линейно); остальные слагаемые
содержат члены, пропорциональные уничтожаемым в линейной
комбинации выделенным слагаемым (тогда эти члены тоже пропадут в
линейной комби\-на\-ции); выражение $a$ имеет своим множителем
неизвестную дробную степень, а слагаемые выражения $b$ - не имеют
таких множителей (тогда в линейной комбинации станет одним
слагаемым с дробными степенями меньше).

Далее отсекается случай, когда до и после преобразования уравнение
имеет ровно одну неизвестную. Без этого легко можно было бы
привести пример с зацикливанием на данном приеме.

Фильтр "не(Входит(известно цели))" \ - ускоряющий; он отсекает
преобразования для задач, ответ которых должен быть выражен через
специально заданное множество параметров. В этом случае решение
происходит только за счет вы\-во\-да следствий в блоке анализа.

Заметим, что все перечисленные выше фильтры приема возникали в
процессе проработки потока задач и аккумулировали в себе лишь те
особые случаи, которые этим потоком были подсказаны. Никакого
общего критического ана\-ли\-за их вне данного процесса не
предпринималось - это лишь сырой материал. По-видимому, наиболее
естественными рамками, в которых такой анализ стоило бы
предпринять, является разработка процедур автоматического синтеза
при\-е\-мов. Этому будет посвящена третья книга данной монографии.
Однако, даже и с такими фильтрами, решатель, в целом, оказывается
достаточно работоспосо\-бен.

В качестве примера системы уравнений, на которой прием должен
сработать, рассмотрим какую-либо систему с двумя неизвестными,
дающую линейную комбинацию с единственной неизвестной. Например,
пусть это будут уравнения $2x^2+3y^2=8, 3x^2+4y=1$. Заметим, что
если бы члены с $y$ оба были линейными, то сработал бы другой
прием для получения линейной комбинации, имеющий меньший уровень
срабатывания.

\item Введем в задачник задачу на упрощение в о.д.з. выражения
$$\sum_{i=1}^{n}\sin(3n+1)^2.$$ Напомним, что степень
тригонометрической операции ставится фор\-муль\-ным редактором не
сразу после ее обозначения, а лишь после обозначения ее
ар\-гу\-мен\-та (чтобы получить степень аргумента, нужно взять ее
в скобки). Далее нажатием "р" \ (кир.) запускаем трассировку по
шагам решения. Первым же шагом выполняется суммирование, о чем и
сообщает поясняющий текст. На\-жи\-ма\-ем "б" \ и входим в
просмотр приема, выполнившего преобразование. Затем
последовательно нажимаем End (возвращение в просмотр текущего
пре\-об\-ра\-зо\-вания), Esc (возвращение в исходный текст
задачи), End (возвращение в глав\-ное меню) и "г" \ (вход в
оглавление базы приемов). В результате окажемся на концевом
разделе, содержащем сработавший прием суммирования.
Воз\-вра\-ща\-ясь от него "обратным ходом" \ к корню оглавления
приемов, определяем цепочку надразделов приема: ("Элементарная
алгебра", "Комбинаторные фун\-к\-ции", "Суммавсех",
"Тригонометрические суммы", "Суммирование квадратов синусов либо
косинусов").

\item Прием находится в разделе ("Элементарная геометрия",
"Фигуры", "Ок\-руж\-ность", "Описанная около фигуры окружность",
"Треугольник", "Теорема си\-нусов"). Переходим в оглавление
задачника, входим в раздел "Элементар\-ная геометрия", нажимаем
Shift-2 и, переходя в просмотр последних четырех при\-е\-мов на
теорему синусов, каждый раз нажимаем "А" \ (кир.). Затем
возвраща\-ем\-ся в задачник, нажимая Shift-3. Переходим в буфер
задачника и предпринимаем анализ избыточности срабатываний приемов
- последовательно для каждого подраздела буфера, используя для
запуска автоматического анализа клавишу "й". Для первого приема
имеем серию из 49 задач, причем в 14 из них его срабатывание
оказывается избыточным. Второй прием сработал в единственной
задаче, да и там его срабатывание оказалось избыточно. Видимо, на
момент создания приема он применялся в какой-то другой задаче,
решение которой впоследствии пошло по другому руслу. Третий прием
сработал тоже на един\-ст\-вен\-ной задаче, но здесь уже он
оказался нужен. Наконец, четвертый прием срабатывает в 12 задачах,
и в 4 из них - избыточен. Попытки оптимизации этих приемов
предоставляем читателю.

\item Приемы расположены в разделе ("Элементарная геометрия",
"Фигуры", "Ка\-са\-тель\-ная", "Касательная и секущая", "Длина
касательной и длины отрезков секущей"). Последние три приема
отличаются друг от друга только уровнями срабатывания и фильтрами.
Каждый из них выписывает соотношение ра\-вен\-ства квадрата длины
касательной произведению длин отрезков секущей.

Первый прием срабатывает при малых значениях текущего уровня - 3
либо 7. Условия срабатывания одинаковы для каждого из этих
уровней; если на третьем уровне прием не сработает, то по
достижении седьмого уровня могут появиться новые посылки, при
которых его срабатывание уже станет воз\-мож\-ным. Если бы не был
предусмотрен дополнительный уровень срабатывания, то нужно было бы
специально заботиться о переключении внимания - уменьшении до 3
веса посылки "касательная($\ldots$)", на которой инициализируется
применение приема.

Ограничения на срабатывание необременительны - они сводятся к
тому, чтобы некоторое количество расстояний, относящихся к
рассматриваемым объек\-там, уже были явно указаны в задаче. Один
из фильтров требует, чтобы в задаче уже встречались либо длина
касательной, либо обе длины отрезков секущей, либо чтобы секущая
проходила через центр окружности. Другой фильтр требует, чтобы уже
была рассмотрена длина хотя бы одного из трех отрезков,
вы\-де\-ля\-емых на секущей. Последние два фильтра усиливают эти
ограничения, если результирующее соотношение имеет более одного
расстояния, не выраженного через числовые параметры.

Второй прием срабатывает на уровне 9. Для его срабатывания нужно,
что\-бы хотя бы два из трех выделяемых на секущей отрезков были
либо вычислены, либо достаточно тесно связаны с неизвестными (в
стандартном для плани\-мет\-рии смысле, определяемом фильтром
"неизв($\ldots$)"). Кроме того, должно быть выделено расстояние от
какого-либо конца рассматриваемого отрезка ка\-са\-тель\-ной до
другой точки на этой же касательной.

Уровень срабатывания третьего приема равен 13. Для его
срабатывания нужно, чтобы длина отрезка касательной была сязана с
неизвестными, а число про\-хо\-дя\-щих через рассматриваемую вне
окружности точку секущих было не более 2.

В том же разделе есть еще четыре приема, выписывающих то же самое
со\-от\-но\-ше\-ние. Каждый раз, когда при решении задачи в нем
возникала потребность, причем имелась какая-то специфическая
особенность, отсутствовавшая в пре\-ды\-ду\-щих ситуациях, -
вводился дополнительный прием. Взятые вместе, все эти приемы
составляют некоторую эвристическую аппроксимацию множества
случаев, в которых данное соотношение оказывается полезным,
разумеется, пока чрезвычайно сырую. Фильтры геометрических
приемов, как правило, про\-слеживают возможность срабатывания
каких-то других приемов, следующих за срабатыванием данного. Чтобы
они не отсекали нужных срабатываний, такой учет последействий
должен быть достаточно полным, а чтобы не происходило бесполезных
срабатываний, он должен быть продолжаем на возможно большую
глубину. Пока учет последействий в приемах достаточно
эпизодический, и цен\-ность его состоит главным образом в том, что
он дает большое количество примеров для дальнейшего анализа.

Для определения задач, в которых срабатывание приема избыточно,
поступаем так же, как в предыдущем упражнении. Первый прием
срабатывает в 22 зада\-чах, причем в трех из них - избыточным
образом; второй прием срабатывает в трех задачах, и во всех из них
нужен; третий прием срабатывает в единст\-вен\-ной задаче и для
нее необходим.

\item Прием находится в разделе ("Элементарная алгебра",
"Тригонометрия", "Тан\-генс", "Уравнения", "Переход к тангенсу
половинного аргумента"). Прием сра\-батывает на шестом уровне, то
есть после того, как все более простые попытки решения уравнения
оказались неудачными. Некоторых пояснений требует вид теоремы
приема. Левая часть эквивалентности - преобразуемое уравнение
$a=b$; указатель "контекст(позиция(х7 х1)вид(х7 косинус(х4)))" \
определяет иден\-ти\-фи\-кацию неизвестного тригонометрического
аргумента $d$ по косинусу этого аргумента, встречающемуся в
уравнении. Нормализатор "половинныйугол" \ вы\-ра\-жает
встречающиеся в левой части уравнения синусы, косинусы и
танген\-сы через тангенс половинного аргумента (тангенс выражается
через поло\-вин\-ный угол лишь тогда, когда этот половинный угол
уже возник в выражении). Фильтры приемы требуют, чтобы кроме
косинуса $d$ уравнение имело либо си\-нус $d$, либо тангенс
половинного аргумента. Кроме того, проверяется, что каж\-дая
неизвестная тригонометрическая операция в уравнении совпадает либо
с синусом $d$, либо с косинусом $d$, либо с тангенсом $d$, либо с
тангенсом половин\-но\-го аргумента $e$. Чтобы отсечь случаи
чрезмерного возрастания сложности уравнения при переходе к
половинному аргументу, не разрешаются степени неизвестных
тригонометрических операций, отличные от второй и третьей.
На\-ко\-нец, прием блокируется при рассмотрении дифференциальных
уравнений.

В качестве задачи для тестирования приема будем искать уравнение
вида $\sin x + \cos x + \tg x = a$. Величину $a$ подберем так,
чтобы уравнение решалось: просле\-дим действия решателя до
появления уравнения $(a+1)y^4-2y^2+4y=a-1$ от\-но\-си\-тельно
вспомогательной неизвестной $y$, после чего положим $y=1/2$ и
определим $a = 41/15$. При таком значении $a$ решатель находит все
корни. Уравнение имеет две их серии, и для одной из них
применяется формула Кар\-да\-но.

\item Прием находится в разделе ("Элементарная алгебра", "Плюс",
"Решение урав\-нений", "Системы уравнений", "Выражение неизвестной
$X$ из уравнения $X+A=B$"). Он преобразует уравнение $b+c=a$, где
$b$ - неизвестная; $c$ - выраже\-ние с неизвестными, не содержащее
$b$; $a$ не содержит неизвестных, к виду $b = a-c$. Такое
преобразование немедленно вызывает подстановку в остальные условия
задачи выражения $a-c$ вместо $b$, т.е. фактически равносильно
исключению этой неизвестной.

Указано три различных уровня срабатывания - 0,1 и 5. Фактически
уровни 0,1 - альтернативные: в случаи задачи на описание допустим
только уровень 1, в случае задачи на исследование - уровень 0.
Такое разделение уровней по типу задачи, видимо, объясняется тем,
что в какой-то задаче на исследование (при анализе объединенного
списка посылок и условий внешней задачи на описание) понадобилось
ускорить выражение неизвестной из данного уравнения, чтобы не
возникло состязание с другим приемом, срабатывающим на первом
уровне. Подробности можно уточнить, скорректировав данный фильтр
так, чтобы и в случае задач на исследование прием срабатывал на
уровне 1, и выполнив прокрутку по задачнику для поиска тех задач,
которые отреагируют на дан\-ное изменение негативным образом.

Срабатывание приема на малых уровнях допускается в двух случаях:
либо $a=0$, а число неизвестных равно 2, либо уравнение линейно
относительно всех входящих в него неизвестных. В прочих случаях (и
только для задачи на описание) уровень срабатывания равен 5. Кроме
того, для срабатывания приема необходимо выполнение одного из
следующих условий: уравнение имеет ровно две неизвестные; задача -
на описание и имеет не более одного нелинейного уравнения; задача
- на исследование, $a=0$, а уравнение содержит ровно 3
неизвестных.

Если неизвестная $b$ - целочисленная, а число неизвестных в $c$
более двух, то для задачи на описание прием блокируется:
целочисленные уравнения обычно решаются другими средствами.
Наконец, последний фильтр учитывает ог\-ра\-ни\-чения на
зависимость ответа от заданных переменных - в этой ситуации также
используются другие средства решения.

Чтобы определить последствия удаления указанного в упражнении
фильтра, проведем прокрутку по разделам задачника ("Элементарная
алгебра", "Ре\-ше\-ние уравнений", "Системы алгебраических
уравнений 1,2,3,4") с пред\-ва\-ри\-тельным удалением фильтра. Так
как здесь область применения приема не сужена, а расши\-ре\-на,
определение списка задач, в которых прием срабатывал, не поможет.
Придется прибегнуть к более трудоемкой полной прокрутке по
избранным раз\-делам. Обычная практика при развитии решателя -
пери\-оди\-чес\-кие (раз в нес\-коль\-ко дней) полные прокрутки,
занимающие около 2 часов. Есть не очень сильно развитые пока
средства сужения класса задач, для которых пред\-при\-ни\-мается
прокрутка. Они основаны на учете всех логических символов,
встречавшихся при решении задачи; если для срабатывания приема
необходимо наличие какого-то символа, а при решении он не
возникал, то задачу можно не рассматривать. Однако, для простейших
приемов, типа рас\-смат\-риваемого, такое отсечение
малоэффективно.

При удалении  фильтра прокрутка первых двух разделов для систем
уравне\-ний, казалось бы, показывает его избыточность: несколько
задач даже "ускоря\-ют\-ся". Однако, на 44-й задаче третьего
раздела неожиданно появляется сообще\-ние "переполнение буфера
текстов". Нажимая "ф", входим в отладчик ЛОСа, поднимаемся до
уровня кадра программы "исследовать" \ и просматриваем
зна\-че\-ние переменной х1 - текущей задачи на исследование
(удобно сделать это нажатием К1). Видно, что в посылках задачи
присутствует введенное данным приемом явное выражение неизвестной
$z$ через $x,y$, а возникшие после ис\-клю\-че\-ния $z$ уравнения
чрезмерно громоздки. Переполнение (получение слишком длинного
набора) произошло при регистрации в задаче на исследование
ре\-зуль\-та\-тов вывода анализатором "сложениеуравнений" \
линейных комбинаций имеющихся уравнений. Такой результат
не\-уди\-ви\-телен: при решении систем нелинейных уравнений
выражение од\-ной неизвестной через другие нужно при\-ме\-нять
очень осторожно. На ограничение этих действий и был направлен
ус\-тра\-нен\-ный фильтр.

\end{enumerate}

\subsection{Создание нового приема}

Приведем несколько несложных упражнений на самостоятельную
разработку при\-е\-мов. Иногда эти упражнения будут дублировать
уже существующие в системе при\-е\-мы. Рекомендуется сначала
создать свою версию, не прибегая к под\-сказкам решате\-ля, и
протестировать ее на какой-либо специально введенной для этого
задаче. Если при тестировании выяснится, что старые приемы
решателя опережают новый при\-ем и не дают ему сработать, то
следует либо взять уровень срабатывания этого приема меньшим, чем
у старых приемов, либо временно отключить старые приемы.
Разумеется, приводимых здесь примеров недостаточно, чтобы
научиться про\-грам\-мировать на ГЕНОЛОГе. Технике такого
программирования посвящен весь вто\-рой том данной монографии, в
котором подробным образом будут рассматривать\-ся разделы базы
приемов решателя.

\begin{enumerate}

\item Создать прием, упрощающий тангенс утроенного арктангенса.

\item Создать прием для упрощения радикала второй степени, под
которым рас\-по\-ло\-жен полный квадрат суммы с другим радикалом.
То же самое - для радикалов третьей степени.

\item Создать прием, решающий простейшее уравнение для секанса:
$\sec x = a$.

\item Создать прием, находящий пересечение двух арифметических
прогрессий с общим начальным членом, положительные раз\-нос\-ти
которых относятся как целые числа.

\item Создать прием для суммирования кубов синусов элементов
арифметической прогрессии.

\item Создать прием, связывающий площадь вписанного в окружность
четырех\-у\-голь\-ника с длинами его сторон и полупериметром.

\item Создать прием, основанный на теореме о том, что точки
пересечения высот, медиан и срединных перпендикуляров в
треугольнике лежат на одной прямой. Придумать планиметрическую
задачу на вычисление, которая могла бы быть решена решателем
только после добавления данного приема.

\item Создать прием, переформулирующий через коэффициенты
квадратного трех\-чле\-на условие, что заданная величина $x$
больше его корней. Придумать задачу, в которой этот прием мог бы
понадобиться.

\item Создать прием, дающий разложение тангенса в ряд с
использованием чисел Бернулли.

\item Создать прием, позволяющий вычислять длину кривой, заданной
уравнением $y = y(x)$ в прямоугольной системе координат.

\item Создать прием, позволяющий переходить от прямоугольных
координат мно\-жес\-тва точек в трехмерном пространстве к
сферическим.

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Разумеется, начинается синтез приема с того, что
определяется его теорема. Обычно это связано с решением несложной
задачи, приводящей к нужной теореме, либо с обобщением какого-то
известного утверждения путем вво\-да в него дополнительных
параметров, учитывающих типичные контексты его применения в
задачах. В нашем случае нужно вывести формулу тангенса трой\-ного
арктангенса и получить теорему $\tg(3\arctg a)=(3a-a^3)/( 1 -
3a^2)$. Так как это - теорема приема, то условие на область
допустимых значений (отличие знаменателя от 0) можно опустить -
при правильной работе других приемов оно должно усматриваться из
контекста преобразуемого выражения.

Далее выбираем раздел, в котором будет размещен прием. В нашем
случае естественно пойти по цепочке подразделов ("Элементарная
алгебра", "Три\-го\-но\-метрия", "Тангенс", "Тангенс выражения,
содержащего обратные три\-го\-но\-мет\-рические функции"). Вводим
для приема новый концевой раздел (нажатием "к"), сопроводив его,
например, текстом: "Тангенс утроенного арктангенса". Далее
набираем теорему приема и вводим его заголовок - "второйтерм". Так
как прием выполняет преобразование, которое, по-видимому,
практически всегда будет полезным, уровень срабатывания его
выбираем небольшим - например, равным 3 (все-таки, здесь лучше
немного подождать - вдруг на уровнях от 0 до 2 этот тангенс
тройного арктангенса будет устранен как-то иначе, напри\-мер,
умножен на 0). Других фильтров не вводим. Указатели приему также
не требуются. Сохранив (F4) набранную заготовку приема, нажимаем
"н" \ для получения подсказок от генератора приемов о возможных
дополнительных эле\-мен\-тах описания приема. Сначала возникает
указатель "логсимвол(3 умно\-же\-ние)", который говорит
компилятору, что тройка здесь должна иден\-ти\-фи\-ци\-роваться
как непосредственный операнд произведения. Однако, в нашем
слу\-чае компилятор и сам это понимает, так что указатель можно не
вводить. Далее идут подсказки о вводе нормализаторов общей
стандартизации - их принимаем, нажимая каждый раз клавишу Insert.
По окончании появления подсказок (воз\-ни\-ка\-ет голубая линия)
прием снова нужно сохранить. Так как он, по существу, уже готов,
то вместо F4 сразу нажимаем F3. Наконец, тестируем работу приема.
Например, вводим выражение $\tg(3\arctg(1/5)$ и на первом же шаге
трассировки получаем $37/55$.

Заметим, что попытки протестировать прием на каком-либо значении,
для которого арктангенс известен, например, для тангенса $\pi/12$,
сразу приведут к срабатыванию старых приемов, и чтобы в этом
случае протестировать новый прием, их придется найти и временно
отключить. Если эта работа будет про\-де\-ла\-на, то мы обнаружим,
что наш прием вводит сравнительно громоздкое выражение с
радикалом, которое вызывает длинную цепочку упрощающих его простых
преобразований. Чтобы избежать этого, можно добавить
нор\-ма\-ли\-за\-торы "видумножение" \ для обработки числителя и
знаменателя - после этого пример будет решаться примерно вдвое
быстрее.

\item Будем рассматривать простейший случай, когда под радикалом
находится вы\-ра\-же\-ние $a+b\sqrt c$, представляющее собой
полный квадрат другого выражения $p+q\sqrt c$, причем $p,q$ не
имеют радикалов. Возводя в квадрат и рассматривая систему
уравнений для неизвестных $p,q$ при известных $a,b,c$, получаем:
$q^2 = (a + \sqrt{a^2-cb^2})/2c \ \vee \ q^2 = (a -
\sqrt{a^2-cb^2})/2c$; $p = b/2q$. Это подсказывает сле\-ду\-ющую
схему вычислений, выполняемых приемом. Сначала предпринима\-ет\-ся
попытка разложить на множители выражение $a^2 - cb^2$ и проверить,
что резуль\-тат является полным квадратом некоторого выражения
$r$. Затем рас\-смат\-ри\-ваются выражения $a+r, a-r$ и
предпринимается попытка представить какое-либо из них в виде
произведения $2c$ на полный квадрат некоторого выражения - оно и
будет равно $q$. Наконец, по $b$ и $q$ определяется $p$. Теорема
приема, соответствующая такой последовательности действий, имеет
вид:

$\forall_{abcpqr}(r^2 = a^2-cb^2 \ \& \ (a+r = 2cq^2 \vee a-r =
2cq^2) \ \& \ b = 2pq \rightarrow \sqrt{a+b\sqrt c}) = |p+q\sqrt
c|)$

После набора этой теоремы вводим остальные компоненты описания
приема: заголовок - "второйтерм"; фильтр для уровня срабатывания
"уровень(0)" \ и проверяющий отсутствие радикалов в коэффициентах
$a,b$ фильтр "не(кон\-тек\-ст(список(х5 $a$ \ $b$)позиция(х6
х5)вид(х6 степень(х7 дробь(1 2)))))"; указатели "единица(1 $b$ $p$
$q$)", "заменазнака(минус $b$ $p$)". Нулевой уровень срабатывания
здесь введен, чтобы при тестировании не срабатывали другие приемы,
уже имеющиеся в решателе. Впрочем, их уровень срабатывания также
маленький - лучше сразу усмотреть возможность избавиться от
двойного радикала, чем выполнять с ним какие-то действия.
Выражения $a+r,a-r$ могут не иметь заголовка "умножение", а быть
числовыми константами. В этом случае иден\-ти\-фи\-кация их с
произведением $2cq^2$ будет заключаться в делении на число $2c$ и
проверке того, что частное является полным квадратом. Чтобы
пред\-ус\-мот\-реть эту ситуацию, добавляем указатель
"пересечениесписков(фикс(2 1 2)фикс(2 2 2))", отменяющий проверку
наличия у данных выражений за\-го\-лов\-ка "умножение".

Далее вводим указатель "идентификатор(1 2 3)" \ и расставляем
указатели общей стандартизации. Наконец, добавляем указатели
нормализации "видумноже\-ние" \ для разложения на множители
выражений $a^2-cb^2$, $a+r$, $a-r$.

Тестируем прием на какой-либо задаче, например, $\sqrt{2\sqrt 2
+3}$.

Создание аналогичного приема для радикалов третьей степени, а
также воз\-мож\-ные обобщения приведенного выше приема оставляем
читателю.

\item Теорему приема нетрудно получить, перейдя от уравнения $\sec
x = a$ к урав\-не\-нию $\cos x = 1/a$:

$\forall_{ax}(\sec x = a \leftrightarrow (0\le 1+1/a \ \& \ 0 \le
1-1/a \ \& \ (\exists_n(\mbox{целое}(n) \ \& \ x = \arccos(1/a)
+2\pi n) \ \vee \ \exists_n(\mbox{целое}(n) \ \& \ x =
-\arccos(1/a) +2\pi n))))$.

Вместо приведенных здесь двух неравенств для $a$ можно было бы
использо\-вать неравенство для модуля $1 \le |a|$. Однако, следует
помнить, что эти неравенства будут обеспечивать сопровождение по
области допустимых значений для арк\-ко\-си\-нуса. Так как
проверки здесь будут относится к выражению $1/a$, то переход к
модулю существенно их затруднит, и лучше его не вводить. С другой
сто\-ро\-ны, от знаменателей в неравенстве можно избавиться, после
чего теорема приема примет вид:

$\forall_{ax}(\sec x = a \leftrightarrow (0\le a(a+1) \ \& \ 0 \le
a(a-1) \ \& \ (\exists_n(\mbox{целое}(n) \ \& \ x = \arccos(1/a)
+2\pi n) \ \vee \ \exists_n(\mbox{целое}(n) \ \& \ x =
-\arccos(1/a) +2\pi n))))$.

Уровень срабатывания приема выбираем равным 2 (как и для прочих
три\-го\-но\-мет\-рических операций). Контекст срабатывания
задается фильтрами "условие", "тип(описать)", "корень",
"известно($a$)", "не(известно($x$))". Добавляем также имеющийся у
других аналогичных приемов фильтр "конец(не(фильтрсерии($a$)\\
))", который блокирует данный переход из общих соображений.
Например, если уже получено параметрическое описание для
какой-либо неизвестной, встре\-ча\-ю\-щейся в $x$, то вместо
применения данного приема выгоднее подставить в выражение $x$
явное значение этой неизвестной. Указатель приема вво\-дим
единственный - "примечание(серия)". Он сопровождает
преобразованное ус\-ло\-вие комментарием "серия", поясняющим, что
встречающиеся в нем кванто\-ры существования дают параметрическое
описание и нет смысла пытаться устра\-нить их, получив явное
разрешение подкванторного утверждения относительно связанной
переменной.

В заключение расставляем нормализаторы общей стандартизации. При
этом нормализатор "нормарккосинус" \ сопровождаем указателем
"посылки(и(целое(\\ $n$)меньшеилиравно(0 $a(a+1)$)меньшеилиравно(0
$a(a-1)$)))".

\item Множество членов арифметической прогрессии будем записывать
в виде $\mbox{set}_x(\exists_i(\\ \mbox{целое}(i) \ \& \ 0 \le i \
\& \ x = a+bi))$. Если есть две прогрессии, с положительными
разностями $b$ и $c$, отношение которых - рациональное число, то
для определения такого отношения $m/n$ будем использовать в
теореме приема процедуру со\-кра\-щения дробного выражения $b/c$.
Чтобы убедиться в несократимости дроби $m/n$, добавляем проверку
взаимной простоты чисел $m$ и $n$ - тогда результиру\-ю\-щая
прогрессия будет иметь разность $bn$. Таким образом, получаем
теорему приема:

$\forall_{abcmn}(b/c = m/n \ \& \ \mbox{натуральное}(m) \ \& \
\mbox{натуральное(n)}\ \& \ \mbox{взаимнопросты}(m,n)\\
\rightarrow \mbox{set}_x(\exists_i(\mbox{целое}(i) \ \& \ 0 \le i
\ \& \ x = a+bi)) \cap \mbox{set}_x(\exists_j(\mbox{целое}(j) \ \&
\ 0 \le j \ \& \ x = a+cj)) =
\mbox{set}_x(\exists_i(\mbox{целое}(i) \ \& \ 0 \le i \ \& \ x =
a+bni)))$.

Единственный фильтр приема - "уровень(1)", так как преобразование
пред\-став\-ляется полезнмы в любых ситуациях. Заголовок приема -
"вто\-ройтерм". Указатели - "идентификатор(1)", "блокпроверок(2
3)", "еди\-ни\-ца(0 $a$)", "еди\-ни\-ца(1 $b$ $c$ $n$)".
Нормализаторы приема - обычные, в том числе нормализатор
"нормдробь" \ для частного $b/c$. В принципе, можно было бы
несколько усилить прием, введя также нормализатор "видумножение" \
для раз\-ложения на мно\-жи\-тели выражений $b,c$ перед попыткой
сокращения дроби.

Проверяем созданный прием на каком-либо простом примере;
оказывается, что после его срабатывания применяется другой прием,
преобразующий результат к виду "арифмпрогрессия($a$ $bn$)". Если
бы существование последнего приема было известно заранее, то можно
было бы прием для пересечения формули\-ро\-вать сразу с
использованием обозначения "арифмпро\-грес\-сия".

\item В решателе имеются приемы, позволяющие вычислять сумму
синусов либо косинусов элементов арифметической прогрессии.
Поэтому все, что требуется для вычисления суммы кубов синусов либо
косинусов - это преобразование их к функциям кратного аргумента,
так как дальше сработают указанные выше приемы. Это соображение
позволяет нам создать даже более общий прием - для вычисления сумм
проивзольных натуральных степеней синусов и косинусов. Теорема
такого приема будет, по существу, вырожденной - в ней должно
со\-дер\-жаться только обращение к нормализатору "стандплюс" \ -
он выполняет не только раскрывание скобок, но и переход к кратному
тригонометрическому аргументу, если при обращении ввести
комментарий "видумножение". За\-пи\-сы\-вается данное обращение
так:
$$\forall_{abmnkp}((\sin (a+bi))^k = p(i)\rightarrow
\sum_{i=m}^{n}(\sin (a+bi))^k = \sum_{i=m}^{n}p(i)).$$ Здесь
$p(i)$ - вспомогательное обозначение для результата перехода к
кратному аргументу. Заголовок приема - "второйтерм". Уровень
срабатывания его вы\-бе\-рем равным единице. Добавим фильтры
"натуральное($k$)" \ (показатель степе\-ни есть десятичная запись
натурального числа) и "меньше($k$ 6)" \ (отсекаем слишком большие
показатели степени, так как пока неясно, нужно ли будет для них
применять данный переход). Вводим стандартный набор указателей -
"идентификатор(1)", "отображение($p$)", "единица(0 х1)",
"заменазнака(минус х2)", "единица(1 х2)". Левую часть антецедента
теоремы снабжаем нор\-ма\-ли\-заторами
"стандплюс(замечание(видумножение))", "посылки(и(целое($i$)
мень\-шеилиравно($m$ $i$) меньшеилиравно($i$ $n$)))". Указатель
нормализации "посыл\-ки($\ldots$)" \ введен из-за того, что
преобразуемое выражение содержит перемен\-ную $i$, определенную
лишь в контексте суммирования, и нормализатору может понадобиться
дополнительная информация о значении этой переменной.

\item Формулу, связывающую площадь вписанного четырехугольника с
длинами его сторон $a,b,c,d$ и полупериметром $p$, нетрудно
вывести или взять из учебника: $S = \sqrt{(p-a)(p-b)(p-c)(p-d)}$.
Здесь имеются пять параметров - $S,a,b,c,d$. Из общих соображений,
выписывать соотношение для них имеет смысл, если достаточно
большая их часть известна либо представляет интерес для
на\-хож\-де\-ния значений неизвестных. Желательно, чтобы хотя бы
один из параметров при этом был неизвестен - иначе соотношение, в
лучшем случае, может понадобиться лишь для усмотрения
противоречивости описания чертежа. Вообще-то, новые приемы
вводятся в решатель только в том случае, когда они понадобились
для решения какой-то конкретной задачи. Здесь мы отступаем от
этого правила - и это может сказаться на качестве приема. Если нет
примера, подтвержадющего полезность приема, то не исключено, что
он вообще будет избыточен. Поэтому, доведя упражнение до конца,
попробуем найти задачу, которая без данного приема решаться
системой не будет.

Прежде чем вводить теорему приема, нарисуем геометрическим
редактором чертеж - проведем окружность $EF$ и изобразим вписанный
в нее четы\-рех\-уголь\-ник $ABCD$. Теорема приема, кроме
приведенного выше соотношения, должна содержать также описание
геометрической ситуации:

$ \medskip
\forall_{ABCDEFabcdpS}(\mbox{окружность}(EF)\mbox{описана около
фигура}(ABCD) \ \& \ \mbox{актив}(S(\mbox{фи}\- \medskip
\mbox{гура}(ABCD))) \ \& \ p = (l(AB)+l(BC)+l(CD)+l(AD))/2
\rightarrow S(\mbox{фигура}(ABCD)) =
\sqrt{(p-l(AB))(p-l(BC))(p-l(CD))(p-l(AD))})$.

Второй антецедент означает, что в задаче уже рассматривается
площадь четы\-рех\-угольника - в этом случае автоматически
вводится явная ссылка на пло\-щадь, представляющая собой фиктивную
посылку вида "актив(площадь($\ldots$))". Третий антецедент вводит
вспомогательное обозначение $p$ для полупери\-мет\-ра, который
четырежды упоминается в консеквенте теоремы.

Прием имеет заголовок "вывод". Уровень его срабатывания выберем
средним - для геометрии в качестве такого уровня годится,
например, шестой. Со\-от\-вет\-ственно, имеем фильтры
"уровень(6)", "тип(исследовать)".

Переходим к основному фильтру, который будет рассматривать список
свя\-зы\-ва\-емых выводимым равенством параметров. Начнем этот
фильтр с пере\-чис\-ле\-ния значений данных параметров:
"контекст(равно(х5 набор(терм(расстояние(\\ $AB$))
терм(расстояние($BC$)) терм(расстояние($CD$))
терм(расстояние($AD$)) терм\\
(площадь(фигура(набор($ABCD$))))))$\ldots$. Так как мы перечисляем
в наборе х5 термы, определяемые теоремными выражениями, то каждое
из них заключа\-ем внутри записи "терм($\ldots$)". В
действительности, нас будут интересовать не выражения
"расстояние($\ldots$)", "площадь($\ldots$)", а значения этих
выражений, определяемые на текущий момент из контекста задачи.
Чтобы получить такие значения, будем обрабатывать выражения
нормализаторами "нормрасстоя\-ние" \ и "нормплощадь".

После того, как набор х5 значений параметров определился,
продолжаем запись фильтра: $\ldots$входит(х6
х5) неизв(х6) меньше(число(входит(х7 х5) не(известно(\\
х7)) не(неизв(х7)))2) меньше(1 число(входит(х7 х5)
известно(х7)))". Здесь тре\-бу\-ется, чтобы хотя бы один параметр
был не известен и связан по цепочке соотношений с неизвестными
внешней задачи на описание; чтобы имелось не более одного
неизвестного параметра, не связанного таким образом с
неиз\-вест\-ны\-ми внешней задачи; чтобы не менее двух параметров
были известны. Разумеется, это - лишь нулевая версия возможного
фильтра, и ее стоит про\-ве\-рить путем прокрутки по задачнику.
Если окажется, что в каких-то задачах срабатывание приема является
вредным, то фильтр придется усиливать. За\-ме\-тим, что пока в
область допустимых срабатываний попадают все ситуации прямого
определения единственного неизвестного параметра через известные
остальные параметры.

Единственный указатель приема - "идентификатор(3)"; нормализаторы
берем все, которые подсказывает система автоматического пополнения
описания при\-ема.

Для тестирования приема вводим простейшую задачу, чертеж которой в
точ\-нос\-ти совпадает с условием теоремы - четырехугольник,
вписанный в окруж\-ность и имеющий известные длины своих сторон,
например, 3,5,7,4. Требуется в задаче найти площадь
четырехугольника. Нажимая Ctr-ч, получаем достаточ\-но точно
воспроизводящий значения длин сторон чертеж. При трассировке
убеждаемся в том, что прием срабатывает. При его отключении (на
момент написания данного примера) решатель задачи не решает.

\item Начинаем создание приема с построения геометрическим
редактором чертежа. Рисуем треугольник $ABC$, проводим высоты $AD$
и $BE$, медианы $BF$ и $AG$, а также срединные перпендикуляры $FQ$
и $GQ$, продолженные до их точки пересечения $Q$. Вводим также
точки $P,R$ пересечения высоты и медиан со\-от\-ветственно. Затем
переходим к набору теоремы:

$\medskip \forall_{ABCDEFGPQR}(\triangle(ABC) \ \& \ D \in
\mbox{прямая}(BC) \ \& \ E \in \mbox{прямая}(AC) \ \& \
\mbox{прямая}(AD)\\ \medskip \bot \mbox{прямая}(BC) \ \& \
\mbox{прямая}(BE) \bot \mbox{прямая}(AC) \ \& \ G \in
\mbox{прямая}(BC) \ \& \ l(BG)=\\ \medskip l(CG) \ \& \ F \in
\mbox{прямая}(AC) \ \& \ l(AF)=l(CF) \ \& \ \mbox{прямая}(FQ) \bot
\mbox{прямая}(AC) \ \& \ \\ \medskip \mbox{прямая}(GQ) \bot
\mbox{прямая}(BC) \ \& \ P \in \mbox{прямая}(AD) \ \& \ P \in
\mbox{прямая}(BE) \ \& \ R \in \\ \medskip \mbox{прямая}(AG) \ \&
\ R \in \mbox{прямая}(BF)\rightarrow Q \in \mbox{прямая}(PR))$.

Заголовок приема - "вывод"; уровень срабатывания выбираем не очень
боль\-шим, так как утверждение о принадлежности трех точек одной
прямой может оказаться существенным для всего дальнейшего ходя
решения. Например, мож\-но взять его равным 4. Обычно такой
произвольный выбор уровня срабаты\-ва\-ния корректируется при
регулировочной прокрутке приема на задачах. Вводим фильтр
"или(тип(доказать)тип(исследовать))". Каких-то особых
соображе\-ний об ограничениях на срабатывание данного приема не
возникает, и других фильт\-ров пока не вводим. Для ввода
указателей и нормализаторов используем авто\-ма\-ти\-ческое
пополнение описания приема - нажимаем "н" \ и соглашаемся с
по\-яв\-ля\-ющимися предложениями.

Для тестирования приема введем задачу, чертеж которой совпадает с
чер\-те\-жом теоремы; зададим какие-то конкретные длины сторон
треугольника, и потребуем найти отношение длин отрезков $PR$ и
$RQ$. При срабатывании приема решатель сравнительно быстро находит
ответ; при его отключении ответ не выдается.

\item Условие на $x$ запишем в таком виде: $\forall_y(ay^2+by+c =
0 \rightarrow y <x)$. Заметим, что оно вовсе не означает наличие у
трехчлена корней; если корни есть, то они должны быть меньше $x$,
а если их нет, то никаких дополнительных ограничений не требуется.
В этой ситуации, как легко видеть, условие эквивалентно
сле\-ду\-ющей альтернативе: либо дискриминант неотрицателен,
значение трехчлена в точке $x$ имеет тот же знак, что и
коэффициент $a$, а сама точка $x$ располо\-же\-на правее точки
$-b/2a$ экстремума трехчлена, либо дискриминант отрицателен. Это
дает следующую теорему приема:

$\medskip \forall_{abcx}(\neg(a=0)\rightarrow
(\forall_y(ay^2+by+c=0
\rightarrow y<x) \leftrightarrow (0 \le b^2-4ac \ \& \ 0 < \\
a(ax^2+bx+c) \ \& \ -b/2a < x) \vee (b^2-4ac < 0)))$.

Заголовок приема - "второйтерм". Уровень срабатывания его выберем
не очень большим - устранение квантора может существенно упростить
задачу, и от\-кла\-ды\-вать его не имеет смысла. Пусть, например,
этот уровень будет равен 2. Для ввода указателей и нормализаторов
прибегаем к подсказкам системы автоматического доопределения
приема; со всеми этими подсказками со\-гла\-ша\-емся. Чтобы
протестировать прием, вводим какую-либо несложную задачу,
например, задачу с неизвестной $b$ и условием
$\forall_x(3x^2+bx+5=0\rightarrow x<4)$. Запускаем трассировку по
шагам решения, и обнаруживаем, что наш прием не срабатывает, а
вместо него применяется другой прием, предпринимаю\-щий попытку
явного разрешения подкванторного утверждения относительно
пе\-ре\-мен\-ной кванторной приставки (т.е. относительно $x$). На
этом пути решатель, разумеется, получает ответ. Однако, такое
решение, все же, более трудоемко, чем предлагаемое нашим приемом.
Чтобы "опередить" \ старый прием, понижа\-ем уровень срабатывания
нового приема до 1. Снова запускаем трассировку, и опять
оказывается, что прием не сработал. При более внимательном
рас\-смот\-ре\-нии ситуации обнаруживаем, что решатель, учитывая
условия на область допустимых значений, ввел под квантор, кроме
условия равенства трехчлена нулю, также утверждение "число($x$)".
Такого рода пополнение антецедентов кванторных импликаций
условиями на тип значений переменных - следствие используемой в
решателе общей стандартизации, изменять которую сейчас
не\-же\-лательно. Поэтому приходится изменить сам прием - ввести в
него под кван\-тор общности дополнительный антецедент
"число($y$)". Лишь после этого трас\-сировка покажет срабатывание
приема, а при выдаче ответа будет отмечено небольшое ускорение по
сравнению с запуском без нового приема.

Этот пример демонстрирует типичную ситуацию при обучении решателя
- как правило, новый прием обязательно приводит к каким-то
неожиданностям, и лишь после некоторого цикла коррекций удается
получить желаемый результат. К такому явлению при обучении системы
придется привыкать. Не следует воспринимать его как что-то
негативное, свидетельствующее либо о малом опыте учителя системы,
либо о принципиально неправильном подходе к ее обучению. Это -
совершенно нормальное явление, своего рода неизбежное "тре\-ние" \
процесса обучения. Создать и откомпилировать прием - это лишь
малая часть труда, который приходится в него вкладывать. Основная
работа состоит в том, чтобы после этого преодолеть все те
неожиданные барьеры, которые выявляются при тестировании. В
общем-то, это неудивительно - логические процессы сложны и
разнообразны, а изучение их только начинается. Для пре\-о\-доления
трудоемкости дрессировки решателей необходимо иметь
пред\-ус\-мот\-рительность, обеспечить которую, по-видимому,
сможет лишь постепенное фор\-мирование, пусть хотя бы и
эмпирическим путем, и пусть хотя бы и немате\-ма\-тической, но все
же теории логических процессов.

\item Для разложения в ряд Тейлора решатель использует
нормализатор "рядтей\-ло\-ра". Ему передается входной комментарий
(рядтейлора $x$ $b$), указываю\-щий переменную $x$, для которой
выполняется разложение, и точку $b$, в которой оно выполняется.
Число Бернулли с индексом $i$ обозначается в решателе
"числобер\-нулли($i$)" \ (см. раздел "Элементарная алгебра",
"Комбинаторные функции"). Разложение в степенной ряд выражения
$\tg x$ сразу обобщаем до разложе\-ния выражения вида
$tg((a(x+c)^k)/d)$. Теорема приема получается следующая:

$\medskip \forall_{abcdxk}(\mbox{натуральное}(k) \ \& \ c = -b
\rightarrow \tg((a(x+c)^k)/d)= \\ {}\sum_{i=1}^\infty
((-1)^{i-1}2^{2i}(2^{2i}-1)\mbox{числобернулли}(2i)
a^{2i-1}(x+c)^{(2i-1)k)}/((2i)!d^{2i-1})$.

Здесь $b$ - точка разложения, передаваемая приему через
комментарий к нор\-ма\-ли\-за\-тору.

Заголовок приема - "замена(второйтерм рядтейлора)". Вводим фильтры
прие\-ма "не(входит($x$ $a$))", "не(входит($x$ $c$))",
"не(входит($x$ $d$))", "не(входит($x$ $k$))", не\-об\-хо\-димые
для того, чтобы бесконечная сумма представляла собой степенной
ряд. Комментарий, определяющий $x$ и $b$, извлекаем указателем
"вход(рядтей\-лора $x$ $b$)". Далее вводим указатели
"блокпроверок(1)", "идентификатор(2)", "единица(0 $c$)",
"единица(1 $a$ $d$ $k$)", "заменазнака(минус $a$)" \ и
расставля\-ем нормализаторы общей стандартизации. Заметим, что
прием служит для полу\-че\-ния бесконечной суммы; если нужно
применить локальную формулу Тейлора и ограничиться заданным числом
членов, то используется нормализатор "фор\-мулатейлора".
Попробуйте самостоятельно ввести аналогичный прием для
по\-след\-него нормализатора, отключив имеющийся в нем прием
разложения тан\-ген\-са через разложения синуса и косинуса.
Нахождение чисел Бернулли осу\-щест\-вляется нормализатором общей
стандартизации "нормчислобернулли".

\item Будем считать, что кривая $P$ задается выражением "точки($A$
$K$)", опреде\-ля\-ю\-щим множество точек плоскости, координаты
которых в системе коорди\-нат $K$ образуют множество $A$. На тот
случай, если условие принадлежности пары чисел ($x$,$y$) множеству
$A$ не имеет вида, явно разрешенного относительно $y$, предпримем
в приеме попытку такого разрешения. Для полученной в
ре\-зуль\-тате зависимости $y=f(x)$ и определившегося при
разрешении отрезка $[a,b]$ далее используем известную формулу
длины кривой. Таким образом, имеем следующую теорему приема:
$$\begin{array}{l}\medskip \forall_{abfKPAB}(\mbox{прямкоорд}(K)\ \& \ P =
\mbox{точки}(A,K) \ \& \ ((x,y) \in A) = (y=f(x) \ \& \ B(x))\\ \
\& \ B(x) = (a \le x \ \& \ x \le b \ \& \
\mbox{число}(x))\rightarrow
\mbox{длина}(P)=\int\limits_{a}^{b}\sqrt{1+\left(\frac{df(x)}{dx}
\right)^2}dx).\end{array}$$

Второй антецедент теоремы идентифицирует определяющее кривую
выражение "точки($A$,$K$)". Либо изначально кривая задана таким
выражением, либо в кон\-тексте имеется равенство, дающее это
выражение для $P$. Третий антецедент нужен для получения явной
зависимости $y=f(x)$. Он выражает эквивалент\-ность двух
утверждений
 - утверждения о принадлежности "произвольной" \ па\-ры ($x,y$) множеству
координат точек кривой $A$, и результата $y=f(x) \ \& \ B(x)$
явного разрешения этого условия относительно неизвестной $y$.
Такие эк\-ви\-ва\-лент\-ности в посылках теорем приемов
записываются в виде равенств - для удобства компиляции. После
разрешения условия на координаты точки от\-но\-си\-тельно $y$
остаются какие-то условия $B(x)$ на независимую переменную. Чтобы
получить отрезок интегрирования, эти условия необходимо явно
разрешить относительно $x$. Это и делает четвертый антецедент
теоремы.

Заголовок приема - "второйтерм". Уровень срабатывания его выбираем
срав\-ни\-тельно небольшим. Так как в решателе уже имеется прием
для вычисления длины кривой, срабатывающий на третьем уровне,
лучше положить уровень срабатывания нашего приема равным 2.

Кроме стандартных указателей "идентификатор(2 3 4)",
"отображение($f$ $B$)", вводим указатели "новаяпеременная($x$)" \
и "новаяпеременная($y$)", объясняю\-щие компилятору, что
переменные $x,y$ он может выбрать произвольным обра\-зом (но без
совпадения их с уже имеющимися в задаче). При разреше\-нии условия
$B(x)$ относительно $x$ вместо нестрогих неравенств могут
появиться строгие. Чтобы обобщить прием и на эти случаи, добавляем
указатели "вари\-ант(фикс(4 2 1)меньше)", "вариант(фикс(4 2
2)меньше)". Они разрешают по\-яв\-ляться строгим неравенствам
вместо нестрогих в задании промежутка для $x$, не изменяя прочих
действий приема.

Расставляем нормализаторы приема. Во-первых, для идентификации
выра\-же\-ния "точки($A$,$K$)" \ снабжаем переменную $P$
(изначально идентифицируемую с кривой из выражения "длина($P$)")
нормализатором "смточки". Это - очень простой вспомогательный
нормализатор, заменяющий $P$ на выражение "точ\-ки($\ldots$)",
если в контексте идентификации встречается равенство
"$P=$точ\-ки($\ldots$)". Далее, для обработки левой части третьего
антецедента вводим об\-ра\-щение к вспомогательной задаче на
описание, разрешающей эту часть от\-но\-си\-тельно $y$. Оно имеет
следующий вид: "задача(6 тип(описать)полный явное буфер
прямойответ упростить цель(неизвестная($y$)))". Цель "буфер" \
добав\-ле\-на для того, чтобы на некоторое время запомнить
результат решения данной задачи и при повторных попытках ее
решения, предприниаемых другими при\-е\-мами, сразу извлекать из
него готовый результат. Надобность в этом может возникнуть, если
создать прием, предпринимающий попытку разрешения урав\-не\-ния
кривой относительно $y$ для усмотрения распадения кривой на
несколько ветвей и разбиения задачи на подзадачи вычисления длин
отдельных ветвей.

Для обработки левой части четвертого антецедента вводим
аналогичный ука\-за\-тель нормализации: "задача(5
тип(описать)полный явное буфер прямойответ упростить
цель(неизвестная($x$)))".

Наконец, для вычисления интеграла сопровождаем его указателем
норма\-ли\-зации "задача(6 упростить)"; радикал под интегралом -
указателем "задача(4 упростить одз)"; производную - указателем
"задача(5 упростить одз)". Такое принудительное выделение этапов
вычисления во многих случаях существенно ускоряет получение
результата.

\item Пусть в прямоугольной системе координат $K$ множество точек
$A$ задает\-ся соотношением $\mbox{коорд}(A,K) =
set_{xyz}(f(x,y,z)=0 \ \& \ \mbox{число}(x) \ \& \ \mbox{число}(y)
\ \& \ \mbox{чис}\- \mbox{ло}(z))$. Тогда для перехода к
сферическим координатам можно записать сле\-ду\-ю\-щую теорему
приема:

$\medskip \forall_{AKf}(\mbox{прямкоорд}(K) \ \& \
\mbox{коорд}(A,K) = set_{xyz}(f(x,y,z)=0 \ \& \ \mbox{число}(x) \
\& \ \mbox{чис}\- \medskip \mbox{ло}(y) \ \& \ \mbox{число}(z))
\rightarrow \mbox{сферкоорд}(A,K) = set_{abc}(f(a\cos c \cos b, a
\cos c \sin b, a\sin c)\\ =0 \ \& \ 0 \le a \ \& \ -\pi \le 2c \
\& \ 2c \le \pi \ \& \ -\pi \le b \ \& \ b \le \pi))$.

Так как решатель обычно устраняет знаменатели в уравнениях и
неравенст\-вах с дробями, то неравенства для широты домножены на 2
уже в теореме.

Заголовок приема - "вывод". Поводом для его срабатывания пусть
будет упо\-ми\-нание в посылках задачи выражения "сферкоорд($A$
$K$)". В этом случае уровень срабатывания можно сделать небольшим,
например, равным 3. Лучше проя\-вить предусмотрительность на тот
случай, если соотношение для прямоугольных координат множества $A$
появится в задаче несколько позднее, и добавить еще одну попытку
применения приема на более высоком уровне - например, на шестом. В
результате появится фильтр "уровень(3 6)". Далее добавляем
стан\-дарт\-ные фильтры "посылка", "тип(исследовать)". Чтобы
избежать повторных применений приема, нужно ввести еще какой-то
ограничитель. Пусть это будет фильтр, проверяющий отсутствие в
посылках равенства, дающего выражение для сферических координат
множества $A$ через описатель "класс" \ -
"не(кон\-тек\-ст(посылка(х1)вид(х1
равно(сферкоорд($A$$K$)х2))заголовок(х2 класс)))".

Далее вводим указатели "отображение($f$)" \ и
"контрольвывода(сферкоорд($A$ $K$))". Последний из них и обязывает
компилятор начать программу приема с усмотрения в задаче выражения
"сферкоорд($A$ $K$)". Чтобы решатель не поме\-нял местами левую и
правую части равенства (при прочих равных условиях влево
переносится более длинное выражение), добавляем указатель
"примеча\-ние(ориентацияравенства)". Он вводит комментарий
"ориентацияравенства" \ к новой посылке, блокирующий на
последующих шагах перестановку частей ра\-венства. Далее, вводим
указатель "примечание(нормкоорд)". Он сопровождает посылку
комментарием "нормкоорд", блокирующим попытки исключения
опи\-са\-теля "класс" \ путем явного разрешения условия
принадлежности этому клас\-су. Такие попытки для множеств,
заданных уравнениями, обычно бесполезны.

Чтобы упростить уравнение для новых координат, сопровождаем
утвержде\-ние под описателем "класс" \ нормализатором "задача(6
тип(описать) полный прямойответ явное упростить
цель(неизвестная($a$ $b$ $c$)))". Это накладывает до\-ста\-точно
сильные требования на уравнение множества - прием пытается
по\-лу\-чить явное соотношение, выражающее одну из сферических
координат через две другие. Чтобы избежать слишком долгого времени
его применения, вводим в заключение ограничитель трудоемкости -
указатель "лимит(10000000)".

\end{enumerate}

 \chapter{Программы общего интерфейса системы}

 Использование логической системы в качестве инструмента для
 исследования ло\-ги\-ческих процессов связано с постоянным
 обращением к процедурам ее интерфейса - для включения в них
 новых блоков либо адаптации старых к новым потребностям. Еще
 более интенсивная работа с процедурами общего интерфейса
 будет нужна при использовании ее в качестве основы для
 различного рода прикладных систем. В этой главе мы дадим краткое
 описание архитектуры программ общего интерфейса логической системы
 и архитектуры ряда наиболее важных стандартных вспо\-мо\-га\-тельных
 блоков, используемых в этих программах.

 Начиная с этой главы, рекомендуется при чтении следить за
 текстами со\-от\-вет\-ствующих программ, отображенных на экране
 компьютера. Основная часть ма\-те\-ри\-а\-ла имеет характер развернутых
 комментариев к этим программам.


 \section{Главное меню}

 \subsection{Начало программы общего интерфейса}

 При запуске логической системы интерпретатор ЛОСа (программа
 LOGSYST.EXE) создает фиктивную задачу на исследование, имеющую
 единственную посылку, со\-сто\-ящую из однобуквенного терма "вход",
 и запускает процесс сканирования этой задачи. При сканировании
 сначала происходит обращение к программе символа "ис\-сле\-довать" \ -
 оно не сопровождается срабатываниями каких-либо приемов, и затем
 осуществляется обращение к программе логического символа "вход".
 Эта программа и реализует общий интерфейс логической системы.
 Проследим первые шаги, вы\-пол\-ня\-емые реализуемой в сканировании
 задачи программой символа "вход". Для удобства рекомендуем войти
 в просмотр корневого фрагмента данной программы и перемещаться по
 ней согласно дальнейшему тексту.

 Собственно корневой фрагмент программы "вход" \ обслуживает
 справочник "ар\-ность"; при сканировании задачи он игнорируется, и
 по переходу "иначе 1" \ попада\-ем в фрагмент, начинающийся с
 оператора "решить".

 Этот фрагмент прежде всего проверяет наличие первого
 информационного блока (файл I0000.lsi), хранящего необходимые
 для прорисовки элементов интерфейса ре\-сурсы (шрифт, текстовые
 заготовки, битмэпы). Проверка выполняется оператором
 "не(файл(проверка(1)))". Если такого блока нет, то сразу же
 происходит выход из логической системы (оператор "ответ(отказ)").
 Заметим, что выход из системы ре\-али\-зуется при выдаче ответа на
 исходную фиктивную задачу, т.е., в частности, при обращении к
 оператору "ответ($\ldots$)" \ в любой точке программы "вход".
 В логической системе не предусмотрена специальная кнопка для
 выхода - он обеспечивается сред\-ствами, предоставляемыми
 операционной системой. Помимо этого, выход реализуется лишь в
 аварийных ситуациях и означает порчу либо некомплектность файлов
 систе\-мы.

 Из текущего фрагмента программы "вход" \ по переходу "ветвь 2"
 \ попадаем в фрагмент, создающий дополнительный драйвер
 клавиатуры. Этот драйвер может понадобиться при работе с
 клавиатурой, имеющей только латинские символы. Тогда нажатие
 "Ctr-F9" \ в режиме текстового редактора позволяет использовать
 латинские символы как аналоги символов кириллицы (g - г, u - у, и
 т.п.). Выключение драйвера - повторное нажатие данной клавиши.
 Роль драйвера играет комментарий (текстре\-дактор $A B$) к
 посылкам исходной задачи, у которого $B$ - список кодов
 клавиатуры (логических символов), соответствующих символам
 кириллицы; $A$ - список кодов для соответствующих символов
 латиницы.

 Далее по переходу "ветвь 1" \ попадаем в фрагмент, начинающийся с
 операторов "файл(проверка 2) файл(актив 2)". Этот фрагмент
 анализирует второй ин\-фор\-ма\-ци\-он\-ный блок, в котором содержится
 задачник системы. Из корневого указателя-каталога данного блока
 по метке "метка" \ имеется переход к логическому терминалу,
 хранящему терм "задачи($N$)". Число $N$ является индикатором
 цикла серийного ре\-ше\-ния задач некоторого раздела задачника. Если
 имеет место установка на про\-ве\-де\-ние такого цикла, то при запуске
 логической системы не происходит выход в главное меню, а сразу
 возобновляется цикл решения задач (начиная с задачи, следующей после
 той, на которой была прервана работа решателя). Рассматриваемый
 фрагмент инициирует такое продолжение прерванного цикла - вводит
 специальные ком\-мен\-та\-рии к посылкам исходной задачи, в зависимости
 от $N$. Более подробно об индикаторе $N$ - см. справочную
 информацию к символу "вид", оглавление типа "задачи".
 Авто\-ма\-ти\-ческое возобновление циклов обработки обучающего
 материала (задачи, теоре\-мы, приемы) введено для удобства восстановления
 нормального состояния массивов интерпретатора после возможных ошибок,
 обусловленных длительностью цикла об\-ра\-ботки. Нажатие $Esc$ в отладчике
 ЛОСа (например, при чрезмерно затянувшемся решении задачи) вызывает
 внутренний перезапуск системы с расчисткой всех рабо\-чих массивов,
 после чего цикл решения продолжается в нормальном режиме.

 Далее через переход "ветвь 1" \ попадаем в фрагмент, начинающийся
 с операторов "файл(проверка 6) файл(актив 6)". Он аналогичен
 предыдущему фрагменту - ини\-ци\-ирует возобновление цикла серийной
 обработки раздела базы теорем (например, при тестировании логического
 вывода). Еще один переход по метке "ветвь 1" \ приводит снова к
 аналогичному фрагменту - на этот раз для возобновления цикла
 обработки раздела базы приемов.

 Наконец, последний перед прорисовкой главного меню
 переход по метке "ветвь 1". Он приводит к фрагменту,
 начинающемуся с оператора "файл(актив 1)". Преж\-де всего, здесь
 реализуются операторы "указатель(список набор(0 3)видео х6)
 файл(ви\-део начало(х6))". Они обеспечивают загрузку в оперативную
 память интерпретатора битмэпов используемого решателем шрифта -
 лишь после этого будут работать опе\-раторы прорисовки текстов.

 Далее идет оператор "повторение" \ - к нему происходят откаты при
 повторных прорисовках главного меню. Наконец, следующий оператор
 вида "или($A$ и(Меню(0)\\Меню(актив)главноеменю(0 0)равно(х7 0)))"
 \ выполняет прорисовку главного меню, если не выполнено условие
 $A$ (упоминавшиеся выше режимы возобновления серийной обработки).
 При прорисовке главного меню в верхней части экрана убирается
 полос\-ка с меню операционной системы. Присвоение нуля переменной
 х7 в данном операто\-ре - фиктивное; оно делает его перечисляющим
 и позволяет сохранить старые вели\-чи\-ны откатов к перерисовке меню
 (в ранних версиях этот оператор являлся сущест\-вен\-ным образом
 перечисляющим). Заметим, что какие-бы то ни было изменения программы
 "вход" \ следует выполнять с особой осторожностью, так как после них
 может оказаться ЗАБЛОКИРОВАНА ВОЗМОЖНОСТЬ ПОВТОРНОГО ВХОДА В ЕЕ
 РЕДАКТИРОВАНИЕ, и система окажется полностью выведенной из строя
 (для продолжения работы придется излекать резервную копию из директории
 SLCO\-PY). На\-пом\-ним, что программа символа "вход" \ - единственная
 программа ЛОСа, в которой заблокирован автоматический сдвиг номеров
 программных переменных.

 После оператора прорисовки главного меню идет оператор "ветвь 1",
 а за ним - группа операторов, выполняющих проверку наличия
 указателя на немедленный переход от главного меню к задачнику
 либо к справочнику по системе. Такой указа\-тель хранится в
 логическом терминале первого информационного блока, достижимом от
 корневого указателя - списка по метке "установка". Если
 содержимое этого тер\-ми\-на\-ла - символ 2, то инициируется переход к
 задачнику; если символ 3, то - к справочнику по системе. Заметим,
 что в начале указанной группы располагается оператор
 "трассировка(вход)", который истинен только при первом запуске
 системы, а при последующих ее внутренних перезапусках с помощью
 оператора "трасси\-ров\-ка(0)" \ (без выхода в операционную систему)
 - ложен. Если бы этого оператора не было, то выход в главное меню
 при последующей работе с системой оказался вообще невозможен.
 Для перехода к задачнику либо справочнику создается комментарий
 "автоклавиатура $\ldots$" к посылкам исходной задачи, содержащий
 коды необходимых для перехода клавиш.

 Следуя по "ветвь 1", попадаем в подфрагмент, начинающийся с
 оператора "пов\-то\-ре\-ние". К этому оператору происходят откаты при
 повторных обращениях к главному меню. Далее следует большой
 оператор "альтернатива($\ldots$)", реализующий обращение к
 главному меню для ввода кода клавиатуры х9. Он представляет
 собой цепочку вложенных друг в друга операторов "альтернатива",
 которые пытаются определить значение х9 до фактического обращения
 к вводу с клавиатуры либо мыши, если это можно сделать согласно
 различным комментариям к посылкам текущей задачи. Например, х9
 будет автоматически определяться при наличии одного из
 упо\-ми\-нав\-ших\-ся выше циклов серийной обработки.
 Часто используется для автоматического входа
 при откате в нужный пункт главного меню комментарий
 "новпозиция $A$" \ к посылкам исходной задачи, у которого $A$ -
 символ клавиатуры, обеспечивающий вход в этот пункт. Лишь
 последний из вложенных друг в друга операторов "альтернатива" \
 обращается к вводу х9 через главное меню (см. подоператор
 "главноеменю(1 х9)").

 После получения значения х9 - переход через оператор "ветвь 1" \
 к началу цепочки фрагментов, осуществляющих обработку различных пунктов
 главного меню. Пе\-ре\-чис\-лим эти пункты. Заметим, что к большинству
 из них можно перейти непос\-ред\-ствен\-но из подраздела "Общий
 интерфейс" \ оглавления программ.

 \subsection{Обращение к оглавлению приемов}

 Первый из пунктов цепочки обработки команды главного меню
 (х9 = "внешнийкван\-тор") - вход в оглавление приемов ГЕНОЛОГа.
 Здесь сначала делается активным 8-й информационный блок,
 содержащий оглавление базы приемов и описания приемов на ГЕНОЛОГе
 (подробнее о его строении будет рассказано в разделах,
 посвященных ГЕНОЛОГу). Затем вводится комментарий (трассировка
 $\ldots$), который делает воз\-мож\-ным просмотр отладчиком ЛОСа
 термов в стандартной математической записи и может оказаться
 полезным при отладке процедур редактора ГЕНОЛОГа. Оператор
 "равно(х10 0)" резервирует переменную х10, которой далее будет
 присвоена ссыл\-ка на корневой указатель - список оглавления
 приемов. Это присвоение осуществляется в конце фрагмента, после
 оператора "ветвь 2", к которому произойдет откат после
 определения значения х10.

 Фрагмент, к которому переходим через "ветвь 2", начинается с
 оператора "пов\-то\-ре\-ние". К этому оператору будут происходить
 откаты для повторных входов в оглавление приемов после обработки
 очередного выбранного концевого пункта этого оглавления. Далее идут
 оператор, удаляющий ранее имевшийся комментарий (вид $\ldots$)к
 посылкам исходной задачи (если он был), и оператор, вводящий
 новый такой комментарий - (вид прием), указывающий, что
 происходит работа с оглавлением приемов. Удаляется также
 комментарий (прием $\ldots$) - ссылка на последний прос\-мат\-ри\-вав\-шийся
 до этого прием базы приемов. Наконец, оператор "или(и(равно(х11
 0)$\ldots$)и(оглавление(х10 х11)замена(х11 конец(х11))))" \
 обеспечивает собственно об\-ра\-ще\-ние к оглавлению базы приемов и
 присваивает переменной х11 ссылку на выб\-ран\-ный концевой
 логический терминал этого оглавления. Заметим, что первый операнд
 оператора "или($\ldots$)" осуществляет присвоение значения х11
 без обращения к ог\-лав\-ле\-нию - если нужно вернуться к известному
 концевому пункту, на который ссылается комментарий
 (контрольпрограммы $\ldots$).

 При работе с оглавлением имеются две возможности - либо выйти из
 него без выбора концевого пункта, либо выбрать концевой пункт. В
 первом случае оператор "оглавление($\ldots$)" \ ложен, и согласно
 переходу "иначе 1" попадаем в ветвь программы, обрабатывающую обрыв
 работы с оглавлением. Если в комментариях к посылкам исходной задачи
 к этому моменту появилось указание на переход к некоторому
 заданному пункту главного меню, то снова выполняется переход
 по "иначе 1", и далее выполняется оператор "сброс(3)" \ для
 отката к определению значения х9; если такого указания нет, то
 происходит внутренний перезапуск и выход в главное меню.

 Если в оглавлении приемов был выбран концевой пункт, то далее
 происходит обращение к редактору ГЕНОЛОГа - оператору
 "блокприемов(х11)". После выхода из него проверяется наличие
 комментариев, определяющих переключения на другие пункты главного
 меню либо внутренний перезапуск. Если таких комментариев нет, то
 происходит откат к упоминавшемуся выше оператору "повторение" \
 и повторное обращение к оглавлению. Заметим, что повторный вход в
 оглавление осуществляется на тот концевой пункт, который был
 выбран в последний раз, и при работе создается впечатление, что
 обращение к редактору ГЕНОЛОГа происходит непосредственно из
 процедуры "оглавление".

 \subsection{Обращение к редактору ЛОСа}

 Следующий пункт цепочки обработки кода х9 начинается с оператора
 "равно(х9 анализатор)". Это - начало ветви, реализующей редактор
 программ ЛОСа. Попасть в него можно также через оглавление
 программ - подпункт "Вход в редактор ЛОСа для заданного
 лог.символа" \ пункта "Общий интерфейс". В начале фрагмента
 рас\-по\-ло\-жен оператор "файл(актив 1)", активизирующий первый
 информационный блок. После оператора "равно(х11 0)" \
 (резервирующего пока не используемую переменную х11) идет
 оператор "повторение", к которому будут происходить откаты при
 пов\-тор\-ных запросах на ввод того логического символа, программу
 которого нужно редактировать. Далее оператор "видео(0)" расчищает
 буфер текстов перед обраще\-ни\-ем к текстовому редактору, а оператор
 "или(существует($\ldots$)существует($\ldots$)су\-щест\-ву\-ет(х12
 текстредактор(0 $\ldots$ х12)))" \ - реализует обращение к
 текстовому редактору, с помощью которого будет введено название
 логического символа. Заметим, что в этой дизъюнкции первые два
 оператора проверяют наличие комментариев, непос\-ред\-ствен\-но
 указывающих на нужный символ; если такие комментарии есть, то
 ручной ввод символа отменяется.

 Если при наборе символа была нажата клавиша "Esc", то оператор
 ввода символа оказывается ложным. Тогда переходим через "иначе 2" \ к
 подфрагменту, за\-вер\-ша\-ющему исключение из программы ранее отключенных
 ветвей (ссылки на них из\-вле\-ка\-ются из комментария (копияветви $\ldots$)),
 и осуществляющему внутренний пе\-ре\-за\-пуск с возвращением в главное меню.

 Если символ был введен, то выполняется оператор "равно(х12 0)"
 \ (резервирую\-щий пока не используемую переменную х12), и далее -
 оператор "альтернатива($A_1 A_2$ альтернатива($B_1 B_2$
 и(кодтекста(3 х13 х14)равно(х14 0))))". Здесь снова проверяется
 наличие комментариев, явно указывающих на тот символ, программа
 которого будет просматриваться, и если эти комментарии есть, то
 символ присваивается переменной х13 (см. операторы $A_2,
 B_2$). Если же таких комментариев нет, то выполняется опе\-ра\-тор
 "кодтекста", считывающий название символа из буфера текстов,
 где оно было сформировано текстовым редактором.

 Далее название символа прорисовывается в верхней части экрана
 (операторы "видео(прямоугольник $\ldots$)" \ и "существует(х15
 видео(логсимвол $\ldots$))").

 В конце фрагмента происходит присвоение переменным х15,х16
 сначала некото\-рых фиктивных значений (в качестве таковых
 выступают вхождения левого края исход\-ной задачи), а затем -
 с помощью оператора "прогфайл(логсимвол $\ldots$)" \ - ссылки
 на корневой фрагмент программы логического символа х13 (если такой
 фрагмент к данному моменту уже создан). Предварительно проверяется
 наличие комментария "альтернатива" \ к посылкам исходной задачи;
 если он есть, то ссылка берется по блоку программ, хранящемуся в
 версии решателя из поддиректории ALT. Это позволяет просматривать
 из текущей версии программы альтернативную версию, отбирать нужные
 ее ветви и переносить в текущую версию. После определения ссылки
 (х15,х16) - переходим к следующему фрагменту через оператор "ветвь 3".

 Этот фрагмент начинается с оператора "замена(х14 пустоеслово)",
 после которого х14 используется как буфер ссылок на отключенные
 (но пока не удаленные) вет\-ви программы. Далее
 идет опера\-тор "замена(х12 пустоеслово)". Переменная х12 начи\-ная с
 этого момента использует\-ся в качестве буфера, определяющего путь
 к текуще\-му просматриваемому фрагменту программы символа х13 от
 корня этой программы. Буфер будет представлять собой набор троек
 $(A_1 A_2 A_3)$, причем у очередной тройки $(A_1 A_2)$ - ссылка
 на фрагмент в блоке программ, $A_3$ - номер перехода от него к
 подфрагменту. Последняя тройка соответствует корню программы
 символа х13, пер\-вая - фрагменту, предшествующему текущему
 фрагменту.

 Следующий оператор "замена(х11 1)" инициализирует переменную х11,
 которая будет далее хранить номер выделенного оператора перехода
 текущего фрагмента.

 Далее идет оператор "повторение", к которому будут происходить
 откаты при перерисовках текущего фрагмента программы. После него
 идет оператор "сборкаме\-ню(набор(5 1))", вводящий в верхней части
 экрана меню системы, сопровождающее обычный режим
 просмотра программы. Если вход в редактор программ произошел
 согласно комментарию (цепьвхождений $\ldots$), непосредственно
 указывающему на тот фрагмент, к просмотру которого нужно перейти,
 то следующий оператор "длялюбо\-го($\ldots$)" переустанавливает
 значения х12, х15, х16 на просмотр нужного фрагмента согласно
 данному комментарию и затем удаляет его. Далее оператор
 "альтерна\-ти\-ва(равно(х15 левыйкрай(х1))равно(х17
 пустоеслово)$\ldots$)" \ считывает текущий фраг\-мент программы и
 присваивает его переменной х17 (если программа символа х13 не
 была создана, то х17 становится равно пустому набору).

 Перед прорисовкой фрагмента программы происходит коррекция этого
 фрагмен\-та: каждый оператор "замена($N$ $t$)" \ заменяется, для
 удобства чтения программы, на "замена(х$N$ $t$)". Ее выполняют
 операторы, расположенные после оператора "ветвь 1". После коррекции - переход к новому фрагменту через
 "ветвь 1".

 Оператор "или(существует(х18 и($\ldots$))видео(прямоугольник
 $\ldots$))" \ проверяет от\-сутствие комментариев, указывающих на
 ненужность прорисовки фрагмента про\-граммы; если их нет, то он
 расчищает ту часть экрана, которая расположена под названием
 текущего логического символа. Текущая позиция для последующей
 про\-рисовки устанавливается на левый край второй сверху текстовой
 полосы (оператор "видео(позиция 0 девятнадцать)"). Затем
 инициализируются используемые в цикле прорисовки данные. Прежде всего,
 это накопитель х18 пятерок (столбец - строка - вхождение оператора в
 фрагмент программы - исходная позиция в буфере текстов - заключительная
 позиция в буфере текстов), характеризующих размещение на экране
 операторов перехода "ветвь $\ldots$", "иначе $\ldots$". Он нужен для
 перекраски фона текуще\-го выбранного оператора перехода. Первые два
 элемента пятерки указывают коор\-динаты начала оператора на экране;
 последние два - размещение его в буфере текстов. Инициализируются также
 х19 - счетчик прорисованных операторов перехода и х20 - номер первой
 свободной позиции в буфере текстов.

 В начале следующего фрагмента расположен оператор "позиция(х21
 х17)", пе\-ре\-чис\-ляющий для прорисовки вхождения операторов в
 текущий фрагмент программы. После него идут два оператора,
 проверяющие необходимость прорисовки фрагмента. Если они истинны,
 то выполняется оператор, распознающий операторы перехода по их
 заголовкам "ветвь","иначе". Если оператор не является оператором
 перехода, то фрагмент по "иначе 2" \ выполняет его прорисовку с
 текущей позиции, пропуск одной пустой позиции и коррекцию
 указателя х20 на первую незанятую позицию буфера текстов.
 В противном случае происходят пополнение накопителя х18 очередной
 пя\-тер\-кой, прорисовка оператора перехода (заголовок оператора и через
 пробел - номер перехода х19), увеличение счетчика х19 на единицу
 и коррекция указателя х20. Если номер х11 выделенного оператора
 перехода равен х19, то фон при прорисовке выбирается желтый.

 После прорисовки всех операторов фрагмента программы - переход по
 "иначе 1" \ к фрагменту, присваивающему переменной х19 вхождение
 в накопитель х18 той пятерки, которая соответствует текущему
 выделенному оператору перехода. Оттуда, по "ветвь 1", переход к
 фрагменту, начинающемуся с операторов "повторение", "при\-ем(1)",
 "автоменю(х21)". Здесь начинается обработчик команд редактора ЛОСа;
 подробнее о программах этого редактора будет рассказано ниже в
 отдельной главе.

 \subsection{Обращение к оглавлению задачника}

 Следующий пункт цепочки обработки кода х9 - вход в оглавление
 задачника. Аль\-тер\-нативный способ найти этот пункт - через оглавление
 программ (Общий интерфейс - Обращение к оглавлению задачника).
 После оператора "равно(х9 подборнеизвест\-ных)" \ расположены
 операторы, запоминающие в х10 номер текущего активного
 ин\-фор\-мационного блока и при отсутствии задачника (второй
 информационный блок) - инициализирующие его. Далее - переход по
 "ветвь 2" \ к фраг\-мен\-ту, начинающемуся с оператора "файл(актив
 2)", активизирующего информационный блок задачника.

 Здесь переменной х11 присваивается исходная задача; если из
 корневого указа\-те\-ля-каталога задачника не было перехода по метке
 "оглавление" \ к некоторому ука\-за\-те\-лю-списку х12, то такой переход
 вводится. Находится переход от х12 по метке "задачи" \ (если
 его не было, то он тоже вводится). В результате х13 - набор, содер\-жа\-щий
 ссылку на корень оглавления задачника. Вводится комментарий (вид
 задачи) к посылкам исходной задачи, указывающий, что начата
 работа с оглавлением задач\-ни\-ка. Далее идет оператор "повторение",
 к которому будут происходить откаты при повторных входах в это
 оглавление после рассмотрения его концевых пунктов (то есть
 отдельных задач). Сразу же за ним - оператор "видео(конец)",
 сбрасывающий ранее введенный массив текстов. Этот массив
 накапливает текстовые заготовки, использкемые при прорисовке на
 экране задач, и его следует периодически сбра\-сы\-вать во избежание
 переполнения.

 Обращение к оглавлению задачника реализуется оператором
 "оглавление(нача\-ло(х13)х14)". Если при работе с оглавлением
 концевой пункт не был выбран, то оператор оказывается ложным; в
 этом случае переходим по "иначе 3". Если был введен комментарий
 (новпозиция $\ldots$), определяющий переключение на новый пункт
 главного меню, то предпринимается откат к точке, обрабатывающей
 обращения к этому меню, иначе осуществляется внутренний
 перезапуск с выходом в главное меню.

 Если концевой пункт оглавления был выбран (либо определился
 автоматически согласно комментариям к посылкам исходной задачи),
 то далее проверяется наличие комментария "задачи", указывающего
 на наличие цикла решения задач из некоторо\-го раздела задачника -
 см. оператор "входит(задачи комментариипосылок(х11))". После
 этого оператора предпринимается проверка того, что в данном цикле
 вообще следует предпринимать попытку решения задачи, соответствующей
 выбранному кон\-цевому пункту оглавления. Если это не так, то
 происходит откат к оператору "пов\-то\-ре\-ние" \ и очередной вход в
 оглавление задачника. Заметим, что в циклах автоматичес\-ко\-го
 решения серий задач поиск очередной задачи выполняется
 непосредственно опе\-ра\-то\-ром "оглавление", который далее снова
 выводит к оператору "входит(задачи комментариипосылок(х11))".

 Проверка целесообразности решения очередной задачи в цикле
 предпринимается следующим образом. Если имеется комментарий
 "идент" \ к посылкам исходной зада\-чи, то логический терминал,
 достижимый по метке "не" \ из корневого каталога задач\-ни\-ка,
 содержит термы "набор($S_1 \ldots S_m$)", указывающие на такие
 наборы логических символов $S_1, \ldots S_m$, которые обязательно
 должны встретиться в процессе решения задачи - иначе заведомо не
 срабатает некоторый прием, и повторное решение задачи не
 интересно. Чтобы определить по текущей задаче, какие именно
 логические симво\-лы возникали ранее при ее решении, используется
 оператор "архивзадачи(х17 х18 х21)". После обращения к нему и
 происходит сравнение наборов $S_1, \ldots, S_m$ с фак\-ти\-чес\-ки
 имевшимися символами. Если задача проходит по указанному
 признаку, то далее выполняется контроль (см "ветвь 5") того, что
 ранее на нее был получен ответ. Для задач, не решенных при
 предыдущем обращении к ним, попытка решения в обычном серийном запуске
 не предпринимается (возможен запуск с отменой такого ограничения -
 об его отсутствии свидетельствует комментарий "префикснаярекур\-сия").

 Если не было отмены рассмотрения задачи в цикле решения, то
 предпринимается переход по "ветвь 4". При наличии комментария
 "задачи" \ (идет серийное решение) формируется комментарий
 (автоклавиатура (частичныйответ)), эмулирующий на\-жа\-тие клавиши "о"
 \ при входе в рассмотрение текущей задачи и инициирующий ее решение.
 Иначе - переход к следующему фрагменту по "ветвь 1".

 Здесь происходит обращение к интерфейсу задачника, реализуемому
 оператором "списокзадач(х16 конец(х17) конец(х15))". Этот
 интерфейс позволяет просмотреть условия всех задач текущего меню
 оглавления задачника, расположенных подряд и отделенных друг от
 друга горизонтальными линиями. В верхней части экрана вначале
 расположена линия, под которой находится текст условия выбранной
 в меню задачи. Более подробно программы интерфейса задачника
 описываются ниже в от\-дель\-ной главе.

 \subsection{Операции со словарем}

 Операции со словарем сгруппированы в ветвь программы,
 начинающуюся с операто\-ра "или(равно(х9 группировка) $\ldots$
 равно(х9 посылки))". Сюда относятся операции: вво\-да нового символа
 (х9 = "группировка"); изменения названия символа (х9 =
 "учет\-символов"); удаления символа (х9 = "конъюнктоперанд");
 определения номера символа по его названию (х9 = "усмчисло") и
 определения названия символа по его номеру (х9 = "посылки").
 Операторы "файл(актив 1)" \ и "видео(0)" \ делают активным первый
 информационный блок (из него извлекаются текстовые заготовки для
 окон диалога) и расчищают буфер текстов. Затем происходит
 расчистка экрана. Если операция отлична от определения названия
 символа по его номеру, то из текс\-то\-вого терминала первого
 информационного блока, достижимого по меткам "ком\-мен\-та\-рии",
 "преобразование", извлекается текст "Логический символ:", который
 и прорисовывается в верхней части экрана. Расчищается буфер
 текстов; оператор "ви\-део(точка х17 х18)" \ определяет позицию
 (столбец х17 - строка х18) справа от про\-ри\-со\-ванного текста,
 и начиная с этой позиции создается окно текстового редактора
 (оператор "текстредактор(0 х17 $\ldots$ х19)"). При отказе от
 набора символа (переход "иначе 3") происходит откат к главному
 меню. Иначе - оператор "видео(прямо\-уголь\-ник 0 0 прогртерм
 наборчленов 0)" \ расширяет рамку выдачи текстов до всего экрана,
 не изменяя содержимого экрана. Дальнейшие действия зависят от
 того, какая операция была выбрана:

  а) Ввод названия нового символа (х9 = "группировка"). Оператор
 "словарь(за\-пись х20)" \ вводит новый символ с названием, хранящимся
 в начале буфера текстов (оно только что создано текстовым
 редактором). Если такое название уже имелось, то переход через
 "иначе 5" \ к фрагменту, прорисовывающему текст о том, что
 наз\-ва\-ние ранее использовалось.

 б) Удаление символа с данным названием (х9 = "конъюнктоперанд")
 Оператор "словарь(исключение)" \ удаляет название символа.

 в) Определение номера символа с заданным названием (х9 =
 "усмчисло"). Опе\-ра\-тор "словарь(проверка х20)" \ определяет номер
 х20 символа (в формате символьного числа). Далее определяется
 десятичное число х21, равное х20; прорисовывается сим\-вол "№",
 находится представление х22 числа х21 в виде терма, и этот терм
 про\-ри\-со\-вы\-ва\-ется. После прорисовки - обращение к операторам
 "клавиатура(х25)","обрыв", обеспечивающее возвращение к главному меню
 после нажатия любой клавиши.

 г) Изменение названия логического символа (остаточный случай для
 х9). Прежде всего проверяется наличие символа с изменяемым названием
 и определяется его номер х20. Затем из первого информационного
 блока извлекается и прорисовывается текстовая заготовка
 "заменяется на:". После изменяемого названия в буфер текстов
 заносится 0, отделяющий его от нового названия. Далее - ограничивается
 рамка для набора текстовым редактором нового названия; оператор
 "повторение"\ обозначает точку отката к повторным входам в
 текстовый редактор, если первоначально было введено уже использованное
 заменяющее название, и происходит обращение к тек\-сто\-во\-му редактору.
 При отказе от ввода символа - возвращение в главное меню (тогда
 исходное название сохраняется). Наконец, оператор
 "словарь(изменение)" \ осу\-щест\-вля\-ет изменение названия. Если
 новое название уже использовалось (переход по "иначе 2"), то
 восстанавливается старое название, прорисовывается указатель на
 то, что новое название уже занято, и происходит повторный вход в
 текстовый редактор.

 В приведенном выше списке не рассмотрена операция определения
 названия сим\-во\-ла по его номеру. Она соответствует случаю х9 =
 "посылки"; в исходном фрагменте ветви обработки операций со
 словарем переход по "иначе 2" \ (после оператора "не(рав\-но(х9
 посылки))") ведет к фрагментам, выполняющим данную операцию.
 Здесь про\-исходит прорисовка символа "№", обращение к текстовому
 редактору для ввода номера, определение символа по его номеру
 и прорисовка символа. По нажатию любой клавиши после этого -
 возвращение в главное меню.

 \subsection{Уплотнение и сохранение файлов}

 При х9 = "внутрвывод" \ происходит уплотнение измененных за
 период после пре\-ды\-дущего уплотнения файлов информационных и
 программного блоков. Вход в соответствующий фрагмент программы
 возможен через оглавление программ - раз\-дел "Общий интерфейс -
 Уплотнение инф.блоков и прогр.блока". Оператор "файл(вы\-писка
 х10)" \ присваивает переменной х10 набор номеров тех
 информационных блоков, для которых, возможно, потребуется
 уплотнение. Эти блоки поочередно акти\-ви\-зи\-ру\-ются, и оператор
 "файл(нормарксинус)" выполняет их уплотнение. Если при уплотнении
 обнаруживается ошибка в структуре файла (ложный оператор
 "файл(\\ нормарксинус)"), то выдается ответ на исходную задачу, то
 есть происходит выход из решателя в операционную систему. После
 обработки информационных блоков - обращение к оператору
 "прогфайл(нормарксинус)", уплотняющему программный блок. Если
 обнаруживается ошибка в программном блоке, то последний оператор
 истинен, и после его выполнения происходит выход из решателя.

 При х9 = "нижняяоценка" \ происходит проверка корректности
 структуры ин\-фор\-мационных блоков и программного блока. Если
 обнаруживается ошибка (ложный оператор "файл(выход)"), то
 происходит выход из решателя в операционную систему. Иначе
 предпринимается сохранение всех файлов информационных блоков и
 про\-грам\-много блока (только после успешно завершенной проверки
 корректности) в резервной копии системы, хранящейся в директории
 $C : \backslash SLCOPY$.

 \subsection{Обращение к оглавлению программ}

 При х9 = "минимум" \ происходит обращение к оглавлению программ.
 Для перехода в соответствующий фрагмент можно использовать пункт
 "Общий интерфейс - Вход в оглавление программ" \ из оглавления
 программ. Прежде всего проверяется наличие 9-го информационного
 блока, содержащего оглавление программ, и если его не было, то он
 создается. После этого - переход по "ветвь 2".

 Здесь активизируется 9-й информационный блок и вводится
 комментарий (трас\-сировка $\ldots$) к посылкам исходной задачи,
 который может понадобиться при про\-смот\-ре термов в стандартной записи
 из отладчика ЛОСа. Далее переменной х10 присваивается 0, после
 чего предпринимается поиск корневого указателя оглавления
 программ (либо создание такого корня, если его не было), и
 переменной х10 пере\-при\-сва\-и\-ва\-ется ссылка на найденный корень.
 Затем - переход по "ветвь 1".

 Новый фрагмент начинается с оператора "повторение", к которому
 будут про\-ис\-хо\-дить откаты при повторных входах в оглавление
 программ. Затем вводится комментарий (вид программа) к посылкам
 исходной задачи, указывающий на тип оглавления, с которым будет
 происходить работа (старая ссылка на тип оглавления перед этим
 удаляется). Далее - обращение к оператору "оглавление(х10 х11)",
 осу\-щест\-вля\-ющему собственно просмотр оглавления программ. Если был
 выбран не\-ко\-то\-рый концевой пункт оглавления, то х11 - пара ссылок:
 на текстовый терминал выбранного пункта, и на его логический терминал.
 Операторы "равно(х12 конец(х11)) файл(терм х12 х13)
 равно(х14 начало(х13))" \ определяют терм х14 вида "програм\-ма($A N$)",
 хранящийся в логическом терминале. У него $A$ - логический
 символ, $N$ - номер, ссылающиеся на оператор "прием($N$)" \ в
 программе символа $A$, к которому относится выбранный пункт
 оглавления. Вводятся комментарии (прогрблок $A$) и (подфрагмент
 $A$ прием($N$) х12) к посылкам исходной задачи, которые будут
 исполь\-зо\-ваться после отката к главному меню для последующего выхода
 на нужный фраг\-мент программы и выделения в нем оператора
 "прием($N$)". В верхней части экрана (полоска высотой в 19 пикселей)
 сразу же прорисовывается название символа $A$, которое сохранится
 при прорисовке найденного фрагмента программы. Далее вво\-дит\-ся
 комментарий (автоклавиатура (элементы)) к посылкам исходной
 задачи. Он будет эмулировать после отката нажатие клавиши F8 для
 поиска оператора "при\-ем($N$)" \ в программе символа $A$, и
 предпринимается откат к главному меню. Если теперь вернуться к
 большому оператору "альтернатива($\ldots$
 главноеменю($\ldots$))", то можно заметить внутри него присвоение
 "равно(х9 вариант(существует(х10
 ключ(\\комментариипосылок(х1)прогрблок х10))анализатор
 внешнийквантор))", усмат\-ри\-ва\-ющий комментарий (прогрблок $A$) и
 выдающий значение х9 = "анализатор" \ для входа в редактор
 программ ЛОСа. Таким образом выполняется первый шаг цепочки,
 приводящей после отката к просмотру нужного фрагмента программы.
 Дальнейшие шаги легко проследить по программе редактора программ.
 Комментарий (под\-фраг\-мент $\ldots$) сохраняется вплоть до
 возвращения в оглавление программ из просмотра фрагментов, чтобы
 распознать в нажатии "End" \ команду на такое возвращение.

 \subsection{Редакция шрифта}

 По х9 = "схемаидентификации" \ происходит вход в интерфейс
 просмотра битмэпов используемого решателем шрифта и изменения
 этих битмэпов. В данную точку про\-граммы можно попасть из
 пункта "Общий интерфейс - Просмотр и изменение шриф\-та" \ оглавления
 программ. Битмэпы для используемого решателем шрифта хранятся в
 первом информационном блоке, в достижимом из корня этого блока по
 метке "видео" \ текстовом терминале. При запуске решателя они
 извлекаются из этого файла и переносятся в специальный массив
 оперативной памяти, который далее называем видеокассой.
 При изменении битмэпа для отдельного символа затрагивается только
 видеокасса; чтобы перенести эти изменения в файл, нужно выполнить
 операцию сохранения шрифта.

 Программа интерфейса работы со шрифтом начинается с оператора
 "повторение", к которому будут происходить откаты после выполнения
 очередной операции. Далее расположены два оператора прорисовки
 прямоугольников: сначала - общий черный фон экрана, затем - белый
 фон для зоны прорисовки битмэпов. Затем идет обращение к клавиатуре
 для запроса команды х12 на операцию со шрифтами. Перечислим пункты
 обработчика этих команд:

 \begin{enumerate}

 \item Если х12 = "Плюс" (клавиша Esc), то происходит возвращение
 в главное меню.

 \item Если х12 = "внешдизъюнкция" \ (клавиша Insert), то
 содержимое видеокассы сохраняется в первом информационном блоке.
 Если изменить битмэпы и не выполнить эту операцию, то при
 перезапуске решателя изменения пропадут. После сохранения
 видеокассы предпринимаются уплотнение первого инфор\-ма\-ци\-онного
 блока и внутренний перезапуск, с возвращением в главное меню.

 \item Если х12 = "стандменьше" \ (клавиша F1), то осуществляется
 обращение к тек\-сто\-вому редактору для пробной прорисовки
 измененных битмэпов символов.

 \item Если х12 = "попыткапараметризации" \ (клавиша F2), то
 реализуется интерфейс ввода номера в видеокассе того символа, для
 которого нужно просмотреть либо изменить битмэп. Номер символа
 изменяется от 0 до 255. Этот интерфейс необходим из-за того, что
 не для всех символов существует соответствующая клавиша. К
 полученному номеру прибавляется 1, он переводится в формат
 символьного номера х17, и далее переменной х12 присваивается
 значение х17. После такого переприсвоения - переход к
 описываемому в следующем пункте "общему случаю" \ обработки
 команды.

 \item Все неподпадающие под перечисленные выше случаи значения х12
 рассмат\-ри\-ва\-ются как символьный номер, соответствующий некоторой
 букве из видеокас\-сы. Логический символ, представляющий этот
 номер, прорисовывается в верх\-ней левой части экрана. Если
 сивмольный номер больше 256, то после оператора "менее(х12 определение)"
 \ - переход по "иначе 1", обращение к оператору
 "кла\-виатура(х13)", и по нажатии любой клавиши - откат к запросу
 очередной ко\-ман\-ды. Если же номер попадает в диапазон видеокассы,
 то прежде всего опе\-ра\-тор "видео(развертка х12 х13)" определяет битмэп
 символа в виде набора х13 длины 19, состоящего из 8 - элементных
 наборов из нулей и единиц (логических символов). Затем происходит
 прорисовка этого битмэпа в виде сетки (синие квадратики - 0,
 черные - 1). Одновременно слева на черном фоне прорисо\-вы\-ва\-ется
 белый "негатив" \ символа, соответствующего битмэпу. Этот негатив
 изменяется при любых изменениях битмэпа и позволяет
 контролировать ка\-чест\-во изображения. Заметим, что после
 прорисовки сетки битмэпа выполняет\-ся оператор "повторение", к
 которому будут происходить откаты при элемен\-тар\-ных изменениях
 этой сетки. Далее прорисовывается желтый квадратик - курсор
 работы с сеткой, и текущее состояние набора х13 переносится в
 видео\-кас\-су (оператор "видео(бланк х12 х13)"). В конце фрагмента
 программы нахо\-дит\-ся обращение к оператору "клавиатура" \ - запрос
 на текущую команду х18 работы с сеткой. Здесь имеются следующие
 команды:

  а) х18 = "префиксныйфильтр" \ (клавиша 0) - текущий квадратик
  сетки уста\-нав\-ли\-вается на 0;

  б) х18 = "унисборка" \ (клавиша 1) - текущий квадратик сетки
  устанавливается на 1;

  в) х18 = "циклвариантов", либо х18 = "внешконъюнкция", либо
  х18 = "внеш\-сумма", либо х18 = "подстановка" \ - перемещения
  курсора с помощью четырех клавиш курсора.

  г) х18 = "тринадцать" \ (клавиша Enter) - завершение обработки
  сетки битмэпа.

 \end{enumerate}

 \subsection{Вход в просмотр и редактирование информационных
 блоков}
 Интерфейс просмотра и редактирования информационных блоков
 является чис\-то техническим; работа с основными содержащимися в
 информационных блоках объ\-ек\-тами, такими, как база приемов,
 задачник, оглавление программ и др., осуществляет\-ся через их
 специальные интерфейсы. Описываемый здесь интерфейс оказывается
 необходим в аварийных ситуациях - для восстановления
 информационного блока после поломки, а также для создания
 ресурсов различного рода (битмэпы, текстовые фрагменты и т.п.).

 Вход в просмотр информационного блока требует
 указания номера этого блока. Поэтому в данном случае оператор
 "главноеменю($\ldots$)" выдает в качестве значения х9 не логический
 символ "новыесвязки", соответствующий нажа\-той клавише "и",
 а терм "новыесвязки($i$)", где $i$ - десятичный номер информаци\-он\-но\-го
 блока, введенный с помощью текстового редактора. Прежде всего
 определяется символьный номер х11 рассматриваемого блока;
 предпринимаются проверка наличия этого блока, его активизация
 и инициализация стэка х12. Этот стэк будет хранить набор $A_1
 \ldots A_n$ троек (ссылка на объект информационного блока - метка
 перехода к нему от пре\-ды\-ду\-щего объекта - номер перехода от
 него к следующему объекту; нумерация берется относительно полного
 списка переходов от данного объекта). Начало стэка $A_1$
 соот\-вет\-ствует текущему просматриваемому объекту блока; $A_n$
 соответствует корню блока и имеет вид $((0 3),0, 1)$. Если блок не
 был создан, то он при просмотре не создается и х12 остается
 равным 0. После инициализации х12 происходит переход по "ветвь
 2".

 Переменной х13, которая впоследствии будет хранить номер текущего
 выделен\-но\-го перехода в списке переходов текущего просматриваемого
 указателя - списка, при\-сва\-ивается значение 1. Далее идет оператор
 "повторение", к которому бу\-дут происходить откаты при прорисовках
 очередного объекта информационного блока. После него
 предпринимается расчистка экрана; переменной х14 присваивается
 зна\-че\-ние 0 (в случае указателя - списка ей будет переприсвоена
 некоторая структура данных, используемая для работы с этим
 указателем). Если х12 не равно 0 (т.е. блок существует), то
 прежде всего определяется тип х15 текущего объекта блока, ссылка
 на который имеется в начале первой тройки из х12. Это выполняет
 оператор "указатель(тип начало(начало(х12))х15)". В верхней левой
 части экрана про\-ри\-со\-вы\-ва\-ется название типа х15 (если х15 =
 "логсимвол", что соответствует случаю указателя-каталога, то
 вместо х15 прорисовывается слово "каталог"). Если текущий объект
 - указатель-каталог, то на этом его прорисовка завершается; если
 он пред\-став\-ляет собой текстовый либо логический терминал, то
 перед завершением прорисовки переменной х14 переприсваивается
 единица.

 Если текущий объект - указатель-список, то прежде всего находится
 список х17 всех его меток. Переменной х14 переприсваивается
 символ "пустоеслово" \- она ста\-но\-вится накопителем шестерок для
 прорисовки указателя-списка: (столбец, с которого начинается
 прорисовка номера очередного перехода по метке - строка - исходная
 позиция в буфере текстов, где хранится этот номер - последняя позиция
 в буфере текстов - метка - ссылка на объект, к которому
 происходит переход по метке). Выпол\-няется расчистка буфера
 текстов; переменной х18 - указателю на первую свободную ячейку
 буфера текстов - присваивается 0. Далее просматриваются метки из
 списка х17. Каждая такая метка прорисовывается оператором
 "альтернатива($\ldots$)", и после нее прорисовываются номера
 переходов по данной метке к новым объектам. Ну\-ме\-ра\-ция в каждом
 случае начинается с 1 (х21 - текущий номер); после прорисовки
 очередного номера происходит пополнение накопителя х14 очередной
 шестеркой.

 После прорисовки текущего объекта - переход по оператору "ветвь
 1", рас\-по\-ло\-жен\-ному после "равно(х14 0)". Здесь происходит
 выделение текущего перехода в случае указателя - списка: фон
 номера этого перехода делается красным. Текущим считается переход,
 номер которого равен х13. Переменной х15 присваивается вхож\-де\-ние в х14
 шестерки для текущего перехода. Далее - переход по "ветвь 1".

 В верхней части экрана прорисовывается меню для просмотра и
 редактирования информационных блоков. Затем выполняется оператор
 "повторение", к которому будут происходить откаты при выполнении
 команд, и предпринимается обращение к оператору "автоменю(х16)" \
 для ввода очередной команды. Перечислим команды данного
 интерфейса:

 а) х16 = "Плюс" \ (клавиша Esc) - завершение работы с блоком и
 возвращение в главное меню.

 б) х16 = "внешсумма" \ (клавиша "курсор вверх") - возвращение к
 внешему для текущего объекта указателю. Если указатель был
 корневым, то возвращение в глав\-ное меню, иначе х12 укорачивается
 на единицу, х13 становится равно концевому символу первой тройки
 из х12, и возвращение в режим запроса очередной команды.

в) х16 = "циклвариантов" \ либо х16 = "внешконъюнкция" \ (клавиши
"кур\-сор вправо" \ и "курсор влево"). В случае текущего
указателя-списка (что проверяется оператором "не(логсимвол(х14))")
предпринимается сдвиг вправо либо влево ука\-за\-те\-ля текущего
перехода. Корректируются значения х15,х13 и последний элемент
первой тройки набора х12 (воспроизводящий значение х13).

г) х16 = "подстановка" \ (клавиша "курсор вниз"). В случае
текущего указателя-списка реализуется выбранный в нем переход: в
начало стэка х12 заносится инфор\-ма\-ция о новом текущем объекте,
х13 заменяется на 1, и откат к прорисовке объекта. В случае
текстового терминала (х14 = 1) происходит прорисовка этого
терминала. Для логического терминала нажатие клавиши "курсор вниз"
\ недопустимо (его содер\-жи\-мое просматривается другой
командой). Наконец, в случае указателя-каталога происходит запрос
на ввод текстовым редактором логического символа х24. Затем
реализуется переход из него по метке х24 - аналогично случаю
указателя-списка.

д) х16 = "внешдизъюнкция" \ (клавиша Insert). Здесь осуществляется
ввод нового перехода из текущего указателя-списка либо
указателя-каталога, либо, в случае тер\-ми\-нала, его изменение.
Если информационный блок еще не был введен (х12 = 0), то он
вводится, состоящим пока из единственного файла длины 0.
Инициализируется нулем переменная х17, которой будет переприсвоена
метка перехода из текущего указателя. Для указателя - списка (в
случае истинности "или(не(логсимвол(х14))рав\-но(х14
пустоеслово))") реализуется ввод текстовым редактором терма х19 -
метки нового перехода, которая и переприсваивается переменной х17.
Для указателя-ка\-та\-лога (переход по "иначе 3") аналогичным
образом вводится метка - логический символ х25. После
доопределения х17 - переход по "ветвь 2".

Здесь инициализируется нулем переменная х18, которой затем с
помощью про\-ри\-со\-вываемого в верхней части экрана меню типов
объектов присваивается логический символ - код типа нового
объекта. Далее рассматриваются варианты:

 д1) х18 - один из символов "верхняяоценка", "подобл",
 "извлечениеварианта" \ (соответственно, типы "Цв.текст",
 "Ч.-б. текст", "Термы"). Тогда расчищаются экран и буфер текстов.
 Если текущий объект - текстовый терминал, то оператор
 "или(не(\\ равно(х14 \ 1))$\ldots$)" \ выполняет прорисовку содержимого
 терминала. В случае логи\-чес\-кого терминала прорисовка его
 содержимого осуществляется в той части фрагмента программы,
 которая расположена после оператора "равно(х18
 извлечениеварианта)".  Далее - переход через "ветвь 5". Здесь
 осуществляется ввод текстовым редактором новой версии терминала
 (если он уже имелся, то редактирование происходит поверх старого
 текста) и сохранение этой версии (изменение старой версии
 терминала либо ввод нового терминала с переходом к нему по метке
 х17).

 д2) х18 = "заменагруппы" \ (тип "Битмэп"). Предпринимается
 редактирование ранее введенного битмэпа либо ввод нового битмэпа
 и сохранение его в логическом терминале по метке х17. Размеры
 битмэпа определяются последними операндами оператора
 "битмэп($\ldots$)". Это - редко используемая возможность ввода
 битмэпов для специальных целей (например, для прорисовки
 шахматных фигур), и при примене\-нии ее может понадобиться
 предварительно изменить оператор "битмэп($\ldots$)" в про\-грам\-ме,
 указав в нем нужные число строк и столбцов битмэпа.

 д3) х18 = "легковидеть" \ (тип "Вставка"). Происходит ввод нового
 логического терминала, содержимое которого было извлечено ранее
 из другого логического тер\-ми\-на\-ла (см. ниже команду, сохраняющую в
 буфере содержимое текущего логического терминала для последующего
 копирования).

 д4) х18 = "внутрвывод" \ (тип "Указатель"). Вводится новый
 указатель - список, достижимый из текущего указателя по метке
 х17. Если информационный блок только что инициализирован (х12
 =0), то этот указатель-список становится корневым. Дан\-ная
 возможность в принципе может понадобиться лишь для 1-го и 4-го блоков,
 так как лишь у них корневой указатель может быть списком. Однако,
 здесь она тоже вряд ли нужна. Остальные информационные блоки
 заведомо должны инициали\-зи\-ро\-вать\-ся вне данного интерфейса.

 После обработки команды х18 происходит переход через "ветвь 1" \ в
 фрагменте, начинающемся с операторов "ветвь 1 не(равно(х18
 внутрвывод))". К этому моменту переменная х18 содержит уже не
 указатель на тип нового объекта, а ссылку на него в файле. Здесь
 выполняется коррекция стэка х12, соответствующая переходу к
 объекту редактирования, и происходит откат к запросу очередной команды.

 е) х16 = "узелраздела" \ (клавиша F3) - уплотнение текущего
 информационного блока;

 ж) х16 = "модули" \ (клавиша Ctr-Del) - исключение текущего
 объекта информа\-ци\-он\-ного блока. Следует быть осторожным в случае
 текущего указателя-списка - удалена будет не его текущая ветвь, а
 весь указатель целиком.

 з) х16 = "верхняяоценка" \ либо х16 = "минимум" \ (клавиши
 "ц","л") - соответ\-ствен\-но, просмотр текстового цветного терминала
 и логического терминала.

 и) х16 = "заменагруппы" \ (клавиша "б") - просмотр и изменение битмэпа.

 к) х16 = "Стандплюс" \ (клавиша "к") - регистрация содержимого $S$
 текущего логического терминала в буфере для последующего копирования.
 Роль буфера играет комментарий (Вставка $S$) к посылкам исходной
 задачи.

 л) х16 = "группировки" \ (клавиша End) - внутренний перезапуск и
 возвращение в главное меню.

 м) х16 = "утверждение" \ (клавиша Ctr-м). Происходит изменение
 метки перехода к выделенному подпункту текущего указателя-списка.
 Текстовым редактором вво\-дит\-ся новая версия метки перехода
 (логический символ либо терм), после чего все объекты, к которым от
 текущего указателя имелся переход по старой метке, ока\-зы\-ва\-ют\-ся
 достижимы из него по новой метке.

 \subsection{Вход в просмотр и редактирование вспомогательных
 меню}

 Используемые в системе меню операционной системы Windows,
 прорисовываемые в верхней части экрана, представляют собой
 разновидность ресурсов, которые можно создавать либо редактировать с
 помощью специального интерфейса. Вход в этот интерфейс реализуется
 по х9 = "фильтр\-квад\-ра\-тов" \ (клавиша "м"). В начале
 фраг\-мен\-та программы активизируется первый информационный блок и
 определяется ссылка на корень оглавления, с помощью которого и
 задаются вспомогательные меню (к этому корню имеется переход по
 метке "Меню" \ от корневого указателя-списка первого
 информационного блока). При обращении к оператору
 "оглавление(начало(\\ х12)х13)" \ осуществляется (обычными
 средствами редактирования оглавления) ввод нового меню либо
 изменение старого. Начало ветви отдельного меню выбирается в
 оглавлении произвольно, а при его использовании нужно лишь
 сослаться на путь к этой ветви от корня оглавления. После выбора
 концевого пункта оглавления - переход к части программы, с
 помощью которой вводится тот код клавиатуры, который будет
 относиться к соответствующему концевому пункту меню. В верхней
 части экрана при этом перерисовывается текст выбранного концевого
 пункта оглавления, под ним проводится горизонтальная черта, и под
 ней - прорисовывается ранее выбранный код клавиатуры (если его не
 было, то под чертой пусто). Далее - переход через "ветвь 3" \ к
 оператору "автоклавиатура(х21)", вводящему команды набор кода.
 Если х21 = "тринадцать" \ (клавиша Enter), то происходит
 обращение к текстовому редактору для набора кода; если х21 =
 "циклвариантов" \ либо "Плюс" \ (клавиши "курсор влево" \ и Esc),
 то - возвращение в оглавление.

 \subsection{Операции со словарем текстового анализатора}

 Для работы с текстовым анализатором необходим специальный
 словарь, отличный от словаря логических символов. Этот словарь
 называется в логической системе внешним словарем. Он хранит
 фрагменты слов, на которые разбивается считываемое слово
 текста. Каждый такой фрагмент кодируется некоторым логическим
 символом. Для ввода новых словарных фрагментов, сопоставления им
 логических символов и простейшей характеризации, используемой
 процедурами текстового анализатора, создан специальный интерфейс.
 Он запускается нажатием клавиши "в" \ в главном меню (либо при
 входе в подпункт "Ресурсы и установки" \ главного меню).
 Возникает диалоговый блок, в котором выделены две основные рамки -
 "Слово" \ (для ввода словарного фрагмента) и  "Логический символ" \
 (после ввода фрагмента прорисо\-вы\-ва\-ет\-ся ранее введенный кодирующий его
 логический символ либо происходит ввод такого символа). После
 ввода словарного фрагмента в окне "Фрагмент словаря" \
 прорисовываются ближайшие к нему в лексикографическом порядке
 уже имеющиеся в словаре фрагменты. Для активизации текстового
 редактора в рамках "Слово", "Логический символ" \ достаточно
 нажать левую кнопку мыши, подведя ее курсор в соответствующую
 рамку. Для сохранения во внешнем словаре введенного словарного
 фрагмента нажимается "Insert". После этого можно задать
 простейшие характе\-рис\-ти\-ки фрагмента, нажав клавишу "о". Это
 нажатие переводит в другой диалоговый блок. Сверху воспроизведено
 характеризуемое слово, а под ним расположены рамки, перечисляющие
 названия частей речи. Нужное выбирается нажатием левой кнопки
 мыши. В случае, например, имени существительного появляется новый
 диалоговый блок. Его рамки соответствуют характеристикам слова
 (род, одушевленный-неоду\-шев\-лен\-ный, единица измерения, процесс,
 сокращение и т.п.). Для выбора нужного используется все та же
 левая кнопка мыши, причем ее нажатие включает (появляется плюс)
 либо выключает (плюс пропадает) выбранный пункт. Две специальные
 рамки выделены для указания условного номера склонения слова - в
 единственном и мно\-жес\-твен\-ном числе. После выбора такой рамки появляется
 соответствующий диа\-ло\-го\-вый блок, рамки которого соответствуют
 отдельным вариантам склонения. Факти\-чес\-ки под склонением здесь
 понимается просто набор окончаний слова в различных падежах.
 Нужное выбирается левой кнопкой мыши, затем происходит
 возвращение (нажатие правой кнопки мыши) к тому диалоговому блоку,
 в котором перечислялись части речи, и здесь нажимается "Insert".
 Результатом является появление оттранс\-ли\-ро\-ванных приемов ряда
 простейших справочников (прежде всего справочника "слово") для
 нового слова, причем эти приемы зарегистрированы в разделе "Сло\-варь"
 \ базы приемов.

 Заметим, что вход в интерфейс редактирования внешнего словаря
 может про\-ис\-хо\-дить автоматически - если при чтении текста встретилось
 незнакомое слово, то чтение обрывается, происходит переключение на
 указанный интерфейс, и новое слово прорисовывается в окне "Слово".

 Войти в начальный фрагмент программы интерфейса работы с внешним
 словарем можно через пункт "Общий интерфейс - Операции с внешним
 словарем - Исходная точка" \ оглавления программ. Здесь х9 =
 "легковидеть". Переменной х9 переприсва\-и\-ва\-ет\-ся в качестве
 значения переменная с номером 1 - впоследствии значением х9
 будет тот логический символ, который используется в качестве кода
 словарного фрагмента. Затем идет оператор "повторение", к
 которому будут происходить откаты при повторных запросах команд
 блоком диалога. Оператор "началодиалога(над\-фраг\-мент 1 х10)"
 выполняет фоновую прорисовку блока диалога и создает структуру
 данных х10 для дальнейшего диалога. Если х9 - не переменная, то
 далее выполняется прорисовка логического символа х9 в окне
 "Логический символ" \ (оператор "или(пе\-ре\-мен\-ная(х9)рис(х10
 $\ldots$))"). После оператора "ветвь 2" \ расположен фрагмент,
 ис\-поль\-зуемый в тех случаях, когда при чтении текстовой задачи
 встретилось незна\-ко\-мое слово. Комментарий (анализслова $N_1$
 $N_2$) к посылкам исходной задачи хранит смещения $N_1,N_2$ в
 массиве текстов начала и конца отрезка, содержащего такое слово.
 Происходит извлечение слова в буфер текстов начиная с позиции
 х13, закрепленной за рамкой "Слово" \ данного блока диалога,
 прорисовка его в этой рамке и обращение к текстовому редактору
 для коррекции слова (отбрасывания суффиксов и окончания). По
 окончании редактирования результат (пока никак не зарегистрированный)
 ос\-та\-ет\-ся в буфере текстов начиная с позиции х13. Далее - переход
 через оператор "ветвь 2".

 Здесь размещается оператор "повторение", к которому будут
 происходить откаты при повторных запросах обращения к блоку
 диалога. За ним следует оператор "аль\-тер\-на\-тива(Входит(анализслова
 комментариипосылок(х1))и(равно(х11 усмчисло)$\ldots$)\\ диалог(х10 х11))".
 Этот оператор обращается к запросу команды х11 диалога либо (если
 при чтении текста встретилось незнакомое слово, которое уже
 перенесено в буфер текстов) сразу полагает х11 равным символу "усмчисло",
 т.е. метке рамки "Слово". Далее идет цепочка обработки вариантов команды
 х11:

  а) х11 = "стоп" \ (нажатие клавиш "Esc" \ либо "End" \ либо
  "курсор влево"). Тогда происходит внутренний перезапуск.

  б) х11 = "усмчисло" \ (обращение к рамке "Слово"). В структуре
  данных диалога х10 находится элемент (текстредактор усмчисло
  $N$), определяющий позицию $N$ бу\-фе\-ра текстов, начиная с которой
  размещается словарный фрагмент. Находится позиция х14 конца
  этого фрагмента в буфере текстов. Если словарный фрагмент $F$,
  рас\-по\-ло\-жен\-ный между $N$ и х14, является началом некоторого ранее
  сохраненного во внешнем словаре фрагмента, то накопитель х15
  заполняется не более чем 10 первыми логическими символами,
  кодирующими словарные фрагменты, следующие в лек\-си\-ко\-гра\-фи\-ческом
  порядке за $F$. Затем - переход через "ветвь 2".

  Переменной х16 присваивается 0 - она будет хранить номер текущей
  строки в рамке "Фрагмент словаря". Из х15 последовательно
  извлекаются символы х17; на очередной строке прорисовывается
  сначала кодируемый этим символом словарный фрагмент, а затем в
  скобках (символы "соединение","учеткоманды" \ суть коды
  от\-кры\-вающей и закрывающей скобок) - сам логический символ.
  Заметим, что оператор "видео(терм $\ldots$)" имеет совпадающие
  указатели цвета и фона символов, т.е. он лишь заносит буквы
  названия логического символа в буфер текстов, не выполняя на
  экране никакой прорисовки. Эту прорисовку будет выполнять
  оператор "рис(х10 1 набор(\\ текстредактор 0 х21 х16))"; здесь 1 -
  метка рамки "Фрагмент словаря". По завер\-ше\-нии прорисовки данных
  о символах набора х15 - переход через "иначе 1".

  Выполняется поиск логического символа х17, кодирующего словарный
  фрагмент $F$. Если такой символ найден, причем рамка "Логический
  символ" \ пока пуста, то он прорисовывается в данной рамке.

  в) х11 = "минимум" \ (обращение к рамке "Логический символ").
  Содержи\-мое данной рамки отображается элементом (новыйсимвол
  минимум $S$) структуры дан\-ных х10. Вначале $S$ - переменная, а
  при обращении к рамке (обрабатываемом внутри оператора
  "диалог(х10 х11)") происходит замена $S$ на введенный текстовым
  ре\-дак\-то\-ром логический символ. Более того, при вводе нового
  названия внутри рамки, снабженной элементом (новыйсимвол
  $\ldots$), оператор "диалог($\ldots$)" создает новый ло\-ги\-ческий
  символ с таким названием. Поэтому рассматриваемая ветвь
  программы лишь комментирует уже введенный символ $S$ (т.е. х13).
  Переменной х9 переприсва\-ива\-ется значение х13, после чего
  расчищается прямоугольная рамка с меткой 2, расположенная
  непосредственно под рамкой "Логический символ", но скрытая (ее
  границы имеют цвет, совпадающий с цветом фона). В этой рамке
  прорисовывается информация об использовании символа $S$ в
  качестве кода словарного фрагмента. Если удается найти такой
  фрагмент $F$ (оператор "внешсловарь(значение х13 $\ldots$)" \
  истинен, то в рамке "2" \ прорисовывается текст: "За логическим
  символом закреплено слово: $F$". Иначе прорисовывается текст "С
  логическим символом не связано слово".

  г) х11 = "внешдизъюнкция" \ (Обращение к рамке "Ввести").
  Определяется логи\-чес\-кий символ х14, введенный в рамке
  "Логический символ". Если он еще не имел программы, то создается
  простейшая его программа, состоящая из единственного оператора
  "продолжение". Это делается для того, чтобы предотвратить
  сообщения интерпретатора ЛОСа об ошибках, которые появятся,
  например, при обращениях различных справочников к несуществующей
  программе символа х14. Затем (после перехода по "ветвь 2")
  находятся начало х15 и конец х19 словарного фрагмента в буфере
  текстов, и оператор "внешсловарь(запись х14 х15 х19)" \
  регистрирует х14 в качестве кода данного фрагмента.

  д) х11 = "модули" \ (Клавиша Ctr-Del). Происходит удаление
  словарного фрагмен\-та, закрепленного за логическим символом,
  введенным в рамке "Логический символ". Если отсутствовала
  программа этого символа, то удаляется и он сам.

  е) х11 = "обл" \ (клавиша пробела). Расчистка рамок при переходе
  ко вводу оче\-ред\-ного словарного фрагмента. Указатель
  логического символа (новыйсимвол минимум $S$) тоже расчищается -
  $S$ заменяется на символ переменной.

  ж) х11 = "частичныйответ" \ (Обращение к рамке "Сведения о
  слове"). Здесь реализуется создание программ справочников
  "слово", "симв", "падеж", "Падеж", обслуживающих логический
  символ - код словарного фрагмента и отображение ранее
  созданных таких программ. Вообще говоря, эти программы
  можно создавать не\-по\-сред\-ственно через редактор ГЕНОЛОГа,
  однако данный интерфейс упрощает и ускоряет их создание.
  Прежде всего определяется символ х13
  и контролируется наличие его программы (при отсутствии -
  вводится простейшая программа "про\-дол\-же\-ние"). Далее (переход
  через "ветвь 1") накопитель х14 заполняется парами (слово $R$),
  (симв $R$) для ненулевых результатов $R$ обращения к
  справочникам "слово", "симв" \ на символе х13. После этого -
  переход через "ветвь 1".

  Здесь инициируется диалог для указания части речи, к которой
  относится рас\-смат\-риваемое слово. После прорисовки оператором
  "рис(х15 слово набор(логсимвол х13))" \ в верхней рамке
  логического символа, кодирующего слово, определяется метка х16
  той рамки, в которой должен быть прорисован знак "плюс". Такие
  скрытые рамки располагаются справа от рамок, в которых
  прорисованы названия частей речи. После прорисовки плюса (если
  на основании информации, имеющейся в накопителе х14, не удается
  определить часть речи, то плюс не прорисовывается) - переход
  через "ветвь 1", где оператор "диалог(х15 х16)" \ запрашивает
  очередную команду х16. Типы выполняемых команд таковы:

  1) х16 = "стоп" \ - откат к внешнему диалогу.

  2) х16 = "1" \ (выбор рамки "Имя существительное").
  Инициализируется диалог для характеризации имени существительного.
  Сначала на основе информации из х14 расставляются плюсы справа от
  тех рамок, которые относятся к данному случаю. Кроме того, справа
  от рамок "Склонение в единств. числе" \ и "Склонение во множеств.
  числе" \ указываются номера соответствующих склонений. После
  этого - обращение к оператору "диалог(х17 х18)", запрашивающему
  команду внутри текущего диалога. Большинство этих команд
  сводятся к выбору либо исключению характеристики сло\-ва,
  указанной в соответствующей рамке; при выборе справа от рамки
  возникает "плюс", при исключении (повторный выбор рамки) - этот
  "плюс" \ исчезает. При этом корректируется список
  характеризующих слово логических символов из накопителя х14.
  Лишь в двух случаях - х18 = "4" \ и х18 = "двенадцать" \ -
  происходит дальнейшее углубление в блоки диалога; на этот раз
  для определения номера склонения в един\-ствен\-ном либо во
  множественном числе (элементы (падеж $N$) и (Падеж $N$) из х14).
  Здесь принцип обработки команды тот же - прорисовка либо исключение
  "плюса" \ и коррекция накопителя х14.

 3) х16 = "2" \ (рамка "Глагол"). Здесь характеризация выполняется
 также от\-дель\-ным диалогом, который пока сводится к выбору одного
 из двух пунктов - "действие" \ либо "отношение".

 4) х16 = "внешдизъюнкция" \ (рамка "Ввести", клавиша "Insert").
 Из накопителя х14 извлекается сначала набор х18 характеризующих
 текущее слово логических сим\-во\-лов, который должен выдаваться по
 кодирующему данное слово логическому сим\-волу х13 справочником
 "слово". Если приема этого справочника еще не было, то он
 создается, иначе - корректируется. Аналогичным образом создаются
 либо кор\-рек\-ти\-ру\-ются приемы справочников "падеж", "Падеж"
 (единств. и множеств. числа).

 \subsection{Обращение к оглавлению базы теорем}

 Обращение к базе теорем соответствует случаю х9 = "заменагруппы";
 войти в данный фрагмент программы можно через пункт "База теорем
 - Обращение к базе теорем из главного меню" \ оглавления
 программ. Прежде всего, проверяется наличие шестого
 информационного блока (в нем хранится база теорем); если его не
 было, то он вводится и инициализируется его корневой указатель -
 каталог. Далее - переход через "ветвь 2". Здесь шестой
 информационный блок активизируется и определяется ссылка х10 на
 корень оглавления базы теорем. Сначала переменной х10
 присваивает\-ся 0, затем проверяется наличие переходов
 "оглавление", "теорема" \ от корнево\-го указателя-каталога к корню
 оглавления; если таких переходов не было, то они создаются.
 После определения х10 - переход через "ветвь 1".

 В начале нового фрагмента располагается оператор "повторение", к
 которому будут происходить откаты при возвращении в оглавление
 базы теорем из просмотра очередной теоремы. Оператор
 "альтернатива($\ldots$ оглавление(х10 х12))" \ реализует
 обращение к оглавлению базы теоремы и получает пару х12 ссылок на
 текстовый и логический терминалы выбранного концевого пункта
 оглавления; при наличии комментария "автоклавиатура $\ldots$" \
 к посылкам исходной задачи, указывающего на эмуляцию нажатия
 клавиши "курсор вправо", вместо обращения к оглавлению сразу
 выдается ссылка х12 на сохраненный либо специально установленный
 его концевой пункт. Заметим, что оглавление обладает "памятью",
 хранящей некоторый путь от его корня, и эта память регулярно
 используется при переключениях между оглав\-ле\-ни\-ями системы.

 Далее переменной х12 переприсваивается второй элемент пары, т.е.
 ссылка на логический терминал концевого пункта оглавления базы
 теорем, и происходит об\-ра\-ще\-ние к оператору "блоктеорем(х12)" \ -
 редактору базы теорем. Его устройство будет описано ниже в
 отдельном разделе.

 \subsection{Прочие функции главного меню}

 При х9 = "заменазнака" \ происходит обращение к просмотру списка
 всех логических символов. Хотя это делается по нажатии клавиши
 "с" \ в главном меню, процедура "главноеменю" \ заменяет код
 клавиши "с" \ на код "заменазнака" \ клавиши "С", ко\-то\-рый и
 обрабатывается данной ветвью программы. Символы прорисовываются в
 два столбца на каждой странице, по 23 символа в каждом столбце.
 Для смены страницы служат клавиши "Page Down - Page Up".

 При х9 = "стандменьше" \ (клавиша F1) происходит обращение к
 оператору "По\-мощь(0)", реализующему просмотр справочника по
 системе.

 При х9 = "Стандплюс" \ (клавиша "к", кир.) происходит обращение к
 оператору "контейнер", предназначенному для обмена информацией
 между различными вер\-си\-ями логической системы.

 При х9 = "частичныйответ" \ (клавиша "о", кир.) происходит
 обращение к хра\-ня\-ще\-му\-ся в 5-м информационном блоке оглавлению
 операторов ЛОСа. После выбора концевого пункта этого оглавления
 происходит прорисовка информации о соот\-вет\-ству\-ю\-щем логическом
 символе, извлекаемой из 3-го инф.блока.

 \section{Программа интерфейса оглав\-ле\-ний}

 Оглавления представляют собой один из наиболее распространенных в
 логической системе видов интерфейса. Они упорядочивают данные и
 позволяют инициировать различные операции над ними. Интерфейс
 оглавлений реализуется оператором "ог\-лав\-ле\-ние(х1 х2)". Он
 получает в качестве входного значения ссылку х1 на корневой
 указатель-список оглавления. Выходной переменной х2 присваивается
 пара ссылок - на текстовый терминал и на логический терминал
 выбранного концевого пункта оглавления. Структура данных,
 используемая для хранения оглавления в инфор\-ма\-ци\-он\-ном блоке,
 уже была описана выше.

 \subsection{Типы оглавлений}

 Каждое оглавление имеет свое имя (иногда называемое также типом
 оглавления). Обычно переход к оглавлению происходит от корневого
 каталога информационного блока по двум меткам - сначала по метке
 "оглавление", и далее по метке - типу оглавления. Перечислим
 типы $T$ основных оглавлений логической системы:

 \begin{enumerate}

 \item $T$ = "прием" \ - оглавление базы приемов. Оно расположено
 в 8-м информацион\-ном блоке. Концевой терминал оглавления базы
 приемов содержит набор тер\-мов "прием($A_1 A_2 A_3$)", где
 $A_1,A_2,A_3$ - стандартная ссылка на прием ГЕНОЛО\-Га, состоящая
 из логического символа $A_1$, номера $A_2$ узла статьи символа
 $A_1$, хранящего теорему приема, и заголовка приема $A_3$.
 Заголовок одного из термов "прием($\ldots$)" \ здесь может быть
 заменен на символ "текприем", для выделения текущего приема, с
 которого нужно начинать просмотр приемов данного тер\-ми\-на\-ла. Кроме
 термов "прием($\ldots$)", в терминале может встретиться терм
 "за\-ме\-чание($B_1 \ldots B_m$)", перечисляющий замечания $B_1,
 \ldots, B_m$ к данному концевому пункту оглавления, используемые
 различными работающими с базой приемов процедурами. Из
 неконцевого пункта оглавления по метке "замечание" \ может быть
 переход к логическому терминалу, хранящему замечания $B_1,
 \ldots, B_m$ ана\-ло\-гич\-ных типов.

 \item $T$ = "программа" \ - оглавление программ ЛОСа. Оно
 находится в 9-м ин\-фор\-ма\-ци\-он\-ном блоке. Концевой терминал
 оглавления программ хранит терм "про\-грам\-ма($A_1 A_2$)", где $A_1$
 - логический символ, $A_2$ - номер узла $U$ статьи символа $A_1$
 в 9-м информационном блоке, связанного с некоторым пунктом в
 программе символа $A_1$. Этот пункт выделяется в данной программе
 при помощи вспо\-мо\-га\-тель\-ного оператора "прием($A_2$)", где $A_2$ -
 последовательность цифр (вместо десятичной записи числа). По
 метке "оглавление" \ из узла $U$ - переход к ло\-ги\-чес\-кому
 терминалу, хранящему путь в оглавлении программ ЛОСа к
 рас\-смат\-ри\-ва\-емо\-му его концевому терминалу.

 \item $T$ = "заголовок" \ - справочное оглавление заголовков приемов.
 Это оглавление находится в 5-м информационном блоке, где расположены
 также многие другие справочные оглавления. Обычно концевой терминал
 справочного оглавления содержит единственный терм "прием($A_1 A_2 A_3$)".
 Здесь $A_1$ - лог.символ, $A_2$ - номер узла статьи символа
 $A_1$, от которого по метке "терм" \ имеется переход к логическому
 терминалу, хранящему тот терм $S$, который является
 вспо\-мо\-га\-тель\-ным обозначением, определяемым данным концевым
 пунктом справочного оглавления. $A_3$ - имя справочного оглавления.
 По метке "команды" \ от узла статьи лог.символа в 5-м инф.блоке
 - переход к указателю - списку, единствен\-ная метка которого - имя
 рассматриваемого оглавления - ведет к указателю - списку, от
 которого по метке "оглавление" \ - переход к лог.терминалу,
 храняще\-му путь к соответствующему концевому пункту оглавления.

 \item $T$ = "условие" \ - справочное оглавление фильтров приемов
 (5-й инф.блок).

 \item $T$ = "идентификатор" \ - справочное оглавление указателей
 приемов (5-й инф.\\ блок).

 \item $T$ = "прогрблок" \ - справочное оглавление информационных
 элементов прогр.\\ блока, используемых компилятором ГЕНОЛОГа (5-й
 инф.блок).

 \item $T$ = "Меню" \ - оглавление меню, прорисовываемых в верхней
 части экрана (1-й инф.блок). Переход к корневому указателю этого
 оглавления - от корневого указателя списка 1-го инф. блока по
 метке "Меню".

 \item $T$ = "оператор" \ - справочное оглавление операторов ЛОСа (5-й
 инф.блок).

 \item $T$ = "нормистина" \ - оглавление блоков диалога,
 используемых в логической системе. Оно размещено в 5-м инф.блоке.
 Концевой терминал оглавления со\-дер\-жит терм "прием($A_1$ $A_2$
 нормистина)", где $A_1$ - логический символ, $A_2$ - номер узла
 статьи этого символа. Этот узел хранит описание формата блока диалога,
 как это было описано выше.

 \item $T$ = "теорема" \ - оглавление базы теорем. Оно хранится в
 6-м информационном блоке. Концевой терминал оглавления содержит
 набор термов "теорема($A_1 A_2$)", где $A_1$ - логический символ,
 $A_2$ - номер узла статьи этого символа, из которого по метке
 "терм" \ - переход к логическому терминалу, содержащему теорему.
 Этот узел называем также узлом данной теоремы. Заголовок одного
 из термов "теорема($\ldots$)" может быть заменен на "нормуравн"
 \ (ранее здесь использовался символ "тектеорема", который затем
 получил другое название) - для указания на теорему, с которой
 начинается просмотр при обращении к терминалу. Терм
 "замечание($B_1 \ldots B_m$)" \ в концевом терминале оглавления
 указывает набор за\-ме\-ча\-ний $B_1, \ldots, B_m$ к концевому пункту
 оглавления. Замечания к неконцевому пункту оглавления хранятся в
 логическом терминале, к которому от указателя этого пункта
 имеется переход по метке "замечание".

 \item $T$ = "задачи" \ - оглавление задачника. Оно размещено во
 2-м информационном блоке. Концевой логический терминал оглавления
 задачника содержит терм "задача($A_1 A_2$)", где $A_1$ -
 логический символ, $A_2$ - номер узла статьи символа $A_1$,
 хранящего задачу. Как и в предыдущих случаях, для замечаний к
 концево\-му пункту оглавления могут быть использованы термы
 "замечание($\ldots$)" \ в кон\-це\-вом логическом терминале либо
 переходы по метке "замечание" \ от про\-ме\-жу\-точ\-ного указателя
 оглавления. Описание структур данных, используемых для хранения
 задач во 2-м информационном блоке, будет дано ниже в отдельной главе,
 посвященной программам интерфейса задачника.

 \item $T$ = "раздел" \ - справочное оглавление типов замечаний к разделу
 базы теорем (5-й инф.блок).

 \item $T$ = "блоктеорем" \ - справочное оглавление типов
 комментариев к теореме в базе теорем (5-й инф.блок).

 \item $T$ = "слово" \ - справочное оглавление типов комментариев
 к представлению слова либо терма фразы (5-й инф.блок).

 \item $T$ = "текстформ" \ - оглавление справочника по логической
 системе. Хранится в 7-м инф.блоке.

 \item $T$ = "контейнер" \ - оглавление контейнера (12-й
 инф.блок).

 \item $T$ = "цели" \ - оглавление типов целевых установок задач
 (2-й инф.блок).

 \item $T$ = "приемы" \ - оглавление типов установок на синтез
 приема (5-й инф.блок).

 \end{enumerate}


 \subsection{Инициализация обращения к оглавлению}

 В этом и следующих подразделах будет рассматриваться программа
 оператора "ог\-лав\-ление(х1 х2)". Основные ее точки выделены в
 оглавлении программ, в подразделе "Интерфейс оглавлений". Еще раз
 напомним, что при обращении к программе оп\-ре\-де\-лено значение
 переменной х1 - ссылка на корневой указатель-список оглавления.
 При чтении целесообразно находить редактором программ ЛОСа
 соответствующие фрагменты программы "оглавление".

 Оператор "равно(х3 пустоеслово)" \ инициализирует стэк х3 ссылок
 на узлы те\-ку\-щего пути в оглавлении. В нем будут сохраняться пары
 (ссылка на указатель оглавления - метка выхода из этого указателя
 вдоль текущего пути). Начало пути соответствует концу списка х3.
 Инициализируется также ссылка х4 на текущее меню оглавления.
 Следующий оператор "или($\ldots$ сборкаменю(набор(7)))" \
 проверяет, нужно ли будет прорисовывать оглавление, и если нужно,
 то прорисовывает в верхней части экрана вспомогательное меню операций
 оглавления.

 Далее идут различные процедуры, проверяющие наличие специальных
 ком\-мен\-тариев к посылкам исходной задачи, указывающих на
 необходимость переустановки пути в оглавлении для выхода в
 просмотр нужных объектов. Прежде всего (после оператора "ветвь
 2") проверяется наличие комментария (теорема $A_1 A_2 A_3$),
 ис\-поль\-зуемого для перехода от просмотра приема к просмотру той
 теоремы в базе теорем, которая является его источником. Если он
 есть, и $A_3$ не равно 0 (что означает наличие теоремы - источника
 приема), то $A_3$ есть одноэлементый набор, состоящий из терма
 "теорема($B_1 B_2$)", ссылающегося на теорему. Оператор
 "адресузла($\ldots$ х8)" \ определяет ссылку х8 на узел теоремы в
 6-м информационном блоке (где хранится база теорем). Переходя от
 х8 по метке "оглавление" \ к логическому терминалу и определяя
 его содержимое х10, получаем путь в оглавлении базы теорем к
 нужному концевому пункту. Используя оператор "путьвоглавлении($\ldots$)",
 переустанавливаем текущий путь согласно х10. Теперь при входе в
 оглавление сразу же будем попадать в данный концевой пункт. Однако, он
 может относиться сразу к нескольким различным теоремам. Поэтому нужно
 еще уточнить, какая из них является "текущей". Для этого считываем
 содержимое х12 выбранного концевого логического терминала
 оглавления. Если в нем уже была выбрана текущая теорема - ссылка
 вида "нормуравн($\ldots$)", - то отменяем выбор, заменяя заголовок
 ссылки на "теорема". Затем находим ссылку на нужную теорему (то есть
 указанный выше терм "теорема($B_1 B_2$)"), и заменяем ее
 заголовок на "нормуравн". В заключение, разумеется, изменяем
 содержимое кон\-це\-во\-го логического терминала оглавления в
 соответствии с указанными выше из\-ме\-не\-ни\-ями в его копии, считанной
 в зону задач. Переходя далее по "ветвь 3", вводим комментарий
 (автоклавиатура $\ldots$), эмулирующий нажатие клавиши "курсор
 вправо". Дальнейшие действия программы "оглавление" \ теперь
 обеспечат выбор нужного концевого пункта и немедленную выдачу
 ссылки на него, а следующая за программой "оглавление" \
 программа редактора базы теорем прорисует нужную теорему из спис\-ка
 теорем, отнесенных к данному концевому пункту оглавления. Описанная
 процеду\-ра переключения ссылки на заданный текущий объект заданного
 концевого пунк\-та оглавления является стандартной и применяется в самых
 различных ситуациях.

 Возвращаясь в корневой фрагмент программы "оглавление", переходим
 далее через "ветвь 2" \ и попадаем в фрагмент, начинающийся с
 операторов "ветвь 1 ис\-ход\-на\-яза\-дача(х5)". Здесь размещаются ветви
 программы, которые обеспечивают смену текущего кон\-це\-во\-го пункта
 оглавления в различных циклических процедурах (се\-рий\-ный запуск решения
 задач, тестирование вывода теорем, и т.п.).

 Если исходная задача х5 имеет комментарий "задачи", указывающий
 на наличие цикла решения задач из некоторого раздела задачника,
 то оператор "Текзадача(х7 х8 х9)" \ определяет набор х7
 ссылок на указатели оглавления задачника, относящиеся к текущему
 пути в этом оглавлении, набор х8 меток перехода из этих
 указателей и ссылку х9 на корневой указатель того раздела
 задачника, в котором предпринимается цикл решения. Метка перехода
 от указателя - конца набора х7 - к концевому ло\-ги\-чес\-ко\-му терминалу
 оглавления, хранящему ссылку на текущую задачу, расположена в конце набора х8.
 Используя эту информацию, далее ищем по принципу "сначала
 вглубь" \ очередной концевой логический терминал в дереве
 оглавления. Если это удается сделать, то после перехода через
 оператор "иначе 5" \ выдаем ссылку х11 на найденный терминал.
 Если же в процессе поиска доходим до корневого указателя раздела,
 в котором реализуется цикл решений (см. оператор "равно(х9 конец(х7))"
 \ в фрагменте, к которому переходим через оператор "иначе 4"), то
 отменяем режим серийного решения (удаляем комментарий "задачи" \ и
 заменяем содержимое ло\-ги\-чес\-ко\-го терминала "метка" \ 2-го
 информационного блока на "задачи(0)"). Заметим, что комментарий
 "задачи" \ не обязательно указывает на серийный режим решения.
 Если он сопровождается комментарием "элементызадачи", то
 происходит откат к просмотру исходного условия задачи по
 окончании ее решения в обычном режиме. В этом случае - переход
 через оператор "иначе 3", удаление комментария "задачи", ввод
 комментария (автоклавиатура $\ldots$), эмулирующего нажатие
 клавиши "кур\-сор вправо", и выдача ссылки на тот концевой терминал
 оглавления, к которому отно\-си\-лась решавшаяся задача.

 Аналогичным образом осуществляется смена текущего приема либо
 теоремы в циклах тестирования процедур генератора приемов
 (комментарии "подраздел" \ и "команды").

 Переходя через оператор "ветвь 1", расположенный перед оператором
 "исход\-на\-яза\-дача(х5)", попадаем в начинающийся с оператора "повторение"
 \ фрагмент, кото\-рый осуществляет продвижение вглубь оглавления в
 соответствии с указателями на выделенный в нем текущий путь. Напомним,
 что изначально переменной х4 присво\-ена ссылка на корень оглавления.
 Логический терминал, достижимый из х4 по метке "позиция",
 содержит терм "число($i j$)", где $i$ - символьный номер перехода для
 те\-ку\-ще\-го пути. Переходим из х4 по метке $i$ (оператор
 "указатель(список х4 х8 х9)"). Если переместились в
 указатель-список, то ссылку на него переприсваиваем переменной
 х4, пополняем стэк х3 парой для перехода от старого указателя х4
 к новому, и откатываемся к оператору "повторение". Если
 переместились в логический терминал, хранящий терм "логсимвол($p
 q$)", то имеет место переход к отрезанной ветви оглав\-ле\-ния. Ее
 корень достижим из корня информационного блока по меткам $p,q$.
 Пере\-при\-сва\-иваем переменной х4 ссылку на данный корень, пополняем
 стэк х3 и тоже окатываемся к "повторение". Наконец, по достижении
 концевого пункта оглавления переходим через оператор "ветвь 1".

 Здесь начинается прорисовка текущего меню оглавления. После
 оператора "по\-вто\-ре\-ние", к которому будут выполняться откаты для
 перерисовки этого меню, рас\-по\-ло\-жена контрольная точка "прием(4
 5)", к которой можно перейти непосред\-ствен\-но из пункта "Интерфейс
 оглавлений - Начало цикла прорисовки текущего меню" \\ оглавления
 программ.

 Прежде всего, инициализируется пустым набором накопитель х5 структур
 дан\-ных, необходимых для прорисовки меню. Этот накопитель будет
 представлять собой набор $(A_1, \ldots, A_n)$ элементов,
 характеризующих отображенные на экране и предшест\-ву\-ю\-щие им пункты меню.
 Каждое $A_i$ имеет вид $(B_1 B_2 B_3 B_4 B_5)$, где $B_1$ - метка
 пе\-ре\-хо\-да к объекту $i$ - го пункта меню; $B_2$ - ссылка на
 текстовый терминал этого пункта; $B_3$ - ссылка на объект,
 переход к которому осуществляется через данный пункт меню; $B_4$
 - переменная, если пункт предшествует группе пунктов,
 отображенных на экране, либо пара (символьный номер строки, с которой
 выдается текст данного пункта - номер строки, на которой этот
 текст заканчивается); $B_5$ - 0, если $i$ - й пункт меню
 ссылается на подменю, и 1, если он является концевым.

 Здесь же инициализируются единицами номер х6 текущего пункта
 отображаемого меню и номер х7 пункта, с которого начинается
 прорисовка на экране. Далее рас\-чи\-ща\-ется экран и уточняются
 значения х6,х7. Для этого определяется терм "число($i j$)",
 хранящийся в логическом терминале "позиция" \ указателя х4.
 Проверяется, что $(i,j)\\ \ne (0,0)$, и х6 переприсваивается значение
 $i$ при $i \ne 0$ и $j$ в противном случае. Аналогично, если $j \ne
 0$, то х7 переприсваивается значение $j$, иначе - $i$. После уточ\-не\-ния
 х6,х7 содержимое логического терминала "позиция" \ заменяется на
 "число(0 0)", т.е. ссылка на теку\-щий пункт меню сбрасывается.
 Далее - переход через "ветвь 1".

 В начале цикла прорисовки пунктов меню значение х8, которое будет
 пред\-став\-лять собой номер текущего обрабатываемого пункта меню,
 инициализируется еди\-ни\-цей, а х9 (номер первой свободной строки на
 экране - нулем). Далее идет оператор "повторение", к которому будут
 происходить откаты при дорисовке пунктов в нижней части экрана,
 высвободившейся из-за прокрутки. Проверяется отсутствие ком\-мен\-та\-рия,
 эмулирующего нажатие клавиши "ш" \ - в этом случае
 прорисовка оглав\-ле\-ния не нужна. Собственно цикл
 прорисовки начинается после оператора "по\-вто\-ре\-ние".
 Находится переход из указателя х4 текущего меню по
 метке х8. Если он ведет к концевому пункту оглавления, то х12
 присваивается 1, иначе - 0. Далее проверяется наличие комментария
 "заголовокприема" \ - такой комментарий вводится в специальных
 случаях просмотра ветви оглавления программ, обслуживающей ге\-не\-ра\-тор
 приемов. Здесь блокируются некоторые переходы, и х12 изменяется на
 1 там, где эти переходы нужно сделать "невидимыми". Затем - переход
 через "ветвь 4".

 Формируется набор х13 для последующего занесения в накопитель х5.
 Если пункт с номером х8 не должен быть прорисован на экране (х8
 меньше номера х7, с которого начинается прорисовка), то х13
 заносится в х5, и переход к очередному пункту. Иначе - переход
 через "иначе 1". Здесь предпринимается считывание из файла текста
 текущего пункта меню (он размещается в буфере текстов с позиции 0
 по х14); при считывании устанавливается нужный цвет символов.
 Для обычного пункта он чер\-ный, для текущего - голубой, для
 занесенного в буфер - красный (если одновременно пункт - текущий) либо
 малиновый. Далее прорисовывается номер пункта; в случае концевого
 пункта после него ставится точка, иначе закрывающая скобка.
 Пред\-при\-ни\-ма\-ется обращение к оператору "видео(прямоугольник обл х9
 прогртерм разныеточки 0)", который определяет рамку с заданным
 отступлением от левого края для про\-ри\-сов\-ки текста пункта, и
 оператор "видео(слово обл х9 0 х14 х17)" \ выполняет эту
 прорисовку. Затем находится текущая позиция (х18,х19) курсора
 после прорисовки текста, и вычисляется последняя занятая строка х20.
 Если она достаточно близка к нижнему краю экрана, то происходит
 откат через "ветвь 1" \ к оператору, за\-кра\-ши\-ва\-ющему белым фоном
 рамку пункта (считается, что пункт не поместился на экране), и
 цикл прорисовки меню завершается. Иначе - в наборе х13
 указываются первая и последняя строки, занятые пунктом, этот
 набор регистрируется в накопителе х5, корректируется номер х9
 первой свободной строки (х20 увеличивается на 19), и
 переход к очередному пункту.

 По завершении цикла прорисовки - переход через "иначе 3", идущее
 после опе\-ра\-тора "указатель(список х4 х8 х10)". Если пункт с
 номером х6, который изначально был определен как текущий, не
 поместился на экране, то здесь х6 переприсваивается номер
 последнего прорисованного пункта. Затем - выход во внешний
 фрагмент, и из него - переход через оператор "ветвь 1".

 Здесь, после контрольной точки "прием(4 6)", происходит изменение
 цвета того пункта текущего меню, который был выбран в качестве
 текущего. Его выполняет большой оператор "или($\ldots$)".
 К этой точке будут происходить откаты при смене текущего пункта
 меню. Далее расположен оператор "повторение", и за ним - оператор
 "автоменю(х10)", запрашивающий команду для работы с оглавлением.

\subsection{Обработка команд интерфейса оглавления}

Перечислим действия обработчика команд в зависимости от текущей
команды х10. Начальные точки соответствующих фрагментов программы
легко находятся при перемещении вдоль "главного ствола" \ вглубь
от оператора "автоменю(х10)". К боль\-шин\-ству из них можно выйти
непосредственно из оглавления программ (ветвь пунк\-та "Интерфейс
оглавлений - обработчик команд").

\subsubsection{Перемещение по оглавлению}

Если х10 - "циклвариантов" \ либо "Плюс" \ (клавиши "курсор влево"
\ либо Esc), то происходит возвращение в надменю оглавления, а для
корневого меню (что со\-от\-вет\-ству\-ет пустому накопителю х3) -
выход из оглавления. При возвращении в надменю х4 присваивается
первый элемент первого набора накопителя х3, отбрасывается
на\-ча\-ло накопителя х3, и откат к перерисовке надменю. Особо
учтен случай коммента\-рия "заголовокприема" \ к посылкам исходной
задачи: здесь блокируется выход из корневого меню той ветви
оглавления программ, которая соответствует клас\-си\-фи\-кации
типов приемов (используется в генераторе приемов).

Для перехода к новому текущему пункту оглавления предусмотрены
следу\-ю\-щие возможности: х10 = "внешсумма" \ (клавиша "курсор
вверх") - переход к предыду\-ще\-му пункту; х10 = "подстановка" \
(клавиша "курсор вниз") - переход к следующему пункту; х10 =
"символтеоремы" \ (клавиша "Ctr - курсор вниз") - переход к
нижнему из прорисованных на экране пунктов; х10 - символ от
"префиксныйфильтр" \ до "мнимаяединица" \ (клавиши - цифры от 0 до
9) - переход к первому из прорисованных на экране пунктов, номер
которого заканчивается на данную цифру. При нажатии любой из
перечисленных клавиш прежде всего проверяется существование
искомого пункта оглавления: если нужно сдвинуться к предыдущему
пункту, то проверяется, что х6 больше 1, если нужно перейти к
следующему, то проверяется, что из текущего указателя х4 имеется
переход по метке х6+1, и т.п. Эти проверки реализуются
опе\-ра\-то\-ром "альтернатива(равно(х10 внушсумма) $\ldots$)".
Если результат проверки от\-ри\-ца\-тель\-ный (переход через
"иначе 2"), то в случае клавиши "курсор вниз" \ происходит сдвиг
вверх прорисованных на экране пунктов оглавления (верхний пункт
пропадает, а следующий за ним становится верхним). Если же
результат проверки поло\-жи\-тель\-ный, то переход по "ветвь 3".

Здесь прежде всего происходит перекраска текущего пункта, который
получает цвет обычного пункта (оператор "длялюбого(х11 х12 х13 х14
$\ldots$)"). Далее рас\-смат\-ри\-ва\-ются отдельные случаи для
команды х10:

 а) х10 соответствует нажатию клавиш "курсор вверх" \ либо
 "курсор вниз". Оп\-ре\-де\-ля\-ется номер х11 нового пункта. Если нажата
 клавиша "курсор вверх" \ и экран пустой (4-й элемент последнего
 набора накопителя х5 является переменной, так как все предыдущие
 пункты при прокрутке убраны с экрана), то х11 воспроизводит
 номер х6 последнего из сдвинутых вверх пунктов. При непустом
 экране х11 получает\-ся из х6 изменением на единицу. Если пункт с
 номером х11 прорисован на экране (находится набор х12 накопителя
 х5, соответствующий этому пункту, и проверяется, что его
 четвертый элемент отличен от переменной "х1"), то переменной х6
 перепри\-сва\-и\-ва\-ет\-ся значение х11 и реализуется откат к изменению
 цвета нового текущего пункта. Если новый пункт еще не прорисован
 на экране, то переход через "иначе 2".

 Здесь происходит разветвление: при обработке команды "курсор
 вниз" \ - переход через "иначе 1"; в оставшейся части данного
 фрагмента обрабатывается случай "кур\-сор вверх". В накопителе х5
 находится набор х13 с номером х11. Соответствующий пункт не
 прорисован на экране, но должен появиться в верхней части экрана
 при выполнении данной команды. Оператор "файл(набор $\ldots$)" \
 считывает текст пункта в буфер текстов. Длина (х14+1) этого
 текста делится на ширину экрана, и таким образом находится число
 х17 строк, которые будет занимать текст. Высота х21 этих строк в
 пикселях получается умножением х17 на 19.  Если для прорисовки
 нового текста в верхней части экрана не нужно отбрасывать нижние
 прорисованные пункты (под ними достаточно пусто места, либо экран
 вообще пуст), то переход через "иначе 2". В противном случае
 определяется вхождение х19 в набор х5 последнего ос\-та\-ю\-ще\-го\-ся на
 экране пункта; набор х5 заменяется на свой начальный отрезок вплоть до
 вхождения х19 и предпринимается коррекция в нем номеров строк (к ним
 при\-бав\-ля\-ет\-ся х21). В х5 указываются номера первой и последней строк
 для верхнего пункта (оператор "изменение(окрестность(х13 3)$\ldots$)").
 Затем изображение сдвигается вниз на х21 пикселей; х6 и х7
 устанавливаются на номер х11 верхнего пункта, и откат к
 перерисовке текущего пункта. Аналогичные действия (но без
 отбрасывания конца набора х5) выполняются в случае перехода через
 "иначе 2".

 Обработка случая "курсор вниз" \ начинается с того, что находится
 переход из текущего указателя х4 по метке х11 к новому пункту
 оглавления. Переменной х14 присваивается указатель типа этого
 пункта (1 - концевой, 0 - промежуточный). Текст пункта должен быть
 прорисован в нижней части экрана. Создается набор х15, соответствующий
 этому пункту, который впоследствии будет занесен в накопитель х5.
 Так как пункт пока не прорисован, в х15 вместо номеров его первой
 и последней строк указана переменная "х1". Текст пункта
 считывается в буфер текстов и оп\-ре\-де\-ля\-ют\-ся число х19 его строк, а
 также высота х20 в пикселях. Просматриваются вхождения х21 в
 набор х5, вплоть до обнаружения такого пункта х22, который
 кончается строкой, не меньшей х20. В нем и предшествующих пунктах
 вместо ука\-за\-те\-лей строк проставляются переменные (эти пункты
 выносятся за рамки экрана). Предпринимается сдвиг изображения
 вверх, при котором в верхней части экрана будет прорисован первый
 пункт, следующий за х22 (оператор "видео(спуск $\ldots$)").
 Корректируются номера строк в наборе х5 для оставшихся на экране
 пунктов. В наборе х15 проставляются номера строк для нового
 пункта. Номер х6 текущего пункта устанавливается на х11,
 корректируется номер х7 пункта в верхней части экрана. К концу
 набора х5 присоединяется набор х15. Номер х8 очередного счи\-ты\-ва\-е\-мого
 из файла пункта и номер х9 первой свободной строки устанавливаются на
 дорисовку пунктов в нижней части экрана (если после нового пункта
 остается достаточно места для нескольких других пунктов), и откат
 к дорисовке.

 б) х10 соответствует нажатию клавиши "Ctr-курсор вниз".
 Происходит просмотр набора х5 и передача переменной х6 номеров тех
 пунктов, которые прорисованы на экране. В результате х6
 становится равно номеру последнего такого пункта. Далее - откат
 к перекраске текущего пункта.

 в) х10 соответствует нажатию цифровой клавиши. Набор х5 просматривается
 до обнаружения первого прорисованного на экране пункта,
 ппоследняя цифра номера х12 которого равна номеру нажатой
 клавиши. Переменной х6 присваивается номер такого пункта, и откат
 к его перекраске.


 Вход в подменю оглавления либо выбор концевого пункта
 осуществляются при х10 = "внешконъюнкция" \ (клавиша "курсор
 вправо") либо х10 = "тринадцать" \ (клавиша Enter). Прежде всего,
 здесь происходит сохранение в логическом терминале "позиция" \
 указателя-списка х4 текущего меню терма "число(х6 х7)". Таким
 образом оглавление запоминает свой текущий путь. Далее в
 накопителе х5 находится список х13, соответствующий текущему
 пункту. Если пункт неконцевой, то переход по "ина\-че 2".
 В случае концевого пункта вводятся, в зависимости от контекста,
 те или иные комментарии к посылкам исходной задачи (в случае
 оглавления приемов создается комментарий "простыеделители $P$",
 где $P$ - последовательность меток текущего пути в оглавлении;
 для оглавления операторов ЛОСа вводится комментарий, эму\-ли\-ру\-ю\-щий
 нажатие клавиши "курсор вправо", и т.п.), Затем выдается
 результат - пара ссылок на текстовый и логический терминал
 выбранного концевого пункта (они извлекаются из набора х13).

 В случае неконцевого пункта - в начало стэка х3 заносится пара
 (х4 х6), ссы\-ла\-ю\-ща\-яся на пройденный указатель х4 и метку
 х6 выхода из него;
 определяется ссылка на новый указатель-список текущего меню (с учетом
 возможного разреза оглавления по данному переходу), и
 значение х4 заменяется на эту ссылку. Затем - откат к перерисовке
 меню.

 Для немедленного выхода из оглавления служит клавиша "End" \ (х10
 = "груп\-пи\-ров\-ки"). В этом случае оглавление запоминает текущие
 значения х6,х7, так что при повторном попадании в оглавление будет
 снова прорисован текущий пункт с номером х6, а первым на экране
 пунктом будет пункт с номером х7. Далее - выход из процедуры
 "оглавление" \ по истинностному значению "ложь".

 Перелистывание "страниц" \ текущего меню оглавления выполняется
 клавишами "Page Down" \ и "Page Up" \ (х10 = "точкапривязки" \ и
 х10 = "контрольунификации"). Фрагменты программы для этих команд
 располагаются в "главном стволе" \ об\-ра\-бот\-чи\-ка команд не сразу
 после перечисленных выше команд, так что для их поиска можно
 использовать оглавление программ (пункты "Интерфейс оглавлений -
 Об\-ра\-бот\-чик команд - PgDown либо PgUp").

 Начнем с команды "Page Down". Прежде всего, здесь проверяется,
 что накопитель х5 непуст и что из указателя текущего меню х4
 имеется переход по метке, на единицу большей последней метки в
 списке х5. Тогда указатели строк всех наборов накопителя х5
 заменяются на переменную "х1" \ (соответствующие пункты уходят
 вверх за рамки экрана). Экран расчищается, переменным х6 и х7
 присваивается увеличенный на единицу номер последнего пункта из
 х5. Инициализируется номер х8 текущего про\-ри\-со\-вы\-ваемого
 на экране пункта, а также номер х9 первой свободной строки
 экрана. Затем размещается оператор "повторение", к которому
 будут про\-ис\-хо\-дить откаты после
 прорисовки очередного пункта. Определяется переход по метке х8 от
 указателя х4; если этот переход ведет к промежуточному пункту, то
 переменной х13 при\-сва\-и\-ва\-ется 0, иначе 1. Создается заготовка х14
 набора для последующего занесения в накопитель х5. Дальнейшие
 действия совершенно аналогичны тем, ко\-то\-рые вы\-пол\-ня\-лись при
 исходной прорисовке меню. По завершении прорисовки - откат к
 перекраске текущего (первого сверху) пункта.

 В случае команды "Page Up" \ проверяется, что х5 непусто и что
 первый пункт накопителя х5 не прорисован на экране. Находится
 вхождение х12 в х5 последнего не прорисованного на экране пункта
 (у него вместо пары номеров первой и последней строк стоит
 переменная). Инициализируется нулем переменная х13. Она будет
 ука\-зы\-вать вхождение в х5 того набора, с которого начнется
 прорисовка. Однако, вначале она же используется в качестве
 счетчика числа строк, занятых прорисовываемыми пунктами.
 Происходит просмотр набора х5 в направлении от х12 к началу, и
 для каждого просматриваемого пункта определяется число занимаемых
 им строк. Для этого пункт сначала считывается в буфер текстов, а
 затем длина текста делится на ширину экрана. Как только число
 строк превышает допустимое, просмотр пре\-кра\-ща\-ется и переменной
 х13 переприсваивается найденное вхождение в х5. Затем - переход
 через "ветвь 2".

 Здесь происходит расчистка экрана и переменным х6, х7
 переприсваивается номер пункта по вхождению х13. Инициализируется
 нулем номер х9 первой свободной строки на экране. Затем
 начинается последовательный просмотр вхождений х14 в набор х5,
 начиная с х13. Переменной х8 переприсваивается номер пункта,
 со\-от\-вет\-ству\-ющего х14. Прорисовка пункта происходит так же, как и
 в случае "Page Down". Если в процессе прорисовки размеры экрана
 оказались исчерпаны раньше, чем закончился список х5, происходит
 отбрасывание в конце этого списка элементов, не поместившихся на
 экране. В обоих случаях далее - откат к перекраске текущего
 пункта.

 \subsubsection{Редактирование оглавления}

 Оглавление в системе совмещает функции меню и "записной книжки",
 что делает необходимыми команды изменения оглавления в процессе
 его использования.

 Для ввода нового пункта оглавления служат команды х10 =
 "Стандплюс" \ (кла\-ви\-ша "к" \ кириллицы; происходит ввод нового концевого
 пункта оглавления в конце текущего меню); х10 = "высотаполосы" \
 (клавиша "К" \ кириллицы; происходит ввод нового концевого пункта
 перед текущим выделенным пунктом меню); х10 = "филь\-тр\-квадратов" \
 (клавиша "м" \ кириллицы; происходит ввод нового пункта подменю в
 конце текущего меню); х10 = "значение" \ (клавиша "М" \
 кириллицы; происходит ввод нового пункта подменю перед текущим
 выделенным пунктом меню). В начало ветви программы,
 обрабатывающей эти команды, можно попасть из пункта "Интерфейс
 оглавлений - Обработчик команд - Ввод нового концевого пункта
 либо нового под\-раз\-де\-ла" \ оглавления программ.

 Прежде всего определяются номер х11 вставляемого пункта и номер
 х12 той строки, начиная с которой будет размещаться его текст
 (оператор "альтернатива(\\ $\ldots$)"). В случае оглавления
 задачника проверяется, что тип нового пункта (концевой либо неконцевой)
 - тот же, что у ранее введенных пунктов данного меню. При
 несовпадении этих типов выполнение операции блокируется. Это
 вызвано тем, что у оглавления задачника концевые пункты собраны в
 специальные концевые меню и соответствующие им задачи
 отображаются на экране в виде сплошной "ленты", с разделяющими
 задачи горизонтальными линиями. После выполнения проверки -
 переход через "ветвь 2".

 Проверяется, что для редактирования текста нового пункта на
 экране имеется хотя бы одна свободная строка, и выполняется
 прорисовка номера нового пункта, после которого ставится точка
 (для концевого пункта) либо скобка. Если вводится концевой пункт
 оглавления задачника, то в буфер текстов заносятся подряд три
 тире, иначе - предпринимается обращение к текстовому редактору
 для ввода текста пункта (оператор "альтернатива(и(или(равно(х10
 Стандплюс)$\ldots$)))"). При отказе от редактирования (переход
 через "иначе 1") - расчищается поле редактирования концевого
 пункта и откат к запросу команды, а для неконцевого пункта -
 откат к перерисовке меню. В случае вставки нового пункта в
 середине меню происходит увеличение на 1 номеров пунктов, начиная
 с номера х11 (оператор "указатель(плюс\-симв(х4 х11 1))"). Далее -
 переход через "ветвь 2".

 Инициализируется нулем переменная х16, которой будет впоследствии
 пере\-при\-сво\-ена ссылка на указатель-список либо логический терминал
 оглавления, вводимый для нового пункта. Если вводится новое подменю,
 то переход через "иначе 2", где создается пустой указатель-список х17
 для этого подменю. В противном случае - рассматриваются следующие
 возможности:

   а) Имеется комментарий (вставка $A_1 A_2 A_3 A_4$) к посылкам
   исходной задачи. Этот комментарий используется при переходе от
   просмотра программы к оглавлению программ для передачи
   информации о вставке контрольной точки "прием($N$)". $A_1$ -
   считанный в зону задач фрагмент программы; $A_2$ - позиция в
   нем, перед которой вставляется "прием($N$)"; $A_3$ - набор
   ссылок на надфрагменты фрагмента $A_1$; $A_4$ - логический
   символ, в программу которого входит $A_1$. Создается новый узел
   х21 статьи символа $A_4$, имеющий номер х22. Переменной х19
   присваивается терм "при\-ем($N$)", где $N$ = х22. Вводится
   логический терминал, достижимый из указателя х4 текущего меню
   по метке х11, содержащий терм "программа($A_4$ х22)". Это -
   ссылка на на узел х21 и на контрольную точку "прием($N$)" \ из
   оглавления программ. Оп\-ре\-де\-ля\-ет\-ся последовательность меток пути
   в оглавлении программ от корня к новому пункту, и эта
   последовательность сохраняется в логическом терминале, достижимом
   из х21 по метке "оглавление". Это - возвратная ссылка на пункт
   оглавления из узла х21, которая будет нужна для поиска текста
   пункта оглавления, если при трассировке программы встретится
   оператор "прием($N$)". Далее - переход через "ветвь 4", где
   происходит вставка в фрагмент программы $A_1$ оператора "прием($N$)"
   и внесение соответствующих изменений в файлы блока программы.

   б) Происходит ввод нового концевого пункта оглавления
   задачника. Тогда на\-хо\-дит\-ся номер х19 текущего шага работы
   интерпретатора ЛОСа, который используется здесь в качестве
   случайного числа. Это число делится на 1000, к остатку
   прибавляется 300, и результат рассматривается как номер того
   логического символа х22, за которым будет закреплена новая
   задача, соответствующая вводимому пункту. Вводится узел х24
   этой задачи, имеющий номер х25. В логическом терминале
   "оглавление" \ узла х24 регистрируется возвратная ссылка на
   новый пункт оглавления и вводится концевой логический терминал
   "задача(х22 х25)" \ этого пункта.

   в) Вводится концевой логический терминал нового пункта,
   содержащий терм "фикс(0)". Этот терм - стандартный указатель на
   пустой концевой пункт оглавлений.

   \par\medskip

   После рассмотрения перечисленных выше вариантов для ввода
   указателя-списка либо логического терминала, соответствующего
   новому пункту, переход через опе\-ра\-тор "ветвь 1", расположенный
   после оператора "равно(х16 0)".

   После проверки того, что х16 не равно 0, т.е является ссылкой
   на уже введенный новый объект оглавления, вводится текстовый
   терминал, сопровождающий этот объ\-ект. Для этого используется
   текст нового пункта, ранее сформированный в буфере текстов.
   Дальнейшие действия зависят от того, вводится ли новый пункт в
   конце текущего меню или в середине. В последнем случае -
   переход через "иначе 1". В первом - определяется номер х20
   последней строки, занятой текстом введенного пункта, и к
   накопителю х5 присоединяется набор х21, описывающий этот пункт.
   Если введен новый концевой пункт оглавления задачника, то он
   запоминается в оглавлении как последний пункт текущего пути, и
   сразу же выдается результат - ссылка на новый пункт. Это
   приводит к автоматическому входу в редактор задач для набора
   условия новой задачи. В остальных случаях происходит перекраска
   ранее имевшегося текущего пункта в "обычный" \ цвет, выбор
   нового пункта в качестве текущего, и откат к его перекраске.

   Если новый пункт введен в середине меню (см. указанный выше
   переход через "иначе 1"), то он вызовет сдвиг в нумерации
   последующих пунктов меню, а при этом изменятся и
   последовательности меток, определяющие пути в оглавлении к
   различным его концевым вершинам, проходящие через данное меню
   по метке с номером, большим или равным х6. Однако, эти
   последовательности меток хранятся в качестве возвратных ссылок
   на оглавление из различных структур данных (описаний приемов,
   задач, и т.д.), на которые ссылается оглавление. Поэтому
   необходим про\-смотр таких возвратных ссылок и их коррекция. Для
   этого и служит ветвь про\-грам\-мы, начинающаяся с оператора
   "ветвьоглавления(х4 $\ldots$)". Данный оператор просматривает
   все концевые пункты оглавления, достижимые из текущего меню х4
   по путям, начинающимся с меток, больших или равных х6. Для
   текущего пункта он выдает тройку х18: (содержимое логического
   терминала концевого пункта - пара ссылок на терминалы данного
   пункта (текстовый и указанный выше логический) - набор лог.
   символов, определяющих путь к терминалу от корня оглавления).
   Про\-смат\-риваются элементы $F(S \ N)$ х19 логического терминала текущего
   конце\-во\-го пункта, ссылающегося на некоторую внешнюю по
   отношению к оглавлению структу\-ру данных - их заголовки $F$
   перечисляются в списке "задача", "текприем", "тек\-вхожд", и т.д.
   Каждый такой элемент ссылается на $N$-й узел статьи символа $S$ в
   том же информационном блоке, что и оглавление. Находится ссылка
   х21 на этот узел. Далее происходит разбор случаев по $F$,
   определяющему, где именно нужно искать возвратную ссылку на
   оглавление.

   После коррекции возвратных ссылок проверяется, не был ли введен
   концевой пункт оглавления задачника - тогда, как и выше,
   происходит выход из процедуры "оглавление". Иначе - откат к
   перерисовке меню.

   Следующая операция по редактированию оглавления - изменение
   текста текущего пункта (х10 = "числитель"; клавиша "р" \ кир.).
   Здесь определяется набор х11 на\-ко\-пи\-теля х5, соответствующий
   текущему пункту и проверяется, что этот пункт изображен на
   экране. Находится номер х13 строки, с которой начинается текст
   пункта. Затем расчищается буфер текстов; текст пункта
   считывается в буфер текстов (на позиции с 0 по х14), и
   происходит рачистка экрана вниз начиная со строки х13. После
   этого порисовывается номер редактируемого пункта,
   устанавливается рамка, необходимая для повторной прорисовки
   старого текста пункта, он прорисовывается, и пред\-при\-ни\-ма\-ется
   вход в текстовый редактор с сохранением старого текста. После
   редак\-ти\-ро\-ва\-ния происходит регистрация нового текста в файле.
   Далее (а также при отмене редактирования) - откат к перерисовке
   меню.

   Чтобы перености выбранные пункты оглавления на новое место,
   они сначала заносятся в буфер оглавления - комментарий
   (оглавление $A$) к посылкам исходной задачи. Здесь $A$ - набор
   троек (ссылка на меню оглавления, содержащее отобранный пункт -
   набор меток пути к этому меню от корня оглавления - метка
   перехода к выбранному пункту меню). Для занесения в буфер
   оглавления либо исключения из него текущего пункта служит
   команда х10 = "заменагруппы" (клавиша "б"). Если уже имелся
   комментарий (оглавление $A$), то формируется тройка х13 в
   фор\-ма\-те набора $A$, соответствующая текущему пункту. Если х13
   входит в $A$, то она исклю\-ча\-ет\-ся из $A$, иначе - заносится
   в $A$. При отсутствии буфера - он вводится с зарегистрированной
   в нем тройкой х13. Во всех перечисленных случаях далее - откат
   к перекраске текущего пункта (цвет его меняется в зависимости
   от принадлежности буферу).

   Для перенесения отобранных в буфер пунктов на новое место
   используются ко\-ман\-ды х10 = "новыесвязки" \ (клавиша "и") и
   х10 = "верхняягрань" \ (клавиша "И"). В первом случае пункты
   присоединяются к концу текущего меню, во втором - встав\-ля\-ют\-ся
   перед текущим пунктом этого меню. Порядок их - тот же, что при
   отборе в буфер. Прежде всего, находится комментарий х12
   (оглавление $A$) и проверяется, что $A$ непусто. В случае х10 =
   "новыесвязки" \ выполняется цикл просмотра меток указателя х4 и
   присвоения переменной х14 номера, на единицу большего последней из
   этих меток. Затем - переход через "ветвь 2" \ и переприсвоение
   переменной х13 номера того пункта, начиная с которого будут
   регистрироваться извлекаемые из буфера пункты.

   Далее начинается просмотр троек х15 из буфера $A$. Если вставка
   пунктов про\-ис\-хо\-дит в середине меню, то увеличиваются
   на 1 все метки указателя-списка х4, начиная с х6.
   Одновременно просматривается буфер $A$, и если в нем имелась
   ссылка на пункт меню х4 с номером, большим или равным х6, то в
   этой ссылке также происходит увеличение номера пункта на 1.
   Находятся "старые" \ указатель х16 и метка х17, по которым
   зарегистрирован пункт тройки х15, и этот пункт переклю\-ча\-ет\-ся на
   указатель-список х4, из которого он становится достижим по
   метке х14 (случай занесения в конец меню) либо х6 (занесение в
   середину меню). Такое переключение осуществляется двумя
   операторами "указатель(перестановка $\ldots$)" \ - сначала
   пе\-ре\-но\-сит\-ся основной объект пункта, а затем его текстовый
   терминал. Далее пред\-при\-ни\-ма\-ет\-ся уменьшение на 1 номеров
   перехода из указателя х16, больших или равных х17 (чтобы
   устранить пробел в нумерации, возникший после удаления перехода
   по метке х17). Пути в оглавлении, упоминаемые в накопителе х3 и в
   буфере $A$, корректируются в соответствии с этим уменьшением номеров.
   Значение х14 (в случае занесения пунктов в конец меню) либо
   значение х6 (при занесении в середину) увеличивается на
   единицу, если только не имело место перенесение пункта "вперед"
   \ из текущего меню в него же. Если через указатель-список х16
   проходил текущий путь в оглавлении, то его продолжение после
   х16 сбрасывается. Затем - откат к очередному элементу х15
   накопителя $A$. После просмотра всех таких элементов - переход
   через "иначе 1".

   После того, как пункты оглавления из буфера $A$ перенесены на новое
   место, нужно провести коррекцию обратных ссылок для оглавления.
   Для этого $A$ пре\-об\-ра\-зу\-ет\-ся в список ссылок на начала тех
   ветвей оглавления, которые требуют контроля обратных ссылок.
   Прежде всего, в начало набора $A$ заносится ссылка на переход
   из текущего меню х4 по метке х13 (с этой метки начинаются
   перенесенные в х4 пункты). Далее просматриваются имеющиеся в
   $A$ переходы из одного и того же меню. Сохраняется тот из них,
   для которого номер метки перехода меньше, а другой заменяется в
   $A$ на 0 (рассмотрение ветви первого включает в себя
   рассмотрение ветви второго). Затем - переход через "ветвь 2", где реализуется
   последовательный просмотр ненулевых элементов из $A$ и коррекция
   обратных ссылок в их ветвях. Это делается точно так же, как и в
   случае ввода нового пункта оглавления (см. выше) - с помощью оператора
   "ветвьоглавления($\ldots$)", перечисляющего концевые пункты
   оглавления, достижимые из данного подменю по путям, начинающимся
   с метки, большей или равной заданной. После коррекции обратных
   ссылок - откат к перерисовке текущего меню.

   Для удаления текущего пункта оглавления служит команда х10 =
   "модули" \ (клавиша Ctr-Del). Прежде всего, в накопителе х5
   находится набор х11, описыва\-ю\-щий текущий пункт, и проверяется,
   что этот пункт прорисован на экране. Затем находится объект, к
   которому от указателя-списка х4 имеется переход по текущей
   метке х6. Если этот объект - указатель-список, из которого
   имеется переход по метке 1 (т.е. его подменю непусто), то
   удаление пункта блокируется (откат через оператор "ветвь 2",
   продолжающий действия по удалению пункта). Аналогичная
   блокировка производится, если найденный объект - логический
   терминал, по которому проходит разрез оглавления, а продолжение
   оглавления после разреза непусто. Если же най\-ден\-ный объект - концевой
   пункт оглавления, то предпринимаются действия по уда\-ле\-нию
   прямых и обратных ссылок, связанных с данным пунктом. Это
   выполняется начиная с фрагмента, к которому от исходного
   фрагмента (содержащего оператор "равно(х10 модули)") имеются
   переходы через операторы "иначе 3" \ и "иначе 1".

   Прежде всего, находится комментарий х17 (вид $T$) к исходной
   задаче, опре\-де\-ля\-ю\-щий тип $T$ рассматриваемого оглавления.
   Здесь рассматриваются следующие случаи:

   а) Оглавление базы теорем либо базы приемов. Проверяется,
   что концевой пункт не ссылается на какую-либо теорему либо на
   прием, не исключенный из базы приемов. Если это не так, то
   удаление отменяется, иначе - продолжение действий по удалению
   пункта (в этом и последующих случаях дальнейшие действия по
   удалению происхо\-дят в ветви программы, к которой от исходного
   фрагмента обработки данной коман\-ды имеется переход через "ветвь
   2").


   б) Оглавление справочного характера (типы оглавлений
   перечислены в операторе "входит(конец(х17)набор($\ldots$))").
   Здесь предпринимается исключение узла статьи ло\-гического
   символа, на который ссылается концевой пункт оглавления.

   в) Оглавление задачника. Исключается узел задачи; в случае
   задачи на анализ рисунка из тринадцатого инф.блока, хранящего
   битмэпы рисунков, исключается со\-от\-ветствующий битмэп.

   г) Оглавление программ. Удаляется узел, на который ссылается
   концевой пункт, после чего в программе находится контрольная
   точка "прием($N$)", которая была связана с удаленным концевым
   пунктом оглавления, и эта точка исключается из программы.

   Далее действия продолжаются в ветви программы, достижимой по
   оператору "ветвь 2" \ из исходного фрагмента обработки команды
   удаления пункта. Здесь ис\-клю\-ча\-ются ссылки по метке х6 из
   текущего указателя-списка х4 на удаленные объект и его
   текстовый терминал. Номера оставшихся ссылок из х4,
   превосходящих х6, уменьшаются на 1. Предпринимается коррекция
   обратных ссылок для ветви ог\-лав\-ле\-ния, в которой после
   указанного вычитания единицы изменились пути (по\-сле\-до\-ва\-тельности
   проходимых меток) к концевым пунктам. Затем - переход к
   перерисовке меню. Текущим пунктом становится пункт, следующий
   после удаленного (т.е. номер х6 сохраняется).

   \subsubsection{Дополнительные операции оглавления}

   Кроме перечисленных выше простейших общих операций, процедура
   "оглавление" \ выполняет большое число специализированных
   операций, связанных с теми блока\-ми логической системы,
   которые обслуживаются оглавлениями. Более подроб\-ное описание
   этих операций естественно отложить до описания соответствующих
   блоков (например, базы приемов или базы теорем). Здесь мы
   ограничимся лишь кратким перечислением таких операций.

   Команда х10 = "внешдизъюнкция" \ (клавиша Insert) служит для
   регистрации в текущем концевом пункте оглавления базы приемов
   либо теорем тех приемов (либо теорем), которые предварительно
   были занесена в буфер при просмотре этой базы. Регистрируемый
   прием (теорема) исключается из того концевого пункта, в котором
   он до этого находился. В случае базы приемов роль буфера играет
   комментарий (ссылканаприем $A$), где $A$ - набор пар (ссылка на
   концевой терминал оглавления, где находился прием - терм
   "прием($B_1 B_2 B_3$)", адресующий прием). В случае базы теорем
   аналогичным образом используется комментарий (блоктеорем $A$);
   $A$ - набор пар (ссылка на концевой терминал оглавления базы
   теорем - терм "теорема($B_1 B_2$)").

   Команды х10 = "минимум", х10 = "арккосинус" \ (клавиши "л" \ и
   Ctr-л) служат для просмотра, соответственно, использованных
   либо неиспользованных в текущем вспомогательном оглавлении
   логических символов. Такой просмотр помогает найти подходящий
   новый логический символ при пополнении типов обозначений,
   пере\-чис\-ля\-емых в оглавлении.

   Команды х10 = "элементы", х10 = "нормвариант" \ (клавиши F8,
   Ctr-F8) служат для запуска цикла просмотра всех приемов либо
   всех теорем базы приемов (со\-от\-вет\-ст\-венно, теорем). Вторая из
   них используется только в случае базы приемов и находит все
   неоттранслированные приемы. Первая в процессе просмотра
   обращается к вспомогательной процедуре ("текприем" \ для базы
   приемов и "тектеорема" \ для базы теорем). Этой
   вспомогательной процедуре передается вся информация о теку\-щем
   просматриваемом объекте, так что перед просмотром можно
   перепрограм\-ми\-ро\-вать ее на заданную серийную обработку приемов либо
   теорем. Наиболее часто вспомогательная процедура используется для
   просмотра приемов либо теорем, удо\-влет\-воряющих заданному условию.
   Чтобы просмотр текущего объекта состоялся, процедура должна
   выдать ответ - набор, включающий в себя логический сим\-вол "См".

   Команда х10 = "оператор" \ (клавиша Ctr-р; кир.) служит для
   перехода в спра\-воч\-ное оглавление, перечисляющее типы
   комментариев, которыми могут сопровождать\-ся разделы оглавления
   базы теорем. Эти комментарии (лог,символы и термы) хра\-нят\-ся в
   логических терминалах "замечание" \ указателей-списков оглавления
   либо внутри термов "замечание($\ldots$)" \ из логических терминалов
   концевых пунктов. Они используются различными процедурами обработки
   базы теорем. Если тексты пунктов оглавления предназначены для
   оператора, работающего с логической системой, то комментарии к
   пунктам представляют собой "теневые" \ версии названий пунктов,
   предназначенные для самой логической системы.

   Команда х10 = "обобщслагаемое" \ (клавиша "?") служит для
   поиска приема в базе приемов, если известны логический символ и
   номер узла теоремы приема в статье этого символа. Сначала здесь
   реализуется интерфейс для ввода символа и номера, затем
   выбирается один из приемов, основанных на данной теореме, и
   происходит переключение текущего пути в оглавлении на концевой
   пункт, содержащий вы\-бран\-ный прием. Сам прием делается текущим в
   списке приемов указанного концевого пункта.

   Команды х10 = "элементызадачи", "развертка", "стрелкапирса",
   "сжатиефиль\-тра" (клавиши Shift - 1,2,3,4) служат для
   переключения между оглавлениями: про\-грамм (Shift - 1), базы приемов
   (Shift - 2), задачника (Shift - 3) и базы теорем (Shift - 4).
   Нажатие соответствующей клавиши приводит к переходу на текущий
   пункт соответствующего оглавления. Для перехода вводится
   комментарий к посылкам ис\-ход\-ной задачи, указывающий то
   оглавление, куда нужно перейти, и предпринимается откат к
   обработке команд главного меню (введенный комментарий блокирует
   пе\-ре\-ри\-сов\-ку главного меню, и внешне наличие отката никак не
   проявляется). При переходе в оглавление базы приемов из
   буфера задачника текущий путь в оглавлении базы приемов
   переустанавливается на тот прием, для слежения за
   срабатываниями которого был введен данный пункт буфера задачника.

   Группа команд предназначена для запуска цикла решения задач в
   заданном разделе оглавления задачника, либо для серийной
   обработки разделов оглавлений базы приемов и базы теорем (в
   основном для тестирования процедур автоматического синтеза
   приемов и вывода теорем). Это - команды х10 = "новыйузел" \
   (клавиша Ctr-з, кир.), х10 = "префикснаярекурсия" \ (клавиша
   Ctr-э), х10 = "элемент" \ (клави\-ша "З"), х10 = "заменазнака"
   \ (клавиша "С"), х10 = "записьзадачи" \ (клавиша Ctr-х), х10 =
   "сдвигпеременных" \ (клавиша Ctr-г), х10 = "дробнаявеличина" \
   (клави\-ша Ctr-ч). Чтобы запомнить корень того раздела задачника,
   внутри которого происхо\-дит серийная обработка, используется логический
   терминал "позиция" \ корневого указателя-списка этого раздела.
   Он должен был хранить терм "число($i j$)", где $i$ - метка перехода
   из указателя вдоль текущего пути; $j$ - номер пункта меню, с
   кото\-ро\-го начинается прорисовка на экране. Для выделения
   корневой точки, на период серийной обработки в ней вместо
   такого $j$ помещается 0.

   Команда х10 = "список" \ (клавиша F9) позволяет быстро перейти
   из просмотра оглавления базы приемов в редактирование программы
   символа "текприем", ис\-поль\-зуемой для поиска в базе приемов либо
   для автоматического преобразования приемов.

   Команда х10 = "стандменьше" \ (клавиша F1) переводит в просмотр
   справочника по решателю.

   Команда х10 = "новаяветвь" \ (клавиша Ctr-F6) служит для
   разрезания оглавле\-ния. Эта операция выполняется, если
   оглавление стало чрезмерно большим и не помеща\-ет\-ся в одном
   файле информационного блока. Она уже была описана выше.

   Команда х10 = "обл" \ (клавиша "пробел") служит, чтобы сбросить
   список вы\-де\-лен\-ных для просмотра приемов либо задач. Такой
   список сохраняется в комментарии (подборнеизвестных $A_1$ $A_2$
   $A_3$) к посылкам исходной задачи.

   Команда х10 = "кортеж" \ (клавиша Ctr-т) служит для коррекции
   обратных ссы\-лок в оглавлениях базы приемов, базы теорем,
   оглавлении программ и оглавлении операторов ЛОСа, если эти ссылки
   по каким-либо причинам оказались испорчен\-ны\-ми. Просматривается вся
   ветвь текущего меню оглавления, начиная с текущего пункта этого меню.
   Для концевых пунктов оглавления определяются точки обратных
   ссылок, и в них заносится фактический путь к концевому пункту.

   Команда х10 = "выражение" \ (клавиша Ctr-и) служит для
   просмотра и редакти\-ро\-ва\-ния комментариев к текущему пункту
   оглавления. В случае неконцевого пункта комментарии $A_1,
   \ldots, A_n$ (логические символы либо термы) хранятся в
   логическом терминале "замечание", в случае концевого
   - в терме "замечание($A_1 \ldots A_n$)" \ из ло\-ги\-чес\-кого
   терминала этого пункта.

   Команда х10 = "соответвхожд" \ (клавиша Delete) позволяет
   сбросить буфер при\-емов либо теорем, созданный для перенесения
   этих приемов или теорем на новое место в оглавлении.

   Команда х10 = "подборнеизвестных" \ (клавиша "з") инициирует
   просмотр ин\-фор\-ма\-ции о решении задач раздела. Это делается с
   помощью диалоговых блоков решателя. При просмотре возможно
   создание списков задач, для которых произошло ускорение,
   замедление, утеря либо изменение ответа. Для этих списков
   вводится упомянутый выше комментарий (подборнеизвестных
   $\ldots$). Команда х10 = "схема\-иден\-ти\-фикации" \ (клавиша "ш")
   позволяет использовать данный комментарий для перехода к
   очередному элементу списка.

   Команда х10 = "взаимнооднозначно" \ (клавиша "О") служит для
   сброса буфера базы приемов, теорем либо задачника. Такой буфер
   представляет собой раздел оглав\-ле\-ния, создаваемый автоматически
   для вспомогательных целей. В случае базы при\-емов в него
   заносятся удаленные приемы, старые версии измененных приемов и
   новые приемы - чтобы на локальном отрезке обучения решателя
   легче было находить причины обнаруженных при тестовом решении
   задач ухудшений в работе. В случае задачника в буфер заносятся
   те задачи, для которых необходимо первоочередное тестирование
   (например, все задачи, имеющие срабатывание заданного приема).
   Раз\-мещается ветвь буфера в конце корневого меню оглавления.

   Команда х10 = "нормпроизведениевсех" \ (клавиша "ф") позволяет
   перейти от произвольной точки оглавления к буферу этого
   оглавления; если буфера не было, то она игнорируется.

   Команда х10 = "усмцелое" \ (клавиша "й") служит для анализа
   избыточности приема ГЕНОЛОГа по разделу буфера задачника,
   созданному для рассмотрения задач, в которых этот прием
   применяется. Происходит последовательный просмотр задач
   раздела, и для каждой предпринимается попытка ее решения с
   отключенным приемом. Чтобы отключить прием, используется
   комментарий (вычерк (прием $A_1$ $A_2$ $A_3$)0) к посылкам исходной
   задачи, который воспринимается процедурами "вывод",
   "заменавхождения" \ и пр., осуществляющими преобразования при
   решении задачи. Для решения отводится время, чуть
   большее того, которое было нужно без отклю\-че\-ния приема. Если
   за это время задача не решается либо ответ изменяется, то пере\-ход
   к следующей задаче. Если же ответ сохраняется, а время решения
   уменьшает\-ся, то после текста, сопровождающего задачу в ветви
   буфера, ставится знак вопро\-са - возможно, следует ввести
   дополнительные фильтры в прием для блокировки его срабатываний
   в ситуациях, аналогичных встретившимся в этой задаче.

   Команда х10 = "нормдроби" \ (клавиша Ctr-ь) используется для
   коррекции вели\-чин вхождений лог.символов в теоремы базы приемов.
   Эти величины хранятся в логических терминалах "мощность" \
   корневых указателей-списков статей логических символов базы
   приемов. Они используются при автоматическом выборе логического
   символа привязки в приемах. Если в силу каких-то ошибок
   величина в терминале "мощность" \ становится отрицательной, то
   компилятор ГЕНОЛОГа перестает реа\-ги\-ро\-вать на явное указание
   выбора другого логического символа привязки и выбирает символ
   с отрицательной величиной. В таких случаях и рекомендуется
   применять данную команду. Сначала все величины в терминалах
   "мощность" \ заменяются на нули, а затем просматривается вся
   база приемов и определяются суммарные коли\-чест\-ва вхождений
   логических символов в теоремы приемов.

   Команда х10 = "извлечениеварианта" \ (клавиша "т") позволяет
   просмотреть все теоремы ветви текущего пункта текущего меню
   оглавления базы приемов, упо\-ря\-до\-чен\-ные в виде линейного списка.
   По любому элементу этого списка можно перейти к полному просмотру
   соответствующего приема нажатием клавиши "курсор вправо", а
   затем вернуться в список нажатием "курсор влево". Эта же
   команда позволяет просматривать все теоремы ветви текущего
   пункта текущего меню базы теорем. Клавиши "курсор вправо -
   влево" \ здесь используются аналогичным образом.

   Команда х10 = "частичныйответ" \ (клавиша "о", кир.) позволяет
   вернуться в оглавлениях базы приемов, теорем и задачника из
   просмотра буфера к той точки оглавления, от которой до этого
   (через нажатие "ф") был осуществлен переход к буферу.

   Команда х10 = "переобозначение" \ (клавиша Ctr-п) используется
   для входа в интерфейс создания оболочки нового пакетного
   оператора ГЕНОЛОГа. Этот интер\-фейс реализуется с помощью
   диалоговых блоков решателя. Он обеспечивает синтез приемов
   справочников, определяющих формат пакетного оператора, а также
   прос\-тей\-ших приемов самого оператора, которые становятся основой
   для последующего заполнения пакета реальным содержанием.

   Команда х10 = "анализатор" \ (клавиша "п") позволяет
   просматривать и ре\-дак\-ти\-ровать текстовые примечания к текущему
   меню оглавления. Такие примечания сохраняются в текстовом
   терминале, достижимом из указателя-списка х4 по метке
   "примечание". Следует заметить, что эта возможность пока
   практически не ис\-поль\-зу\-ет\-ся, так как обычно тексты пунктов
   оглавления уже несут всю необходимую сопровождающую информацию.

   Команды х10 = "область" \ (клавиша "Л") и х10 = "минимум" \
   (клавиша "л") осуществляют запуск в разделе оглавления
   базы теорем серийного логического вы\-во\-да с целью тестирования
   приемов вывода. Первая из них ограничивает вывод только теми
   случаями, когда применяется заданный, заранее выбранный прием.

   Команда х10 = "внутрвывод" \ (клавиша "у") позволяет
   просмотреть все теоремы в заданном разделе базы теорем, для
   которых на последнем цикле тестирования приемов вывода не
   удалось получить их вывод из связанных с ними
   теорем-ис\-точ\-ни\-ков. Для просмотра используется стандартная
   конструкция - создается комментарий (подборнеизвестных
   $\ldots$), и далее каждое нажатие клавиши "ш" \ переводит к
   про\-смот\-ру очередной теоремы.

   Команда х10 = "нижняяоценка" \ (клавиша "х") позволяет
   последовательно про\-смо\-треть все приемы в ветви текущего меню
   базы приемов, имеющие заданный тип. Тип приема определяется
   ветвью оглавления приемов, связанной со справочником
   "заголовокприема" \ генератора приемов. После нажатия
   клавиши "х" \ возникает эта ветвь оглавления, и при
   выходе на ее концевой пункт (каждый такой пункт задает тип
   приема) составляется список просматриваемых приемов. Здесь
   снова применя\-ет\-ся комментарий (подборнеизвестных $\ldots$);
   для перехода к очередному приему списка нажимается "ш".
   Та же команда х10 = "нижняяоценка" \ в случае базы теорем
   поз\-во\-ля\-ет (аналогичным образом) просмотреть все теоремы в
   ветви текущего меню, имеющие комментарий заданного типа.

   Команда х10 = "подобл" \ (клавиша "ч") позволяет просмотреть
   информацию об автоматическом построении чертежей в задачах
   текущего раздела задачника.

   \par\medskip

   Приведенный список дополнительных операций, выполняемых через
   интерфейс оглавлений, будет пополняться по мере развития
   логической системы. Фактически, оглавления превратились здесь из
   средства древовидной организации данных, не\-об\-хо\-ди\-мого для быстрого
   поиска, в мощное средство интерактивного обучения, поз\-во\-ляющее запускать
   различные циклы групповой обработки этих данных и ана\-ли\-зи\-ро\-вать
   полученные результаты.

   \section{Программа формульного редак\-то\-ра}

   Необходимость пополнять формульный редактор при обучении
   решателя возникает постоянно. Для упрощения этого процесса
   большинство логических символов про\-ри\-со\-вы\-ва\-ются формульным
   редактором в виде тех же словообразований, которыми они
   задаются в словаре. Чтобы такая прорисовка стала возможной,
   достаточно ввести (в виде псевдотеоремы приема) на ГЕНОЛОГе
   формат прорисовки символа и создать по нему серию приемов
   справочников, к которым обращается формульный редактор. В этом
   формате, в частности, можно определить кодовые комбинации клавиш
   (обыч\-но - две последовательно нажимаемые клавиши) для ускоренного
   ввода символа. Процедура создания приемов справочников формульного
   редактора автомати\-зи\-ро\-ва\-на. Тем не менее, в особых случаях такая
   простейшая форма прорисовки может оказаться нежелательной, и тогда
   для расширения формульного редактора пона\-до\-бит\-ся представление о его
   внутреннем устройстве.

   Как уже говорилось выше, действия формульного редактора
   реализуются опе\-ра\-то\-ром "формредактор(х1 х2 $\ldots$ х10)".
   У него х1-х4 задают координаты рам\-ки редакти\-ро\-ва\-ния
   (столбец-строка левого верхнего угла и солбец-строка правого
   ниж\-не\-го угла); х5 - цвет фона. Редактор работает в двух
   режимах: ручной набор формулы (терма) и создание по заданному
   терму такой структуры данных, которая позволяет про\-ри\-со\-вать его
   на экране в стандартной математической записи (точнее говоря,
   почти-стандартной). В первом режиме при обращении к оператору
   переменной х6 при\-сва\-и\-ва\-ет\-ся цвет символов, во втором режиме -
   тот терм, для которого нужно выполнить прорисовку. Переменные
   х7-х10 являются выходными переменными опе\-ра\-то\-ра. Пе\-ре\-мен\-ной х7
   присваивается корень так называемого дерева указателей - структуры
   данных для прорисовки терма в стандартной записи. Переменной х8
   присваивается терм, полученный при ручном вводе. Переменные
   х9,х10 используются для уточнения размеров области прорисовки:
   х9 - правый столбец собственной рамки набранной формулы, х10 -
   пара (верхняя строка рамки - нижняя строка рамки).

   Программа формульного редактора использует ряд вспомогательных
   процедур, реализованных, ради ускорения вычислений, непосредственно
   на СИ. Эти процедуры собраны в оператор ЛОСа "формблок($N
   \ldots$)", где $N$ - символьный номер реализу\-е\-мой процедуры.
   В первых версиях формульного редактора они программировались
   непосредственно на ЛОСе.

   \subsection{Структура данных, используемая для прорисов\-ки
   фор\-мул в стан\-дарт\-ной ма\-те\-ма\-ти\-чес\-кой записи}

   Для прорисовки формулы на экране создается древовидная
   структура данных, вос\-про\-из\-во\-дя\-щая (быть может, с некоторыми
   отклонениями) древовидное строение фор\-мулы. Эта структура данных
   называется деревом указателей, а элементы ее (верши\-ны) -
   указателями формульного редактора. Для ссылки на дерево указателей
   ис\-поль\-зуется его корень. Каждый указатель определяет
   прорисовку части формулы (как правило, отдельной операции,
   предиката, квантора и т.п.) и хранит необходимую для этого
   геометрическую информацию. Он представляет собой набор ($A_1
   \ldots A_7$), элементы которого несут следующую нагрузку:

   \begin{enumerate}

   \item $A_1$ - символьный номер, называемый типом указателя. При
   инициализа\-ции указателя он иногда получает тип 0, который впоследствии
   заменяется на не\-ну\-ле\-вое значение. Тип 1 имеют указатели
   большинства операций и отношений, прорисовываемых "префиксным
   образом" \ как $f(t_1 \ldots t_m)$. Тип 2 имеют указа\-те\-ли
   "инфиксных записей" \ - $(t_1 f t_2 f \ldots f t_n)$.
   Тип 3 - указатели одноместных отношений, прорисовываемые с
   помощью тире ($t - \mbox{число}$, $t - \mbox{функция}$, и
   т.п.). Тип 4 получили указатели для прорисовки выражений
   "величина($\ldots$)" \ (де\-ся\-тич\-ные числа, отличные от цифр),
   "степень($\ldots$)", "связприставка($\ldots$)". По\-след\-няя
   конструкция вводится самим формульным редактором - при анализе
   кванторов и описателей переменные связывающей приставки
   группируются под символом "связприставка". Тип 5 имеют
   указатели, используемые при про\-ри\-сов\-ке модуля. Тип 6 -
   указатели для прорисовки переменных; тип 7 - указатели
   функциональных переменных, и тип 8 - указатели матриц.

   \item $A_2$ - логический символ, являющийся заголовком
   указателя и обычно сов\-па\-да\-ющий с названием соответствующей
   операции (отношения, и т.п.) в прори\-со\-вы\-ва\-емой формуле. Если
   $A_1 = 6$, то $A_2$ есть код клавиатуры, соответствующий
   переменной.

   \item $A_3,A_4$ - координаты "начала" \ подтерма, определяемого
   ветвью указателя. $A_3$ - столбец; $A_4$ - строка.
   Предполагается, что у любого подтерма выделена его "главная" \
   текстовая полоса (высотой в 19 пикселей), на которой
   (кроме ряда исключений, таких, как матрицы) прорисована корневая
   операция. $A_4$ есть верхняя строка этой
   полосы. Этот принцип ссылки на верхнюю строку текстовой
   полосы является в формульном редакторе стан\-дарт\-ным.

   \item $A_5$ - информация о внешней скобке подтерма,
   определяемого ветвью указателя. Если $A_5=0$, то такой скобки
   нет. При наличии скобки $A_5$ представляет собой пару ($h,l$),
   у которой $h$ - высота части скобки, выступающей вверх над
   19-пиксельным вертикальным отрезком главной полосы подтерма.
   Верхняя и ниж\-няя части скобки строго симметричны по
   отношению к этой 19-пиксельной полосе. Если скобка еще не
   закрыта (в процессе набора фрмулы), то $l=0$. Иначе $l$ есть
   пара (столбец - строка), определяющая координаты закрывающей
   скобки. Под строкой здесь понимается номер верхней строки той
   текстовой полосы, на уровне которой должна быть размещена
   закрывающая скобка.

   \item $A_6$ - специальная информация для прорисовки(см. ниже).

   \item $A_7$ - набор ссылок на подуказатели данного указателя.
   Обычно они соответ\-ству\-ют операндам операции (отношения, и т.п.)
   данного указателя и размещены в том же порядке.

   \end{enumerate}

   Информационный элемент $A_6$ используется следующим образом:

   \begin{enumerate}

   \item Если $A_1 =1$, то $A_6$ есть пара ($P_1$ $P_2$), где $P_1$ -
   координата (столбец - строка) текста заголовка указателя без учета
   внешней скобки; $P_2$ - либо 0, либо содер\-жит дополнительную
   информацию для прорисовки сложных операций (дроби, ра\-ди\-калы,
   интегралы и т.п.).

   При $A_2$ = "дробь" \ значением $P_2$ служит пара (длина дробной
   горизонтальной черты в пикселях - указатель $U$ на завершение
   набора дроби). По завершении набора дроби $U$ становится равно
   символу "пустоеслово".

   При $A_2$ = "корень" \ (что соответствует случаю радикала
   степени от 3 до 9) либо $A_2$ =  "квадркорень" \ (для
   квадратного радикала) значением $P_2$ служит четверка
   ($B_1$ $B_2$ $B_3$ $B_4$). Здесь $B_1$ - смещение вверх от
   текущей строки (т.е. от верхней строки текущей 19-пиксельной
   полосы) к верхней строке радикала; $B_2$ - смещение от текущей
   строки до нижней строки радикала; $B_3$ - указатель на
   завершение набора радикала (1 - набор завершен, 0 - не завершен);
   $B_4$ - длина верхней горизонтальной линии радикала. Под
   завершением набора в случае дробей и радикалов понимается
   ситуация, когда цвет прорисовки их линий становится черным.

   При $A_2$ = "суммавсех" \ либо "произведениевсех" \ $P_2$
   представляет собой трой\-ку (смещение вверх от текущей строки до
   верхней линии знака суммы или произведения - длина верхней
   горизонтальной линии знака - указатель за\-вер\-ше\-ния набора).
   Знак прорисовывается симметричным относительно текущей
   19-пиксельной полосы образом. Указателем завершения набора
   служит 1 (до завершения - 0).

   При $A_2$ = "интеграл" \ либо "факториал" \ либо
   "числосочетаний" \ элемент $P_2$ представляет собой пару
   (смещение вверх от текущей строки до верхнего края знака -
   указатель завершения набора, такой же, как для "суммавсех").

   \item  Если $A_1 = 2$ (инфиксная операция), то значением $A_6$
   служит набор $(0, (B_{21},B_{22}),\\ \ldots , (B_{n1}B_{n2}))$,
   где $n$ - число операндов; $(B_{i1},B_{i2})$ - координата
   позиции символа операции $A_2$ перед $i$ - м операндом.

   \item  Если $A_1 = 3$, то $A_6$ есть координата
   (столбец-строка) начала текста, идущего после тире.

   \item  Если $A_1 = 4$ и $A_2$ - символ "степень", то $A_6$ есть
   индикатор завершения набора степени (он становится равен
   символу "пустоеслово", когда набор завершен).

   \item  Если $A_1 = 6$ и вводится переменная с индексом, то $A_6$
   служит для указания на завершение набора индекса (равно
   "пустоеслово", когда индекс набран).

   \item  Если $A_1 = 8$ и $A_2$ есть логический символ
   "элементы", то значением $A_6$ служит набор $(B_1 \ldots
   B_{n-1} C)$. Здесь $B_1, \ldots B_{n-1}$ - смещения по
   горизонтали от левого края матрицы до начала прорисовки
   элементов 2-го,3-го, $\ldots$ , $n$ - го столбцов; $C$ -
   смещение до закрывающей скобки матрицы. Данный указатель
   соответствует некоторой строке матрицы; сама матрица
   представлена указателем типа 8 с заголовком $A_2$ = "Набор",
   у которого $A_6 = 0$. Указатели для строк - подука\-за\-те\-ли
   последнего указателя.

   \end{enumerate}

   \subsection{Начало программы формульного редактора}

   Для выхода в программу формульного редактора можно
   использовать пункт "Вспо\-мо\-га\-тельные процедуры интерфейсов -
   Формульный редактор - Основной блок фор\-мульного редактора"
   \ оглавления программ.

   Начинается программа формульного редактора с рассмотрения того
   спе\-ци\-аль\-ного случая, когда нужно прорисовать уже имеющуюся
   формулу, содержа\-щую мат\-рицы. В этом случае сначала
   предпринимается попытка получить (в размерах от\-ве\-денного
   прямоугольника) изображение формулы с обычной прорисовкой
   матрицы, а если это не удается, то предпринимается
   допол\-ни\-тель\-ная попытка получить изо\-бра\-же\-ние матрицы в виде
   "строки($(a_{11} \ldots a_{1n}) \ldots (a_{m1} \ldots a_{mn})$)".

   В отсутствии указанного выше особого случая - переход через
   "ветвь 2". Опе\-ра\-тор "русшрифт(0)" переключает здесь драйвер
   клавиатуры на ре\-жим ввода латинских букв (по выходе из
   формульного редактора будет восстановлен ре\-жим кирилицы).
   Далее блокируется попытка прорисовать однобуквенный терм
   служебного характе\-ра (например, отдельно взятый заголовок
   какой-либо обыч\-ной математической опера\-ции, квантора и т.п.).
   Такие попытки, возможные при работе отладчика, могут при\-вести
   к выдаче сообщений об ошибках в работе программы. Далее -
   переход через "ветвь 1".

   Если имеет место режим ручного ввода формулы (х6 - логический
   символ), то предпринимается расчистка экрана. Инициализируются
   переменные х11,х12, кото\-рые указывают координаты текущей
   позиции курсора формульного ре\-дак\-то\-ра (стол\-бец - строка).
   Инициализируется стэк х14 указателей формульного редактора.
   Пос\-лед\-ний элемент набора х14 соответствует указателю для всей
   формулы, предпос\-лед\-ний - его подуказатель, и т.д. вплоть до
   первого элемента, который соответствует текущему вводимому
   подтерму. При инициализации в х14 заносится заготовка кор\-не\-во\-го
   указателя, в котором все позиции, кроме позициий текущих
   столбца и строки, заполнены нулями и символами "пус\-то\-е\-слово".
   Затем идет оператор "повторение", к которому будут происходить
   откаты при вводе очередной команды (только для ручного набора).
   При ручном режиме ввода прорисовывается курсор
   формульного редактора и происходит обращение к процедуре
   "формклавиатура(х15)" \ для запроса оче\-ред\-ной команды х15.
   В режиме формирования дерева указателей для уже из\-вест\-ной
   формулы - полагается х15 = 0.

   Процедура "формклавиатура" \ видоизменяет последовательность
   сигналов, по\-сту\-па\-ющих с клавиатуры, в соответствии с некоторыми
   правилами. Она имеет "па\-мять", роль которой выполняют
   комментарии (формклавиатура $\ldots$) и (кор\-теж $\ldots$)
   к посылкам исходной задачи. Используя эту память, процедура
   в определенных случаях выдает результат вообще без нажатия
   клавиш; в то же время, в ряде случаев для выдачи результата
   может понадобиться несколько нажатий клавиш. Пре\-об\-ра\-зо\-вания
   сигналов с клавиатуры происходят в со\-от\-вет\-ствии со следующими
   согла\-ше\-ниями:

   а) Если имеется комментарий (кортеж $A_1$ $A_2$) к посылкам
   исходной задачи, то перед каждой вводимой буквой, кроме первой,
   вставляется символ умножения (ко\-ди\-руемый логическим символом
   "спуск"). $A_1$ - указатель первой буквы, вначале равный 0,
   а после ввода первой буквы заменяемый на 1. $A_2$ - буфер, в
   котором сохраняется очередной буквенный символ, в то время как
   вместо него выдается "умножение". При следующем обращении
   результат будет извлечен сразу из этого буфера, а в буфер будет
   занесен ноль. Такое преобразование используется при вводе
   обозначений типа $\triangle(ABC)$, когда несколько буквенных
   символов $A,B,C$ должны вводиться подряд без символов
   разделителей (опе\-ратор "формклавиатура" \ автоматически вводит
   здесь в качестве разделителей символы умножения, которые при
   определении резуль\-ти\-ру\-ю\-щего терма будут отброшены). В прочих
   ситуациях формульный редактор блокирует ввод двух букв подряд
   либо (см.ниже) рассматривает эти буквы как кодовую ком\-би\-на\-цию,
   преобразуемую в отдельный символ.

   б) Вводимые с клавиатуры буквенные символы, а также специальные
   сигналы - пробел, слэш, звездочка, сохраняются в буфере $A_1$
   комментария (форм\-кла\-ви\-а\-ту\-ра $A_1$ $A_2$). Буфер $A_2$ этого же
   комментария используется для немедленной выдачи хранящихся в нем
   символов. Чтобы распознавать кодовые комбинации буквенных
   клавиш, служит справочник "префикс", которому передается
   со\-дер\-жи\-мое буфера $A_1$, причем символом обращения к
   справочнику служит первый элемент буфера $A_1$. Если он выдает
   переменную, то заполнение буфера про\-дол\-жа\-ется; если 0 -
   буфер сбрасывается; если выдается другой логический символ, то
   он рассматривается как результат распознавания кодовой
   комбинации кла\-виш. Таким образом, могут выда\-ва\-ться не только
   коды клавиш, но также множество дополнительных кодов для
   последующей обработки формульным редактором.

   в) Если идет процесс накопления информации о кодовой комбинации
   клавиш, то при поступлении очередной буквы оператор "формклавиатура"
   \ выдает сиг\-нал об откате (логический символ "8"),  занося поступившую
   букву в буфер $A_2$. При следующем обращении она будет оттуда
   извлечена в качестве результата.

   г) Для обработки символа, поступившего после нажатия клавиши
   "слэш", ис\-поль\-зу\-ется справочник "суффикс", определяющий
   фактически выдаваемый ре\-зультат.

   д) Если кодовая комбинация клавиш начинается с символа "пробел",
   то для ее распознавания применяется не справочник "префикс", а
   справочник "форм\-кла\-ви\-а\-тура".

   е) Двойное нажатие клавиши "звездочка" \ воспринимается как
   кодовая ком\-би\-на\-ция, приводящая к прорисовке умножения в виде
   точки (при однократном нажатии применяется обычное слитное
   расположение сомножителей).

   \par\medskip

   После получения команды х15 прежде всего проверяется, не
   является ли она символом закрывающей скобки (символ
   "учеткоманды"), и если является, то сбра\-сы\-ва\-ется упомянутый
   выше комментарий (кортеж $\ldots$).

   \subsection{Обработчик команд формульного редактора}

   Перечислим процедуры обработки специальных команд х15 формульного
   редактора; обработка общего случая - команд ввода символов формулы -
   рассматривается в следующем подразделе.

   \begin{enumerate}

   \item х15 = "Плюс" \ (клавиша Esc). В этом случае убирается
   курсор (закрашивается цветом фона); драйвер клавиатуры
   переключается на режим кириллицы, уда\-ля\-ются комментарии (кортеж
   $\ldots$) и (формклавиатура $\ldots$), используемые опе\-ратором
   "формклавиатура", и выход из формульного редактора по
   истин\-ност\-но\-му значению "ложь".

   \item х15 = "8" \ (клавиша Backspace). В этом случае
   реализуется откат для последнего введенного символа набираемой
   формулы. Прежде всего здесь убирается кур\-сор. Если начало стэка
   указателей х14 (т.е. текущий заполняемый указатель) уже имеет
   определенный тип, то переход через "иначе 2". В противном случае
   проверяется, что длина стэка больше 1 (если она равна единице,
   то набор формулы еще не начат и откат не выполняется) и
   находится второй элемент х16 стэка указателей. Текущий
   указатель является его подуказателем. Далее предпринимается
   разбор случаев по типу указателя х16:

    а) х16 - указатель типа 1. Здесь рассматриваются два
    подслучая:

    а1) Число подуказателей указателя х16 равно 1 . В этом случае
    единственный подуказатель - стоящая перед х16 "пустая" \ заготовка,
    так что при откате нужно удалить саму операцию, определяемую
    указателем х16. Сначала пред\-при\-ни\-мается обращение к
    оператору "блокредактора(десять $\ldots$)", который стирает данную операцию на экране, предпринимая
    при необходимости также пере\-ри\-сов\-ку ряда внешних операций. Например,
    если при откате укорачивается числитель или знаменатель дроби,
    так что дробная черта становится избыточно длинной, то она тоже
    укорачивается; аналогичным образом корректируется прорисовка знаков
    радикалов, суммирования, и т.п. Затем курсор прори\-со\-вы\-ва\-ется на
    новой позиции, соответствующей указателю х16. В первую ячейку
    указателя х16 заносится 0 (его тип сбрасывается); в последнюю
    (список под\-ука\-за\-телей) - "пустоеслово". Корректируются
    координаты х11, х12 текущей позиции курсора. После этого
    особо рассматривается случай, когда исключен\-ная операция являлась
    минусом перед очередным слагаемым (переход по "иначе 5"). Если
    это не имело места, то информационный (6-й) элемент указателя
    х16 заменяется на "пустоеслово"; удаляется, если он был, комментарий
    (кортеж $\ldots$); отбрасывается первый элемент стэка
    указателей (расположенный перед х16), и откат завершен. В
    противном случае - проверяется, равнялось ли число слагаемых
    двум. Если равнялось, то находится надуказатель суммы, и
    ссылка из него на сумму заменяется ссылкой на первое
    (оставшееся после отката) слагаемое, а указатель суммы
    отбрасывается. Если число слагаемых больше двух, то сумма
    остается, хотя ссылка из нее на подуказатель х16 исключается.
    В обоих случаях в начале стэка указателей располагается указатель
    последнего из оставшихся слагаемых суммы. Если этот указатель
    имеет подуказатели, то к началу стэка может быть добавлен последний
    из них, и т.д. до получения неудлиняемой далее цепочки указателей.
    Такое удлинение стэка указателей осуществляется оператором
    "блокредактора(одиннадцать $\ldots$)".

    а2) Число подуказателей указателя х16 больше одного.
    Определяется заголовок х17 указателя х16. Отбрасывается
    последний подуказатель этого указателя (т.е. расположенный перед
    ним в стэке х14 недоопределенный указатель) и в начало стэка
    помещается последний из оставшихся подуказателей указателя
    х16. В зависимости от типа х17 (дробь, радикал с указателем
    степени, интеграл, и т.п.) находится новая позиция курсора
    при откате (например, в случае дроби про\-ис\-хо\-дит возвращение
    курсора из знаменателя в числитель). Чтобы вернуться к
    доопределению "последнего" \ фрагмента в подтерме,
    определяемом новым началом $U$ стэка х14, используются обращения к
    оператору "блокредактора(две\-надцать $\ldots$)", добавляющему
    в начале стэка х14 цепочку подуказателей ука\-за\-теля $U$.

    б) Либо тип указателя х16 равен 5, либо этот указатель имеет
    заголовок "пе\-ре\-чень", а число подуказателей равно 1. Эти
    ситуации возникают, если была введена первая вертикальная
    черта модуля либо левая фигурная скобка ко\-неч\-но\-го списка.
    Тогда выполняются стирание с экрана символа указателя х16,
    прорисовка вместо него курсора, замена типа указателя х16
    на 0, замена на "пустоеслово" \ списка подуказателей и
    информационного элемента, удаление комментария (кортеж $\ldots$) и
    отбрасывание в стэке указателей элемента, идущего перед х16.

    в) Тип указателя х16 равен 2. Тогда должна быть стерта
    последняя введенная инфиксная операция. Находится символ х17
    этой операции. В случае заголовка указателя "набор" \ либо
    "перечень" \ он равен запятой, иначе - совпадает с за\-го\-лов\-ком.
    Оператор "блокредактора(десять $\ldots$)" \ стирает символ
    х17. Координаты этого символа извлекаются из информационного
    элемента указателя (они рас\-по\-ло\-жены в конце данного элемента).
    Затем курсор устанавливается на позицию стертого символа. Если
    число подуказателей указателя х16 было равно 2 (пер\-вый из них
    соответствует полностью введенному операнду, второй - рас\-по\-ло\-жен\-ной
    перед х16 заготовке указателя), то вместо х16 помещается его первый
    подуказатель; если же число подуказателей было более двух, то
    последний из них удаляется и одновременно удаляется последняя
    координатная пара из информационного элемента указателя х16.
    В обоих случаях отбрасывается ука\-за\-тель, располагавшийся перед
    х16, и применяется процедура "блокредактора(\\ одиннадцать
    $\ldots$)" \ для удлинения стэка указателей х14.

    г) Тип указателя равен 4 либо 6. Эти ситуации возникают в двух
    случаях: ли\-бо набиралась переменная с индексом, и имеет место
    откат к уровню переменной после отказа от индекса (тип 6),
    либо набиралась степень и имеет место воз\-вра\-щение к уровню
    главной строки от уровня показателя степени. Соответственно, в
    первом случае номер х12 текущей строки уменьшается, а во
    втором случае - увеличивается на 9. По скорректированной
    текущей позиции прорисовывается курсор. Если х16 не был
    корневым указателем набираемого терма, то он за\-ме\-ня\-ется на
    свой первый подуказатель; соответственно корректируется стэк
    х14.

    д) Тип указателя равен 8. В этом случае происходит откат в
    строке набираемой матрицы к предыдущему элементу (если текущий
    не введен либо стерт пре\-ды\-ду\-щим откатом). Если список х17
    подуказателей указателя х16 более чем одноэлементный, то
    текущая строка непуста. В этом случае курсор перево\-дит\-ся на
    позицию, непосредственно следующую после последнего элемента
    строки. Если же х17 одноэлементый, то текущая строка пуста, и
    тогда нужно вернуться к предыдущей строке. Случай
    одноэлементного х19 означает, что рассмат\-ри\-ва\-е\-мая строка
    вообще была первой. Если это не так, то корректируются размеры
    левой скобки матрицы (правая пока не прорисована), и курсор
    возвращается в конец предыдущей строки.

    е) Тип указателя х16 равен 0, причем в нем указана ссылка на
    открывающую скобку. Это означает, что после скобки нет каких-
    либо записей, и при откате нужно ее удалить. Особо
    рассматриваются случай, когда такая скобка
    стояла после квантора либо описателя (осуществляется откат к
    продолжению про\-ри\-совки связывающей приставки - см. действия
    после "заголовок(х17 1)"), и случай, когда открывающая скобка
    стояла после бук\-вен\-но\-го символа, в ре\-зуль\-тате чего появилась
    заготовка указателя  для терма вида "значение($f \ldots$)".
    Эта заготовка удаляется, и происходит возвращение к обычному
    указателю переменной $f$.

    \par\medskip

    Перейдем теперь к рассмотрению случая, когда первый указатель
    стэка х14 имел тип, отличный от нуля. Переход к соответствующему
    фрагменту про\-грам\-мы - через оператор "иначе 2" \ в начале
    ветви обработки команды отката. Отличие от нуля типа первого
    указателя стэка х14 означает, что он определяет некоторый
    полностью набранный терм $T$. При откате следует вернуться к
    ука\-за\-те\-лю того подтерма терма $T$, который обрабатывался на
    последнем шаге набора $T$. Чтобы найти данный указатель,
    реализуется цикл, начинающийся с оператора "повторение" \ - к
    нему будут происходить возвращения для выпол\-не\-ния очередного
    перехода вглубь терма $T$.

    Прежде всего, обрабатывается общий случай - первый указатель
    х16 стэка х14 имеет тип 1, 2 либо 7, с ним не связана скобка,
    и заголовок его не является одним из символов, требующих
    перекраски при завершении набора (т.е. не является дробью,
    радикалом, символом суммирования или интегрирования и т.п.).
    Если этот указатель имеет подуказатели, то последний из них
    заносится в начало стэка х14, и откат к "повторению".

    Если указанный выше общий случай не имеет места, то переход
    через оператор "ветвь 1". Прежде всего, здесь проверяется, не
    связаны ли с указателем внешние скобки. Если они есть, то переход
    через оператор "иначе 2". Здесь происходит стирание закрывающей
    скобки (в специальных случаях - при заголовках "мо\-дуль" \ и
    "перечень" \ указателя х16 - вместо закрывающей круглой скобки
    берутся вертикальная черта либо закрывающая фигурная скобка).
    Курсор переносится на место стертой скобки. Если была стерта
    круглая скобка, то между х16 и его надуказателем вводится
    промежуточный указатель х19 типа 0, в который из х16 переносятся
    данные о внешних скобках (в самом х16 они исключаются).
    Указатель х19 - временный; после закрытия скобки он будет
    устранен, и данные о внешних скобках снова окажутся в х16. Во
    всех случаях после стирания скобки предпринимается стандартное
    удлинение стэка указателей с помощью
    "блокредактора(двенадцать $\ldots$)" \ (в начало стэка
    выносится указатель наи\-мень\-ше\-го подтерма, который будет
    доопределяться при наборе), и выполнение команды отката
    завершается.

    Если с указателем х16 не были связаны внешние скобки, то
    прежде всего рассматривается случай указателя типа 3. Здесь
    стирается текст указателя, располагавшийся после тире, курсор
    переносится на начало этого текста, ука\-за\-тель х16 заменяется
    на свой подуказатель, оператор "блокредактора(один\-над\-цать
    $\ldots$)" выполняет удлинение стэка х14, и выполнение команды
    отката завершается.

    Далее рассматривается случай указателя х16 типа 1, заголовок
    которого требу\-ет перекраски по завершении набора (дробь, радикал,
    интеграл, и т.п.). В этом случае восстанавливается малиновый цвет
    заголовка, в случае дроби отменяется центровка числителя и
    знаменателя, курсор переносится на позицию, с которой будет
    происходить доопределение терма, и выполняются необходимые
    кор\-рек\-ции стэка х14.

    Оставшиеся случаи, рассматриваемые в той же цепи фрагментов
    программы, таковы: сначала - откат после набора степени либо
    переменной с индексом (корректируется высота курсора); затем -
    откат к набору более чем одно\-сим\-воль\-ного числа либо
    связывающей приставки; затем - откат после набора пе\-ре\-мен\-ной,
    цифры либо символа константы.

    \item х15 = "стандменьше" \ (клавиша F1). Здесь выполняется
    обращение к спра\-воч\-ни\-ку по логической системе. Предварительно
    осуществляется перевод драйвера клавиатуры на режим кириллицы
    (чтобы правильно воспринимались обычные команды интерфейсов).
    Текущее содержимое экрана сохраняется в буфере (опе\-ратор
    "видео(минус)"). После обращения к справочнику -
    восстановление ис\-ход\-ного экрана и переход в режим латиницы.

    \item х15 = "символтеоремы" \ (клавиша "Ctr-курсор вниз"). При
    наборе формулы вручную происходит переход на новую строку. Для
    этого применяется проце\-ду\-ра "выводсимвола", которой передается
    информация о фиктивном сим\-во\-ле "развязка". Длина этого символа
    указана достаточно большой, чтобы проце\-ду\-ра "выводсимвола" \
    начала свою работу с перехода к новой строке. Фактический вывод
    этого символа блокируется.

    \item х15 = "фигуры" \ (клавиша Ctr-Enter). Происходит набор
    логического символа с помощью текстового редактора; после
    этого х15 заменяется на набранный символ, и
    продолжается обработка скорректированного значения х15 как
    оче\-ред\-но\-го символа набираемой формулы. Этот способ применяется для
    редко встречающихся символов, когда ввод специальной кодовой
    комбинации клавиш нецелесообразен. Тем не менее, здесь все же
    нужно, чтобы с символом заранее были связаны необходимые программы
    справочников формульного редактора (справочники
    "формредактор", "блокредактора", и др.).

    \item х15 = "внешдизъюнкция" \ (клавиша Insert). Здесь
    происходит вставка с текущей позиции набираемой формулы
    некоторого подтерма, который был заранее за\-не\-сен в буфер.
    Роль такого буфера играют комментарии (смполоса $\ldots$),
    (Смполоса $\ldots$) к посылкам исходной задачи. Первый из
    них вводится процедурой про\-смот\-ра задачника, второй - процедурой
    просмотра цепи задач при пошаговой трассировке решения.
    В этих комментариях регистрируются выделенные эле\-мен\-ты задач.
    Предпринимается обращение к клавиатуре для ввода цифры
    от 1 до 9, находится выделенный подтерм $T$ с соответствующим
    номером, и пе\-ре\-мен\-ная х13 заменяется на терм "набор($T$)".
    Эта переменная была инициализиро\-ва\-на нулем (одновременно с
    инициализацией стэка указателей х14),и ее ненуле\-вое значение
    определяет временное переключение (см. ниже) с режима ручного ввода
    на режим автоматического ввода терма $T$; по окончании
    снова вос\-ста\-но\-вится ручной режим.

  \end{enumerate}

  \subsection{Обработка очередного символа набираемой формулы}

  Если полученная формульным редактором команда х15 не
  обрабатывается одним из перечисленных выше фрагментов, то она
  либо есть 0 (в случае создания формульным редактором дерева
  указателей для уже известного терма), либо представляет собой
  логический символ, кодирующий очередной элемент набираемой
  вручную формулы (операцию, переменную, скобку и т.п.). Обработка
  такого х15 начинается в фрагменте, соответствующем пункту
  "Вспомогательные процедуры интерфейсов - Формульный редактор -
  Основной блок формульного редактора - Обработка очередного
  входного набора" \ оглавления программ. Первый оператор
  "альтернатива(логсимвол(х6)$\ldots$)" \ этого фрагмента в случае
  ручного набора (х6 - логический символ) проверяет, равно ли х13
  нулю. Если равно, то находится результат х16 обращения к
  справочнику "формредактор" \ на символе х15. Этот результат -
  либо 0 (в случае ввода переменной), либо четверка ($i,r,p,s$)
  характеристик графического изображения кодируемого по\-сред\-ст\-вом х15
  символа $s$. $i$ - тип символа, равный 1 для префиксных
  операций, 2 - для инфиксных (включая записи типа "$a$-число");
  3 - для степени; 4 - для "Enter" \ и "курсор вниз"; 5 - для
  скобок; 6 - для цифр и точки; 7 - для модуля, целой части, перечня
  и набираемой в стандартном виде матрицы; 8 - для
  константных символов ("е","пи","пусто" \ и т.п.). $r$ - длина
  (символьный номер) записи символа $s$ в 8-пиксельных единицах;
  $p$ - зависящая от символа вспомогательная информация (для
  инфиксных операций  - указатель их относительной "силы" \ при
  расстановке скобок; равенство $p$ символу "пустоеслово" \ означает,
  что $s$ имеет нестандартные размеры по вертикали).
  Если х13 не равно 0, то оно имеет вид
  "набор($T$)", и тогда включается режим автоматического набора
  терма $T$. В этом режиме перечисляются четверки х16,
  эму\-ли\-рующие ручной набор $T$. Начинается перечисление с
  набора (5 1 0 операнд), обозначающего открывающую скобку, затем
  идут собственно наборы для $T$, и в конце - набор
  (5 1 0 последнийоперанд) для закрывающей скобки.
  По окончании перечисления - переход через "иначе 1", где значение
  х13 изменяется на 0, и откат ко вводу очередной команды для
  ручного набора формулы. Наконец, в случае режима создания дерева
  указателей для из\-вест\-но\-го терма х6, происходит обращение к
  опе\-ра\-тору "модульредактора(левыйкрай(х6) х16)", перечисляющему
  четверки х16, эму\-ли\-ру\-ющие ручной ввод терма х6.

  Таким образом, как в случае ручного набора терма, так и в случае
  создания дерева указателей для известного терма, дальнейшие
  действия по обработке наборов х16 почти совпадают. Отличие возникает
  лишь на этапе завершающей обработки построенного дерева
  указателей - в первом случае по нему будет определяться
  терм, а во втором случае терм уже известен.

  После получения значения х16 прежде всего проверяется, не
  определяет ли оно операцию, между операндами которой при наборе
  должны вставляться фиктивные символы умножения; если определяет,
  то вводится уже упоминавшийся выше ком\-мен\-та\-рий (кортеж 0 0) к
  посылкам исходной задачи, используемый оператором "фо\-рмклавиатура" \
  в качестве буфера. Если значение х16 равнялось 1 (при
  эмуляции набора терма стало ясно, что его не следует изображать
  формульным редактором), то попытка построить дерево указателей
  обрывается, и выход из формульного редак\-то\-ра по значению "ложь".

  Далее идет оператор "или(не(заголовок(начало(х14)1))$\ldots$)",
  который усмат\-ри\-ва\-ет завершенный набор числа, укорачивая при этом
  стэк указателей х14 таким образом, чтобы в начале был размещен
  указатель для максимального терма, набор которого уже завершен.
  После этого оператора начинается разбор случаев для х16.

  Прежде всего, рассматривается случай, когда х16 соответствует
  префиксной опе\-рации либо символу "минус", не расположенному под
  знаком суммы - см. оператор "или(заголовок(х16 1)$\ldots$)". Здесь
  выполняется обращение к процедуре "выводсим\-во\-ла($\ldots$)",
  которая осуществляет фактическую прорисовку введенного символа
  опе\-ра\-ции, корректируя при необходимости размеры ранее введенных
  элементов изо\-бра\-же\-ния - как в дереве указателей, так и на
  экране. Если для размещения символа не хватило места (переход
  через "иначе 5"), то в случае обработки уже известного терма
  предпринимается попытка переформулировать его так, чтобы
  исключить не помещающиеся на одной строке числители и знаменатели
  дробей. Подозрительные на такое переполнение подтермы
  "дробь($\ldots$)" \ заменяются на подтермы "деление($\ldots$)",
  при прорисовке которых вместо горизонтальной черты используется
  двоеточие. Пос\-ле замены - откат к повторной обработке терма.

  Если места для прорисовки символа оказалось достаточно, то
  предпринимаются обращения к справочникам "формблок" \
  (определение вертикального смещения кур\-со\-ра после прорисовки
  символа), "терм" \ (получение дополнительной информации для
  прорисовки специальных символов), "пусто" \ (определение
  случаев, не требую\-щих сдвига курсора по горизонтали после
  прорисовки символа). Далее происходит обращение к оператору
  "формблок(5 $\ldots$)", реализация которого вынесена в про\-грам\-му
  интерпретатора ЛОСа. Он доопределяет первый указатель стэка
  указателей х14 и вводит его подуказатель, присоединяя его к началу
  стэка. Новая версия стэка - значение выходной переменной х22 данного
  оператора. Затем корректируется пози\-ция курсора, и откат к получению
  очередной четверки х16.

  Для рассмотрения следующего подслучая перейдем через "иначе 4" \ к
  фрагменту, начинающемуся с оператора "заголовок(х16 2)". Это -
  случай инфиксной операции. Ветвь, расположенная после оператора
  "повторение", обеспечивает усмотрение за\-вер\-шенного ввода
  операнда, если новая (внешняя) инфиксная операция оказалась "слабее",
  чем старая (внутренняя) инфиксная операция, являющаяся заголовком
  этого операнда. Соответственно укорачивается стэк х14. Для
  сравнения инфиксных операций по их "силе" \ используется
  информационный элемент $p$ набора х16. Чтобы определить
  соответствующее значение для внутренней инфиксной операции,
  ис\-поль\-зуется справочник "блокредактора", аналогичный справочнику
  "формредактор", но выдающий не четверку ($i,r,p,s$), а тройку
  ($i,r,p$) и получающий в качестве входного символа не код
  клавиатуры, а символ $s$. Этот же справочник используется и
  при эмуляции оператором "модульредактора" \ набора терма, так
  как здесь изначально известным оказывается не код клавиатуры, а
  логический символ $s$.

  После коррекции стэка х14 - переход через оператор "ветвь 3",
  где прежде всего проверяется, не была ли введена операция
  умножения после ввода выражения, на\-чи\-на\-ющегося с минуса. Если
  это так, то указатель операнда при минусе выносится в начало
  стэка х14, чтобы в итоге минус оказался отнесенным ко всему
  произведению. Далее используется оператор "формблок(4
  $\ldots$)", который определяет скор\-рек\-ти\-ро\-ванный стэк указателей
  (в начало его заносится бланк указателя для ввода очеред\-но\-го
  операнда). Заметим, что программа оператор "формблок(4
  $\ldots$)" \ содержит список инфиксных операций $f$,
  прорисовываемых в виде "$a - f$". Этот список должен
  попол\-няться при вводе новых таких операций, с перекомпиляцией
  интерпретатора ЛОСа.

  При обработке случая "заголовок(х16 2)" \ особо рассматривается
  подслучай ввода символа "точка с запятой" \ после ввода фигурной
  скобки для конечного списка. Это - условное обозначение для
  конечного списка, определяемого по набору элементов, заданному
  неявно.

  Если первый элемент четверки х16 равен 3, то была нажата клавиша
  "курсор вверх" \ для перехода к набору показателя степени. В
  этом случае проверяется, что основание степени набрано полностью
  (либо тип начального указателя стэка х14 отличен от 0, либо этот
  указатель соответствует паре внешних скобок, в которые заключено
  основание степени). Затем - обращение к оператору
  "выводсимвола", которое приводит к перенесению курсора на уровень
  показателя степени, быть может, сопровождаемому коррекцией прочих
  параметров изображения формулы. Если осно\-ва\-ние степени
  начиналось с минуса и не было заключено в скобки, то в начало
  стэка х14 добавляется указатель, соответствующий выражению под
  минусом. Этим достигается то, что минус будет отнесен ко всей степени.
  Затем вводятся указатели х19 (бланк для набора показателя
  степени) и х20 (собственно указатель для степени, имеющий своим
  подуказателем первый указатель стэка). х19 и х20 заносятся в
  начало стэка х14, из которого при этом исключается первый
  элемент (учтенный в х20). Затем - откат к получению очередного
  набора х16.

  Если х16 начинается с символа 4, то была нажата "управляющая
  клавиша" \ фор\-муль\-ного редактора. Здесь рассматриваются
  следующие случаи:

  а) набору х16 соответствует логический символ "спуск" \ (клавиша
  "курсор вниз"). Для ввода индекса переменной курсор переводится
  вниз; создается бланк х19 под\-ука\-за\-теля текущего указателя
  переменной, в котором будет формироваться индекс; х19 заносится
  в начало стэка х14, и переход к очередному набору х16.

  б) набору х16 соответствует логический символ "сброс" \ (клавиша
  Enter). Здесь сгруппированы различные процедуры, обслуживающие
  завершение набора спе\-ци\-аль\-ного фрагмента терма, такие, как перенесение
  курсора из числителя в знаменатель, перенесение курсора при вводе
  пределов суммирования или интегрирования, пе\-ре\-крас\-ка в черный цвет
  линий полностью набранного фрагмента (в процессе набора цвет
  незавершенных дроби, радикала, интеграла и т.п. - малиновый),
  и др. Кроме того, здесь обрабатывается случай завершения набора
  всей формулы с выдачей ре\-зуль\-та\-та. Переходы к соответствующему
  фрагменту - через операторы "иначе 3", "ветвь 1". Для получения
  терма по дереву указателей служит оператор "блокредак\-тора(8
  конец(х14)х18)". Если этот оператор оказывается не в
  состоянии определить терм (ввод заведомо не завершен либо
  происходил с ошибками), то выход из фор\-муль\-ного редактора
  блокируется, и происходит откат к вводу очередной команды.
  Иначе предпринимаются обращения к операторам "блокредактора(9
  $\ldots$)" \ и "блок\-ре\-дак\-тора(1 $\ldots$)", которые находят
  верхнюю и нижнюю строки области, занятой формулой, после чего
  выдается результат.

  в) набору х16 соответствует логический символ "конец" \ (клавиша
  End) либо "следузел" \ (клавиша Page Down). Соответствующие
  процедуры связаны со вводом матрицы: в первом случае ее набор
  завершается и прорисовывается правая скобка матрицы; во втором
  случае - выполняется переход к следующей строке матрицы.

  \par\medskip

  Если набор х16 начинается с символа 5, то была введена скобка.
  Находится последний элемент х17 набора х16 - символ, обозначающий тип
  скобки. Для откры\-ва\-ющей скобки (х17 = "операнд") рассматриваются
  два случая: в скобки заключается новая операция (случай нулевого
  типа первого указателя х20 стэка х14), либо имеет место
  функциональная запись $F(\ldots)$, где выражение $F$ определяется
  первым ука\-за\-те\-лем стэка х14 (тогда тип этого указателя ненулевой).
  В первом случае наличие скобки регистрируется в указателе х20, и
  в начало стэка добавляется его подуказа\-тель х21 - для ввода
  заключенного в скобки выражения. Во втором случае (переход через
  "иначе 3") - сначала находится минимальное осмысленное $F$ в конце
  набранной части, которое и будет рассматриваться как обозначение
  функции. Затем создается указатель х23 с заголовком "значение",
  первый подуказатель которого определяет $F$, а второй есть новый
  указатель х22, содержащий информацию о скобке. Кроме того, для
  ввода аргумента функции в начало стэка х14 помещается
  "пустой" \ подуказатель х21 указателя х22.

  Если набор х16 начинается с символа 6, то вводится цифра либо
  точка. Здесь различаются следующие случаи:

  а) Вводится отдельно стоящая цифра. Тогда тип первого указателя
  х17 стэка х14 равен 0. Если цифра вводится в показателе
  радикала, то переход через "иначе 3", где указатель радикала х19
  с заголовком "корень" \ получает, в дополнение к подуказателю
  х17, сохраняющему введенную степень радикала, также новый
  под\-ука\-за\-тель х20 для ввода выражения под радикалом. Иначе -
  х17 доопределяется в соответствии со введенной цифрой; это
  делает оператор "формблок(десять $\ldots$)".

  б) Продолжается перечисление цифр ранее инициализированного
  числа. Если ранее имелась единственная цифра, то для накопления
  числа вводится указатель х22 с заголовком "величина". Иначе -
  добавляется новый подуказатель ранее созданного указателя
  "величина", хранящий данные о введенной цифре либо точке.

  \par\medskip

  Если набор х16 начинается с символа 7, то вводится модуль, либо
  целая часть, либо инициализируется матрица. Переход к
  инициализации матрицы - через "иначе 1" (в этом случае набор х16
  заканчивается логическим символом "Набор"). Левая черта модуля
  либо левая скобка целой части вводится в ситуации, когда тип
  первого указателя стэка х14 равен 0; правая черта либо правая
  скобка - если этот тип не равен 0 (см. переход через "иначе 2").

  \par\medskip

  Переход к ветви программы, в которой рассматриваются оставшиеся
  случаи для набора х16 - через оператор "иначе 3" \ исходного
  фрагмента обработчика очередного символа (т.е. фрагмента, в
  котором было определено значение х16). Здесь обра\-ба\-ты\-ва\-ются
  случаи, когда х16 равно 0, имеет заголовок 8 или заголовок 9.
  Случаи х16 = 0 и заголовка 9 аналогичны и означают ввод
  переменной (при ручном наборе ввод переменной дает нулевое
  значение х16, при эмуляции набора известного терма оператор
  "модульредактора" \ создает для переменных четверки,
  начинающиеся с 9). Случай заголовка 8 означает ввод символа
  константы.

  \subsection{Прорисовка очередного символа и коррекция
    ранее\\ вве\-ден\-ной части изображения}

  Прорисовка очередного символа формулы выполняется оператором
  "выводсимвола". Он не только обеспечивает вывод символа на
  экран, но и осуществляет необходи\-мую коррекцию параметров
  уже имеющейся части изображения, чтобы для нового символа
  хватило места. Эта коррекция предпринимается в дереве
  указателей и со\-про\-вож\-дается перерисовкой той части формулы,
  которую она затрагивает. Таким образом обеспечивается
  автоматическое удлинение линий дробей и радикалов, сме\-ще\-ние
  вверх или вниз формульной строки, на которой появляется
  "многоэтажная" \ конструкция (например, дробь),и т.п.
  Так как оператор "выводсимвола" \ необхо\-дим для создания
  дерева указателей, он применяется не только в режиме ручного
  ввода формулы, но и при автоматической обработке уже известной
  формулы.

  Выход в начальный фрагмент программы оператора "выводсимвола" \
  возможен либо через оглавление программ (см. соответствующий
  подпункт в разделе фор\-муль\-но\-го редактора), либо непосредственно
  через набор заголовка этой программы в главном меню. Заметим,
  что стэк указателей оператора "формредактор" \ здесь является
  значением переменной х9. Напомним, что начало набора х9 есть
  текущий указатель, каждый следующий указатель является
  надуказателем предыдущего, а конец набора х9 - указатель,
  определяющий всю формулу. Прежде всего, программа определяет
  длину х14 выводимого символа в  8-пиксельных единицах. Находится
  число х16 \ 8-пиксельных позиций, имеющихся в текущей строке после
  позиции кур\-со\-ра.

  Далее рассматривается случай, когда на текущей строке места для
  прорисовки символа не хватает (см. участок после контрольной точки
  "прием(2)"). Инициа\-ли\-зи\-ру\-ется нулем переменная х18, и
  предпринимается просмотр стэка указателей х9 для поиска такого самого
  большого выражения, содержащего вводимый символ, которое вместе
  с этим символом должно помещаться на одной строке. Такие не
  допускающие переноса на новую строку выражения суть: дроби, радикалы,
  мат\-рицы, логарифмы в случае набора первого операнда, а также
  целый ряд других - см. большой оператор "или(входит(х20 $\ldots$)".
  Переменной х18 присваивается вхождение в стэк х9 указателя для
  найденного выражения. Если любое надвыражение вводимого символа
  может быть перенесено через строку, то х18 остается равно 0.
  Затем - переход через "иначе 3".

  Предпринимается обращение к оператору "блокредактора(1
  $\ldots$)", определяюще\-му нижнюю строку х19 той части
  формулы, которая получается при отбрасывании подформулы х18
  (она будет перенесена на следующую строку). Затем с помощью
  оператора "блокредактора(9 $\ldots$)" \ находится верхняя строка
  подформулы х18, опре\-де\-ля\-ется смещение к этой строке от главной
  строки формулы х18, и х19 увеличива\-ет\-ся на это смещение. Таким
  образом находится та строка х19, с небольшим отсупле\-ни\-ем вниз от
  которой будет происхо\-дить прорисовка перенесенной части.

  Если х18 равно 0, то достаточно перенести курсор на новую
  строку. Так как найденная строка х19 определяет лишь верхний
  край расположенных на ней букв, то для определения строки
  курсора к ней прибавляется 22 (19 пикселей - буква и еще 3
  пикселя для промежутка между частями формулы). Столбец курсора
  полагается равным левому краю рамки х1. Если указатель, расположенный
  в начале стэка х9, имел тип 0 и еще не имел подуказателей, то
  координаты его подтерма устанав\-ли\-ва\-ют\-ся по новым координатам
  курсора.

  Если х18 определяло позицию указателя для перенесения части
  формулы на новую строку, то проверяется, что для прорисовки
  нового символа после такого перенесения останется достаточно
  места. Если это не так, то работа процедуры "вы\-вод\-сим\-вола" \
  обрывается. В случае обработки фиктивного символа "развязка"
  \ (руч\-ной переход на новую строку) длина этого символа х14
  заменяется на 0 для про\-дол\-же\-ния действий по перерисовке
  переносимой на новую строку части формулы. Да\-лее используется
  дважды процедура "выводформулы", которая сначала стирает ранее
  прорисованное изображение по указателю х18, а затем прорисовывает
  его с нача\-ла новой строки (как и в предыдущем случае, отступая
  от х19 вниз на 22 пикселя). Эта же процедура обращается к
  "блокредактора(2 $\ldots$)" \ для коррекции параметров поддерева
  указателя х18, чтобы они соответствовали новым позициям символов
  на экране.

  В обоих случаях факт имевшего место перехода к новой строке
  отмечается вводом комментария "выводформулы" \ к посылкам
  исходной задачи.

  \par\medskip

  После перехода к новой строке - откат к переходу через "ветвь 2"
  \ в корневом фрагменте программы. Здесь перехватывается случай
  обработки фиктивного сим\-вола "развязка", и сразу выдается
  результат (новые координаты курсора). В про\-чих случаях - переход
  через "ветвь 1".

  Здесь начинается учет вертикальных размеров прорисовываемого
  символа и кор\-рек\-ция параметров дерева указателей, если места
  по вертикали недостаточно. Преж\-де всего, проверяется, что
  информационный элемент $p$ четверки $(i,r,p,s)$ равен
  ло\-ги\-чес\-кому символу "пустоеслово". Это означает, что символ,
  вообще говоря, не укла\-ды\-ва\-ет\-ся в вертикальные размеры одной
  строки (дроби, радикалы, степени, и пр.). В случае символа
  "степень" \ сразу же происходит определение необходимых для прорисовки
  степенного выражения смещений вверх (х16) и вниз (х17) от
  верхнего и нижнего краев стандартной 19-пиксельной полосы.
  Смещения берутся до гео\-мет\-ри\-чес\-ких границ области, в которой
  будет прорисована вся степень. Они определяются вертикальными
  размерами основания степени, причем в случае смещения вверх
  вво\-дят\-ся дополнительные 9 пикселей (на эту величину будет смещен
  вверх показатель степени). Следующий большой оператор
  "равно(х19 $\ldots$)" \ определяет пару х19 сме\-ще\-ний вверх и
  вниз от верхнего и нижнего краев стандартной полосы уже в общем
  случае; для степени берутся найденные перед этим значения х16, х17.
  Так, в случае дроби пара "(двенадцать десять)" \ означает, что полоса
  числителя смещается вверх по от\-но\-ше\-нию к главной полосе на 12
  пикселей, а полоса знаменателя - вниз на 10. Таким образом,
  между ними остается зазор в 3 пикселя.

  Далее определяется величина х20 смещений вверх и вниз от стандартной
  19-пиксельной полосы, необходимых для прорисовки символа операции.
  Эта величина равна 0 для обычных символов, а для специальных символов,
  вертикальные размеры которых зависят от размеров их операндов
  (интегралы, сигмы, и т.п.), она берется равной своему наименьшему
  значению - 10 пикселям. После этого предпринимается попытка
  усмотреть достаточность пространства по вертикали для прорисовки
  сим\-во\-ла: это заведомо так, если нет надоперации, накладывающей
  ограничения на вер\-ти\-каль\-ные размеры операндов (проверяется с
  помощью справочника "модульредак\-то\-ра"), не было переноса формулы
  на новую строку (проверяется по отсутствию комментария
  "выводформулы"), не было внешней скобки, и расстояния от текущей
  строки до верхней и нижней сторон рамки не меньше, чем этого
  требуют значения в наборе х19.

  Если контроль вертикальных размеров все же необходим, то
  инициализируется пустым словом набор х21, в котором будет
  накапливаться план коррекций парамет\-ров изображения для
  высвобождения достаточного пространства по вертикали. Типы
  элементов этого плана таковы:

  а) набор (указатель - направление вертикального сдвига (0 -
  вверх, 1 либо 2 - вниз) - величина сдвига);

  б) пара (указатель - новая высота его скобки);

  в) пара (указатель - скорректированный набор из информационного
  элемента $A_6$ этого указателя, в котором указаны новые параметры
  изображения соответствующей операции).

 Если строка курсора совпадает с главной строкой указателя в начале
 стэка х9, то для составления плана сдвига происходит просмотр стэка
 указателей слева на\-пра\-во (от подуказателя к надуказателю), с
 выделением тех точек, где операция име\-ет нестандартные размеры по
 вертикали. Для каждой такой точки корректиру\-ют\-ся параметры
 прорисовки операции и переопределяются новые величины сдвига вверх и
 вниз от главной строки операции (номер этой строки передается
 переменной х17; для хранения таких величин сдвига по-прежнему
 используется пара х19). Переход к рассмотрению очередной операции с
 нестандартными размерами по вертикали - через оператор "иначе 5".
 Часть программы, расположенная после этого оператора, связана со
 следующими двумя преобразованиями:

 а) Если текущая операция - инфиксная, то просматриваются ее
 операнды, от\-лич\-ные от текущего набираемого операнда, и
 определяются необходимые для их прорисовки смещения вверх и вниз
 от текущей полосы операции. Если они пре\-вос\-хо\-дят величины, необходимые
 для прорисовки набираемого операнда, то соответ\-ствен\-но корректируется
 пара х19.

 б) Если встречается операция, которая была перенесена на новую
 строку, и рас\-сто\-яние между ее последней и предпоследней строками
 недостаточно (с учетом пер\-вого элемента пары х19), то в план сдвига
 х21 заносятся элементы, определя\-ю\-щие необходимый сдвиг вниз для
 указателей последней строки. Те элементы последней строки,
 которые относятся не к ее операндам, а ко всей операции в целом
 (например, скобки), при этом перерисовываются на экране на новых
 позициях.

 \par\medskip

 Для операции х25 с нестандартными размерами по вертикали
 рассматри\-ва\-ют\-ся следующие случаи (в них х24 - указатель операции,
 х23 - его текущий подуказатель, х17 - главная строка для х23, х26 -
 главная строка для х24):

 а) х25 = "дробь". Если х23 - указатель для числителя дроби, то
 проверяется, достаточно ли расстояние от его главной строки
 х17 до дробной черты (с уче\-том последнего элемнта пары х19),
 и если недостаточно, то в плане сдвига указывается необходимость
 сдвига числителя вверх на соответствующее число пикселей.
 Ана\-ло\-гич\-но для знаменателя. В каждом случае вводятся новые
 значения для указанных в х19 смещений вверх и вниз от главной
 полосы дроби.

 б) х25 = "степень". В этом случае х23 - указатель для показателя
 степени. Если места вниз от показателя недостаточно, чтобы
 набираемые символы находились вы\-ше главной строки основания
 степени, то в плане сдвига указывается на сдвиг по\-ка\-зателя вверх.

 в) х25 = "корень" \ либо "квадркорень". В этом случае в наборе
 $B_3$ инфор\-ма\-ци\-он\-ного элемента $A_6 = ((B_1,B_2),B_3)$ указателя
 радикала содержится информация о смещениях вверх и вниз от главной
 строки, определяющих вертикальные размеры радикала. Если места под
 радикалом оказывается недостаточно, то в копию набора $B_3$ вносятся
 необходимые изменения, и в план сдвига вносится элемент, указывающий
 на необходимость соответствующей коррекции указателя радикала и на
 его пере\-ри\-сов\-ку.

 г) х25 - один из символов списка "суммавсех", "произведениевсех",
 "объеди\-не\-ни\-евсех", "пересечениевсех", "дизъюнкциявсех",
 "конъюнкциявсех", "интеграл", "двойнойинтеграл",
 "тройнойинтеграл". В этом случае коррекция зависит от номера
 подуказателя х23 указателя х24. Если это - первый подуказатель,
 то набирается выражение снизу от знака операции. Тогда
 проверяется достаточность места свер\-ху от х23, и если его
 мало, то в х21 указывается необходимость сдвинуть х23 вниз.
 Аналогично, в случае второго подуказателя (сверху от операции),
 проверяется до\-ста\-точ\-ность места снизу. Наконец, в случае третьего
 подуказателя (основной операнд операции) находятся верхняя и
 нижняя строки всей прорисованной части операции и определяется
 достаточность места в полосе между ними. Если места мало, то
 в копии набора $B_3$ информационного элемента $A_6$,
 определяющего размеры символа, вводятся необходимые изменения.
 В х21 включаются после этого указания на из\-ме\-не\-ние размеров
 символа, а также указания на вертикальные смещения выражений под
 и над символом, связанные с увеличением размеров символа.

 \par\medskip

 При просмотре стэка указателей анализируются все встречающиеся
 указатели со скобкой (см. переход через "ветвь 4" \ из фрагмента
 программы, содержащего цикл просмотра стэка), и если запрос на
 смещения вверх и вниз, определяемый набором х19, превосходит высоту
 скобки, то в х21 вклю\-ча\-ет\-ся задание на увеличение этой высоты.
 Если же встречается скобка, вертикальные размеры которой
 поглощают запросы на смещения вверх и вниз, то просмотр стэка
 обрывается и осуществляется реализация накопленных в наборе х21
 команд на изменение ветви дерева указателей. Это делается в фрагменте
 программы, переход к которому - через оператор "ветвь 3";
 собственно реализацию плана изменений х21 выполняет оператор
 "блокредактора(4 $\ldots$)".

 Если произошел полный просмотр
 стэка х9, то по окончании его - переход через "иначе 2". Здесь
 сначала проверяется, что запрос на смещение вверх не выводит за
 верхнюю границу рамки формульного редактора; если это не так, то
 в х21 вклю\-ча\-ет\-ся задание на соответствующий сдвиг изображения
 вниз. Далее проверяется, что запрос на смещение вниз не выводит
 за нижнюю рамку формульного редактора. Если это не так, то работа
 формульного редактора обрывается с истинностным значением "ложь".
 Наконец, далее происходит реализация плана х21.

 \par\medskip

 Если строка курсора располагалась ниже главной строки первого
 указателя стэка х9, то вместо просмотра стэка - переход через
 "ветвь 1". Этот случай соответствует формуле, для которой имел
 место перенос на новую строку. Соответственно, кор\-рек\-ции по вертикали
 будут затрагивать только последнюю стро\-ку, которую можно независимо
 от расположенной над ней части смещать на не\-об\-хо\-ди\-мое
 расстояние вниз. Сначала определяется самая нижняя линия х22
 изображения, предшествующая перенесенному на новую строку концу
 формулы, затем находится указатель х24, для которого имел место
 перенос, и оператор "блокредактора(6 $\ldots$)" \ корректирует этот
 указатель для сдвига вниз той части формулы, которая лежит на
 последней строке. На экране подтерм по х24 перерисовывается
 с помощью операторов "блокредактора(3 $\ldots$)" \ целиком.

 \par\medskip

 После коррекции вертикальных размеров изображения происходит
 возвращение к фрагменту программы, начинающемуся с операторов
 "ветвь 1 равно(левпозиция(х10 2)пустоеслово)" \ и переход через
 оператор "ветвь 1". Переменной х18 присваивается: в случае выдачи
 переменной - логический символ "переменная", иначе - прори\-со\-вы\-ва\-емый
 логический символ. Далее справочник "терм" \ определяет по
 значению х18 пару (дополнительная информация для справочника
 "выводсимвола", который будет выдавать на экран изображение
 символа - величина сдвига строки к новой позиции курсора после
 выдачи символа). Сразу же определяется новая строка курсора х17.

 Если результат х19 обращения к справочнику "терм" \ ненулевой
 (т.е. символ - специального типа), то переменной х19
 присваивается первый элемент пары х19 (информация для прорисовки
 символа), и переход через "ветвь 1". Иначе - рас\-смат\-ри\-ва\-ются
 следующие случаи:

 а) х18 - логический символ "конец" \ (прорисовка закрывающей
 простой, фигурной либо квадратной скобки, либо второе вхождение
 вертикальной черты модуля). Тогда х19 присваивается информация о
 левой скобке (либо черте модуля) из первого ука\-за\-те\-ля стэка х9, а
 х18 уточняется - заменяется на тот логический символ, для
 которого обращение к справочнику "выводсимвола" \ даст скобку
 нужного типа.

 б) х18 - логический символ "сброс" \ (нажатие клавиши Enter для
 завершения набора всей формулы либо ее фрагмента). Стирается
 курсор, и далее анализируется заголовок х21 первого указателя х20
 стэка х9. Если из него видно, что завершается набор фрагмента,
 после которого следует вернуться к главной строке (например,
 после набора показателя степени, кванторной приставки, индекса
 переменной и т.п.), то корректируется строка курсора х8. В случае
 основания степени, заключенного в скобки, учитывается возможность
 имевшего место переноса его через строку - тогда главная строка
 определяется по позиции закрывающей скобки. В случае радикала
 предпринимается перенесение курсора из позиции для степени радикала
 в первую позицию под радикалом. В случае дроби, у которой набран только
 числитель, про\-ис\-хо\-дит перенесение курсора в знаменатель; если же
 завершается набор знаменателя, то выполняется центровка числителя
 либо знаменателя (в зависимости от того, что из них короче) и
 возвращение курсора в главную строку. Аналогичные действия
 выполняются для операций типа "суммавсех", "интеграл",
 "числосочетаний", и т.п. Во всех перечисленных случаях на новой
 позиции прорисовывается курсор, и вы\-пол\-не\-ние процедуры
 "выводсимвола" \ завершается.

 в) х18 - логический символ "последнийоперанд", причем заголовок
 первого ука\-за\-те\-ля стэка х9 - "Набор". Этот случай означает
 прорисовку закрывающей скобки матрицы. Переменной х19 передается
 информация об открывающей скобке.

 \par\medskip

 После рассмотрения перечисленных случаев - переход через "ветвь
 1" \ того фраг\-мен\-та, в котором происходило обращение к
 справочнику "терм". Здесь убирает\-ся курсор, после чего выполняется
 обращение к справочнику "выводсимвола" \ для фактической
 прорисовки символа на экране. В случае виртуальной прорисовки
 (если создается дерево указателей для уже известного терма) это
 обращение тоже нужно, так как оно определяет первый свободный
 после прорисовки столбец х20. Прежде, чем продолжать действия в
 общем случае (переход через оператор "ветвь 1"), про\-ве\-ря\-ется, не
 имеет ли места переход к новой строке при наборе матрицы
 (соответ\-ству\-ю\-щий нажатию клавиши "курсор вниз" \ символ "спуск" \ и
 заголовок "элементы" \ первого указателя стэка). В этом случае
 корректируется ордината курсора х17. Затем - переход через "ветвь
 1".

 После прорисовки символа может понадобиться увеличение горизонтальных
 раз\-ме\-ров надопераций (горизонтальная черта дроби,
 верхняя черта радикала, гори\-зон\-таль\-ные размеры опе\-раций типа
 "суммавсех", "произведениевсех", объединениевсех" \ при удлинении
 текста над или под ними, и т.д.).
 Сначала предпринимается обраще\-ние к оператору "формблок(7
 $\ldots$)", который просматривает слева направо стэк ука\-за\-те\-лей
 и создает заготовку х21 списка отрезков, которые должны быть
 дорисованы. В этот список включаются лишь простейшие случаи -
 дроби и радикалы. Если встречается более сложный случай операции
 типа "суммавсех", то для него в х21 ничего не заносится, но
 выдается значение х22 = 1, указывающее на необходимость
 специального дополнительного просмотра стэка х9. Такой просмотр и
 реализуется после оператора "равно(х22 1)". Заметим, что для
 сложных операций бывает не\-об\-хо\-ди\-ма не просто дорисовка отрезков,
 но частичная перерисовка отрезков. В зави\-си\-мос\-ти от типа операции,
 для этого сначала стирается старая версия отрезка, а в план х21
 заносится новая его версия. По окончании просмотра стэка х9 -
 переход через оператор "ветвь 1" \ к новому фрагменту, где все
 накопленные в списке х21 отрезки выдаются на экран. Далее
 располагаются операторы, уменьшаюшие абсциссу кур\-со\-ра х20 для
 тех случаев, когда он должен оказаться не правее прорисованной
 операции (под радикалом, над или под дробной чертой, и т.п.).
 Наконец, происходит про\-ри\-сов\-ка курсора и выдаются его координаты.

 \subsection{Блок вспомогательных процедур формульного ре\-дак\-то\-ра}

 Ряд вспомогательных процедур формульного редактора вынесен в
 оператор "блок\-ре\-дактора(х1 $\ldots$)". Первая входная переменная х1
 указывает номер процедуры. Дадим краткое описание этих процедур.

 \begin{enumerate}

 \item х1 = 1. Процедура определяет номер самой нижней строки
 изображения, за вычетом некоторого подтерма этого изображения
 (например, при перенесении формулы на новую строку бывает нужно
 найти нижнюю границу той части, которая остается связана со старой
 строкой). Вся эта процедура включена в реализуемый
 интерпретатором ЛОСа оператор "формблок(1 $\ldots$)".

 \item х1 = 2. Процедура выполняет коррекцию ветви дерева указателей,
 соот\-вет\-ству\-ющую сдвигу по горизонтали и (или) по вертикали. Входная
 переменная х2 имеет своим значением пару ($i j$), где $i=0$
 означает сдвиг влево, иначе - вправо; $j$ - величина сдвига в
 пикселях. Аналогичное значение ($i j$) переменной х3 опре\-де\-ля\-ет
 сдвиг по вертикали ($i=0$ - сдвиг вверх, иначе - вниз). х4 -
 ограничение сверху для номера строки при сдвиге (если оно нарушено, оператор
 ложен); х5 - указатель, определяющий обрабатываемую ветвь. Данная
 процедура бывает нужна и после применения формульного редактора,
 если происходит пе\-ре\-ме\-ще\-ние на экране формулы с уже известным
 деревом указателей. Как и в предыдущем случае, она включена в
 оператор "формблок(2 $\ldots$)".

 \item х1 = 3. Процедура осуществляет прорисовку на экране формулы
 по дереву указателей. х2,х3 - цвет фона и символов; х4 - корень
 дерева указателей; х5 - указатель режима прорисовки: 0 -
 прорисовка не происходит, а вычисляются лишь выходные значения
 х6,х7; 1 - прорисовка выполняется; символьный номер $n$, больший
 единицы - на экране прорисовываются лишь строки с номерами,
 большими $n$. Выход\-ным переменным х6,х7 присваиваются координаты
 курсо\-ра после прорисовки формулы.

 \item х1 = 4. Процедура осуществляет изменение дерева указателей
 в соответствии с уже упоминавшимся выше планом сдвига по
 вертикали при выводе очередного символа. х2,х3 - цвет фона и
 символов; х4 - максимально допустимый номер строки изображения;
 х5,х6 - текущая позиция курсора; х7 - план сдвига; х8 - указатель
 режим прорисовки: 0 - нет прорисовки, 1 - есть прорисовка.
 Выход\-ным переменным х9,х10 присваиваются координаты новой позиции
 курсора.

 \item х1 = 5. Процедура определяет наибольшую ординату точек
 той части изо\-бра\-же\-ния, которая расположена до последней строки
 х3. х2 - корень ветви дерева указателей. Так как программа процедуры
 имеет рекурсивный характер, то используется также входная
 переменная х4, которой присваивается текущее значение наибольшей
 ориднаты, найденное до просмотра указателя х2. Вы\-ход\-ной
 переменной х5 передается скорректированное после просмотра х2
 значение х4. Выходной переменной х6 присваивается значение 0,
 если внутри х2 еще нет строки х3, иначе ей присваивается 1.

 \item х1 = 6. Процедура выполняет коррекцию ветви дерева
 указателей, соот\-вет\-ству\-ю\-щую сдвигу по вертикали вниз части
 изображения, расположенной после заданной строки. х2 - величина
 сдвига в пикселях; х3 - максимально допустимый номер строки; х4 -
 корень дерева указателей; х5 - номер строки, после которой
 происходит сдвиг.

 \item х1 = 7. Процедура выполняет отбрасывание начала стэка
 указателей х2 вплоть до максимального завершенного операнда. Выходной
 переменной х3 передается получаемый укороченный стэк.

 \item х1 = 8. Это - наиболее важная из процедур блока, которая
 осуществляет пере\-ход к терму от дерева указателей. х2 - корень
 дерева указателей, выходной пере\-мен\-ной х3 присваивается терм.
 Если терм определить не удалось, то оператор ложен.

 При определении терма прежде всего, проверяется, равен ли нулю
 тип указателя х2. Если равен, то переход через "иначе 2", где
 проверяется, что этот указатель соответствует взятому в скобки
 подуказателю. Находится терм, определяемый подуказателем, который и
 выдается в качестве результата. Если тип указателя х2 не равен 0, то
 находится его заголовок х4 = $f$, и составляется список х5 термов
 $t_1 \ldots t_n$, определяемых подуказателями указателя х2. Если
 этот список короче списка подуказателей, то выход по значению "ложь".
 В общем случае результат имеет вид $f(t_1 \ldots t_n)$. Однако, имеется
 большое число особых случаев, в которых результат получается из $f$ и
 $t_1, \ldots, t_n$ более сложным образом. Не указывая здесь
 подробный список особых случаев (принципы их обработки
 достаточно легко вычитываются из программы), приведем лишь два
 первых примера из этого списка - если х4 = "квадркорень", то результат
 имеет вид "степень($t_1$ дробь(1 2))"; если х4 = "корень", то
 результат имеет вид "степень($t_2$ дробь(1 $t_1$))", и т.п.

 \item х1 = 9. Процедура определяет номер х3 самой верхней строки
 изображения, определяемого деревом указателей с корнем х2.

 \item х1 = 10. Процедура выполняет стирание изображения символа
 на экране и соответствующую коррекцию горизонтальных размеров
 символов надопераций (например, при стирании последнего символа
 числителя дроби выполняется укорочение дробной черты). х2,х3 -
 координаты позиции, с которой начинается символ; х4 - символ;
 х5 - необходимая для прорисовки символа дополнительная
 информация; х6 - цвет фона; х7 - стэк указателей.

 \item х1 = 11. Процедура выполняет добавление в начале стэка
 указателей цепи подуказателей при откате (определяется, к набору
 какой наименьшей операции следует вернуться), выполняемом для
 текущей инфиксной операции х3 (либо для минуса). х2 - цепь
 указателей.

 \item х1 = 12. Аналог случая х1 = 11, но откат происходит для
 операций другого (не инфиксного) типа.

 \item х1 = 13. Процедура определяет план сдвига вниз элементов
 последней строки, если имел место перенос формулы на новую
 строку. х2 - нижняя линия той части изображения, которая
 расположена до перехода к последней строке; х3 - последняя
 строка; х4 - корень дерева указателей. х5 присваивается
 скор\-рек\-ти\-ро\-ванное значение х2; х6 - набор указателей
 в последней строке, каждый из которых независимо от других должен
 быть сдвинут вниз; х7 - набор до\-пол\-ни\-тель\-ных указаний на сдвиг.
 Каждый такое указание имеет либо вид (1 $A$),где $A$ - указатель
 с правой скобкой, перенесенной через строку (при опускании последней
 строки размеры правой скобки увеличиваются, так что одновременно
 должны быть увеличены и размеры левой скобки), либо вид(2 $a$ $(b,c)$),
 где $a$ - символ, который должен быть сдвинут, но не находится внутри
 указателей списка х6 (например, перенесенный через строку "плюс");
 $(b,c)$ - извлеченная из некоторого указателя пара, определяющая
 координаты символа.

 \end{enumerate}

 \subsection{Блок эмуляции набора формулы с клавиатуры}

 Для автоматического формирования дерева указателей по известному
 терму ис\-поль\-зу\-ется специальный режим формульного редактора. В этом
 режиме определяется такая последовательность ввода символов с
 клавиатуры, при которой будет получено дерево указателей данного терма;
 переход от дерева указателей к терму здесь не нужен и программой не
 ыполняется. Эмуляция набора терма с клавиатуры осу\-щест\-вля\-ет\-ся
 процедурой "модульредактора(х1 х2)". Значением ее входной
 переменной х1 служит вхождение первого символа набираемого терма.
 Выходная переменная х2 при этом перечисляет четверки ($i$ $r$ $p$
 $s$), представляющие собой результаты обращения к справочнику
 "формредактор" \ на тех символах, которые должны были бы
 вводиться с клавиатуры. Оператор "модульредактора" \ реализован
 рекурсивным образом; на очередном уровне рекурсии анализируется
 вхождение некоторой операции, и в за\-ви\-си\-мос\-ти от ее особенностей
 предпринимаются обращения к обработке с его же помощью тех или иных
 вхождений, расположенных внутри этой операции.

 Выход в корневой фрагмент программы "модульредактора" \ - либо
 обычным об\-ра\-зом через главное меню, либо через раздел
 "Вспомогательные процедуры интер\-фей\-сов - Формульный редактор -
 Блок эмуляции набора формулы с клавиатуры" \ оглавления программ.

 Прежде всего, переменной х3 присваивается тот символ, который
 расположен по вхождению х1. Если этот символ представляет собой
 переменную, то процедура "видпеременной" \ находит пару (код
 буквы $s$ для данной переменной - индекс пе\-ре\-мен\-ной); при отсутствии
 индекса второй элемент пары равен 0. Сначала выдается четверка
 (9 1 0 $s$), соответствующая вводу буквы переменной. При запросе
 очередной четверки - переход через "ветвь 4", где анализируется
 наличие индекса. Если индекс имеется, то сначала выдается четверка
 (4 0 пустоеслово спуск), соответствующая нажатию клавиши "курсор
 вниз" \ для перехода к уровню индекса. Затем пере\-чис\-ля\-ют\-ся
 четверки, соответствующие цифрам индекса, и в конце добавляется
 четверка (4 0 0 сброс), соответствующая нажатию клавиши Enter.
 Заметим, что во всех случаях по окончании обработки текущего
 символа х3 происходит переход через "ветвь 2" \ к фрагменту,
 проверяющему, не является ли текущее обрабатываемое вхождение х1
 корневым (это будет выполнено для первого обращения к процедуре и
 не выполнено при рекурсивных обращениях). Если оно корневое, то
 выдается завершающая набор всего терма четверка (4 0 0 сброс).
 Иначе - перечисление обрывается без выдачи такой четверки.

 Если символ х3 не является символом переменной, то из начального
 фрагмента через "иначе 3" \ переходим к фрагменту, проверяющему,
 не происходит ли при про\-ри\-сов\-ке этого символа использование
 обозначения некоторого другого символа. На\-при\-мер, при
 прорисовке сложения векторов используется тот же знак "плюс", что
 и для сложения чисел. Здесь используется справочник "Замена";
 если он выдает ненулевой результат х4, то первоначальный символ
 х3 заменяется на новую его версию х4 (заметим, что с этого
 момента х3 уже не будет равен символу по вхождению х1).

 Далее, переходя через "ветвь 1", попадаем в фрагмент, первый
 оператор которого обращается к справочнику "блокредактора" \ для
 символа х3 и получает от него значение х4 - первые три элемента
 ($i$ $r$ $p$) той четверки ($i$ $r$ $p$ х3), которая соответствует
 вводу символа х3 с клавиатуры (прямому либо с помощью кодовых
 комбинаций клавиш). Предпринимается проверка, что х4 не равно 0,
 причем вхождение х1 не является бесскобочным вхождением
 логического символа, отличного от специальных случаев таких
 вхождений, допустимых для формульного редактора (символы цифр,
 запятая, константы "е", "пи", вспомогательные символы "максимум",
 минимум", используемые для указания типа экстремума, и т.п.).
 Если это не так, то проверяется, не выдается ли на экран терм,
 определяющий вид некоторого другого терма и ис\-поль\-зу\-ющий операцию
 "запись" \ (как это принято в ЛОСе). Если последний случай
 распознается, то для него генерируется соответствующая
 последовательность чет\-ве\-рок, иначе - выдается значение 1,
 указывающее на невозможность отображения терма формульным
 редактором. Если же первое условие (х4 не равно 0 и т.д.)
 выполнено, то переход через "иначе 1" \ для дальнейшей обработки
 символа х3. Здесь начинается разбор случаев для типов $i$ символа
 х3:

 \begin{enumerate}

 \item Прежде всего, рассматривается случай, когда $i=2$, причем
 х3 не есть символ "минус". Это - случай инфиксных операций.
 Состаавляется список х5 вхож\-де\-ний операндов операции х3 (до этого
 особо рассматривается случай симво\-ла "вариант"), и
 последовательно просматриваются позиции х6 этого списка. Для
 текущей позиции прежде всего определяется, будет ли
 соответствующий операнд заключаться в скобки. Индикатор наличия
 скобки - переменная х7 (х7 =1 означает наличие скобки). Это
 делается исходя из сравнения числовых характеристик "силы" \
 связи между операндами для различных инфиксных операций,
 получаемых с помощью справочника "блокредактора". Если скобка
 нужна, то перечисление для текущего операнда начинается с
 четверки (5 1 0 операнд) для открывающей скобки, а завершается
 четверкой (5 1 0 послед\-ний\-опе\-ранд) для закрывающей. После набора
 операнда выдается четверка для очередного вхождения инфиксной
 операции (кроме случая последнего опе\-ран\-да), причем в случае х3 =
 "умножение" \ анализируется необходимость про\-ри\-сов\-ки умножения
 в виде точки. Точке соответствует четверка (2 1 1 умножение),
 отсутствию точки - (2 0 1 умножение).

 \item Либо $i=1$, либо х3 = "минус". Это - случай префиксных
 операций либо символьных констант. Программа содержит большое
 число независимых ветвей для конкретных символов х3. В общем, они
 не содержат сколь-нибудь инте\-рес\-ных моментов, кроме следующих
 двух: отделение символами умноже\-ния операндов для выражений типа
 $\triangle(ABC)$ (они распознаются при помощи спра\-вочника
 "кортеж") и определение случаев, когда операнд одноместной
 опе\-ра\-ции заключается в скобки. В частности, для этого применяется
 справочник "пря\-мо\-е\-про\-изведение".

 \item $i=3$. Набирается степень. Прежде, чем набирать ее "в общем
 виде", пред\-при\-ни\-маются попытки усмотреть квадратный корень,
 радикал степени от 3 до 9 и экспоненту.

 \item $i=6$. Набирается десятичное число.

 \item $i=7$. Набирается выражение для числового промежутка,
 модуля, целой час\-ти, конечного перечня, и т.п.

 \item $i=8$. Набор символьных констант либо конечных отрезков
 целых чисел.

 \item $i=10$. Набор производной либо частной производной.

 \item $i=11$. Некоторые специальные логические обозначения.

 \end{enumerate}

 \section{Программа текстового редакто\-ра}

 Хотя программа текстового редактора - явление достаточно
 тривиальное, все же в нее включены фрагменты "чужих"
 \ интерфейсов, обращающихся к данной программе. Поэтому ее также
 приходится время от времени корректировать и по\-пол\-нять.
 Со\-от\-вет\-ственно, несколько более подробное описание ее устройства
 может оказаться весьма полезным.

 Текстовый редактор реализован оператором "текстредактор(х1 х2 х3
 х4 х5 х6 х7 х8)". Входные данные суть: х1 - номер позиции буфера
 текстов, начиная с которой будут размещаться символы, вводимые
 в рамке редактирования (начинающийся с х1 отрезок буфера текстов
 взаимно-однозначно сопоставлен позициям рамки, согласно обычному
 принципу переноса на новую строку); х2,х3,х4,х5 - координаты
 рамки редактирования в пикселях; х6 - цвет фона; х7 - цвет
 символов. Выходной переменной х8 присваивается по завершении
 редактирования номер последней занятой вве\-ден\-ны\-ми символами позиции
 буфера текстов. Если при обращении положить значение х7 равным
 логическому символу 0 либо символу "метка", то перед
 редактиро\-ва\-ни\-ем сохраняется старое изображение, иначе рамка
 редактирования расчищается. Рас\-чист\-ка буфера текстов в начале
 редактирования не выполняется, и при необходи\-мос\-ти ее надо выполнить
 отдельно.

 Интерфейс текстового редактора уже был описан выше, поэтому
 сразу перейдем к рассмотрению его программы. Вход в начальный ее
 фрагмент - либо через главное меню, либо через пункт
 "Вспомогательные процедуры интерфейсов - Текстовый редактор" \
 оглавления программ.

 Прежде всего, драйвер клавиатуры переводится в режим кириллицы.
 Затем пред\-при\-нимается расчистка рамки редактирования (кроме
 указанных выше случаев спе\-циальных значений х7). Координаты х4,х5
 правого нижнего угла рамки кор\-рек\-ти\-ру\-ются так, чтобы по ее
 размеры по вертикали были кратны 19, а по горизонтали - 8.
 Переменной х7, если она до этого не указывала цвет символов,
 присваивается значение 1, соответствующее черным символам.
 Инициализируются координаты х9, х10 текущей позиции курсора
 (изначально - по левому верхнему углу рамки). Ини\-ци\-ализируется
 указатель х11 позиции буфера текстов, соответствующей текущей
 позиции курсора. Если исходная задача имела комментарий к посылкам
 (теквхожд \\ $A_1$ $A_2$), указывающий на ту позицию курсора, с которой
 нужно войти в редакти\-ро\-ва\-ние, то значения х9,х10,х11 корректируются
 согласно данному комментарию, а сам он удаляется. Затем - переход
 через "ветвь 2".

 Здесь инициализируется переменная х12, сохраняющая информацию о
 текущей выполняемой операции, требующей нескольких нажатий клавиш
 (удаление фраг\-мен\-та текста, режим вставки, перенесение фрагмента
 текста либо сохранение его в буфере). Ее значением служит набор,
 первый элемент которого указывает на опе\-ра\-цию либо на ее этап.
 Если он равен 0, то специальная операция отсутствует; 1 - режим
 вставки; 2 - удаление; 3 либо 4 - перенесение фрагмента текста;
 "десять" \ - регистрация фрагмента текста в буфере. Последний
 элемент набора х12 определяет величину шага курсора: если он
 равен 0, то курсор сдвигается по горизонтали либо вертикали на
 размеры одной буквы, иначе - на размеры 8-буквенной цепочки.
 После инициализации х12 расположен оператор "повторение", к которому
 будут про\-ис\-хо\-дить откаты при запросе очередной команды.

 Прежде всего, считывается символ х13 с текущей позиции буфера
 текстов, и этот символ прорисовывается на экране на позиции курсора.
 Цвет фона здесь является цветом курсора и выбирается в зависимости
 от того, какая операция выполняется, цвет символа равен х7. Далее
 происходит обращение к оператору "клавиатура" \ для ввода
 очередной команды х16. Если текущая позиция буфера текстов была пустая,
 то цветовые ее атрибуты переустанавливаются согласно х6,х7. Затем
 восстанавливается цвет фона х6 на текущей позиции курсора - кроме
 случаев, когда на этой позиции следует удерживать особый цвет фона
 до завершения начатой операции.

 Если заголовок х12 равен 0 (отсутствует режим специальной
 операции) и исходная задача имеет комментарий к посылкам "слово",
 указывающий на режим перевода нажатия клавиатуры в логический
 символы, кодирующий нажатую клавишу, то данный комментарий удаляется,
 на экране прорисовывается с текущей позиции наз\-ва\-ние символа,
 корректируются х9,х10,х11, и откат к запросу очередной команды.
 Заметим, что данный режим бывает нужен в редакторе программ при
 определении символа, соответствующего нажатию той или иной
 клавиши. Если такой режим не имел места, то переход через "ветвь
 1". Здесь начинается цепь подслучаев для различных команд х16:

 \begin{enumerate}

 \item х16 = "циклвариантов". Нажата клавиша "курсор влево".
 В режиме вставки команда игнорируется. Иначе происходит коррекция
 значений х9,х10,х11, со\-от\-вет\-ствующая одному шагу влево. Здесь
 возможны два режима: если конец набора х12 равен 0, то шаг
 делается на 8 пикселей (горизонтальный размер одной буквы). При
 этом из крайней левой позиции строки делается переход на крайнюю
 правую позицию предыдущей строки. Если же конец набора х12 не
 равен 0, то имеет место режим увеличенного шага, равного сразу 8
 размерам буквы. Здесь переход на предыдущую строку не
 выполняется.

 \item х16 = "внешконъюнкция". Нажата клавиша "курсор вправо".
 Обрабатывается аналогично предыдущему.

 \item х16 = "внешсумма". Клавиша "курсор вверх"; аналогично
 предыдущему.

 \item х16 = "подстановка". Клавиша "курсор вниз"; аналогично
 предыдущему.

 \item х16 = "тринадцать". Клавиша Enter, завершающая
 редактирование. В режиме вставки символов игнорируется. Обращение
 к оператору "видео(текстредактор $\ldots$)" \ позволяет определить
 последнюю позицию х21 буфера текстов (после начальной позиции
 х1), содержащую символ, прорисовываемый на экране "не\-пус\-тым" \
 образом. Если этот символ - искусственно введенный нажатием
 кла\-ви\-ши F9 указатель конца текста "нормсуп", то он заменяется на
 символ пробела. После этого выдается результат х21.

 \item х16 = "копияблокаанализа". Клавиша F4, используемая в
 текстовом редакторе для вызова справочника по системе (F1 занято
 как клавиша поиска парной скобки).

 \item х16 = "элементы". Клавиша F8, используемая для перехода в
 режим трансляции нажатия очередной клавиши в логический символ - код
 этой клавиши. Ука\-за\-те\-лем режима служит комментарий "слово" \ к
 посылкам исходной задачи.

 \item х16 = "8". Нажата клавиша Backspace. Если имел место режим
 вставки, то восстанавливается обычный режим, а содержимое буфера
 текстов, рас\-по\-ло\-жен\-ное после позиции вставки, перерисовывается на
 экране. Такая перерисов\-ка необходима для восстановления правой части
 текущей строки, пропавшей с экрана при вставке. Если имел место
 режим удаления либо регистрации фраг\-мен\-та текста в буфере, то
 восстанавливается обычный режим и удаляется вве\-ден\-ный в начале
 операции цветной маркер. Если имел место режим перенесения
 фрагмента на новое место, то удаляется последний введенный до
 этого цветной маркер. Если цветной маркер был единственный, то
 восстанавливается обыч\-ный режим, иначе - режим перенесения
 фрагмента сохраняется, но х12 кор\-рек\-ти\-ру\-ется на случай одного
 оставшегося маркера. Наконец, в обычном режиме происходит откат
 курсора на предыдущую позицию и занесение нуля на со\-от\-вет\-ству\-ющую
 позицию буфера текстов.

 \item х16 = "внешдизъюнкция". Нажата клавиша Insert,
 инициализирующая либо завершающая режим вставки. Если заголовок
 набора х12 равен 0, то опреде\-ля\-ет\-ся последняя позиция х21 буфера
 текстов, на которой находится "непустой" \ символ, и указатель
 режима х12 заменяется на (1 х21 0). Если же имел мес\-то режим
 вставки, то восстанавливается обычный режим и происходит
 пере\-ри\-сов\-ка части текста, расположенной после точки вставки.

 \item х16 = "соответвхожд". Нажата клавиша Delete. Если имел
 место обычный режим, то указатель режима х12 заменяется на
 набор (2 - столбец курсора - строка курсора - позиция буфера
 текстов - 0), инициализирующий режим удаления с прорисовкой
 красного маркера на текущей позиции. Если же режим удаления уже
 был включен (начало набора х12 равно 2), то находится со\-хра\-нен\-ная
 в х12 позиция х17 начала удаляемой части в буфере текстов.
 Проверяется, что она предшествует текущей позиции х11. Затем
 находится последняя не\-пус\-тая позиция х22 буфера текстов, и
 происходит исключение отрезка буфера текстов с х17 по х11, причем
 перед х22 вставляется такое же число пустых символов с соответствующим
 цветом фона. Текущая позиция устанавливается по маркеру начала
 удаленного отрезка, происходит перерисовка с этой позиции
 оставшейся части текста, и восстанавливается обычный режим.

 \item х16 = "Плюс". Нажата клавиша Esc, приводящая к отказу от
 редактирования.

 \item х16 = "9". Нажата клавиша Tab, осуществляющая смену малого
 шага курсо\-ра на большой и обратно. Изменяется последний элемент
 набора х12.

 \item х16 = "приведение". Нажата клавиша Home. Курсор сдвигается
 к левому краю строки, соответственно корректируется текущая
 позиция х11 буфера текстов.

 \item х16 = "группировки". Нажата клавиша End. Курсорв сдвигается
 к правому краю строки.

 \item х16 = "Текзадача". Нажата клавиша Ctr-F4. Происходит
 циклическая смена цвета фона х6 (цвета нумеруются от 1 до 16).

 \item х16 = "текуровень". Нажата клавиша Ctr-F5. Происходит
 циклическая смена цвета символов х7.

 \item х16 = "узелраздела". Нажата клавиша F3. Выдается краткая
 подсказка отно\-си\-тель\-но команд текстового редактора.

 \item х16 = "стандменьше". Нажата клавиша F1. Если на текущей
 позиции х11 буфера текстов находится скобка, то переменной х17
 присваивается позиция буфера текстов для парной скобки (если
 такую скобку удается найти). На\-хо\-дят\-ся координаты позиции х17 на
 экране, курсор переводится на эту позицию, и х11 присваивается
 значение х17.

 \item х16 = "попыткапараметризации". Нажата клавиша F2. Если имел
 место обыч\-ный режим (заголовок набора х12 равен 0), то
 инициализируется режим пе\-ре\-не\-сения фрагмента текста на новое
 место. При этом х12 заменяется на на\-бор (3  - столбец курсора -
 строка курсора - текущая позиция в буфере текстов - 0). Если
 режим перенесения уже был инициализирован, но отмечено только
 начало переносимого фрагмента (заголовок набора х12 равен 3), то
 проверяется, что текущая позиция в буфере текстов расположена не
 раньше выделенного начала, заголовок набора х12 меняется на 4, и
 после указателя текущей позиции начала фрагмента в буфере текстов
 в набор х12 вставляется тройка (столбец курсора - строка курсора
 - текущая позиция в буфере текстов), отмечающая конец
 переносимого фрагмента. Наконец, если уже выделены начало и
 конец пе\-ре\-но\-си\-мо\-го фрагмента (заголовок набора х12 равен 4), то
 проверяется, что текущая позиция х11 не расположена внутри
 фрагмента, после чего реализуется пере\-ста\-нов\-ка фрагмента в
 буфере текстов, установка курсора по началу изменяемой части
 изображения и перерисовка с этой позиции остатка текста. Далее
 вос\-ста\-нав\-ли\-ва\-ется обычный режим.

 \item х16 = "фиктопер" \ либо х16 = "простоенеравенство".
 Соответственно, нажа\-ты клавиши F6 либо F7. В первом случае
 оператор "видео(исключение $\ldots$)" \ исключает ровно одну
 строку из буфера текстов, начиная с текущей позиции, во втором -
 оператор "видео(сборкнабора $\ldots$)" \ вставляет ровно одну
 строку, заполненную символами пробелов. Затем предпринимается
 перерисовка текста, начиная с текущей позиции.

 \item х16 = "путьвхождения". Нажата клавиша Ctr-F9.
 Предпринимается включе\-ние либо выключение (с помощью ввода либо
 удаления комментария "биключ" \ к посылкам исходной задачи)
 дополнительного драйвера клавиатуры, пере\-во\-дя\-щего нажатия
 латинских клавиш в условно соответствующие им буквы кириллицы.
 Эта возможность бывает полезна для клавиатуры, не имеющей
 кириллицы.

 \item х16 = "точкапривязки". Нажата клавиша Page Down. Если имел
 место обычный режим (заголовок набора х12 равен 0), то
 инициализируется режим регист\-ра\-ции фрагмента текстов в буфере
 текстового редактора. При этом х12 заменя\-ет\-ся на набор (десять -
 столбец курсора - строка курсора - текущая позиция в буфере
 текстов - 0), указывающий на начало заносимого в буфер фрагмента.
 Если же режим регистрации фрагмента уже был инициализирован, то
 удаля\-ет\-ся синий цветовой маркер начала фрагмента,
 восстанавливается обычный режим, проверяется, что текущая позиция
 расположена не раньше начала фраг\-мен\-та, и предпринимается
 регистрация фрагмента в буфере текстового ре\-дак\-то\-ра с помощью
 оператора "видео(извлекается $\ldots$)". Заметим, что роль буфера
 текстового редактора играет массив, доступ к которому
 осуществляется только на уровне интерпретатора ЛОСа.

 \item х16 = "контрольунификации". Нажата клавиша Page Up.
 Проверяется, что имеет место обычный режим, и в буфер текстов
 начиная с текущей позиции х11 вставляется содержимое буфера
 текстового редактора. Затем предпринимается перерисовка текста
 начиная с текущей позиции.

 \item х16 - один из символов "новыйузел", "конъюнктоперанд",
 "записьзадачи", "эле\-ментызадачи", "стрелкапирса". Они
 соответствуют специальным ко\-ман\-дам ре\-дак\-тора приемов
 (нажатия клавиш Ctr-з,Ctr-у,Ctr-х (кир.), Shift-1, Shift-3).
 Вызов этих команд из текстового редактора служит для
 автомати\-чес\-кой встав\-ки в редактируемый текст различных кодовых
 фрагментов. Про\-грам\-ма про\-ве\-ряет, что имеет место использование
 текстового редактора в процессе ре\-дак\-ти\-ро\-вания одного из окон
 описания приема (комментарий "учет\-по\-ка\-за\-те\-ля" \ к посылкам
 исходной задачи); в случае клавиш Shift-1,Shift-3 про\-ве\-ряется
 условие на номер окна, после чего подготавливается прерывание
 тек\-стового редактирования: создается комментарий (теквхожд $\ldots$) к
 посылкам исходной задачи, содержащий информацию, необходимую для
 последующе\-го про\-дол\-же\-ния редактирования; содержимое буфера
 текстов сохраняется в до\-пол\-ни\-тельном буфере, и происходит
 выход из программы текстового ре\-дак\-то\-ра. Ин\-фор\-мация о команде х16
 сохраняется в том же комментарии (теквхожд $\ldots$); эта команда
 будет передана через данный комментарий программе редактора
 приемов. Например, в случае х16 = "конъюнктоперанд" \ произойдет
 выход в оглавление фильтров ГЕНОЛОГа, а после выбора концевого
 пункта данного оглавления будут реализованы восстановление на экране
 сохраненного в до\-пол\-ни\-тельном буфере текста, добавление к нему текста
 шаблона фильтра для выбранного концевого пункта и возвращение в
 текстовое редактирование.

 \item х16 = "список". Нажата клавиша F9 - указатель на то, что
 пустой отрезок в конце текста вплоть до текущей позиции должен
 быть включен в область редактирования. Здесь предпринимается
 замена значения х16 на логический символ "нормсуп", используемый
 в качестве специального указателя конца тек\-ста (прорисовывается
 как $\bot$), и переход через "ветвь 1" \ к продолжению об\-ра\-ботки
 команды х16.

 \item х16 - один из логических символов "транслвыражения",
 "конъюнктоперанд", "кортеж", "утверждение" (клавиши Ctr-a,Ctr-e,
 Ctr-n,Ctr-v, все - лат.). В этом случае вводится символ,
 соответственно, квантора общности, существования, отрицания и
 дизъюнкции. х16 изменяется так, как это нужно для прорисов\-ки
 указанных символов, и переход через "ветвь 1".

 \item Проработка общего случая  - введенный символ х16
 регистрируется на текущей позиции. Предварительно проверяется, не
 был ли включен режим допол\-ни\-тель\-ного драйвера перевода латинской
 клавиатуры в кириллицу, и если был, то х16 корректируется в
 соответствии с этим драйвером, через комментарий (текстредактор
 $\ldots$) к посылкам исходной задачи. Затем отдельно
 рассмат\-ри\-ва\-ют\-ся два случая - наличие общего режима (заголовок х12
 равен 0) и режима вставки (заголовок равен 1). В первом случае
 символ х16 заносится на текущую позицию буфера текстов и
 прорисовывается на экране вместо курсора; если позиция в рамке
 редактирования не последняя и х11 не выходит за рамки буфера
 текстов, то х11 увеличивается на 1 и предпринимается сдвиг
 позиции курсора для ввода следующей буквы. Во втором случае
 предпринимается сдвиг на одну позицию вправо содержимого буфера
 текстов для осво\-бож\-де\-ния пози\-ции х11 и одновременный сдвиг вправо
 текущей строки на экране, начиная с текущей позиции (оператор
 "видео(вставка $\ldots$)"). На высвободившуюся по\-зи\-цию в буфере
 текстов и на экране заносится буква х16. Далее, как и в первом
 случае, если позиция в рамке редактирования не последняя,
 происходит уве\-ли\-че\-ние х11 на единицу и сдвиг позиции курсора.
 Если курсор переносится на новую строку, то предварительно
 предпринимается перерисовка всей остав\-шей\-ся части текста (для
 отображения на экране "спрятанной" \ при вставке правой части
 текущей строки).

 \end{enumerate}

 \section{Программы геометрического и текст\-фор\-муль\-но\-го ре\-дак\-то\-ров}

 Интерфейсы и основные структуры данных геометрического и
 текстформульного редакторов были описаны выше; программы их в
 принципиальном плане достаточно просты, так что здесь мы
 ограничимся лишь очень кратким описанием их устройства.

 Программа геометрического редактора реализуется оператором
 "геомредактор(х1 х2 х3 х4 х5 х6 х7 х8)", у которого х1-х4
 определяют прямоугольную рамку чертежа; х5,х6 - цвет фона и
 линий; х7 - описание чертежа; х8 - указатель на режим изменения
 (1) либо только прорисовку чертежа. Описание чертежа представляет
 собой пару, первый элемент которой перечисляет пятерки
 (переменная, обозначающая точку - столбец точки - строка точки -
 столбец буквы, обозначающей точку - строка буквы, обозначающей
 точку), причем координаты в пикселях берутся не относительно
 рамки чертежа, а относительно всей рамки экрана. Второй элемент
 пары перечисляет (уже в терминах переменных, обозначающих точки)
 элементы чертежа, которые должны быть прорисованы - отрезки,
 окружности, и т.п. В этом же элементе могут сохра\-нять\-ся указатели
 на измененные размеры рамки чертежа.

 Программа геометрического редактора прежде всего удаляет из
 описания чер\-те\-жа указатели на имевшее место изменение рамки,
 после чего переключает драй\-вер кла\-ви\-а\-ту\-ры на режим латиницы.
 Затем вводится копия х9 описания чертежа х7, с которой и будет
 происходить работа при редактировании чертежа. Инициализиру\-ет\-ся
 нулем указатель х10 режима работы геометрического редактора
 (ввод новых точек, проведение отрезков, и т.д.). Инициализируются
 нулями вспомогатель\-ные регистры х11,х13, используемые для
 сохранения информации о точках в операциях, применяемых к нескольким
 точкам (в частности, х13 указывает обозначение "теку\-щей точки",
 которую можно сдвигать курсорами); инициализируется пустым словом
 накопитель х12 переменных - обозначений точек. Если этот накопитель
 непуст, то для новой точки обозначение берется из него, иначе -
 выбирается первая неисполь\-зо\-ван\-ная большая буква. Далее располагается
 оператор "повторение", к которому происходят откаты для перерисовки
 чертежа.

 Перерисовка начинается с расчистки рамки чертежа. Затем
 последовательно про\-смат\-риваются подлежащие прорисовке элементы
 х15 из описания чертежа, и спра\-воч\-ник "геомредактор" \ выполняет
 их прорисовку. После этого просматриваются все точки из описания
 чертежа, и изображаются соответствующие им буквы. Если х8 равно
 0, то восстанавливается режим кириллицы для драйвера клавиатуры,
 и работа геометрического редактор обрывается. Иначе - голубым
 цветом обозначается рамка чертежа, в правом верхнем углу этой
 рамки отделяется небольшой прямоугольник, и в нем размещается
 логический символ, указывающий режим редактирования. Если
 указатель режима х10 равен 0, то прямоугольник остается пустым.

 Далее идет оператор "повторение", к которому осуществляются
 откаты для за\-про\-са очередной команды х15. После него - обычная
 цепочка обработки этой команды. Мы не будем подробно описывать
 реализацию этих команд, так как она в боль\-шин\-ст\-ве случаев весьма
 проста. Для операций, изменяющих координаты точек (даже для
 сдвига одной точки на один пиксел), предпринимается полная
 перерисовка чертежа. В общем, необходимости ускорять такую крайне
 неэкономную схему пока не воз\-ни\-ка\-ло. Сохранение элементов,
 связывающих точки линиями чертежа, приводит к тому, что при
 перемещениях точек большая (но не вся) часть чертежа также
 корректируется. Разумеется, данную, по существу, очень примитивную
 версию гео\-мет\-ри\-ческого редактора можно было бы довести в рамках
 описанной структуры данных до весьма высокого уровня, однако для той
 цели, для которой она была создана - для снабжения чертежами
 школьных планиметрических задач на вычис\-ле\-ние - она и сейчас вполне
 достаточна. Развитие системы пошло не по пути усиления ручного
 интерфейса редактирования чертежей, а по пути их автоматического
 пост\-ро\-ения.

 Программа текстформульного редактора реализуется оператором
 "текстформ(х1 х2)". Здесь х1 - текстформульная структура,
 определяющая форматированный текст с вставленными формулами и
 чертежами; х2 - набор информационных элементов, определяющих
 режим работы текстформульного редактора. Типы информационных
 элементов в х1 и х2 были определены выше, при описании
 основных процедур ин\-тер\-фейса логической системы.

 Корневой фрагмент программы "текстформ" \ прежде всего создает в
 верхней части экрана меню для работы с тексформульным редактором
 (кроме случаев, когда при обращении не предусмотрена работа в
 диалоговом режиме). Если текст\-фор\-муль\-ный редактор используется
 для просмотра результатов грамматического анализа текста, то
 берется специальное меню. Затем определяется номер х3 нижней
 строки той области, которая выделена для редактирования, и
 переход через "ветвь 2".

 Инциализируются переменная х4, которая хранит номер текущей
 строки, а также переменная х5, хранящая номер первой свободной
 строки. Инициализируется эк\-ран\-ная структура х6, описывающая
 полосы изображения (формат ее элементов был описан там же, где
 и типы элементов в х1,х2). Инициализируется единицей номер х7 той
 полосы экранной структуры, с которой начинается прорисовка на
 экране. Проверяется наличие в х2 элемента (видео $\ldots$); если
 он есть, то х5,х6,х7 кор\-рек\-ти\-ру\-ются на значения, указанные в этом
 элементе. Далее переход через "ветвь 1".

 Здесь размещен оператор "повторение", к которому происходят
 откаты при пе\-ре\-ри\-сов\-ке изображения. Сначала предпринимается
 прорисовка тех элементов изо\-бра\-же\-ния, которые уже представлены в
 экранной структуре. Затем - переход через "ветвь 1" \ к циклу
 продолжения прорисовки за счет тех элементов текстформульной
 структуры, которые следуют после последнего элемента, учтенного в
 экранной струк\-туре. После дорисовки проверяется наличие в х2 элемента
 (высотаполосы $\ldots$). Если он есть, то в нем регистрируется
 высота полосы, востребованной для прорисовки (заметим, что в данном
 случае фактической прорисовки на экране не происходит), и выход из
 редактора. Далее проверяется наличие элемента "выход", который
 также обрывает работу редактора. Наконец, при отсутствии
 указанных элементов - вход в цикл обращений к оператору
 "автоменю(х10)" для ввода команд. Перед циклом инициализируются
 нулями вспомогательные переменные х8,х9. Значением х8 будет далее
 служить ссылка на левый край выделенного элемента текст\-фор\-муль\-ной
 струк\-туры, к которому относится команда х10; х9 - используется
 при форматировании текста. Процедуры обработчика команд легко
 анализируются с учетом ранее при\-ве\-ден\-ных описаний форматов
 данных; начальные точки обработки команд указаны в оглавлении программ
 (раздел "Вспомогательные процедуры интерфейсов - Текст\-формульный
 редактор - Цикл обращений к клавиатуре").


 \chapter{Программа редактора программ}

 Хотя вносить изменения в программу редактора программ ЛОСа
 приходится крайне редко, в этих особых случаях описание ее процедур
 может оказаться необходимым. Кроме того, такое описание будет
 полезно для попыток общего усовершенствования интерфейса
 редактирования программ на ЛОСе.

 В главе "Программы общего интерфейса системы" \ (подраздел
 "Обращение к редак\-тору ЛОСа" \ раздела "Главное меню") была
 описана начальная часть про\-грам\-мы ре\-дак\-то\-ра программ. В этой части
 произошла прорисовка фрагмента программы и ини\-ци\-али\-зированы
 следующие программные переменные: х13 - логический символ, программа
 которого редактируется; х11 - номер выделенного оператора перехода
 текущего фраг\-мента (не символьный номер, а десятичное число);
 х12 - набор троек, определяющий путь к текущему фрагменту программы от
 ее корня (первые два элемента тройки - ссылка на фрагмент в блоке
 программ, последний элемент - номер перехода от него к подфрагменту;
 корень соответствует началу набора х12); х14 - набор ссылок на
 отключенные при редактировании, но пока не удаленные ветви программы;
 (х15,х16) - ссылка на текущий фрагмент; х17 - сам фрагмент; х18 - набор
 определяющих прорисовку на экране операторов перехода текущего
 фрагмента пя\-те\-рок (столбец - строка - вхождение оператора перехода
 в фрагмент программы - исходная позиция в буфере текстов текста этого
 оператора - заключительная его позиция); х19 - вхож\-де\-ние в х18
 пятерки для текущего оператора перехода, либо 0 при отсутствии
 переходов. Кроме того, произошло обращение к оператору "автоме\-ню(х21)"
 \ для ввода очередной команды х21. В данной главе мы приведем описание
 действий, выполняемых про\-грам\-мой при обработке команды х21.

 \begin{enumerate}

 \item х21 - либо "внешконъюнкция", либо "циклвариантов" (клавиши
 "курсор впра\-во" \ и "курсор влево"). Происходит переход к
 следующему либо предыдущему оператору перехода (текущий оператор
 выделен желтым цветом фона). Про\-веряется, что х19 не равно 0 и
 имеет в наборе х18 соседа, соответственно, справа либо слева.
 Затем корректируется х11, цвет фона старого оператора перехода делается
 белым, а нового оператора  - желтым, и переменной х19 присваивается
 вхождение х22 в х18 пятерки для нового оператора перехода.

 \item х21 = "подстановка". Нажата клавиша "курсор вниз". Если х19
 не равно 0, то происходит переход к подфрагменту для текущего
 оператора перехода. К началу набора х12 добавляется тройка (х15
 х16 х11), указывающая на прой\-ден\-ный фрагмент программы.
 Переменной х22 присваивается текущий оператор перехода. Если он
 соответствует реальному переходу, то имеет два операнда -
 логических символа х23 и х24, определяющих ссылку на подфрагмент.
 В этом случае значения х15 и х16 заменяются на х23,х24;
 переменной х11 (указате\-лю номера выделенного оператора перехода)
 присваивается 1, и откат к прорисовке подфрагмента. Если же
 переход - недоопределенный, то оператор х22 имеет лишь один
 операнд - номер такого перехода (он является нелокальным и
 от\-ли\-ча\-ется от прорисованного на экране локального номера перехода).
 Нелокальный номер прорисовывается в левом верхнем углу экрана,
 х15 заменяется на вхож\-де\-ние левого края исходной задачи (чтобы
 указать на отсутствие фргамента, к прорисовке которого произойдет
 откат), и откат к прорисовке пустого фраг\-мен\-та.

 \item х21 = "внешсумма". Нажата клавиша "курсор вверх".
 Происходит возвращение к надфрагменту текущего фрагмента, либо, в
 случае корневого фрагмента (набор х12 пуст), возвращение к главному
 меню. В последнем случае пред\-ва\-ри\-тель\-но завершается исключение из
 блока программ ранее отключенных ветвей, ссылки на которые
 хранятся в наборе х14. В первом случае (переход через "иначе 2")
 - переменным х15 и х16 присваивается ссылка на надфрагмент,
 извлеченная из первой тройки стэка х12, а переменной х11 - номер
 текущего оператора перехода, извлекаемый из той же тройки.
 Отбрасывается первая тройка стэка х12, и откат к прорисовке
 надфрагмента.

 \item х21 = "Плюс". Клавиша Esc, при нажатии которой удаляются
 все отключенные фрагменты из буфера х14 и происходит внутренний
 перезапуск системы с до\-пол\-ни\-тель\-ной расчисткой зоны программ.

 \item х21 = "контрольунификации". Клавиша PageUp, при нажатии
 которой про\-ис\-хо\-дит удаление отключенных фрагментов и возвращение
 к главному меню без внутреннего перезапуска системы. В отличие от
 Esc, здесь сохраняются комментарии к посылкам исходной задачи, что
 бывает необходимо для вы\-пол\-не\-ния ряда операций, инициированных в
 просмотре текущей программы).

 \item х21 = "частичныйответ". Нажата клавиша "о", переводящая в
 режим просмот\-ра операторов фрагмента программы. Этот режим
 обладает своим собственным длинным списком команд. Поэтому ограничимся
 здесь описанием первых вы\-пол\-няемых шагов, а описание списка используемых
 в данном режиме команд приведем в конце, после рассмотрения списка
 команд основного режима ре\-дак\-тора программ. Прежде всего,
 проверяется непустота текущего фрагмента х17. Если текущий
 фрагмент имел операторы перехода (х19 не равно 0), то
 восстанавливается белый фон выделенного оператора перехода.
 Переменной х22 присваивается набор из пяти цветов, которые будут
 использоваться при выделении подтермов (после того, как пятый
 цвет использован - переход к первому, и т.д.). Инициализируется
 пустым словом стэк х23, который будет сохранять наборы четверок
 для перекраски надтермов текущего терма; каждая такая четверка
 указывает: исходную позицию буфера текстов для перекраски,
 заключительную позицию для перекраски, а также столбец и строку
 для вы\-да\-чи надтерма на экране. Инициализируется переменная х24,
 которая будет ука\-зы\-вать вхождение текущего цвета в набор х22.
 Переменной х21 присваивается пара (вхождение текущего выделенного
 оператора в фрагмент программы - указатель типа оператора
 (оператор перехода - 1, иначе - 0)). Переменной х25 присваивается
 вхождение выделенного подтерма текущего оператора.
 Ини\-циа\-ли\-зи\-ру\-ется переменная х26, которая будет являться
 указателем направле\-ния перемещения при просмотре подтермов одного
 уровня (1 - влево, 0 - вправо). Ини\-ци\-али\-зи\-руются
 переменные х27, х30 (далее они указывают начало и конец выделенного
 подтерма в буфере текстов), а также переменные х28, х29 - столбец и
 строка начала этого подтерма на экране.

 После инициализации переменных прорисовывается меню, обеспечивающее
 ре\-жим просмотра подтермов. Далее идет оператор "повторение", к
 которо\-му будут происходить откаты при перекрасках. После
 оператора "ветвь 2" \ - дей\-ст\-вия по перекраске выделенного
 подтерма текущего оператора. Здесь учи\-ты\-ва\-ется указатель направления
 перемещения х26: при движении влево изначально известно значение х30 и
 по нему определяется соответствующее х27, при дви\-же\-нии вправо - по
 известному х27 определяется х30. Затем - переход через "ветвь 2".

 Здесь осуществляется учет комментария (умножсимв $p$) к посылкам
 исходной задачи. Если он имеется, то $p$ - позиция в буфере
 текстов, соответствующая тому подтерму, который желательно
 выделить многоцветной указкой. Со\-от\-вет\-ствен\-но, через
 комментарий (автоклавиатура $\ldots$) передаются команды для
 нажатий клавиш курсора, обеспечивающих выделение подтерма.
 Ко\-ман\-ды вы\-да\-ются поштучно, и после обработки очередной
 команды происходит воз\-вра\-щение в данную точку для продолжения
 работы с комментарием (ум\-нож\-симв $p$). После выделения нужного
 подтерма он удаляется. Далее - переход через "ветвь 1" \ и
 обращение к оператору "автоменю(х31)", вводящему оче\-ред\-ную
 команду режима просмотра подтермов операторов.

 \item х21 = "точкапривязки". Нажата клавиша "PageDown".
 Происходит поиск в программе текущего символа х13 первого
 недоопределенного перехода, экран расчищается для входа в редактирование
 фрагмента, и в верхнем левом углу прорисовывается номер перехода.
 Собственно поиск недоопределенного пере\-хо\-да выполняется
 оператором "прогфайл(продолжение х13 х22 х23)", после чего
 предпринимается коррекция стэка х12 для пути к найденному
 фрагменту.

 \item х21 = "числитель". Нажата клавиша "р", инициирующая
 редактирование фраг\-мента. Прежде всего, создается стэк х22 для
 учета новых ветвей программы, появляющихся при редактировании.
 Если при редактировании фрагмента воз\-ник\-ли новые операторы
 перехода, то после его ввода автоматически появится предложение
 ввести подфрагмент для последнего из не определенных перехо\-дов. В
 процессе ввода подфрагмента могут возникнуть дальнейшие операторы
 пе\-ре\-хо\-да, для которых тоже будут сделаны предложения ввести их
 под\-фраг\-мен\-ты, и т.д. В результате к текущему вводимому фрагменту
 будет вести це\-поч\-ка надфрагментов, часть которых указаны в стэке
 х12, а часть - новые над\-фраг\-менты, для которых и создан стэк х22.
 В него заносятся наборы, послед\-ние два элемента которых являются
 ссылками на фрагменты в блоке программ, а первые элементы - номера
 недоопределенных ссылок из этих фрагментов. Номера здесь берутся
 нелокальные, т.е. те, которые фактически были введены текстовым
 редактором.

 В правом верхнем углу экрана про\-ри\-со\-вы\-вается красный
 прямоугольник, пред\-упреждающий о режиме изменения программы.
 Если фрагмент имел операто\-ры перехода, то желтый фон текущего оператора
 перехода заменяется на белый. Затем идет оператор "повторение", к
 которому будут происходить откаты при обнаружении ошибок либо
 при пе\-ре\-хо\-дах к редактированию очередного фраг\-мен\-та вводимой ветви
 программы. После него выполняется обращение к тек\-сто\-вому редактору для
 набора программы фраг\-мента. Заметим, что это обраще\-ние сохраняет ранее
 имевшийся экран - чтобы можно было исправить обнаружен\-ную ошибку. Если
 имел место отказ от ре\-дак\-ти\-рования, то расчищаются экран и буфер
 текстов, и далее - откат к перери\-сов\-ке исходного вида редактируемого
 фрагмента. Иначе - обращение к оператору "кодтекста(1 х24 х25)", который
 преобразует содержимое буфера текстов в набор термов. Если это сделать
 не удается, то есть х25 отлично от 0, то х24 и х25 содержат
 информацию об ошибке, которая прорисовывается в верхнем правом углу
 экрана. Если ошибка локализуется, то перед откатом к текстовому
 редактору создается комментарий (теквхожд $\ldots$), определяющий
 позицию кур\-со\-ра для указания на ошибку.

 В случае успешного определения набора термов х24 выполняется
 оператор "разверткапрограммы(х24)". Он устраняет условные
 обозначения в набранной программе, заменяя их на обозначаемые ими
 конструкции языка ЛОС. Во-первых, вместо обозначения
 "логсимвол($n$)", используемого для указания на символьное число
 $n$, помещается это символьное число - логический символ, имеющий
 номер $260 + n$. Во-вторых, вместо обозначения "замена($xi \ t$)" \
 по\-ме\-щается оператор "замена($i \ t$)".

 Создается список х26 всех операторов перехода в новом фрагменте
 программы х24. Предпринимается просмотр операторов х27 данного
 списка и проверка, что каждый из них имеет лишь одно вхождение в
 список. Если это не так, то в правом верхнем углу экрана выдается
 сообщение об ошибке, и откат к повторному редактированию. Иначе -
 переход через "иначе 4".

 Просматриваются все операторы перехода, имевшиеся в текущем
 фрагменте до его редактирования, и создаются: список х27 номеров
 $1,2,\ldots$ этих операторов, а также список х28 пар
 однобуквенных термов - определяемых ими ссылок на подфрагменты.

 Просматриваются все операторы перехода из списка х26. Каждый
 такой опе\-ра\-тор имеет вид "ветвь($n$)" \ либо "иначе($n$)", где
 $n$ - натуральное. Если $n$ входит в список х27, то находится
 соответствующая пара термов $t_1,t_2$ из х28, и оператор
 заменяется на "ветвь($t_1 \ t_2$)" \ либо "иначе($t_1 \ t_2$)".
 Это означает, что через опера\-тор будет выполнен переход к тому
 же подфрагменту, к которому он имелся через $n$-й из старых
 операторов перехода до редактирования. Иначе происходит замена
 десятичного числа $n$ на его символьное представление.

 Если вводимый фрагмент - корневой и стэк х22 пуст, то значение
 х29 заменяется на 0, а значение х27 - на заголовок редактируемой
 программы. Иначе х29 заменяется на 1, а х27, х28 - на пару логических
 символов, образующих ссылку в блоке программ на тот оператор
 перехода, который ведет к редактируемому фрагменту. Затем
 оператор "прогфайл(запись $\ldots$)" \ выполняет запись нового
 фрагмента программы х24 в блоке программ и запись ссылки на него из
 соот\-вет\-ству\-ющего надфрагмента (при х29 = 1) либо из каталога программ
 (при х29 = 0).

 Далее переменной х17 (текущий фрагмент) присваивается пустой
 набор. Если редактировался корневой фрагмент ветви новых
 фрагментов (стэк х22 пуст), то ссылка х15,х16 на
 редактируемый фрагмент изменяется на новое значение, указанное
 оператором "прогфайл(запись $\ldots$)". Создается список х32
 номеров недоопределенных переходов из нового фрагмента (они
 упорядочены в нап\-рав\-ле\-нии от конца фрагмента к началу). Если этот
 список непуст, то к началу стэка х22 добавляется набор,
 соответствующий недоопределенным переходам из нового фрагмента. В
 этом случае в левом верхнем углу экрана про\-ри\-со\-вы\-ва\-ется номер
 первого (по списку х32) такого перехода, экран расчищается ниже первой
 строки, и откат к набору подфрагмента. Если список х32 пуст, то
 анализируется стэк х22. От начала его последовательно
 отбрасываются наборы длины 3 (они уже обработаны). Если
 встречается набор длины, большей 3, то удаляется первый его
 элемент, в верхнем левом углу экрана прорисовывается первый из
 оставшихся элементов, экран расчищается ниже первой строки, и
 откат к набору подфрагмента. Если же стэк х22 оказывается пустым,
 то в верхней части экрана оставляется только заголовок программы,
 и откат к пере\-ри\-сов\-ке корневого фрагмента новой ветви (т.е. новой
 версии того фрагмента, для которого было начато редактирование).

 \item х21 = "модули". Нажата клавиша Ctr-Del для удаления ветви
 программы, начинающейся с выделенного оператора перехода. Эта ветвь,
 до выхода из редактора программ, не исключается из блока
 программ, а лишь отключается от программы. Прежде всего, проверяется,
 что фрагмент имеет операторы перехода и что накопитель х14 отключенных
 фрагментов пуст. Затем опре\-де\-ля\-ются значения х22, х23, х24, указывающие
 внешнюю ссылку в блоке программ на текущий фрагмент: если фрагмент
 корневой, то х22 равно 0, а х23 равно заголовку программы. Иначе х22
 равно 1, а х23, х24 - ссылка в блоке программ на оператор перехода к
 данному фрагменту. После определения указанных значений - переход через
 "ветвь 2".

 Здесь определяется вхождение х25 текущего оператора перехода в
текущий фрагмент программы х17 и проверяется, что этот переход
определен. В на\-ко\-пи\-тель х14 заносится тройка (ветвь х27
х28), ссылающаяся на корневой фрагмент удаляемой ветви программы.

Предпринимается коррекция фрагмента программы х17, ориентированная
на запись его в блоке программ; фактически это затрагивает лишь
операторы "замена($\ldots$)". Определяется ссылка х27,х28 на
вхождение в блок программ оператора перехода, ведущего к
удаляемому подфрагменту текущего фраг\-мен\-та, и предпринимается
отключение этой ветви. Затем из текущего фрагмен\-та х17
исключается рассматриваемый оператор перехода, и
скорректирован\-ная версия этого фрагмента регистрируется в блоке
программ вместо старой версии. Ссылка х15,х16 на текущий фрагмент
корректируется на его новую версию, и откат к перерисовке.

\item х21 = "конъюнктконтекст". Нажата клавиша Ctr-F7. Выполняется
удаление всей программы текущего логического символа. Проверяется,
что накопитель отключенных фрагментов х14 пуст, и в него заносится
ссылка на корневой фрагмент удаляемой программы.

\item х21 = "элементы". Нажата клавиша F8. Происходит поиск
фрагмента про\-грам\-мы текущего логического символа, содержащего
заданный оператор. Такой оператор может быть либо заранее
определен специальным комментарием к посылкам исходной задачи, и
тогда инициированное нулем значение х22 за\-ме\-ня\-ется на
оператор, извлекаемый из соответствующего комментария, либо (см.
переход через "ветвь 3") искомый оператор вводится вручную с
помощью текстового редактора, и снова х22 получает в качестве
значения этот оператор. Далее - переход через "ветвь 2" \ к
фрагменту, в котором находится оператор "прогфайл(имя х22 х25)".
Этот оператор и осуществляет поиск фрагмента. Его выходной
переменной присваивается путь в программе текущего символа до
фрагмента с искомым оператором; формат описания пути - тот же, что
и в случае поиска первого недоопределенного перехода. Стэк х12
переопределяется на найденный путь, вводится комментарий
"автоклавиатура $\ldots$" \ к посылкам исходной задачи,
определяющий такую последовательность нажатий клавиш, при которой
искомый оператор в найденном фрагменте оказывается выделен
многоцветной указкой, и откат к перерисовке этого фрагмента.

\item х21 = "узелраздела" \ либо х21 = "попыткапараметризации" \
(соответственно, клавиши F3 и F2). Переход к просмотру справочной
информации о логическом символе. В верхней части экрана
устанавливается меню для просмотра и ре\-дак\-ти\-рования
справочной информации о символе. Дальнейшие действия
вы\-пол\-няются процедурой "помощь", причем в случае F3 ей
передается известный символ - заголовок текущей программы, а в
случае F2 она организует ввод символа текстовым редактором.

\item х21 = "новаяветвь". Нажата клавиша Ctr-F6. В накопителе х14
находится первая ссылка на отключенную ветвь программы; эта ссылка
удаляется из х14, удаляется вся программа текущего символа х13, и
указанная выше ветвь становится программой символа х13.

\item х21 = "схемаидентификации". Нажата клавиша "ш" \ для
перехода к просмотру программы следующего логического символа.
Прежде всего, осуществляется удаление отключенных фрагментов
программы текущего логического символа, если они имеются в буфере
х14. Затем идет оператор "повторение", к которому будут
происходить откаты в цикле поиска первого следующего за текущим
символа, имеющего программу. Номер текущего символа х13
увеличивается на 1; если достигнут максимальный символ (пока в
программе редактора про\-грамм указана константа 5000), то цикл
обрывается, и откат к перерисовке. Иначе - проверяется, что символ
имеет программу. Если имеет, то выполняются действия, необходимые
для того, чтобы эта программа стала текущей и была прорисована при
откате (в частности, в верхней части экрана прорисовывается новое
название символа).

\item х21 - один из символов "прообраз", "подборзначений",
"внутрвывод", "ана\-ли\-за\-тор". Соответствующие клавиши - "П",
"У", "у", "п". В случаях "п","П" за\-пус\-кается процедура
проверки корректности программы (для "П" \ - серийная, начиная с
текущего логического символа; для "п" \ - только проверка текущей
программы). В случаях "у","У" \ происходит поиск фрагментов
программы, ко\-то\-рые могут оказаться неудаленными остатками
ранее удаленных приемов ("У" \ - серийный поиск, "у" \ -
однократный). Основные действия здесь выполняются процедурой
"нормпрог", к которой сразу же и происходит обращение. Она
выполняет общий контроль корректности текущей ветви программы и
ор\-га\-ни\-зует обращения к оператору "смпрог" \ в цикле
сканирования операторов про\-грам\-мы (напомним, что оператор
"спрог" \ программируется вручную как сред\-ство поиска в
программе либо автоматического изменения программы). В слу\-чаях
"у","У" \ оператору "нормпрог" \ передается информационный элемент
"про\-должение", инициирующий поиск концевых вхождений оператора
"про\-дол\-же\-ние", подозрительных на наличие неудаленного
остатка приема. Набор х22 содержит результаты проверки программы
(типы элементов этого набора пе\-ре\-чис\-лены в справочной
информации символа "результат").

Если найдены ошибка либо то вхождение оператора, для которого
пред\-при\-ни\-мал\-ся поиск, то информация о них передается в
элементы (стоп $\ldots$), (титр $\ldots$) набора х22. Первый из
них содержит координаты оператора, второй - указы\-ва\-ет на
сопровождающий текст, который должен быть прорисован.
Соответственно, установки на текущий фрагмент корректируются для
прорисовки фрагмента с найденным оператором, вводится комментарий
(автоклавиатура $\ldots$) для вы\-де\-ле\-ния оператора
многоцветной указкой, и откат к перерисовке фрагмента.

В случае серийного запуска (переход через "ветвь 4" \ после
анализа содер\-жи\-мо\-го набора х22, если это содержимое не
указывает на необходимость выдачи на экране полученной информации)
- проверяется, не была ли в процессе вы\-чис\-лений нажата
какя-либо клавиша. Если была, то цикл обывается. Иначе - вводится
комментарий (авоклавиатура $\ldots$), определяющий нажатия клавиши
"ш" \ (для перехода к следующему символу) и снова - той же клавиши
х21.

\item х21 = "извлечениеварианта". Команда соответствует нажатию
клавиши "т", которое в действительности является фиктивным, так
как запускается эта ко\-ман\-да обычно через комментарий
(автоклавиатура $\ldots$) и служит для про\-ри\-сов\-ки в верхнем
правом углу экрана текста согласно комментарию (титр $\ldots$),
который вводится при проверке правильности программы.

\item х21 = "группировки" \ либо х21 = "старшийчлен".
Соответственно, нажимаются клавиши End и "э". В случае клавиши "э"
\ происходит откат к прорисовке корневого фрагмента программы
текущего символа; предварительно удаляются все отключенные
фрагменты, а также комментарий (контрольпрограммы $\ldots$),
обеспечивавший возвращение в базу пприемов, если переход к
редактору прог\-рамм произошел из нее. В случае клавиши End -
реализуется возвращение из редактора программ в тот внешний
интерфейс, из которого к нему происходил переход. Здесь
рассматриваются следующие случаи:

а) Исходная задача имела комментарий посылок "оператор". В этом
случае реализуется возвращение в оглавление операторов ЛОСа.

б) Исходная задача имела комментарий посылок "контрсерия
$\ldots$". В этом ком\-мен\-та\-рии накапливается
последовательность логических символов, к просмот\-ру программ
которых имели место переходы при нажатии клавиш "с" \ из
ре\-дак\-тора программ. Реализуется откат по этой цепочке символов
на один шаг - возвращение к просмотру корневого фрагмента
программы первого из симво\-лов цепочки и отбрасывание начала
цепочки.

в) Исходная задача имела комментарий посылок "контрольпрограммы
$\ldots$". В этом случае имел место переход от просмотра приема
ГЕНОЛОГа к его программе, и реализуется возвращение в просмотр
приема.

В остальных случаях предпринимается откат к перерисовке корневого
фраг\-мен\-та программы и расчистка накопителя х14.

\item х21 = "фиктопер". Нажата клавиша F6. Реализуется операция
объединения двух последовательно идущих фрагментов программы в
один фрагмент. Пер\-вый из них заканчивается операторами "ветвь
$N$", "продолжение", где $N$ - ссылка на второй фрагмент, либо
операторами $P$, "иначе $N$", "продолжение". Прежде всего,
программа проверяет, что последние операторы текущего
фраг\-мен\-та х17 действительно имеют указанный выше вид. Затем
находится набор х25 операторов второго фрагмента программы. В
зависимости от вида окон\-ча\-ния фрагмента х17, создается
результат х27 объединения фрагментов х17 и х25 (в случае оператора
"иначе($N$)" \ оператор $P$ заменяется на свое отрицание). Все
непосредственные подфрагменты фрагмента х25 отключаются, но
сохраняются в блоке программ. Отключение необходимо для того,
чтобы при последующем удалении фрагмента х25 не оказались
удаленными и его подфрагменты, на которые ссылки будут делаться
также из нового фрагмента х27. После от\-клю\-чения находится
ссылка из надфрагмента на фрагмент х17 (в случае корневого
фрагмента - ссылка из каталога программ), и с помощью оператора
"прог\-файл(запись $\ldots$)" \ выполняется запись по данной
ссылке нового фрагмента х27. Автоматически при этом удаляются
старые фрагменты х17 и х25. Далее - откат к перерисовке текущего
фрагмента.

\item х21 = "копияблокаанализа". Нажата клавиша F4. Выполняется
поиск всех вхождений в текущую ветвь программы терма либо
логического символа, вво\-ди\-мого в окне текстового редактора.
Для поиска очередного вхождения каждый раз нажимается F4.

Сначала проверяется наличие комментария (клавиатураоператора
$\ldots$). Та\-кой комментарий вводится при обнаружении в
некотором фрагменте про\-смат\-ри\-ва\-емой ветви нужного терма
либо логического символа $A$. Он сохраняет список операторов
фрагмента, вхождение в этот список того оператора, внутри
ко\-то\-ро\-го расположено найденное вхождение $A$, и само это
вхождение. Если данный комментарий имеется, то он используется для
продолжения просмотра при поиске следующего вхождения $A$. Чтобы
определить, какой терм или логичес\-кий символ нужно найти, далее
извлекается комментарий (перечислфрагментов $\ldots$) к посылкам
исходной задачи. Он содержит информацию о пути к корню
просматриваемой ветви от корня программы; информацию о пути от
корня просматриваемой ветви к ее текущему фрагменту, а также
список термов либо логических символов, которые нужно искать. В
соответствии с этой инфор\-ма\-ци\-ей и предпринимается
продолжение просмотра фрагмента, указанного в комментарии
(клавиатураоператора $\ldots$). После обнаружения очередного
ис\-ко\-мо\-го вхождения - вводится комментарий (автоклавиатура
$\ldots$), определяющий последовательность нажатий клавиш для
входа в выделение найденного вхож\-де\-ния многоцветной указкой, и
откат к обработке очередной команды. Если же просмотр фрагмента
завершился безрезультатно, то комментарий (клавиатура\-опе\-ратора
$\ldots$) удаляется, и переход через "ветвь 2". Если комментария
(клави\-атураоператора $\ldots$) вообще не было, то сразу же -
переход через "ветвь 2".

Здесь переменная х22 инициализируется нулем, после чего ей
переприсва\-ива\-ет\-ся комментарий (перечислфрагментов $\ldots$),
если он уже введен к данному моменту. Если в данном комментарии
еще не был указан путь от корня про\-грам\-мы к корню
просматриваемой ветви, то в качестве такого пути регистрируется
х12. Далее - переход через "ветвь 1", где переменная х23
инициализируется нулем; если х22 было ненулевым, то из него
извлекается список искомых термов (в данном интерфейсе он всегда
одноэлементный), и его элемент перепри\-сва\-ива\-ется переменной
х23.

В случае нулевого х22 реализуется интерфейс ручного ввода искомого
терма; этот терм переприсваивается переменной х23. Затем - переход
через "ветвь 1".

Переменной х24 присваивается путь от корня просматриваемой ветви к
те\-ку\-щему фрагменту. Затем предпринимается обращение к
оператору "пере\-числ\-фраг\-ментов($\ldots$)", выполняющему
перечисление следующих за текущим фраг\-мен\-тов данной ветви.
Набор операторов очередного такого фрагмента пере\-да\-ется
выходной переменной х26. В списке х26 предпринимается поиск
очередного искомого вхождения. Операторы перехода исключаются из
поиска, так как в них случайным образом может оказаться искомый
логический символ, ис\-поль\-зу\-емый в качестве кода ссылки на
подфрагмент. Если вхождение найдено, то вводится соответствующий
комментарий (клавиатураоператора $\ldots$). Вводится либо
корректируется на найденное вхождение комментарий
(перечисл\-фраг\-мен\-тов $\ldots$); стэк х12 переустанавливается
на путь к найденному фрагменту; пере\-мен\-ные х15,х16,х11
изменяются для просмотра этого фрагмента; вводится ком\-ментарий
(автоклавиатура $\ldots$), определяющий последовательность нажатий
клавиш, необходимую для выделения найденного вхождения
многоцветной ука\-з\-кой, и откат к перерисовке фрагмента. Если же
просмотр ветви завершился безрезультатно, то переход через "иначе
1".

Экран расчищается, и предпринимается контрольное обращение к
клавиатуре. После нажатия любой клавиши - проверяется, равно ли
х22 нулю. Если равно, то сразу откат к перерисовке текущего
фрагмента (он не изменялся и является по-прежнему корневым
фрагментом просматриваемой ветви). Иначе - перед откатом к
перерисовке восстанавливаются значения х12,х15,х16,х11,
соот\-вет\-ству\-ющие корневому фрагменту ветви, и удаляется
комментарий (перечисл\-фраг\-ментов $\ldots$).

\item х21 = "внешдизъюнкция". Нажата клавиша Insert. Удаляется,
если он был, комментарий (копия $\ldots$) к посылкам исходной
задачи, и вводится новый такой комментарий, ссылающийся на текущий
фрагмент. Этот комментарий ис\-поль\-зуется в качестве буфера для
копирования ветви программы. Команда создания на его основе копии
ветви программы дается через режим просмотра подтермов операторов
(см. ниже).

\item х21 = "существпосылки". Нажата клавиша Ctr-а (кир.). Это -
переключатель для работы с альтернативным программным блоком,
расположенным в поддиректории ALT. Он вводит либо удаляет
комментарий "альтернатива" \ к посылкам исходной задачи,
указывающий на работу с альтернативным блоком программ. Затем
расчищается буфер отключенных фрагментов х14,
пере\-ри\-со\-вы\-ва\-ется главное меню, и выполняется откат ко
вводу заголовка программы.

\item х21 = "истинно". Нажата клавиша Ctr-ъ. Если имеет место
режим работы с альтернативным блоком программ, то создается ссылка
на текущий фрагмент для копирования его в основной блок программ.
Роль такой ссылки играет комментарий (копияфайла $A$) к посылкам
исходной задачи. Если имеет место режим работы с основным блоком
программ, то находится комментарий (ко\-пи\-яфай\-ла $A$). Если
стэк х12 пуст, то реализуется перенесение из альтернативного блока
программ ветви, ссылка на корень которой есть $A$, в основной блок
программ, причем эта ветвь становится программой текущего
логического сим\-во\-ла. Если же х12 непусто, то находится ссылка
х27 на оператор перехода, ссылающийся на текущий фрагмент, и вся
ветвь текущего фрагмента за\-ме\-ня\-ет\-ся на ветвь, переносимую
из альтернативного блока программ по ссылке $A$. В обоих случаях
собственно перенесение ветви осуществляется оператором
"копияветви($\ldots$)".

\item х21 - один из символов "арккосинус", "переобозначение",
"транслвыражения", "кортеж". Соответственно, нажаты клавиши Ctr-л,
Ctr-п,Ctr-ф,Ctr-т. Здесь реализуется обращение к одному из
справочных оглавлений: оглавлению опе\-ра\-то\-ров ЛОСа,
оглавлению информационных элементов программного блока (компилятор
ГЕНОЛОГа), оглавлению типов комментариев к представлению слова
либо терма фразы, и оглавлению типов комментариев к теореме в базе
теорем. Все эти оглавления располагаются в 5-м информационном
блоке, так что прежде всего этот блок активизируется. Находится
указатель х23 типа оглавления, и находится одноэлементный набор
х24, состоящий из ссылки на корень оглавления (если оглавления еще
не существовало, то оно при этом вводится). Далее происходит
обращение к процедуре "оглавление". После вы\-бо\-ра концевого
пункта оглавления - экран расчищается, в верхней части его
перерисовывается текст выбранного пункта, и под текстом -
горизонтальная черта. Затем находится содержимое логического
терминала выбранного кон\-це\-во\-го пункта оглавления. Этим
содержимым является терм "прием($\ldots$)", первые два операнда
которого суть логический символ и номер узла этого символа.
Находится логический терминал, достижимый из данного узла по метке
"терм" \ - его содержимое и прорисовывается под горизонтальной
чертой в качестве информации, сопровождающей текст пункта
оглавления. Затем - переход через "ветвь 6" \ к небольшому
обработчику команд, позволяющему войти в тек\-сто\-вый редактор
для изменения сопровождающей информации (х33 = "тринадцать"), а в
случае оглавления операторов ЛОСа - также просмотреть информацию о
заголовке оператора (х33 = "внешконъюнкция"). По окончании работы
со справочным оглавлением - откат к оператору "ветвь 2"; далее
активизируется первый информационный блок, расчищается верхняя
часть экрана, в которой восстанавливается прорисовка текущего
логического символа х13, и откат к перерисовке текущего фрагмента.

\item х21 = "нормвариант". Нажата клавиша Ctr-F8. Происходит
контроль блока программ на уровне интерпретатора ЛОСа. Основная
работа выполняется опе\-ратором "прогфайл(контроль х22)",
определяющим набор х22 наборов (номер файла блока программ - тип
ошибки - $A_1$ - $A_2$), где $(A_1,A_2)$ - ссылка на фрагмент, в
котором найдена ошибка. На практике эта возможность контроля
практически не используется, так как контроль блока программ
автоматически осущест\-вля\-ет\-ся при уплотнении либо сохранении
программы решателя. Первоначально предполагалось создать
специальный интерфейс коррекции ошибок блока прог\-рамм, возникших
на уровне интерпретатора, с помощью самого решателя. Од\-на\-ко,
пока это направление не получило сколь-нибудь заметного развития,
а при обнаружении поломок в файлах на указанном уровне
предпринимается просто извлечение резервной копии из директории
SLCOPY.

\item х21 = "правмногоугольник". Нажата клавиша "я".
Предпринимается регист\-ра\-ция ветви текущего фрагмента в
контейнере - информационном блоке номер 12, используемом для
перенесения информации из одной версии логической системы в
другую.

\item х21 = "путьвхождения". Нажата клавиша Ctr-F9. Дополнение к
команде Ctr-F8 - удаляется найденная изолированная ветвь в блоке
программ. На протяжении всего периода работы с системой эта
команда практически не использовалась.

\item х21 = "стандменьше". Нажата клавиша F1. Происходит обращение
к спра\-воч\-ни\-ку по логической системе.

\item х21 = "мышь". Нажата левая либо правая кнопка мыши. Прежде
всего, пе\-ре\-мен\-ной х22 присваивается указатель на левую (0)
либо правую (2) клави\-шу мыши. Переменным х23,х24 присваиваются
столбец и строка текущей позиции курсора. Далее проверяется, что
курсор мыши находится ниже верхней тек\-сто\-вой строки.
Вычисляется номер х30 позиции в буфере текстов, соответствующей
позиции курсора мыши. Проверяется, то либо на позиции х30, либо на
сле\-ду\-ю\-щей за ней позиции расположен символ с "непустой" \
прорисовкой. Находится начальная позиция в буфере текстов того
слова, к которому относится х30 (если х30 приходится на оператор
перехода, то определяется начальная позиция этого оператора); х30
присваивается номер этой начальной позиции. Далее - переход через
оператор "ветвь 3".

Если была нажата левая кнопка мыши, то вводится комментарий
(умножсимв х30) к посылкам исходной задачи - указатель той позиции
в буфере текстов, которая является началом выделяемого
многоцветной указкой подтерма. Затем формируется комментарий
(автоклавиатура $\ldots$) для перехода в режим про\-смот\-ра
подтермов операторов, и откат к запросу очередной команды.

Если была нажата правая кнопка мыши, то с помощью набора х18
определяется тот оператор перехода, начальной позицией которого в
буфере текстов служит х30. Затем создается комментарий
(автоклавиатура $\ldots$) для такой цепочки нажатий клавиш "курсор
влево" \ либо "курсор вправо", завершаемой нажатием "курсор вниз",
которая сделает текущим выделенный оператор перехода и
обес\-пе\-чит переход через него.

Наконец, при нажатии правой кнопки мыши вне оператора перехода -
переход через "ветвь 2" \ из исходного фрагмента обработки данной
команд, где фор\-ми\-ру\-ет\-ся комментарий (автоклавиатура
$\ldots$) для нажатия клавиши "курсор вверх", что соответствует
возвращению в надфрагмент.

\item х21 = "арктангенс". Нажата клавиша Ctr-д. Предпринимается
вход в оглав\-ле\-ние блоков диалога и создание шаблона нового
такого блока либо редак\-ти\-ро\-вание ранее созданного. Сначала
активизируется 5-й информационный блок, в котором находится данное
оглавление. Затем находится корневой указатель оглавления блоков
диалога (тип этого оглавления - логический символ "норм\-истина"),
и происходит обращение к оглавлению. При выборе концевого пунк\-та
оглавления проверяется, что он содержит ссылку на узел ранее
созданного блока диалога. Если это не так - переход через "иначе
6", где с помощью простейшего датчика случайных чисел (остаток от
деления на 1000 номера текущего шага работы интерпретатора)
выбирается тот логический символ, для которого будет введен узел
нового (пока пустого) шалона блока диалога. Такой узел вводится, и
откат к повторному поиску ссылки на узел выбран\-но\-го концевого
пункта оглавления. Затем - обращение к оператору "новыйдиалог(х27
х28)", реализующему интерфейс редактирования блока диалога.

\item х21 = "арксинус". Нажата клавиша Ctr-о (кир.). Организуется
переход к тому пункту оглавления операторов ЛОСа, который
соответствует заголовку про\-смат\-ри\-ва\-е\-мой программы.

\item х21 = "фигуры". Нажата клавиша Ctr-Enter. Происходит запуск
программы текущего логического символа "пуск".

 \end{enumerate}

Мы проследили выполнение команды входа в режим просмотра подтермов
опе\-ра\-то\-ров (нажатие клавиши "о") вплоть до обращения к
оператору "автоклавиату\-ра(х31)", запрашивающему очередную
команду х31 данного режима. Рассмотрим ре\-али\-зацию процедур
обработки команды х31. Для входа в фрагмент, содержащий оператор
"автоклавиатура(х31)", можно использовать пункт "Точка входа в
об\-ра\-бот\-чик команд просмотра операторов в фрагменте $\ldots$"
\ подраздела "редактор ЛОСа" \ оглавления программ.

Напомним смысловую нагрузку переменных, используемых в режиме
просмотра подтермов операторов. х22 - набор из пяти цветов,
используемых при выделении подтермов. х23 - стэк, сохраняющий
наборы четверок (исходная позиция буфера текстов для перекраски -
заключительная позицию для перекраски - столбец - строка для
выдачи надтерма на экране) для перекраски надтермов текущего
терма. х24 - вхождение текущего цвета в набор х22. х21 - пара
(вхождение текущего выделенного оператора в фрагмент программы -
указатель типа оператора (оператор перехода - 1, иначе - 0)). х25
- вхождение выделенного подтерма текущего оператора. х26 -
указатель направления перемещения при просмотре подтермов одного
уровня (1 - влево, 0 - вправо). х27, х30 - начало и конец
выделенного подтерма в буфере текстов. х28, х29 - столбец и строка
начала этого подтерма на экране.

Сразу после получения команды х31 определяется значение х32 цвета
фона над\-терма текущего терма.


\begin{enumerate}

\item х31 = "копияблокаанализа" \ либо х31 = "частичныйответ".
Соответственно, нажата клавиша F4 для поиска очередного вхождения
заданного терма либо клавиша "о" \ (кир.) для возвращения в
обычный режим просмотра фрагмента программы. В первом случае
проверяется наличие комментария посылок (пе\-ре\-числ\-фрагментов
$\ldots$), в котором сохраняются данные о виде искомого терма и
области поиска. Если выделенный текущий подтерм - некорневой, то
значения х27 - х30 переустанавливаются на выделение всего текущего
оператора, в кото\-ром выделен этот подтерм. Если была нажата
клавиша F4, то вводится ком\-мен\-тарий (автоклавиатура $\ldots$),
который после возвращения в обычный режим вызовет очередное
нажатие F4 для поиска очередного вхождения терма. Иначе -
удаляются комментарии (клавиатураоператора $\ldots$) и
(перечислфрагментов $\ldots$), если они были; в последнем случае,
строго говоря, комментарий не уда\-ля\-ет\-ся, а лишь обнуливаются
его второй и третий разряды, чтобы впоследствии можно было
использовать его для поиска того же терма в другой части
про\-граммы. Далее происходит восстановление белого цвета фона
текущего опе\-ратора в буфере текстов и перерисовка этого
оператора. Если текущий фраг\-мент имел операторы перехода, то
согласно значению х19 восстанавливается желтый цвет фона текущего
оператора перехода. Восстанавливается меню обыч\-ного режима
просмотра, и откат к запросу команды этого режима.

\item х31 = "внешконъюнкция". Нажата клавиша "курсор вправо" для
выделения следующего подтерма текущего надтерма либо следующего
оператора фраг\-мен\-та программы. Определяется позиция х33 буфера
текстов, следующая за крайней правой позицией выделенного
подтерма. До тех пор, пока на позиции х33 оказывается символ
пробела, происходит сдвиг х33 вправо. Если при этом выходим на
пустую зону буфера текстов либо на закрывающую скобку, то
выполнение команды отменяется. Иначе - переход через "иначе 2".

Здесь восстанавливается цвет фона х32 текущего подтерма (он
сливается с надтермом). Затем значения х28,х29,х27,х25,х21
изменяются таким образом, что указывают на подтерм с началом х33;
х26 заменяется на 0 (движение вправо), и откат к изменению цвета
фона текущего подтерма.

\item х31 = "циклвариантов". Нажата клавиша "курсор влево".
Аналогично пре\-ды\-ду\-щему. Проверяется, что начало х27
выделенного подтерма в буфере текстов не является началом этого
буфера, после чего находится левый сосед х33 по\-зи\-ции х27.
Значение х33 сдвигается влево, пока не появляется символ, отличный
от пробела. Если этот символ - открывающая скобка, то команда
отменяется. Иначе - цвет фона текущего подтерма изменяется на х32;
определяющие вы\-де\-ле\-ние подтерма переменные корректируются на
левого соседа текущего под\-тер\-ма (он задается своей последней
позицией х33), х26 присваивается 1, и откат к перекраске.

\item х31 = "подстановка". Нажата клавиша "курсор вниз".
Проверяется, что теку\-щий подтерм по вхождению х25
неоднобуквенный. Затем переменной х33 при\-сваивается номер
начальной позиции х27 этого подтерма в буфере текстов, и
начинается цикл сдвигов х33 вправо до обнаружения открывающей
скобки (очередной шаг сдвига - откат к оператору "повторение").
После обнаружения открывающей скобки (х34 = "соединение") -
переменной х37 присваивается номер позиции буфера текстов,
следующей за позицией открывающей скобки. В стэк х23 заносится
четверка, соответствующая текущему подтерму; переменные
х28,х27,х24,х25 корректируются для выделения первого операнда
текущего под\-тер\-ма, и откат к изменению цвета фона этого
операнда.

\item х31 = "внешсумма". Нажата клавиша "курсор вверх". Из первого
элемента стэка х23 извлекаются данные для выделения надтерма
текущего терма, а сам этот элемент удаляется из стэка. Весь
надтерм перерисовывается в своем цвете фона; значения х25,х27 -
х30,х24 корректируются для ссылки на этот надтерм, и откат к
запросу очередной команды.

\item х31 = "Стандплюс" \ либо х31 = "легковидеть".
Соответственно, нажаты кла\-ви\-ша "к" \ либо "в" \ (кир.). В
первом случае находится комментарий (копия $A$) к посылкам
исходной задачи, который сразу же удаляется; во втором случае -
извлекается элемент (ветвь $A$) из накопителя х14. В обоих случаях
$A$ - пара логических символов, ссылающаяся на некоторый фрагмент
программы (во втором случае - отключенный). Если была нажата
клавиша "в", то реализуется диалог выбора типа перехода к
отключенной ветви. В верхней правой части экрана прорисовывается
текст "ветвь - иначе", в котором левое слово выделено зеленым
цветом фона. Переменная х27 будет при реализации данной команды
(случай "в") играть роль указателя на тип оператора перехода к
подключаемой ветви; изначально ей присваивается символ "ветвь".
Далее - обращение к кла\-ви\-а\-ту\-ре для получения команды х39.
Если х39 = "тринадцать" \ (клавиша Enter), то верхняя правая часть
экрана расчищается, и выход из диалога выбора типа оператора
перехода. Если х39 - "внешконъюнкция" \ (клавиша "курсор вправо")
либо "циклвариантов" \ (клавиша "курсор влево"), то зеленый фон
переносится на правое либо, соответственно левое слово текста, и
соответственно изменяется х27. Наконец, в случае х39 = "Плюс" \
(клавиша Esc) - отмена команды.

Далее - переход через "ветвь 2", где в случае "в" \ происходит
исключение из накопителя х14 пары (ветвь $A$). Переменным х23,х24
присваиваются значения, адресующие точку ссылки на изменяемый
фрагмент программы. Если текущий фрагмент программы - корневой, то
значением х23 становится заголовок про\-грам\-мы, а х24 - 0. В
случае некорневого фрагмента пара (х23,х24) - ссылка на оператор
перехода надфрагмента в блоке программ, по которому
осущест\-вля\-ет\-ся переход к текущему фрагменту.

Если была нажата клавиша "к", то далее происходит копирование
ветви по ссылке $A$ и вставка ее вместо ветви текущего фрагмента.
Последняя удаляется. Значения х15,х16 устанавливаются для ссылки
на новую ветвь, и откат к пере\-ри\-сов\-ке текущего фрагмента -
первого фрагмента новой ветви.

Если была нажата клавиша "в", то находится результат х34 вставки в
текущий фрагмент перед текущим оператором оператора перехода типа
х27, ссыла\-ю\-ще\-го\-ся на начало ветви $A$. После исключения из
х34 вспомогательных обозначений происходит изменение текущего
фрагмента на фрагмент х34. Корректируются х15,х16,х11, и откат к
перерисовке фрагмента.

\item х31 = "числитель". Нажата клавиша "р" \ (кир.) для
разрезания текущего фраг\-мен\-та на две части (выделенный
оператор становится началом второй части). Происходит исключение
из х17 вспомогательных обозначений и формирова\-ние значений
х23,х24, определяющих ссылку на текущий фрагмент из
надфраг\-мен\-та - аналогично предыдущей команде. Далее - переход
через "ветвь 2".

Создается набор х33 всех операторов текущего фрагмента,
предшествующих выделенному оператору. После добавления к концу х33
оператора перехода "ветвь(0)" \ и оператора "продолжение",
получается набор х35 операторов новой версии текущего фрагмента.
Определяется набор х36 операторов старой версии текущего
фрагмента, расположенных начиная с выделенного оператора. Все
ветви, достижимые из текущего фрагмента по операторам перехода, не
во\-шед\-шим в х35, отключаются и сохраняются в блоке программ.
Это делается для того, чтобы они не пропали при замене текущего
фраг\-мен\-та на х35. Далее предпринимается регистрация в блоке
программ новой версии текущего фраг\-мен\-та вместо старой, и
сразу после этого - подключение фрагмента х36 по ссылке "ветвь(0)"
\ из х35. Отключенные выше фрагменты здесь снова становят\-ся
подключенными к программе. Корректируются значения х15,х16,х11, и
от\-кат к пе\-ре\-ри\-сов\-ке фрагмента.

\item х31 = "извлечениеварианта". Нажатие клавиши "т", которое,
как и в случае обычного режима, является фиктивным. Данная команда
запускается через комментарий (автоклавиатура $\ldots$) для
прорисовки в верхней части экрана тек\-ста согласно комментарию
(титр $A$), создаваемому при обнаружении особой точки в процессе
просмотра ветви программы.

\item х31 = "конст" \ либо х31 = "группировки". Нажата клавиша
Ctr-End либо, соответственно, End. В первом случае происходит
поиск в оглавлении программ концевого пункта, к ветви которого
относится выделенный оператор; во втором - возвращение в
оглавление программ, если переход к редактору программ произошел
оттуда.

Если исходная задача имеет комментарий (подфрагмент $\ldots$),
означающий, что переход к редактору программ произошел от
оглавления программ, то этот комментарий удаляется; проверяется,
что была нажата клавиша End, и вводится комментарий "прогртерм",
инициирующий при откате к главному меню вход в оглавление
программ. Удаляются отключенные фрагменты. Ссылка на прог\-рам\-му
текущего символа переустанавливается по блоку программ - эта
пере\-уста\-нов\-ка предотвращает использование старых версий
фрагментов программы, сохраняющихся в зоне программ, если они были
заменены при редактировании на новые версии. Затем - откат к
обработчику команд главного меню, который и осуществит (без
прорисовки этого меню и запроса команды) переключение на
оглавление программ.

Если же исходная задача не имела комментария (подфрагмент
$\ldots$) либо была нажата клавиша Ctr-End, то предпринимается
просмотр всех позиций х36 в текущем фрагменте либо его
надфрагментах, из которых достижима позиция х35 текущего
выделенного оператора. Если при этом обнаруживается оператор
"прием($N$)", то в 9-м информационном блоке (т.е. блоке оглавления
программ) находится $N$ - й узел заголовка программы х13. Его
логический терминал "оглавление" \ содержит путь в оглавлении
программ к концевому пункту, со\-от\-вет\-ствующему найденному
оператору. Этот путь становится текущим путем оглавления программ,
вводится комментарий "прогртерм", и далее - те же действия, что и
в предыдущем случае.

\item х31 = "точкапривязки". Нажата клавиша Page Down. В этом
случае должна быть выполнена операция вставки перед выделенным
оператором оператора "прием($N$)" \ и создание ссылки на этот
оператор из нового концевого пункта оглавления программ. Прежде
всего, удаляется, если он был, комментарий (подфрагмент $\ldots$)
и вводится комментарий "прогртерм", обеспечивающий
пе\-ре\-ключение к оглавлению программ от точки запроса команд в
главном меню. В отличие от случая х31 = "группировки", перед
откатом к этой точке создается комментарий (вставка $\ldots$),
сохраняющий информацию, необходимую для ав\-то\-ма\-ти\-ческой
вставки оператора "прием($N$)" \ и создания ссылки на него после
ввода нового концевого пункта оглавления программ. Использование
этого ком\-мен\-тария было описано выше в разделе, посвященном
программе "оглавление".

\item х31 = "анализатор". Нажата клавиша "п". Реализуется
процедура увеличения либо уменьшения номеров всех программных
переменных, больших или равных заданного номера $N$, в операторах,
достижимых из текущего оператора. Про\-це\-дура заблокирована в
случае программы символа "вход". Прежде всего, про\-ис\-хо\-дит
обращение к текстовому редактору для ввода в левой верхней части
экрана терма "плюс($xN \ k$)" \ либо "минус($xN \ k$)",
указывающего величину $k$ и направление (увеличение, уменьшение)
сдвига номеров переменных. х36 ста\-но\-вит\-ся равно переменной
$xN$; х35 - сначала десятичному, а затем символьному числу $k$.
Далее инициализируются переменные х37, х38, х39, используемые в
цикле просмотра ветви текущего оператора. Значением х37 будет
ссылка на текущий просматриваемый фрагмент этой ветви; х38 - стэк,
являющийся непосредственным продолжением стэка х12. Его элементами
будут тройки, пер\-вые два разряда которых - ссылка на фрагмент, а
последний - номер перехода из фрагмента. Наконец, х39 - текущий
просматриваемый фрагмент. К оператору "повторение" \ будут
происходить откаты для рассмотрения очередного фраг\-мен\-та
ветви. Далее расположен оператор, перечисляющий позиции х40 в
те\-ку\-щем фрагменте операторов х41, для которых производится
сдвиг номеров переменных. Сначала в х41 выполняется изменение
номеров явно указанных переменных, затем - переменных $xi$, неявно
упоминаемых в операторах "заме\-на($i \ t$)". После просмотра
фрагмента - переход через "иначе 3".

Здесь устраняются вспомогательные обозначения в фрагменте х39 и
происходит его регистрация в блоке программ вместо старой версии.
Затем - переход через "ветвь 1" \ к циклу поиска первого оператора
перехода в х39, относящегося к области изменения номеров
переменных. В стэк х38 заносится тройка для перехода от х39 по
найденному оператору. х39 заменяется на фрагмент, до\-сти\-жи\-мый
по данному оператору, и откат к его обработке. Если оператор
перехо\-да не найден, то переход через "иначе 1".

Здесь происходит откат по стэку х38 к первому фрагменту, у
которого имеется еще не обработанный оператор перехода. Если
такого не найдено, то выполнение команды завершается, и откат к
перерисовке фрагмента. Иначе - х37, х38, х39 корректируются для
обработки фрагмента, достижимого через найденный оператор
перехода, и откат к изменению в этом фрагменте номеров переменных.

\item х31 = "узелраздела". Нажата клавиша F3. Происходит просмотр
справочной информации о заголовке х33 выделенного оператора либо
операторного вы\-ра\-же\-ния.

\item х31 = "мышь". Нажата левая либо правая кнопка мыши.
Определяются ука\-за\-тель х33 этой кнопки (0 - левая, 2 -
правая)и координаты курсора мыши (х34,х35). Если нажата правая
кнопка, то создается комментарий (авто\-кла\-ви\-а\-тура $\ldots$)
для нажатия клавиши F3. В случае левой кнопки - определяется
выделенный курсором мыши оператор и создается комментарий
(умножсимв $\ldots$) для перемещения многоцветной указки на этот
оператор, после чего - откат. Если курсор мыши не указывал на
оператор, то переход через "ветвь 3", где создается комментарий
(автоклавиатура $\ldots$) для возвращения в обычный ре\-жим
просмотра.

\item х31 = "усмчисло". Нажата клавиша "с". Находится текущий
выделенный мно\-го\-цвет\-ной указкой символ х33, и вводится
комментарий (прогрблок х33) для перехода к просмотру корневого
фрагмента программы этого символа. Вводится либо пополняется
значением х13 стэк "пройденных" \ логических символов. За\-тем -
откат к прорисовке корневого фрагмента программы символа х33.

\item х31 = "схемаидентификации". Нажата клавиша "ш". Нижняя часть
экрана расчищается, вводится комментарий (автоклавиатура $\ldots$)
для команды, про\-дол\-жа\-ющей инициированный в обычном режиме
поиск (клавиши "П" \ либо "У"), и откат к обработчику команд
обычного режима просмотра.

\end{enumerate}

\chapter{Программа отладчика ЛОСа}

Отладчик ЛОСа реализован программой символа "прерывание". В
действительности его роль гораздо большая, чем просто отладка или
пошаговый показ решения. Так как обращения к отладчику могут
происходить, после установки соответствующего типа прерывания,
практически в любом месте выполняемой программы, он стано\-вит\-ся
той точкой, в которой естественным образом можно аккумулировать
различного рода самоконтроль и самоанализ. Программа "прерывание"
\ достаточно слож\-на; при\-водимое ниже ее описание может оказать
существенную помощь при развитии ин\-тер\-фей\-сов, связанных с
решением задач, а также при создании дополнительных средств
отладки и контроля.

\section{Предварительные сведения об интерпрета\-то\-ре ЛОСа}

Начнем с предварительных сведений об интерпретаторе ЛОСа,
необходимых для понимания работы отладчика. При работе системы в
оперативной памяти создаются следующие основные массивы:

\begin{enumerate}

\item Массив для хранения термов и наборов, создаваемых
операторами ЛОСа. В частности, в нем хранятся все задачи текущей
цепи задач. Этот массив назы\-ва\-ет\-ся зоной задач. Размеры зоны
задач сравнительно невелики - они позволяют хранить всего около
250000 элементарных знаков (логических символов; пе\-ре\-мен\-ных;
ссылок на термы, наборы и вхождения). Однако, для потребностей
логического процессора эти размеры оказываются более чем
достаточны. Нор\-мальным режимом работы системы является режим с
"почти пустой" \ зоной задач; при этом поиск свободного места для
записи новых термов и наборов происходит за время, пренебрежимо
малое по сравнению с полным временем реализации очередного
оператора. Для исключения из зоны задач не\-ис\-поль\-зуемых
объектов ("мусора") используется следующая простая схема. Каждый
объект имеет пометку четности номера цикла заполнения зоны задач.
Те объ\-екты, пометка которых не совпадает с четностью текущего
цикла (зона на каждом цикле заполняется слева направо),
рассматриваются как пустая об\-ласть. Как только зона оказывается
заполнена, по цепочкам ссылок выявляются все фактически
используемые объекты (их мало), и их пометка четности ме\-ня\-ется
на противоположную. При переходе к очередному циклу все прочие
объекты автоматически оказываются пустой областью.

\item Массив для фрагментов программ, считываемых из файлов блока
программ и сохраняемых на некоторое время в оперативной памяти. Он
называется зоной программ и представляет собой буфер,
обеспечивающий необходимое бы\-стро\-дей\-ствие системы. Размеры
зоны программ - около 2.5 Мбайт; она разбита на сегменты по 256
Кбайт. В блоке программ фрагменты хранятся в несколько сжатом
виде, а при считывании в зону программ они разворачиваются так,
чтобы стала возможной быстрая работа интерпретатора.

\item Массив для хранения значений программных переменных и другой
информа\-ции, необходимой для выполнения программы. Этот массив
называется гло\-бальным стэком интерпретатора ЛОСа и разбит на
кадры. Новый кадр вводится при обращении к программе оператора
либо операторного выражения, либо при обращении к решению задач.
Он сохраняет значения программных переменных на период выполнения
программы (решения задачи). Если программа реализует перечисляющий
оператор, то ее кадр сохраняется даже после получения
ре\-зуль\-та\-та - он будет использоваться при откатах. Наличие
таких теневых кадров, используемых при откатах, нарушает обычную
"стэковую" \ структуру гло\-баль\-но\-го стэка, который, строго
говоря, стэком уже не является. Новые кадры могут возникать в
глобальном стэке также при выполнении тех перечисляющих
операторов, которые реализованы непосредственно интерпретатором.
Они хра\-нят информацию, необходимую для продолжения перечисления
при откатах. Более подробное описание структуры кадров глобального
стэка приводится ниже.

\item Массив для накопления входных данных реализуемого
интерпретатором ЛОСа оператора либо операторного выражения. Этот
массив называется стэком вы\-ра\-жений, и в отличие от глобального
стэка он уже является обычным стэком. При вычислении значения
операторного выражения результат снова заносится в стэк выражений,
после того как из него были исключены входные данные. Кроме
обычных преимуществ, предоставляемых при организации вычисления
значения многоэтажного операторного выражения, данный стэк играет
роль буфера, предохраняющего промежуточные записи от удаления при
пери\-оди\-чес\-ки проводимых расчистках зоны задач.


\end{enumerate}

Значением программной переменной ЛОСа, как уже говорилось выше,
служит объект одного из четырех типов: логический символ, символ
переменной, терм либо набор, вхождение в терм либо набор. Это
значение кодируется при помощи одного 32-битного слова, которое и
сохраняется в кадрах глобального стэка либо в стэке выражений.
Глобальный стэк и стэк выражений рассматриваются далее как наборы
32-битных слов.

В данном разделе нам понадобится более подробное описание
структуры кадров глобального стэка. Эти кадры бывают 4-х типов.
Первые 6 ячеек каждого кадра хранят следующую стандартную
информацию:

В первой ячейке записано смещение относительно начала стэка начала
сле\-ду\-юще\-го кадра.

Вторая ячейка хранит смещение начала предыдущего кадра (для
первого кадра стэка - 0).

Третья ячейка хранит тип кадра - число от 1 до 4.

Четвертая ячейка кадра хранит смещение относительно начала стэка
источника этого кадра. Источником кадра называется кадр того
фрагмента программы, при выполнении которого был введен данный
кадр (и к которому нужно будет воз\-вра\-щать\-ся для продолжения
вычислений). С учетом наличия сохраняемых для про\-дол\-же\-ния
перечисления кадров, источник кадра не обязательно должен быть
расположен непосредственно перед ним.

Пятая и шестая ячейки кадра хранят адрес продолжения - информацию,
не\-об\-хо\-ди\-мую для возобновления вычислений в источнике этого
кадра. Младшие 16 бит пятой ячейки хранят номер сегмента $M$ зоны
программ, в котором хранится фрагмент программы $F$, по которому
ведутся вычисления в источнике; старшие 16 бит пятой ячейки -
смещение начала фрагмента $F$ в массиве $M$. Младшие 16 бит шестой
ячейки хранят смещение ячейки фрагмента $F$, с которой должны
возоб\-нов\-лять\-ся прерванные вычисления для источника. Наконец,
старшие 16 бит шестой ячейки хранят значение, которое должно быть
установлено в специальном регистре "уровня перечисления" \ при
возобновлении вычислений в источнике.

Назначение дальнейших ячеек кадра глобального стэка зависит от его
типа:

\begin{enumerate}

\item Кадр типа 1. Этот кадр используется при реализации
программы, осущест\-вля\-ю\-щей сканирование задачи. Он называется
также кадром задачи.

Седьмая ячейка кадра задачи хранит так называемый отложенный
уровень сканирования. Обычно он равен нулю и используется в тех
случаях, когда при сканировании задачи встречается условие либо
посылка, вес которой на единицу больше текущего уровня
сканирования $U$. Тогда (см. раздел "Ска\-ни\-ро\-вание задачи" \
в главе, посвященной описанию общей схемы функционирования
решателя) предпринимается серия локальных просмотров такого
условия (по\-сыл\-ки), в процессе которых текущий уровень меняется
от 0 до $U-1$. На период этих просмотров отложенный уровень
сохраняет исходное значение текущего уровня $U$, а затем опять
становится равен 0. Его ненулевое значение является указателем на
наличие серии локальных просмотров.

Восьмая ячейка кадра задачи хранит в младших 16 битах максимальный
уро\-вень задачи, а в старших 16 битах - смещение вершины стэка
выражений по отношению к его корню на момент ввода кадра задачи.

Девятая ячейка кадра задачи хранит смещение по отношению к началу
того же кадра первой не определенной на текущий момент программной
переменной (все относящиеся к тому же кадру последующие ячейки
также соответствуют не определенным программным переменным).

Ячейки кадра задачи начиная с десятой хранят значения программных
пе\-ре\-мен\-ных х1,х2, и т.д. В частности, сама десятая ячейка
хранит ссылку на задачу данного кадра.

Переменная, значение которой не определено, представляется в кадре
гло\-баль\-ного стэка одним из трех способов:

а) нулевой набор;

б) набор, старшие 16 бит которого имеют вид $(10 \ldots 0)$, а
младшие 16 образуют номер переменной в источнике кадра, которой
будет присваиваться значение данной (выходной) переменной текущего
кадра;

в) набор, старшие 14 бит которого имеют вид $(010 \ldots 0)$, а
младшие 18 образуют смещение в зоне задач позиции набора, на
которую заносится значение данной (выходной) переменной текущего
кадра. Этот способ передачи выходных зна\-че\-ний используется при
обращении к оператору "процедура($\ldots$)".

\item Кадр типа 2. Этот кадр используется при реализации
оператора, запрограм\-ми\-ро\-ванного на ЛОСе; он называется
кадром оператора.

Седьмая ячейка данного кадра хранит "начало расчистки". Оно
используется в том случае, если оператор реализуется в режиме
перечисления. Тогда при откате к продолжению определяемого им
перечисления выполняется обнуление всех ячеек источника кадра
оператора, начиная с ячейки, смещение которой (по отношению к
началу источника) равно "началу расчистки".

Восьмая ячейка хранит значение, переносимое в регистр "уровня
перечисления" \ при откате к продолжению перечисления.

Девятая ячейка хранит смещение относительно начала кадра первой не
опре\-де\-лен\-ной переменной.

Ячейки кадра начиная с десятой хранят значения программных
переменных х1,х2,$\ldots$.

\item Кадр типа 3. Этот кадр используется при реализации
операторного выражения, запрограммированного на ЛОСе; он
называется кадром операторного выра\-же\-ния.

Седьмая ячейка данного кадра хранит код логического символа -
индекса об\-ра\-ще\-ния к программе (логический символ 0 в случае
обычного операторно\-го выражения, иначе - тип справочника).

Восьмая ячейка хранит заголовок операторного выражения.

Девятая ячейка хранит смещение относительно начала кадра первой не
опре\-де\-лен\-ной переменной.

Ячейки кадра, начиная с десятой, хранят значения программных
перемен\-ных х1,х2,$\ldots$.

\item Кадр типа 4. Этот кадр используется для организации
продолжения перечис\-ле\-ния, выполняемого базисными
(реализованными программой интерпретатора) перечисляющими
операторами ЛОСа; он называется кадром продолжения. Та\-кой кадр
вводится процедурой интерпретатора, обрабатывающей первое
об\-ра\-ще\-ние к перечисляющему оператору. При откатах к данному
оператору при\-ме\-ня\-ется другая, обеспечивающая шаг
перечисления, процедура интерпретатора, которая корректирует
содержимое введенного изначально кадра продолжения и устраняет его
по завершении перечисления.

Седьмая ячейка кадра продолжения хранит "начало расчистки" \ -
аналогично кадру оператора, оно определяет расчистку кадра
источника при откате к повторной обработке оператора.

Восьмая ячейка кадра хранит значение, передаваемое при откате в
регистр "уровня перечисления".

Девятая ячейка кадра хранит дополнительный тип кадра. Обычно это
0; в случае кадра, вводимого для оператора "лимит($\ldots$)", это
значение равно 1; в случае кадра для оператора
"контрольприема($\ldots$)" \ оно равно 3.

Ячейки кадра, начиная с десятой, хранят значения "скрытых" \
перемен\-ных, обеспечивающих продолжение перечисления. Для каждого
конкретного опе\-ра\-то\-ра число и назначение их - свои
собственные.

\end{enumerate}

Из-за режима перечисления глобальный стэк отличается от обычного
стэка: даже после того, как перечисляющий оператор выполнен, кадр
его сохраняется в стэке для продолжения перечисления. Это может
приводить к тому, что фактически ре\-али\-зу\-емый "текущий" \
стэковый кадр будет находиться не в конце, а в середине
глобального стэка - после него будет размещена группа кадров,
обеспечивающих продолжение начатых перечислений. Данное
обстоятельство несколько усложняет работу интерпретатора: при
присвоении значений новым программным переменным может не хватить
места в ранее зарезервированной области текущего стэкового кадра.
Тогда приходится сдвигать все последующие кадры, расширяя эту
область.

Вход в программу отладчика ЛОСа организуется интерпретатором при
об\-на\-ру\-жении некорректного обращения к оператору
(операторному выражению) либо при усмотрении заранее
установленного условия прерывания. При этом в конце глобального
стэка формируется кадр фиктивного операторного выражения
"пре\-ры\-вание". Этот кадр не имеет источника. Его четвертая
ячейка хранит указатель кад\-ра прерывания, роль которого играет
константа 0xFFFFFFFF - i, где i - вспомогатель\-ный параметр,
равный 1 либо 2. После создания кадра прерывания управление
пе\-ре\-да\-ется программе логического символа "прерывание" \ с
таким типом обращения, как если бы вычислялось значение
операторного выражения. Соответственно, программа отладчика
начинается с оператора "обращение(0)", устанавливающего наличие
дан\-ного типа обращения.

Условия на прерывания могут устанавливаться самой программой
отладчика. Обычно в этом случае нужно, чтобы условие отслеживалось
лишь после выхо\-да из отладчика и возобновления внешних
вычислений. Вместе с тем, при отладке отладчика может понадобиться
установка прерываний, срабатывающих в нем самом. При этом
произойдет обращение к программе отладчика из нее же, и снова
возникнет проблема уточнения контекста, к которому будут отнесены
новые установки на пре\-ры\-ва\-ние. Для решения этой проблемы
создан стэк установок на прерывание. При каждом входе в отладчик
ЛОСа предпринимается переход к следующему кадру этого стэка; при
выходе из отладчика - последний кадр стэка отбрасывается. Оператор
отладчика, вводящий установку на прерывание, получает информацию о
том, куда ее следует занести - в предпоследний кадр стэка
установок на прерывания (для активизации после выхода из
отладчика) либо в последний (для немедленной ак\-ти\-ви\-за\-ции в
рамках программы отладчика). Эта информация, называемая ниже
указателем установки прерывания, в первом случае есть символ 1, во
втором - 0.

\section{Серия операторов "трассировка"\ }

Отладчик ЛОСа использует серию операторов "трассировка($A_1 \ldots
A_n$)", реа\-ли\-зу\-емых непосредственно оператором ЛОСа и
предназначенных для анализа и мо\-ди\-фи\-кации структур данных
интерпретатора с уровня программы ЛОСа. В частности, с помощью
этих операторов устанавливаются либо отменяются установки на
пре\-ры\-ва\-ния. Прежде чем перейти к описанию программы
отладчика, перечислим операторы данной серии.

\begin{enumerate}
\item "трассировка(прерывание $t_1$)". Значение переменной $t_1$
становится равно ссылке на последний кадр прерывания. Эта ссылка
представляет собой символьный номер смещения в глобальном стэке
начала кадра.

\item "трассировка(внешзнак $t_1 \ t_2 \ t_3$)". Значением $t_1$
является ссылка на некоторый кадр глобального стэка. Переменной
$t_2$ присваивается ссылка на предыдущий кадр (не на источник
кадра, а именно на предшествующий ему в стэке кадр); переменной
$t_3$ становится равна типу предыдущего кадра (число от 1 до 4).
Если кадр - первый в стэке, то оператор ложен.

\item "трассировка(контекст $t_1 \ t_2$)". $t_1$ - ссылка на кадр
$K$ глобального стэка. В зоне задач формируется набор $t_2 = (a_1
\ldots a_p)$, содержащий информацию о кадре:

 а) Если $K$ - кадр задачи, то $a_1 = 1$; $a_2$ - ссылка на
 источник кадра либо (для исходного кадра) логический символ
 "нет"; $a_3$ - отложенный уровень либо логический символ "нет";
 $a_4$ - максимальный уровень задачи; $a_5,a_6,a_7,a_8$ - адрес
 продолжения, представленный символьными номерами: смещения
 фрагмента программы в сегменте зоны программ, сегмента зоны
 программ, смещения ячейки продолжения в фрагменте программы,
 уровня перечисления. $a_9$ - набор значений программных
 переменных кадра.

 б) Если $K$ - кадр оператора, то $a_1 = 2$; $a_2$ - ссылка на
 источник кадра; $a_3,a_4,a_5,a_6$ - адрес продолжения; $a_7$ -
 заголовок оператора; $a_8$ - набор значений программных
 переменных.

 в) Если $K$ - кадр операторного выражения, то $a_1 = 3$; $a_2$ -
 ссылка на источник кадра (у кадра прерывания вместо этого указана
 переменная "х1"); $a_3,a_4,a_5,a_6$ - адрес продолжения; $a_7$ -
 заголовок операторного выражения; $a_8$ - индекс обращения; $a_9$
 - набор значений переменных.

 г) Если $K$ - кадр продолжения, то $a_1 = 4$; $a_2$ - ссылка на
 источник кадра; $a_3,a_4,a_5,a_6$ - адрес продолжения; $a_7$ -
 символьный номер уровня перечисления; $a_8$ - набор значений
 переменных кадра продолжения, используемых для про\-дол\-жения
 перечисления.

 \item "трассировка(программа $t_1 \ t_2 \ t_3 \ t_4 \ t_5 \
 t_6$)". $t_1,t_2,t_3$ - символьные номера, со\-от\-вет\-ственно,
 смещения начала некоторого фрагмента программы в сегменте зоны
 программ; самого этого сегмента и смещения обращения к процедуре
 интерпретатора в фрагменте программы. Переменной $t_4$
 присваивается пред\-став\-ле\-ние фрагмента программы в виде набора термов,
 сформированных в зоне задач; переменной $t_5$ - вхождение текущего
 терма в $t_4$; $t_6$ - вхождение оператора в терм по $t_5$. Если
 обращение к процедуре интерпретатора расположено в за\-вер\-ша\-ющей
 части фрагмента (после обращений к процедурам, соответствующим
 собственно операторам и операторным выражениям ЛОСа), то значения
 $t_5,t_6$ становятся равны 0.

 \item "трассировка(внешнийэлемент $t_1 \ t_2 \ t_3 \ t_4 \
 t_5$)". $t_1,t_2$ - символьные номера сме\-ще\-ния начала фрагмента
 программы в зоне программ и содержащего фрагмент сегмента этой
 зоны. $t_3,t_4,t_5$ становятся равны символьным номерам смещения
 надфрагмента в зоне прог\-рамм, содержащего надфрагмент сегмента
 зоны прог\-рамм и смещения обращения к оператору перехода в
 надфрагменте (относи\-тельно начала сегмента). Если надфрагмента
 нет, то $t_3$ становится равно 0, $t_4$ - логическому символу
 "нет", $t_5$ - заголовку программы.

 \item "трассировка(значение $t_1 t_2$)". $t_1$ - символьный номер
 ячейки стэка выражений. Значением $t_2$ становится логический
 символ "нет" \ (если ячейка не используется) \ либо объект из этой
 ячейки.

 \item "трассировка(набор $t_1$)". Значением $t_1$ становится
 набор $a_1 \ldots a_7$ сохраненных перед входом в прерывание
 значений регистров интерпретатора: $a_1$ - регистр "ответ" \
 (если он содержал 0, то указывается символ "нет"); $a_2$ -
 регистр "сим\-вол" \ (логический символ, программа которого
 выполнялась на момент пре\-ры\-ва\-ния); $a_3$ - регистр уровня
 обращения (приведенный к виду символьного номера); $a_4$ -
 символьный номер смещения текущего кадра глобального стэка
 на момент входа в прерывание; $a_5$ - символьный номер смещения
 вершины стэка выражений; $a_6$ - регистр истинности; $a_7$ -
 заголовок того оператора, при выполнении которого возникло
 прерывание.

 \item "трассировка(задача $t_1 \ t_2$)". Установка прерывания при
 выдаче ответа задачи кадра $t_1$. $t_2$ - указатель установки
 прерывания (0 - в текущем кадре стэка установок на прерывания, 1
 - в предыдущем).

 \item "трассировка(решить $t_1 \ t_2$)". Установка прерывания при
 преобразовании задачи кадра $t_1$. $t_2$ - указатель установки
 прерывания.

 \item "трассировка(логсимвол $t_1 \ t_2$)". Установка прерывания
 при обращении к про\-грам\-ме логического символа $t_1$. $t_2$ -
 указатель установки прерывания.

 \item "трассировка(ветвь $t_1 \ t_2 \ t_3$)". Установка
 прерывания при обращении к не\-кор\-не\-вому фрагменту программы,
 имеющему ссылку ($t_1,t_2$) в блоке программ. $t_3$ - указатель
 установки прерывания.

 \item "трассировка(слово $t_1 \ t_2 \ t_3 \ t_4$)". Установка
 прерывания при обращении в кадре $t_1$ к некорневому фрагменту
 программы, имеющему ссылку ($t_2,t_3$) в блоке программ. $t_4$ -
 указатель установки прерывания.

 \item "трассировка(позиция $t_1 \ t_2 \ t_3$)". Установка
 прерывания при обращении к опе\-ра\-то\-ру, имеющему смещение $t_2$ в
 $t_1$ - м сегменте зоны программ. $t_3$ - указатель установки
 прерывания.

 \item "трассировка(конец $t_1$)". Сброс всех прерываний по
 указателю установки пре\-ры\-ва\-ния $t_1$.

 \item "трассировка(стоп $t_1$)". Ввод пошаговой трассировки
 по указателю уста\-нов\-ки пре\-ры\-ва\-ния $t_1$.

 \item "трассировка(сброс $t_1 \ t_2$)". $t_1$ - ссылка на
 кадр глобального стэка. Ввод трас\-си\-ров\-ки по шагам в этом кадре;
 $t_2$ - указатель установки прерывания.

 \item "трассировка(обрыв $t_1 \ t_2$)". $t_1$ - ссылка на кадр
 глобального стэка. Ввод по\-опе\-ра\-торной трассировки в этом кадре;
 $t_2$ - указатель установки прерывания.

 \item "трассировка(выход $t_1 \ t_2$)". $t_1$ - ссылка на кадр
 глобального стэка. Ввод пре\-ры\-ва\-ния по выходу из этого кадра.
 $t_2$ - указатель установки прерывания.

 \item "трассировка(ответ $t_1$)". Ввод прерывания при выходе на
 кадр задачи. $t_1$ - указатель установки прерывания.

 \item "трассировка(число $t_1 \ t_2$)". Ввод прерывания после
 $t_1$ шагов работы интер\-пре\-та\-тора ($t_1$ - число). $t_2$ -
 указатель установки прерывания.

 \item "трассировка(актив)". Включение счетчика шагов работы
 интерпретатора.

 \item "трассировка(пассив)". Выключение счетчика шагов работы
 интерпретатора. При обращении к отладчику ЛОСа счетчик шагов
 автоматически выключается, а при выходе из отладчика -
 включается. Это происходит без явного исполь\-зо\-ва\-ния
 данного и предыдущего операторов; они нужны вне программы отладчика.

 \item "трассировка(величина $t_1$)". Переменной $t_1$
 присваивается число на счетчике шагов работы интерпретатора.

 \item "трассировка(файл $t_1 \ t_2 \ t_3 \ t_4$)". $(t_1,t_2)$ -
 ссылка на начало фрагмента программы в зоне программ. $(t_3,t_4)$
 становится равно ссылке на начало этого фрагмента в блоке
 программ.

 \item "трассировка(зона $t_1 \ t_2 \ t_3 \ t_4 \ t_5 \ t_6$)".
 ($t_1,t_2$) - ссылка на начало фрагмента про\-грам\-мы в зоне
 программ ($t_1$ - номер сегмента, $t_2$ - смещение в сегменте).
 $t_3$ - фрагмент программы, записанный в зоне задач, то есть
 набор термов $(A_1 \ldots A_p)$. $t_4$ - вхождение терма $A_i$
 в $t_3$; $t_5$ - вхождение оператора либо операторного выражения
 $B$ в $A_i$. $t_6$ становится равно смещению $B$ в сегменте $t_1$.

 \item "трассировка(Текзадача $t_1$)". Переменной $t_1$
 присваивается смещение последнего кадра задачи.

 \item "трассировка(исходнаязадача $t_1$)". Если было введено
 прерывание на пре\-обра\-зо\-ва\-ния задачи некоторого кадра, то
 переменной $t_1$ присваивается ссылка на этот кадр. Иначе
 оператор ложен.

 \item "трассировка(тип $t_1$)". Переменной $t_1$ присваивается
 тип обращения к програм\-ме "прерывание". Типом обращения к этой
 программе называется некоторое число, характеризующее причину
 прерывания. Рассматриваются следующие типы обращений:

  1 - переполнение зоны задач;

  2 - переполнение глобального стэка;

  3 - превышение при откате сброса максимально допустимого число
  пере\-чис\-ля\-ющих операторов;

  4 - исчерпание переменных;

  5 - нет программы логического символа, к которой произошло
  обращение;

  6 - превышение максимально допустимого размера текста;

  7 - некорректное обращение к оператору;

  8 - переполнение стэка выражений;

  9 - обращение из трассировки согласно заранее установленному
  условию;

  10 - контроль зацикливания по размеру глобального стэка (для
  обнару\-же\-ния циклически повторяющихся рекурсивных обращений).

  \item "трассировка(0)". Внутренний перезапуск логической системы
  - расчистка зоны задач и основных регистров (зона программ
  сохраняется) с выходом в главное меню.

  \item "трассировка(результат $t_1$)". Переменной $t_1$
  присваивается содержимое регистра "ответ" \ (если этот регистр
  обнулен, то оператор ложен).

  \item "трассировка(ключ $t_1$)". Переменной $t_1$ присваивается
  тип установки на пре\-ры\-ва\-ние (символьный номер), хранящейся в
  предпоследнем кадре стэка установок на прерывание (при отсутствии
  таковой - логический символ "нет"). Рас\-смат\-риваются следующие типы
  установок на прерывание:

    1 - прерывание при выдаче ответа задачи заданного кадра;

    2 - прерывание при преобразовании задачи заданного кадра;

    3 - прерывание при обращении к программе заданного логического
    символа;

    4 - прерывание при обращении к фрагменту программы по ссылке в
    бло\-ке программ;

    5 - прерывание при обращении к оператору по ссылке в зоне
    программ;

    6 - прерывание при пошаговой трассировке;

    7 - прерывание при пошаговой трассировке в заданном кадре;

    8 - пооператорная трассировка в заданном кадре;

    9 - прерывание при выходе из заданного кадра;

    10 - прерывание при выходе на кадр задачи;

    11 - прерывание по достижении заданного числа шагов;

    12 - прерывание при обращении в заданном кадре к оператору по
    ссылке в зоне программ;

    13 - прерывание при обращении в заданном кадре к фрагменту
    программы по ссылке в блоке программ;

    14 - прерывание при обращении в заданном кадре к оператору
    "замена" \ по заданной переменной.

    15 - прерывание при обращении к оператору "изменение" \ для
    вхождения в заданный набор;

    16 - прерывание при обращении к оператору "контрольприема";

    17 - прерывание при обращении в заданном кадре к операторам
    "стандслед\-ствие" \ либо "контрольнормализации", либо при изменении
    значения перемен\-ной "х1";

    18 - прерывание при обращении к оператору "прием($N$)" программы
    заданного логического символа;

    19 - прерывание при обращении к оператору "записьтеоремы";

    20 - прерывание при переустановки трассировки после отката по
    оператору "лимит".

  \item "трассировка(точка $t_1 \ t_2 \ t_3 \ t_4$)". Ввод
   прерывания при обращении в кадре $t_1$ к оператору, имеющему
   смещение $t_3$ в $t_2$ - м массиве зоны программ. $t_4$ -
   указатель установки прерывания.

  \item "трассировка(замена $t_1 \ t_2 \ t_3$)". Ввод прерывания
  при выполнении в кадре $t_1$ оператора "замена" для переменной
  $t_2$. $t_3$ - указатель установки прерывания.

  \item "трассировка(изменение $t_1 \ t_2$)". Ввод прерывания при
  изменении разряда набора $t_1$. $t_2$ - указатель установки
  прерывания.

  \item "трассировка(контрольприема $t_1 \ t_2 \ t_3 \ t_4 \
  t_5$)". Ввод прерывания при обращении в кадре $t_1$ к оператору
  "контрольприема($t_2 \ t_3 \ t_4$)". $t_5$ - указатель установки
  прерывания. После выхода на оператор "контрольприема($\ldots$)"
  \ автоматически осуществляется переустановка на пооператорную
  трассировку в кадре. Если $t_1$ - не ссылка на кадр, а
  переменная, то прерывание выполняется в произвольном кадре.

  \item "трассировка(контроль $t_1$)". Включение при $t_1 = 1$ и
  выключение при $t_1 = 0$ режима контроля холостого хода приемов.
  Предварительно создается ком\-мен\-та\-рий (выписка пустоеслово) к
  посылкам исходной задачи. Этот комментарий накапливает
  статистику о холостом ходе приемов (трудоемкости неудавшихся попыток
  применения приема) и числе их срабатываний. Второй элемент
  ком\-мен\-тария (изначально пустой набор) заполняется парами
  (логический символ $A$ - набор пар (заголовок приема $S$ - набор
  троек (номер приема $N$ - счетчик его холостого хода,
  представляющий собой символьное число, увеличиваемое после
  очередной неудавшейся попытки применения приема на число тысяч
  шагов работы интерпретатора, занятых в этой попытке; если число
  шагов было меньше 1000, то увеличение не предпринимается -
  счетчик числа применений приема))). Заполнение этого комментария
  при включенном режиме контроля холостого хода происходит автоматически
  на уровне интерпретатора ЛОСа.

  \item "трассировка(окончание)". Завершение работы системы. Этот
  оператор поз\-во\-ля\-ет завершать работу системы из произвольной точки
  программы. Фактически для выхода из системы вместо него
  используется оператор "ответ", обращение к которому из программы
  символа "вход" \ инициирует выдачу ответа на исходную фиктивную задачу,
  т.е. выход из системы.

  \item "трассировка(клавиатура)". Ложно, если в период после последнего
  ввода ин\-фор\-мации с клавиатуры (мыши) была нажата клавиша клавиатуры
  либо кноп\-ка мыши.

  \item "трассировка(процедура $t_1 \ t_2$)". Ввод прерывания при
  обращении в кадре $t_1$ к операторам "контрольнормализации",
  "контрольбуфера", "синтезатор", "под\-случаи" \ либо при изменении
  значения переменной "х1". $t_2$ - указатель установки
  прерывания.

  \item "трассировка(обращение $t_1 \ t_2 \ t_3$)". $t_1$ - ссылка
  на кадр. Переменной $t_2$ при\-сва\-и\-ва\-ется ссылка на источник этого
  кадра либо, в случае кадра прерывания, ссылка на предыдущий
  кадр. Переменной $t_3$ присваивается тип источника. Если кадр
  исходный, то оператор ложен.

  \item "трассировка(прием $t_1 \ t_2 \ t_3$)". Ввод прерывания
  при обращении к оператору "прием($t_2$)" программы логического
  символа $t_1$; здесь $t_2$ - набор цифр. $t_3$ - ука\-за\-тель
  установки прерывания. После выхода на этот оператор
  автоматически осуществляется переустановка на пооператорную
  трассировку.

  \item "трассировка(внешкадр $t_1 \ t_2$)". $t_1$ - символьное
  число. Переменной $t_2$ при\-сва\-и\-ва\-ется ссылка на кадр, являющийся
  $t_1$-м источником (по цепочке переходов от кадра к источнику)
  текущего кадра глобального стэка. При $t_1=0$ - при\-сва\-и\-ва\-ется
  ссылка на текущий кадр.

  \item "трассировка(смответ $t_1$)". Переменной $t_1$
  присваивается содержимое регистра "смответ". Этот регистр хранит
  смещение кадра глобального стэка, при выходе из которого
  организуется обращение к программе "прерывание". Используется
  для отслеживания момента выхода из процедуры, внутри которой
  ведется трас\-си\-ров\-ка.

  \item "трассировка(суммавсех $t_1 \ t_2$)". $t_1$ - либо 0, либо
  набор. В первом случае оп\-ре\-де\-ля\-ется количество используемых
  8-байтных слов в зоне задач (общее чис\-ло таких слов в ней равно
  256К); во втором - количество 8-байтных слов в зоне задач,
  достижимых по цепочкам ссылок из набора $t_1$. Переменной $t_2$
  при\-сва\-и\-ва\-ет\-ся найденное количество слов в формате символьного
  числа.

  \item "трассировка(приемы $t_1$)". Если $t_1 = 1$, то включаются
  обращения к программе символа "контрольприема" \ (по умолчанию
  они отключены); если $t_1 = 0$, то они выключаются.

  \item "трассировка(фильтр $t_1 \ t_2 \ t_3$)". Серия процедур,
  предназначенных для работы с буфером фильтрации. Он состоит из
  списка пар (логический символ - номер узла теоремы), указывающих
  на теоремы приемов ГЕНОЛОГа, применение которых блокируется.
  Блокировка выполняется интерпретатором при по\-пыт\-ке обращения к
  оператору "контрольприема" \ безотносительно к тому, вклю\-чен
  ли режим выполнения ЛОС-программы этого оператора. Если $t_1 =
  1$, то устанавливается режим блокировки с применением буфера
  фильтрации. Если $t_1 = 2$, то режим блокировки отменяется. Если
  $t_1 = 0$, то буфер фильтрации расчищается. Если $t_1 = 3$, то
  проверяется наличие режима блокировки с при\-ме\-не\-нием буфера
  фильтрации: при наличии режима оператор истинен, иначе ложен.
  Если $t_1 = 4$, то в буфер фильтрации заносится пара ($t_2 \
  t_3$); $t_2$ - логический символ, $t_3$ - номер узла теоремы в
  формате десятичного числа.

  \item "трассировка(теорема $t_1$)". Ввод прерывания при
  обращении к процедуре "за\-пись\-те\-оремы". $t_1$ - указатель
  установки прерывания.

  \item "трассировка(справка $t_1 \ t_2$)". Переменной $t_1$
  присваивается тип прерывания, установленного до входа в
  последнее прерывание; переменной $t_2$ - смеще\-ние кадра, по
  которому оно было установлено.

  \item "трассировка(См $t_1 \ t_2$)". Аналогично предыдущему, но
  для текущего пре\-ры\-ва\-ния.

  \item "трассировка(запись $t_1$)". На счетчике числа шагов
  работы интерпретатора устанавливается десятичное число $t_1$.

  \item "трассировка(повторение $t_1$)". $t_1$ - ссылка на кадр
  прерывания. Происходит откат к этому кадру и повторная
  инициализация программы "прерывание".

  \item "трассировка(вход)". Истинно до первого внутреннего
  перезапуска, а затем ложно.

\end{enumerate}

\section{Начало программы "прерывание"\ }

Программе "прерывание" \ не передаются значения каких-либо
изначально опре\-де\-лен\-ных программных переменных. Анализ
текущей ситуации она начинает с по\-мо\-щью операторов серии
"трассировка". Прежде всего, переменной х1 присваивается тип
обращения к программе, указывающий причину обращения. При этом
переменной х2 присваивается набор значений регистров
интерпретатора, сохраненных перед входом в прерывание.

Последним элементом набора х2 является заголовок того оператора,
при реа\-ли\-за\-ции которого интерпретатор обратился к отладчику.
Если этот заголовок указывает на работу с комментариями задачи
(ввод либо удаление комментария), то проверя\-ет\-ся,
предусматривает ли режим трассировки отображение на экране
соответствующего действия. Для этого извлекается комментарий
(трасснабор $A$), хранящий в наборе $A$ список логических символов
- установок на режим трассировки. Эти установки вводятся либо при
просмотре задачи в задачнике перед запуском ее решения, либо
непосредственно в процессе решения; вход в диалоговый блок для
изменения уста\-но\-вок - через нажатие клавиши "т". Типы
установок таковы: "полный" \ - ручной выбор входа в подпроцессы
(т.е. во вспомогательные задачи и пакетные операторы);
"легковидеть" \ - пропуск отображения обращений к проверочным
операторам; "иск\-лю\-че\-ние" \ - пропуск шагов удаления посылок
и условий; "сопровождение" \ - пропуск изменения сопровождающих
утверждений; "обращение" \ - пропуск входа в любые подпроцессы;
"примечание" \ - просмотр изменений комментариев задачи; "одз" \ -
пропуск шагов регистрации условий на область допустимых значений.
Если оператор, по которому выполнено прерывание, изменяет
комментарии, а в наборе $A$ нет символа "примечание", то выход из
отладчика. Последний обеспечивается оператором
"от\-вет($\ldots$)"; здесь несущественно, что именно выдается в
качестве ответа.

Если выхода из отладчика не произошло, то переменной х3
присваивается ссылка на тот кадр глобального стэка, который
обслуживает выполнение данной программы "прерывание".
Отбрасывается, если он был, комментарий (актив $\ldots$) к
посылкам исходной задачи, после чего вводится новая версия такого
комментария, в которой сохраняется номер текущего активированного
информационного блока. При работе с отладчиком активированный
информационный блок может меняться, и данный комментарий обеспечит
восстановление исходной активации перед выходом из
пре\-ры\-ва\-ния.

Далее идет оператор "повторение", к которому происходят откаты для
пе\-ре\-ри\-сов\-ки исходного текста, выдаваемого при входе в
отладчик. Инициализируется переменная х4, которая будет указывать
номер первой свободной строки на экране. Если обращение к
отладчику произошло в результате обнаружения ошиб\-ки (тип
обращения от 1 до 8), то в верхней части экрана прорисовывается
сообщение об ошибке; в случае типа обращения 5 - отсутствия
программы логического символа - прорисовывается также этот символ.
Во всех случаях далее - переход через оператор "ветвь 3".

Если тип обращения к прерыванию равен 10 (контроль зацикливания
при ре\-кур\-сив\-ных обращениях), то удаляется, если он был,
комментарий (повторчисло $A_1 \ A_2$) к посылкам исходной задачи.
Затем находится кадр глобального стэка, непосред\-ствен\-но
предшествующий текущему кадру прерывания, и прослеживается цепочка
источников этого кадра. Для текущего просматриваемого кадра
создается тройка (тип кадра - заголовок оператора либо
операторного выражения либо тип задачи, соответствующих кадру -
текущий набор входных данных кадра). Эти тройки за\-но\-сят\-ся в
список х6 так, что первая из них оказывается в конце списка, а
последняя занесенная - в его начале. Если все тройки в списке
различные, то зацикливания нет, и осуществляется выход из
отладчика. Иначе - создается список х14, образованный тройками
найденного цикла; вводится комментарий (повторчисло х14
пустоеслово) к посылкам исходной задачи; создается установка на
прерывание при обращении к программе того логического символа х15,
который должен быть очередным в найденном цикле, и выход из
отладчика.

Если тип обращения отличен от 10, то переход через "ветвь 1".
Здесь проверяется наличие комментария (повторчисло $\ldots$),
свидетельствующего о найденном за\-цик\-ли\-ва\-нии по рекурсивным
обращениям, занесение в этот комментарий некоторой
до\-пол\-ни\-тель\-ной информации, и обращение к оператору
"трассировка(стоп 0)", при\-водя\-ще\-му к выходу в отладчик ЛОСа
с показом на экране данного фрагмента програм\-мы самого отладчика
и с установкой пошаговой трассировки. Далее предпринимается ручной
анализ ситуации; фактически эта часть программы - заготовка для
по\-сле\-ду\-ю\-ще\-го развития автоматических средств анализа
причин зацикливания.

При отсутствии указаний на зацикливание - переход через "ветвь 1",
где попада\-ем на контрольную точку "прием(4)", с которой
начинается анализ цепочки кад\-ров глобального стэка,
предшествующих кадру прерывания. Прежде всего, будет
опре\-де\-лять\-ся набор х5 ссылок на кадры глобального стэка,
начиная с того кадра, информация о котором будет отображаться на
экране, и кончая текущим кад\-ром прерывания. Изначально в х5
заносится единственная ссылка х3 на текущий кадр прерывания.
Инициализируется нулем заготовка х6 набора ссылок на операторы
продолжения по выходу из кадров набора х5. Определяется тип х7 той
установки на прерывание, которая привела ко входу в отладчик.

Далее анализируется тип установки на прерывание х7. Если х7 =
"десять" \ (пре\-ры\-ва\-ние при выходе на кадр задачи), то
просматривается цепочка источников кадра, предшествующего
прерыванию, пока не встретится кадр задачи. Отменяются ра\-нее
имевшиеся установки на прерывания, и вводится установка на
прерывания при выполнении преобразований данной задачи. Если х7 =
"четырнадцать" \ (пре\-ры\-ва\-ние при обращении в заданном кадре
к оператору "замена" \ по заданной переменной), то цепочка
источников просматривается до первого кадра операторного
выражения, после чего происходит переустановка прерывания на
изменение значения перемен\-ной "х1" \ в найденном кадре (такие
замены используются в нормализаторах для изменения текущего
преобразуемого терма). В обоих случаях вводится комментарий (буфер
пустоеслово) к посылкам исходной задачи, инициализирующий
трассиров\-ку на семантическом уровне - на экране будет
отображаться ход решения задачи либо применения пакетного
оператора, сопровождаемый поясняющими текстами. Далее - переход
через "ветвь 1".

Переменной х8 присваивается ссылка на тот кадр глобального стэка,
который являлся текущим кадром перед входом в отладчик. Если х7 =
"двадцать", то имеет место вход в отладчик для переустановки
прерывания после отката по оператору "лимит". Без такой
переустановки трассировка может оказаться неожиданно
пре\-рван\-ной вплоть до выдачи ответа задачи. Для переустановки
просматривается це\-поч\-ка кадров начиная с х8 (каждый раз
переходим к источнику кадра); если встречается кадр задачи, то
устанавливается трассировка по преобразованиям этой задачи; если
встреча\-ет\-ся кадр оператора либо операторного выражения,
которые суть пакетные операторы ГЕНОЛОГа, то устанавливается
трассировка по их действиям; в прочих случаях - продолжение
просмотра цепочки. После переустановки прерывания - выход из
отладчика.


Если х7 не равнялось "двадцать", то определяется набор х9,
описывающий со\-дер\-жи\-мое текущего кадра прерывания. По этому
набору определяется четверка - ссылка на оператор продолжения
после выхода из отладчика, и х6 заменяется на одноэлементный
набор, состоящий из этой четверки. Далее идет цикл заполнения
набора х5. На очередном шаге к началу набора х5 присоединяется
ссылка на кадр х8. Определяется набор х11, описывающий содержимое
кадра х8, и к началу х6 добавляется извлекаемая из х11 ссылка на
оператор продолжения после выхода из кадра х8. Затем проверяется,
нужно ли рассматривать источник кадра х8 (тогда значение
переменной х8 заменяется ссылкой на этот источник), или х8 и
является тем кадром, информацию о котором нужно отображать на
экране. Необходимость перехода к источникам легко понять хотя бы
из рассмотрения ситуации, скла\-ды\-ва\-ю\-щей\-ся при отображении
очередного преобразования задачи. В этом случае изменение задачи
выполняется оператором, расположенным внутри вспомогательной
проце\-ду\-ры, к которой обращается прием. Если не обеспечить
автоматический переход от кадра вспомогательной процедуры к его
источнику - кадру приема, то для получе\-ния информации о
программе приема придется каждый раз переходить к нему вручную.

После заполнения набора х5 - откат к надфрагменту, в котором
определялось х8, и переход из него через "ветвь 1". При этом
значения начиная с х8 оказываются не определенными.

Далее располагается ветвь, обеспечивающая проверку дополнительных
условий на прерывание при реализации заданного оператора
программы. Находится ком\-мен\-та\-рий (контекст $A$) к посылкам
исходной задачи, определяющий такие допол\-ни\-тель\-ные условия.
$A$ представляет собой список располагаемых последовательно термов
либо пар термов одного из следующих типов:

\begin{enumerate}

\item "терм($B$)", $C$. $B$ - программное выражение в терминах
контекста рассмат\-ри\-ва\-е\-мо\-го оператора прерывания,
определяющее некоторый объект; $C$ - терм. Условие состоит в
совпадении указанного объекта с $C$.

\item "заголовок(хi $B$)". Условие состоит в том, что значением
программной пе\-ре\-мен\-ной хi является логический символ $B$
либо набор, начинающийся с логичес\-ко\-го символа $B$.

\item "входит($B$ хi)". Условие состоит в том, что значением
переменной хi являет\-ся терм либо набор, содержащий логический
символ либо символ переменной $B$.

\item "корень", $B$. Условие состоит в том, что текущий терм
задачи должен совпадать с термом $B$.

\item "См($B$)". $B$ - программная переменная хi либо выражение
"буква(хi)". Этот элемент определяет не дополнительное условие на
прерывание, а указание на необходимость выдачи на экран при
прерывании значения выражения $B$, если только этим значением
служит терм либо логический символ.

\end{enumerate}

Обнаружив элемент (контекст $A$) такого типа с непустым списком
$A$, программа проверяет, что установка на прерывание была связана
с обращением к заданному оператору программы (в некотором кадре
или безотносительно к выбору кадра). Затем определяется набор х10,
описывающий содержимое того кадра, информация о котором будет
отображаться на экране, то есть кадра, в котором выполняется
оператор прерывания. Из х10 извлекается набор х11 значений
программных пе\-ре\-мен\-ных кадра. Далее реализуется цикл
просмотра набора $A$ и проверки находящихся в нем условий; при
этом значения упоминающихся в $A$ программных переменных берутся
из набора х11. Если какое-либо условие не выполнено, то выход из
отладчика. Иначе, по окончании просмотра $A$, переход через
оператор "ветвь 1".

Здесь инициализируется набор х8 ссылок на фрагменты программы,
относящиеся к цепи того фрагмента, информация о котором должна
отображаться на экране (далее называем его текущим фрагментом).
Первым элементом набора х8 станет логический символ, к программе
которого относится текущий фрагмент; последний элемент набора х8
(с него х8 инициализируется) - ссылка на текущий фрагмент. Под
ссылкой на фрагмент в х8 понимается четверка (смещение фрагмента в
его сегменте зоны программ - номер сегмента зоны программ -
смещение в фрагменте оператора перехода к подфрагменту цепи либо
(для текущего фрагмента) текущего оператора - уровень
перечисления). Для просмотра цепи надфрагментов текущего фрагмента
используется оператор "трассировка(внешнийэлемент $\ldots$)".
После заполнения х8 - переход через "ветвь 1".

Проверяется наличие комментария (техпротокол $P_1 \ P_2$) к
посылкам исходной задачи. Этот комментарий указывает на режим
трассировки с формированием либо использованием технического
протокола. Технический протокол - инструмент от\-лад\-ки,
позволяющий выявить и локализовать различия в процессах решения
задачи двумя версиями решателя. Если в первой версии решателя
запустить решение задачи с помощью клавиши "П", то в 4-м
информационном блоке этой версии создается технический протокол
решения. Этот блок представляет собой файл R0000.lsi, размещенный
в поддиректории INF. Чтобы определить отличия в шагах решения той
же задачи второй версией, следует скопировать указанный файл в ее
одноименную поддиректорию и запустить решение с помощью клавиши
"Ctr-п".

Структура технического протокола в 4-м информационном блоке
такова. Из кор\-не\-во\-го указателя-списка этого блока по метке
"техпротокол" \ - переход к цепоч\-ке указателей - списков $A_1,
\ldots, A_n$, образующих протокол (узлов протокола). Из каждого
$A_i$ переход к очередному $A_{i+1}$ - также по метке
"техпротокол". Метки узлов протокола таковы:

\begin{enumerate}

\item "прием" \ - переход к логическому терминалу, хранящему терм
"контрольприе\-ма($A_1 \ A_2 \ A_3$)" \ либо терм "прием($A_1 \
A_2$)" \ - ссылку на примененный прием (в последнем случае $A_1$ -
логический символ, $A_2$ - группа цифр, образующая номер
контрольной точки "прием($A_2$)" \ в программе символа $A_1$).

\item "преобразование" \ - переход к логическому терминалу,
хранящему заголовок примененного оператора, выполнившего
преобразование ("заменаусловия", "за\-несениепосылки",
"удалениепосылки" \ и т.п.), а также один либо пару термов,
участвовавших в преобразовании: в случае преобразования замены -
заменя\-е\-мый и заменяющий термы; в случае занесения либо
удаления терма - дан\-ный терм.

\item "число" \ - переход к логическому терминалу, хранящему
десятичную запись номера шага, на котором было выполнено
преобразование.

\item "точкапривязки" \ - терм, при сканировании которого сработал
прием.

\end{enumerate}

Комментарий (техпротокол $P_1 \ P_2$) состоит из набора
информационных элементов $P_1$, указывающего тип режима
трассировки (режим протокола) и набора информа\-ци\-он\-ных
элементов $P_2$, характеризующих формируемый либо используемый
протокол (блок протокола). В режиме протокола используются
элементы "новый" \ (режим создания нового протокола) и "различны"
\ (режим сравнения решения с техническим протоколом). В блоке
протокола используются элементы следующих типов:

\begin{enumerate}

\item (файл $A$) - $A$ есть ссылка в 4-м информационном блоке на
последний об\-ра\-бо\-тан\-ный узел протокола (из него при
формировании протокола будет делаться ссылка на следующий узел, а
при сравнении с созданным протоколом - вы\-пол\-няться переход к
следующему узлу).

\item (набор $A_1 \ A_2$) - $A_1$ есть номер шага сравнения с
протоколом, на котором был введен данный элемент; $A_2$ - набор
троек (содержимое логического терминала "прием" \ - содержимое
логического терминала "преобразование" \ - ссылка на узел
протокола) для элементов технического протокола, следующих за тем,
на котором возникло рассогласование. Этот элемент применяется для
вос\-ста\-нов\-ле\-ния сравнения с техническим протоколом, если
после небольшой полосы различий снова наблюдается полное
согласование действий.

\item (число $A_1 \ A_2$) - $A_1$ есть пара (номер предыдущего
шага прерывания для те\-ку\-ще\-го решения - номер предыдущего
шага прерывания для технического протоко\-ла); $A2$ - набор пар
(пара для начала и конца интервала наблюдения по теку\-ще\-му
решению - величина замедления на этом интервале), в котором
отбираются 5 наибольших замедлений, выявленных на шагах
трассировки при сравнении текущего решения с техническим
протоколом.

\end{enumerate}

Возвращаясь к рассмотрению программы отладчика, заметим, что после
из\-вле\-че\-ния комментария (техпротокол $\ldots$) проверяется
наличие трассировки по пре\-об\-ра\-зо\-ва\-ниям задачи текущего
кадра. Создание и использование технического протокола пока
предусмотрено только для анализа такой цепочки преобразований.
Перемен\-ной х11 присваивается заголовок текущего оператора.
Сначала рассматривается случай, когда этот оператор изменяет
посылки либо условия задачи. Здесь формируется список х12 термов,
участвующих в преобразовании: для случая замены - пара
(за\-ме\-ня\-емый терм - заменяющий терм), иначе - одноэлементный
набор из добавляемого либо исключаемого терма. После перехода
через "ветвь 4" \ с помощью набора х8 определяется ссылка х14 на
примененный прием (в формате логического терминала "прием" \ узла
протокола). Находится номер х15 текущего шага работы
интерпре\-та\-то\-ра, который несколько операторов спустя
корректируется на число шагов, прошедшее с момента запуска решения
задачи. Определяются набор х16, описывающий со\-дер\-жи\-мое
текущего кадра задачи, а также набор х17 значений программных
переменных этого кадра. Находится текущий логический символ х18
сканирования задачи (для начала цикла сканирования - тип задачи).
Далее действия разветвляются. Если имеет место режим создания
протокола, то в 4-м информационном блоке вводятся, в соответствии
с описанным выше форматом, новый узел протокола и сопровождающие
его терминалы "прием", "преобразование", "число", "точкапривязки",
после чего - выход из отладчика. Если имеет место режим сравнения
с имеющимся протоколом, то переход через "иначе 1".

Здесь определяется ссылка х23 на узел протокола, следующий за уже
просмот\-рен\-ным на предыдущем шаге. Из логических терминалов
этого узла извлекаются данные для сравнения с описывающими текущее
преобразование значениями х14, х11, х12. После того, как
установлена идентичность действий, предпринимается коррекция
накопителя "число" \ из комментария х10, в котором сохраняются 5
наибольших за\-мед\-ле\-ний по сравниваемым шагам (при просмотре
информации о замедлениях будут выдаваться промежуток времени, в
шагах интерпретатора, на котором имело место замедление, а также
величина замедления). Далее - выход из отладчика.

Если же обнаружено рассогласование с протоколом, то переход через
"ветвь 1". Здесь проверяется наличие в блоке протокола
информационного элемента "набор". Если элемента "набор" \ нет, то
он вводится. Если он есть и в нем обнаруживается указание на
преобразование, идентичное текущему, то выполняется переустановка
указателя "файл" \ из блока протокола для продолжения сравнения
преобразований с найденной точки совпадения, элемент "набор" \
удаляется, и выход из отладчика. В остальных случаях - откат к
точке учета комментария "техпротокол" \ и переход через оператор
"ветвь 1", расположенный непосредственно перед оператором
"исход\-на\-я\-за\-да\-ча(х9)".

Инициализируется переменная х9, указывающая вхождение в наборе х8
ссылки на фрагмент, программа которого отображается на экране
(вначале это правый край набора х8). Вводит\-ся пустой накопитель
х10 объектов, для которых будут вводиться при просмотре значений
программных переменных временные обозначения. Вводится пустой
накопитель х11 четверок (буква, указывающая тип объекта - номер
объекта в списке х10 - строка для прорисовки на экране - тип
просмотра (0 - формульный, 1 - текстовый)). Инициализируются
вспомогательные накопители х12,х13. Если исход\-ная задача имела
комментарий (сдвиготкатов $A$), указывающий, что на экране
долж\-но быть прорисовано не текущее преобразование, а его двойник
из технического протокола, то этот комментарий удаляется, а в
накопитель х13 заносится пара (тех\-про\-то\-кол $A$). Далее -
переход через "ветвь 1".

Проверяется, что вход в отладчик произошел при трассировке (х1 =
9). Если на экране должен быть отображен на верхнем, семантическом
уровне очередной шаг решения задачи либо вывода теорем, то переход
через оператор "иначе 2". В противном случае проверяется, не имела
ли место установка на прерывание по достижении заданного числа
шагов (х7 = "одиннадцать"). Если это так, то сначала проверяется
наличие комментария (транскоммент $A_1 \ A_2$), вводимого при
повторном запуске решения вспомогательной задачи типа $A_2$ либо
пакетного оператора с за\-го\-лов\-ком $A_2$. У этого комментария
$A_1$ задает число шагов интерпретатора перед входом в трассировку
с небольшим недостатком, и по достижении этого числа шагов (т.е. в
данный момент ра\-бо\-ты отладчика) предпринимается замена $A_1$
на переменную, с выходом из отладчика. Результатом будет повторный
вход в отладчик и установка семантической трас\-си\-ров\-ки, как
только появится обращение к задаче типа $A_2$ либо пакетному
опе\-ра\-то\-ру с заголовком $A_2$. Этот способ входа в задачу
либо пакетный оператор при повторном запуске применяется в тех
случаях, когда нужно ком\-пен\-сировать небольшое возможное
отклонение числа шагов при семантической трас\-си\-ровке от числа
шагов без трассировки. При отсутствии комментария (транскоммент
$\ldots$) - сбрасыва\-ет\-ся установка на прерывание по достижении
заданного числа шагов и тип установки х7 заменяется на 6
(пошаговая трассировка, которая здесь еще не установлена). Далее
безотносительно к тому, имела ли место установка на прерыва\-ние
по достижении заданного числа шагов, выполняется расчистка экрана,
х12 из\-ме\-ня\-ется на 0 (что определяет в дальнейшем прорисовку
текущего фрагмента прог\-рам\-мы), и откат к оператору "ветвь 1",
расположенному перед "равно(х1 9)".

Если выше имел место переход через оператор "иначе 2", то далее
сначала рас\-смат\-ри\-вается случай отображения на экране
текущего преобразования задачи, те\-ку\-щей цепи задач и
вспомогательных задач, решавшихся для текущего преобразования.
Программа для этого случая располагается после оператора
"или(входит(цепь\-за\-дач комментариипосылок(х14))Входит(буфер
комментариипосылок(х14)))". Для по\-ни\-мания ее необходимо
представление о программе интерфейса задачника, поэтому данную
ветвь отладчика мы опишем ниже, после рассмотрения указанной
программы. Оператор "ветвь 1", расположенный перед оператором
"исходнаязадача(х14)", пе\-ре\-водит в несложную процедуру
отображения на экране теоремы, полученной при логическом выводе.

Возвращаемся к продолжению "главного ствола" \ программы
отладчика, переходя через оператор "ветвь 1" \ перед "равно(х1
9)". Если х12 не равно 0, то под уже выведенной на экране
информацией проводится горизонтальная черта. Если про\-изо\-шло
прерывание при обращении к программе символа "пуск", то
устанавливается пошаговая трассировка. Далее - обращение к циклу
запросов с клавиатуры ко\-манд отладчика.

\section{Цикл обработки команд отладчика}

Начальный фрагмент обработчика команд легко найти по оглавлению
программ ("Отладчик ЛОСа - Обработчик команд - Исходная точка").
Если х12 равно 0, то переменной х14 сразу присваивается команда
"частичныйответ" \ для прорисовки на экране текущего фрагмента
программы вплоть до текущего оператора; в противном случае команда
х14 вводится через клавиатуру либо мышь. Реализуются следующие
команды:

\begin{enumerate}

\item х14 = "тринадцать". Нажата клавиша Enter. Активируется тот
ин\-фор\-ма\-ци\-он\-ный блок, который был активирован при входе в
отладчик, и выход из от\-лад\-чика.

\item х14 = "частичныйответ" \ либо х14 = "нормпроизведениевсех".
Соответственно, нажата клавиша "о" \ либо "ф". В первом случае
происходит прорисовка теку\-ще\-го фрагмента до текущего
оператора, во втором случае - всего текуще\-го фрагмента.
Переменной х15 присваивается ссылка на текущий фрагмент,
из\-вле\-чен\-ная из набора х8. Если экран не расчищен, то он
расчищается. По коммен\-та\-рию (трассировка $\ldots$)
определяется номер шага, на котором было начато решение задачи из
задачника; находится номер х18 текущего шага, и
опре\-де\-ля\-ет\-ся число х19 шагов с момента начала решения. В
правом верхнем углу экрана прорисовывается текст "шаг № х19".

Далее - переход через "ветвь 2" \ и прорисовка в левом верхнем
углу экрана текста "Программа $S$", где $S$ - заголовок программы,
к которой относится прорисовываемый фрагмент. Этот заголовок
расположен в начале набора х8. По ссылке на фрагмент х15
определяются значения х21 (представление фраг\-мен\-та в виде
набора термов), х22 (вхождение текущего терма в х21), х23
(вхож\-дение в х22 текущего оператора). Если просматривается
фрагмент из цепи надфрагментов текущего фрагмента, то под текущим
термом понимается опе\-ра\-тор перехода к очередному фрагменту
цепи. При наличии установки на по\-опе\-ра\-торную трассировку
происходит замена х23 на корневое вхождение те\-ку\-ще\-го терма.
В случае команды "частичныйответ" \ в наборе х21 отбрасываются все
термы, расположенные после текущего терма. Далее - переход через
"ветвь 1".

Переменной х12 присваивается набор, состоящий из тройки (смещение
начала фрагмента в сегменте зоны программ - номер сегмента - копия
набора х21). После этого каждый оператор перехода "ветвь($A \ B$)"
\ либо "иначе($A \ B$)" \ в наборе х21 заменяется на "ветвь($N$)"
\ либо "иначе($N$)", где $N$ - порядковый номер перехода.

Далее - переход через "ветвь 1" \ к циклу прорисовки фрагмента.
Позиция на\-ча\-ла прорисовки устанавливается по левому краю
второй сверху 19-пик\-сель\-ной по\-ло\-сы. Перед прорисовкой
очередного терма набора х21 определяются координаты х25-х26
текущей позиции на экране. Если терм представляет собой оператор
перехода, то после его прорисовки к концу набора х12 добавляется
четверка (х25 - х26 - прорисованный терм - в зависимости от того,
является ли прори\-со\-ван\-ный терм текущим термом фрагмента,
корневое вхождение этого терма либо 0). Оператор перехода к
подфрагменту текущей цепи фрагментов прорисовы\-ва\-ется малиновым
цветом. Иначе - переход через "иначе 2", где после прорисов\-ки
терма (в случае текущего терма в нем малиновым цветом
выделя\-ет\-ся текущий оператор) к концу набора х12 добавляется
четверка (х25 - х26 - про\-ри\-со\-ванный терм - в зависимости от
того, является ли терм текущим термом фрагмента, вхождение в него
текущего оператора либо 0).

По окончании прорисовки термов набора х21 - переход через "иначе
1", опре\-де\-ле\-ние координаты х24 - х25 текущей позиции, и еще
раз переход через "ветвь 1", к определению номера х4 строки для
проведения под фрагментом про\-грам\-мы горизонтальной линии.
После прорисовки этой линии проверяется, имеет ли исходная задача
комментарий (контекст $\ldots$), содержащий указатель (См $A$) на
автоматическую выдачу после прорисовки программы значения
выражения $A$. Если имеет, причем выход в отладчик произошел по
установке на прерывание при обращении к заданному оператору, то
выполняется прорисовка выражения $A$, двоеточия, и с новой строки
- прорисовка формульным редактором терма, являющегося значением
$A$.

Заметим, что по окончании прорисовки фрагмента в х12 остается
набор, на\-чи\-на\-ю\-щий\-ся с тройки (смещение начала фрагмента
в сегменте зоны программ - номер сегмента - набор термов
фрагмента), после которой идут четверки (столбец - строка - терм -
0 либо выделенный оператор этого терма), ука\-зы\-ва\-ю\-щие места
прорисовки на экране термов фрагмента. Этот набор будет
использоваться последующими командами.

\item х14 = "Плюс". Нажата клавиша Esc. Происходит внутренний
перезапуск сис\-те\-мы с выходом в главное меню.

\item х14 = "попытка". Нажата клавиша Ctr-F3. Происходит выход из
отладчика с предварительным обращением к оператору "тест(1)". Это
обращение можно отслеживать из отладчика языка СИ для перехода к
нему от отладчика ЛОСа в текущей точки трассировки.

\item х14 = "Текзадача". Нажата клавиша Ctr-F4. Происходит
обращение к оператору "трассировка(стоп 0)" \ для просмотра
отладчиком ЛОСа его собственного стэ\-ко\-во\-го кадра.
Используется при отладке отладчика.

\item х14 = "заменагруппы" \ либо х14 = "префикснаярекурсия".
Соответственно, нажаты клавиши "б" \ либо "Ctr-б". В первом случае
происходит просмотр опи\-са\-ния примененного либо применяемого
приема, во втором случае - просмотр при обнаружении
рассогласования с техническим протоколом описания того приема,
который должен был бы применяться согласно техническому
протоко\-лу. В первом случае программа обращается для получения
ссылки х16 на те\-ку\-щий прием к оператору "поискприема"; во
втором - считывает эту ссылку из 4-го информационного блока по
информации, хранящейся в комментарии (техпротокол $\ldots$). В
обоих случаях найденная ссылка присваивается перемен\-ной х15, и
далее - переход через "ветвь 2".

Если х15 есть ссылка на прием ГЕНОЛОГа (т.е. является набором
длины 3), то находится ссылка х22 на логический терминал концевого
пункта оглавле\-ния базы приемов, хранящий ссылку на узел приема.
В списке ссылок этого терминала нужная ссылка выделяется
заголовком "текприем", и далее (пере\-ход через "ветвь 3")
происходит обращение к оператору "блокприемов(х22)", реализующему
интерфейс просмотра описания приема. Этот оператор будет более
подробно описан впоследствии; он реализует интерфейс редактора
прие\-мов ГЕНОЛОГа. По окончании просмотра приема вводится
комментарий (ав\-токлавиатура $\ldots$) к посылкам исходной
задачи, обеспечивающий эмуляцию нажатия клавиши "р" \ (кир.) для
восстановления исходного изображения кад\-ра трассировки.

Если же х15 было ссылкой на прием, реализованный на ЛОСе, то
текущий путь в оглавлении программ переустанавливается на концевой
пункт, соответ\-ству\-ющий данному приему, и происходит обращение
к оглавлению программ. По выходе из этого оглавления - те же
действия по восстановлению исходного кадра, что и выше.

\item х14 = "подстановка". Нажата клавиша "курсор вниз". Это
нажатие переводит в режим выделения операторов текущего
просматриваемого фрагмента про\-грам\-мы многоцветной указкой.
Прежде всего, удаляется комментарий (про\-смотр\-тер\-ма
$\ldots$), если он был введен предыдущими процедурами. Затем
рас\-смат\-ри\-ва\-ется длина набора х12. Если она равна 2, т.е.
прорисован единственный терм, то сразу же предпринимается
обращение к оператору "просмотртерма", который перекрашивает фон
терма в голубой цвет и выделяет многоцветной указкой текущий
подтерм этого терма. Если при просмотре терма была нажата
клави\-ша Enter, то оператор "просмотртерма" \ создаст комментарий
(про\-смотртер\-ма $A_1 \ A_2$), у которого $A_1$ - вхождение
выделенного в процессе про\-смот\-ра подтерма. После выхода из
оператора "просмотртерма" \ $A_2$ заменяется на вхождение в х12
четверки, соответствующей прорисованному терму фрагмента
программы. Этот комментарий будет далее использован для
переустановки прерывания перед выходом из отладчика. Такая
переустановка выполняется после отката к оператору "ветвь 2";
ветвь этого оператора (к нему будут происходить откаты и из других
точек программы) называем ниже циклом установки прерывания.

Если длина набора х12 больше 2, т.е. прорисовано больше одного
опера\-то\-ра фрагмента программы, то переход через "иначе 3".
Здесь переменной х15 присваивается вхождение в набор х12 четверки,
соответствующей первому про\-ри\-со\-ванному терму фрагмента
программы. Далее идет оператор "повторение", к которому будут
происходить откаты при переходе к выделению очередного терма.
Переменной х16 присваивается четверка по вхождению х15, переменной
х17 - терм этой четверки, х18 - 0 либо вхождение выделяемого
малиновым цветом подтерма (текущий выполняемый оператор либо
оператор перехода к следующему фрагменту текущей цепи). Затем терм
х17 выделяется - пере\-ри\-со\-вывается на старой позиции, но при
голубом цвете фона. Далее - переход через "ветвь 1" \ к фрагменту,
в котором реализуется цикл обращений к клавиатуре и мыши для
получения команды х20. Эта команда определяет действия при
фиксированном выделенном голубым цветом фона терме х17
просматриваемого фрагмента программы. Рассматриваются следующие
случаи:

 а) х20 = "подстановка". Нажата клавиша "курсор вниз". Если
 оператор х17 не является оператором перехода и неоднобуквенный,
 то он перерисовывается с белым цветом фона, и выполняется
 обращение к процедуре "просмотртерма" \ для выделения в нем
 какого-либо подтерма. Если после выделения подтер\-ма было нажато
 Enter, то процедура создает комментарий (просмотртерма $A_1 \
 A_2$). После выхода из нее $A_2$ заменяется на вхождение х15 в
 набор х12 четверки, соответствующей оператору х17. В этом случае
 происходит откат к циклу ус\-та\-нов\-ки прерывания. Если же указанный
 комментарий не был создан, то откат к получению новой команды х20.

 б) Если х20 = "внешконъюнкция" \ (клавиша "курсор вправо") либо
 х20 = "циклвариантов" \ (клавиша "курсор влево"), причем слева
 либо, соответственно, справа от выделенного оператора х17 нет
 других операторов, то команда х20 блокируется, и откат к
 получению новой команды.

 в) Если х20 = "внешсумма" \ (клавиша "курсор вверх") либо х20 =
 "внеш\-кон\-ъюнк\-ция" \ либо х20 = "циклвариантов" \ (клавиши "курсор
 вправо", "кур\-сор вле\-во"), то текущий оператор х17 перерисовывается на
 белом фоне, и про\-дол\-же\-ние анализа команды х20 после перехода через
 "ветвь 1".

 г) Если х20 = "внешсумма", то откат к циклу установки прерывания.

 д) Если х20 = "внешконъюнкция", то позиция х15 текущей четверки в
 на\-бо\-ре х12 сдигается на единицу вправо, и откат к выделению
 нового текущего терма.

 е) Если х20 = "циклвариантов", то позиция х15 сдвигается на
 единицу влево, и откат к выделению нового текущего терма.

 ж) Если х20 = "фигуры" \ либо х20 = "тринадцать" \ (клавиши
 Ctr-Enter и Enter). Если комментарий (просмотртерма $A_1 \ A_2$)
 уже имелся, то в нем $A_2$ заменяется на х15, иначе такой
 комментарий вводится, с $A_1$ равным вхождению левого края
 текущего оператора х17 и $A_2$ равным х15. Если х20 =
 "тринадцать", то вводится комментарий "точка", указывающий, что
 вводимая установка на прерывание относится только к текущему
 кадру глобального стэка. Затем - откат к циклу установки
 прерывания.

 з) Если х20 = "узелраздела" \ (клавиша F3), то предпринимается
 обращение к просмотру и редактированию справочной информации по
 заголовку оператора х17.

 и) Если х20 = "мышь" \ (нажата клавиша мыши), то определяются тип
 х21 сообщения от мыши (0 - левая кнопка, 2 - правая) и
 столбец-строка х22,х23 позиции курсора мыши. Если нажата левая
 кнопка (команда перехода к выде\-ле\-нию подтерма, на который указывает
 курсор мыши), то предпринимается поиск позиции х24 в наборе х12,
 определяющей прорисовку того оператора, на котором расположен
 курсор. После перехода через "иначе 3" \ проверяется, что
 курсор действительно находился над одним из операторов (х24 не
 равно 0), и определяется вхождение х26 в этот оператор наименьшего
 подтерма, выде\-лен\-но\-го курсором. Затем формируется набор х27
 кодов клавиатуры, определяющих перемещение от ранее выделенного
 оператора к оператору, на котором рас\-по\-ло\-жен курсор. Если
 вхождение х26 - не корневое, то к концу набора х27 добавляется
 код клавиши "курсор вниз" \ для входа в оператор "просмотртерма",
 а также символ "мышь" \ для обработки сообщения от мыши (того же
 самого, что и в данной команде) после входа в "просмотртерма".
 Вводится комментарий (автоклавиатура х27) к посылкам исходной
 задачи, и откат к запросу команды х20.

 Если левая кнопка курсора мыши была нажата не над оператором, то
 пере\-ход через "ветвь 2", где формируется комментарий
 (автоклавиатура $\ldots$) для нажа\-тия клавиши "курсор вверх",
 выводящего из режима выделения подтермов операторов. Наконец, при
 нажатии правой кнопки - переход через "иначе 1", где выполняются
 те же действия, что и после нажатия Enter.

 Переходим к рассмотрению ветви программы, определяющей цикл
 установки прерывания (переход через "ветвь 2" \ из фрагмента,
 начинающегося оператором "равно(х14 подстановка)"). Здесь
 извлекается комментарий х16 вида (про\-с\-мотр\-терма $A_1 \ A_2$).
 Находится вхождение х18 в набор операторов текущего фраг\-мен\-та
 того оператора, внутри которого был выделен подтерм. Если этот
 оператор не является оператором перехода, то находится смещение
 х19 в со\-дер\-жащем текущий фрагмент сегменте зоны программ обращения к
 реализации вы\-де\-лен\-ного подтерма. Сбрасываются ранее имевшиеся
 установки на пре\-ры\-ва\-ния, и вводится установка на прерывание при
 обращении к процедуре интер\-пре\-та\-тора по смещению х19. Если имелся
 комментарий "точка", то установка акти\-ви\-зи\-ру\-ет\-ся только при нахождении
 в текущем кадре глобального стэка, иначе - при любом выходе на данную
 процедуру. Если был выделен оператор перехода, то определяется
 ссылка х19,х20 на фрагмент в блоке программ, к которо\-му имеется
 переход, и после сброса старых установок на прерывания создается
 установка на прерывание при обращении к этому фрагменту.
 Комментарий "точка" \ учитывается так же, как в предыдущем
 случае.

 \item х14 = "числитель". Нажата клавиша "р". Откат к повторной
 прорисовке ис\-ход\-но\-го кадра прерывания, выданного при входе в
 отладчик.

 \item х14 - один из символов "нижняяоценка" \ (кла\-ви\-ша "х"),
 "группировка" \ (кла\-ви\-ша "н"), "легковидеть" \ (клавиша "в"),
 "извлечениеварианта" \ (клавиша "т"), "деление" \ (клавиша "а"),
 "дробь" \ (клавиша "Х"), "контрольприема" \ (кла\-ви\-ша "Н"); все клавиши -
 кириллица. Эти нажатия клавиш используются (в сочетании с последующим
 набором номера) для просмотра значений про\-грам\-мных переменных и
 элементов ранее вызванных на экран объектов. В ряде случаев выдается
 не одно такое значение, а группа значений, расположенных одно под
 другим.

 Прежде всего, заметим, что начиная с данного пункта (еще до
 идентифика\-ции значения х14) переменной х15 присваивается набор,
 описывающий содержи\-мое того кадра глобального стэка, к которому
 относится выданный на экран фрагмент программы.

 Определяется номер х16 нижней строки экрана. Если для выдачи
 запра\-ши\-ва\-емой информации, начиная с текущей строки х4, не
 осталось ни одной свободной 19-пиксельной полосы, то
 предпринимаются действия по прокрутке вверх со\-дер\-жи\-мого той части
 экрана, которая расположена под текстом фрагмен\-та программы.
 Здесь сначала проверяется, что накопитель х11 координат вы\-дан\-ных на
 экран информационных элементов, определяющих значения про\-грам\-мных
 переменных либо компонент ранее выделенных объектов, непуст.
 Как уже говорилось выше, в х11 заносятся четверки (буква, указывающая
 тип объекта - номер объекта в списке х10 выделенных при просмотре
 объектов - строка для прорисовки на экране - тип просмотра (0 -
 формульный, 1 - текстовый)). Активный прямоугольник для прорисовок
 устанавливается начиная с верхней строки, содержащей эти элементы.
 Предпринимается просмотр накопителя х11, пока не будет найден элемент,
 отстоящий вниз от верхнего элемента не менее чем на 19 пикселей.
 После того, как он найден, содержимое активного пря\-мо\-у\-голь\-ника
 сдвигается вверх так, чтобы найденный элемент был прорисован в
 верехней части. Затем корректируется значение х4 первой свободной
 строки; из х11 исключаются ссылки на первые, удаленные с экрана,
 элементы, и кор\-рек\-ти\-ру\-ются номера строк оставшихся элементов.
 Если для расчистки места нужно удалить все элементы списка х11, то
 это делается отдельным фрагментом (пе\-ре\-ход через "иначе 4").

 Если необходимое место удалось расчистить, то переход через
 "ветвь 2" \ (иначе команда отменяется). Здесь сначала
 прорисовывается буква, соответствующая нажатой клавише. Затем
 реализуется обращение к текстовому редактору для набора в той же
 строке номера программной переменной либо выделенного в накопителе
 х10 объекта, быть может, сопровождаемого дополнительной ин\-фор\-ма\-цией.
 Введенный набор термов присваивается переменной х18. Определяется
 значение х21 указателя выдачи информации в формульном (х21 = 0) либо
 скобочном (х21 = 1) виде. Переменной х22 присваивается одноэлементный
 на\-бор, состоящий из списка х10 выделенных при просмотре компонент
 объектов (этот список позволяет вызывать компоненты для просмотра
 через их номера в списке). Затем выполняется обращение к оператору
 "трассперечисл($\ldots$)", обеспечивающему перечисление пар х25,х26
 (тип объекта - номер объекта) для просмотра, и выдающему на каждом шаге
 перечисления пополненную версию х24 списка х10. Очередная пара
 х25,х26 передается оператору "блоктрас\-си\-ров\-ки" \ для фактической
 прорисовки на экране. Переменная х29 при этом указы\-ва\-ет на то,
 была ли прорисовка выполнена в формульном редакторе (0) либо в
 теккстовом (1). Если места для нее вообще не хватило, то х29
 присваивается значение 2, а х28 - число дополнительных 19-пиксельных полос,
 необходимых для прорисовки объекта по текущей паре х25,х26.
 В этом последнем случае находится позиция х31 такого элемента набора х11,
 что прокрутка его вверх высвобождает необходимое количество
 места. Если при прокрутке вверх те\-ря\-ет\-ся первый из выданных в
 цикле элементов (соответствующая ему четверка набора х11
 заблаговременно присваивается переменной х23), то перед про\-крут\-кой
 происходит обращение к оператору "клавиатура" \ - создается необходимая
 для просмотра пауза. Цикл выдачи элементов на этом этапе можно отменить,
 нажав клавишу пробела.

 \item х14 = "высотаполосы" \ либо х14 = "Стандплюс" \ (клавиши
 "К" \ либо "к"; кир.). Выполняется сквозной просмотр набора,
 определяемого программной пе\-ре\-мен\-ной с заданным номером
 (первая команда) либо объектом списка х10 с задан\-ным номером
 (вторая команда). Такой просмотр позволяет просматривать объ\-екты
 и их элементы, используя только клавиши курсора ("курсор вверх",
 "кур\-сор вниз" \ - смена текущего элемента; "курсор вправо" \ -
 вход в прос\-мотр эле\-мен\-та; "курсор влево" \ - возвращение
 во внешний набор). Программа обработки команды прорисовывает
 букву, соответствующую нажатой клавише, и об\-ра\-ща\-ется к текстовому
 редактору для ввода номера переменной либо объекта. Проверяется,
 что введенный терм х18 является десятичной записью числа,
 определяется символьное представление х22 этого числа, и по
 номеру х22 в наборе х10 (случай "к") либо в конце набора х15
 (случай "К") находится объект х24 для просмотра. Проверяется, что
 этот объект является набором, создается структура данных х25 для
 просмотра (в формате оператора "просмотрсписка"), и для х25
 предпринимается обращение к процедуре "сквознойпросмотр".

 \item х14 = "прогрблок". Нажата клавиша F5 для удаления с экрана текста
 фраг\-мен\-та программы и перерисовки размещенных под ним информационных
 эле\-мен\-тов непосредственно с верхней строки.

 \item х14 = "приведение" \ либо х14 = "группировки".
 Соответственно, нажата кла\-ви\-ша Home либо End. Команда обеспечивает
 переход к просмотру предыду\-ще\-го либо следующего фрагмента в цепи
 фрагментов, связанных между собой операторами перехода. Рассматривается
 вхождение х9 в набор х8 ссылки на текущий отображаемый на экране
 фрагмент программы. В первом случае пе\-ре\-мен\-ной х16 присваивается
 вхождение левого соседа вхождения х9, во втором - вхождение правого
 соседа. Проверяется, что х16 не равно х9 (т.е. сдвиг в указанном
 направлении был возможен) и не равно левому краю набора х8 (так
 как в начале набора х8 находится не ссылка на фрагмент, а
 логический символ, к программе которого относятся просматриваемые
 фрагменты). Затем х9 заменяется на х16, х12 - на 0 (сброс
 информации о прорисовке операторов фрагмента при переходе к
 просмотру другого фрагмента), и откат к запросу очередной
 команды, где из-за х12=0 будет эмулировано нажатие клавиши "о" \
 для прорисовки нового фрагмента.

 \item х14 = "контрольунификации" \ либо х14 = "точкапривязки".
 Соответственно, нажаты клавиша PageUp либо PageDown для перехода
 к предыдущему или следующему кадру глобального стэка в цепи кадров,
 связанных по\-сле\-до\-ва\-тельными обращениями к программам.

 В первом случае рассматривается начальный элемент х16 набора х5,
 который представляет собой ссылку на текущий просматриваемый кадр
 глобального стэка. Определяется набор х17, описывающий содержимое
 этого кадра. Далее предпринимается цикл переходов к источнику
 кадра (если встречается кадр прерывания, то переход делается к
 кадру, расположенному непосредственно перед ним), пока не
 встретится кадр задачи, оператора либо операторного выражения.
 По мере прохождения кадров ссылки на них добавляются к началу
 набора х5, а в набор х6 заносятся ссылки на операторы продолжения
 при выходе из этих кадров.

 Во втором случае ссылки на кадры, расположенные после первого элемен\-та
 набора х5, просматриваются до тех пор, пока не встретится кадр
 задачи, опе\-ра\-то\-ра либо операторного выражения. После этого
 предшествующие элементы набора х5, а также соответствующие им
 элементы набора х6 отбрасываются.

 В обоих случаях далее обновляется набор х8 ссылок на фрагменты
 программы, относящиеся к новому кадру глобального стэка. Сначала
 в него заносится ссыл\-ка на последний фрагмент, которая совпадает с
 о ссылкой на оператор про\-дол\-же\-ния следующего кадра. Затем к
 началу набора х8 последовательно до\-бав\-ля\-ются ссылки на предшествующие
 фрагменты той же цепи, прослеживаемой вплоть до корневого
 фрагмента программы, а далее - в начало набора х8 (случай
 "равно(х18 нет)") заносится логический символ х19, к программе
 которого относится цепь фрагментов. Текущее вхождение х9 в набор
 х8 устанавливается на его правый край; сбрасывается содержимое
 наборов х10,х11,х12, и откат к запросу очередной команды. Так как
 х12 равно 0, то при этом будет выполнена прорисовка фрагмента
 программы, соответствующего х9.

 \item х14 = "усмчисло" \ либо х14 = "фильтрквадратов". Нажата
 клавиша "с" \ либо "м". В комментарии (трассировка $\ldots$)
 предпринимается замена на 1 (первый случай) либо на 0 указателя
 прорисовки в текстовом либо формульном режиме. Этот указатель
 определяет только прорисовку термов, вводимых после сме\-ны режима,
 не изменяя способа прорисовки ранее выданных термов.

 \item х14 = "подборнеизвестных". Нажата клавиша "з" \ для входа в
 просмотр цепи задач, если он уже не имеет места. Программа вводит
 комментарий "цепьзадач" \ и откатывается к повторной обработке
 входа в отладчик. Для прорисовки цепи задач будет использована
 ветвь программы "прерывание", описание которой отложено до
 раздела, посвященного интерфейсу задачника.

 \item х14 = "анализатор". Нажата клавиша "п" \ для прорисовки
 соответствия между обозначениями используемых в текущей задаче
 переменных для текстового и фор\-муль\-но\-го редакторов.

 \item х14 = "соответвхожд". Нажата клавиша Delete. Расчищается
 экран, номер х4 первой свободной строки заменяется на 0, х11 и
 х12 заменяются на пустой набор, и откат к запросу очередной
 команды.

 \item х14 = "усмцелое". Нажата клавиша "й" \ для ввода
 трассировки по преоб\-ра\-зо\-ва\-ниям текущей задачи. Начиная с текущего
 кадра прерывания (ссылка на него расположена в конце набора х5),
 просматриваются предшествующие ему кадры до обнаружения кадра
 задачи х18. После этого вводится комментарий (буфер пустоеслово)
 (если комментарий (буфер $A$) уже имелся, то в нем $A$ заменяется
 на "пустоеслово"). Этот комментарий будет использоваться
 процедурами се\-ман\-тической трассировки для сохранения информации о
 вспомогательных за\-дачах, решенных для выполнения текущего
 преобразования. Затем сбрасыва\-ет\-ся старая установка на
 трассировку, и устанавливается трассировка по пре\-об\-ра\-зованиям
 задачи кадра х18.

 \item х14 = "обл". Нажата клавиша пробела для ввода трассировки
 по пре\-об\-ра\-зованиям текущих пакетного оператора либо задачи.
 Действия аналогичны предыдущему пункту, но просматриваются не все
 кадры, предшествующие те\-ку\-щему кадру прерывания, а лишь цепочка
 источников того кадра, в котором произошло прерывание. При этом
 берется первый кадр х18, оказывающийся кадром задачи, либо
 кадром нормализатора, имеющего в описании своего фор\-ма\-та символ
 "контрольтитра" \ или "контрольнормализации", либо кадром про\-ве\-роч\-ного
 оператора или синтезатора.

 \item х14 = "минимум". Нажата клавиша "л" \ для установки
 прерывания по дос\-ти\-же\-нии программы заданного логического символа.
 Название символа х17 вводится текстовым редактором; удаляется, если он
 имелся, комментарий (буфер $\ldots$), и трассировка
 переустанавливается указанным образом.

 \item х14 = "префиксныйфильтр". Нажата клавиша "0". Удаляется
 комментарий (буфер $\ldots$) и отменяется установка на
 прерывание.

 \item х14 = "унисборка". Нажата клавиша "1". Удаляется
 комментарий (буфер $\ldots$), отменяется старая установка на
 прерывание, и вводится режим пошаговой трас\-сировки.

 \item х14 = "если". Нажата клавиша "2". Удаляется комментарий
 (буфер $\ldots$), от\-ме\-няется старая установка на прерывание,
 и вводится режим пооператорной трассировки в том кадре
 глобального стэка, к которому относится про\-смат\-ри\-ва\-емый фрагмент
 программы (ссылка на этот кадр - начало набора х5).

 \item х14 = "то". Нажата клавиша "3". Аналогично предыдущему, но
 в со\-от\-вет\-ству\-ющем кадре глобального стэка устанавливается не
 пооператорная, а более мелкая пошаговая трассировка.

 \item х14 = "комплексныечисла". Нажата клавиша "4". Установка
 прерывания при выходе из кадра, к которому относится
 просматриваемый фрагмент программы.

 \item х14 = "усмотрениефильтра". Нажата клавиша "5". Установка
 прерывания при выходе на кадр задачи.

 \item х14 = "схемаидентификации". Нажата клавиша "ш" \ для ввода
 прерывания по достижении заданного числа шагов работы
 интерпретатора (число шагов отсчитывается с момента запуска
 решения задачи). После прорисовки буква "ш" \ происходит
 обращение к текстовому редактору для ввода номера шага. Этот
 номер (терм) преобразуется в формат х19 десятичного числа.
 Опреде\-ля\-ет\-ся текущий номер шага х20; с помощью комментария
 (трассировка $\ldots$) находится номер шага, с которого было
 начато решение задачи. Находится результат х23 увеличения
 последнего на х19. Если х20 меньше х23, то удаляется комментарий
 (буфер $\ldots$) и устанавливается прерывание по достижении шага
 х23.

 \item х14 = "новыесвязки" \ либо х14 = "верхняягрань" \ либо х14
 = "объедине\-ние\-фраг\-ментов" \ либо х14 = "транслоперандов".
 Соответственно, нажаты клавиша "и" \ либо "И" \ либо "7" \ либо
 "6". Происходит установка прерываний. В первых двух случаях
 устанавливается прерывание при изменении разряда заданного
 набора; в первом случае набор берется из списка выделенных объектов, во
 втором - как значение некоторой программной переменной. В третьем
 случае устанавливается прерывание при изменении в текущем кадре
 значения заданной программной переменной; в четвертом -
 прерывание при достижении фрагмента программы заданного
 логического символа, имеющего заданный оператор.

 После нажатия клавиши происходит прорисовка, соответственно,
 буквы "и" \ либо "И" \ либо "з" \ либо "о". Предпринимается
 обращение к текстовому ре\-дак\-то\-ру для ввода сопровождающих команду
 параметров (термов). х19 - ре\-зуль\-ти\-рующий набор. Дальнейшие
 действия зависят от типа команды:

 а) Нажата клавиша "6". Проверяется, что х19 имеет длину 2. Первый
 эле\-мент набо\-ра х19 должен быть однобуквенным термом, заголовок
 которого - логи\-чес\-кий символ х22, в программе которого нужно найти
 оператор, явля\-ю\-щий\-ся вторым элементом набора х19. Для поиска
 используется оператор "прогфайл\\ (имя х22 конец(19)х23)". Результат
 поиска - набор х23 пар логических симво\-лов, представляющих собой
 ссылки на фрагменты пути от корня программы сим\-во\-ла х22 к
 найденному фрагменту. Эти ссылки расположены справа налево, так
 что ссылкой на найденный фрагмент служит начало набора х23.
 Вво\-дит\-ся установка на прерывание при достижении данного
 фрагмента программы.

 б) В остальных случаях проверяется, что набор х19 имеет длину 1 и
 находит\-ся его начало х21. Если была нажата клавиша "7", то
 заголовком х21 служит символьный номер некоторой переменной х23.
 Вводится установка на пре\-ры\-ва\-ние при изменении значения этой
 переменной (только оператором "замена") в текущем кадре.

 в) Если были нажаты клавиши "и" \ либо "И", то первый терм набора х19
 указывает номер объекта списка х10 выделенных объектов либо номер
 про\-грам\-мной переменной. Соответственно, находится объект х26 с данным
 номером либо значение указанной программной переменной.
 Проверяется, что этот объ\-ект является набором. Далее вводится
 установка на прерывание при изменении разряда данного набора.

 Заметим, что во всех перечисленных случаях после установки
 прерывания про\-ис\-ходит расчистка строки, на которой отображалась
 введенная команда.

 \item х14 = "новыйузел". Нажата клавиша Ctr-з для обрыва серийного
 решения задач, логического вывода либо тестирования. Здесь
 рассматриваются сле\-ду\-ю\-щие подслучаи:

 а) Исходная задача имеет комментарий "задачи". В этом случае
 происходит цикл решения задач из задачника. Предпринимается
 обращение к оператору "Текзадача(х18 х19 х20)", определяющему
 набор х18 ссылок на указатели ог\-лав\-ле\-ния задачника, лежащие на
 пути к текущей выбранной задаче, набор х19 меток перехода из этих
 указателей и ссылка х20 на корневой указатель того раздела $R$, в
 котором реализуется серийное решение. В логическом термина\-ле
 "метка" \ корневого указателя второго информационного блока
 хранится ус\-та\-нов\-ка "задачи($N$)" \ на серийный вывод, $N \ne 0$,
 и прежде всего эта установка сбрасывается - в терминал помещается терм
 "задачи(0)". Без такой замены режим серийного решения продолжался
 бы даже после выхода из логической системы и повторного ее
 запуска. Далее удаляется комментарий "задачи" \ к посылкам
 исходной задачи; если ранее был включен режим контроля холостого
 хода приемов, то оператор "трассировка(контроль 0)" \ отменяет
 этот режим. Наконец, логические терминалы "позиция" \ оглавления
 задачника, лежащие на пути от корня раздела $R$ до текущей выбранной
 задачи, нормализуются - вместо термов "число($N \ 0$)", обозначавших
 область серийного решения, в них заносятся термы "число($N \ N$)".

 б) Если имеется логический терминал, достижимый из корня 6-го
 инфор\-ма\-ци\-он\-ного блока по меткам "метка","повторение", то он
 удаляется. Наличие это\-го терминала поддерживает продолжение
 серийного логического вывода в ба\-зе теорем. Удаляется также
 комментарий "вывод" \ к посылкам исходной задачи.

 в) Исходная задача имеет комментарий к посылкам "подраздел",
 указывающий на наличие серийного тестирования генератора приемов
 в подразделе базы приемов. Активируется 8-й информационный блок,
 и предпринимается об\-ра\-ще\-ние к оператору "Текприем(х18 х19 х20)".
 Он определяет значения х18,х19,х20, аналогично значениям из
 пункта а). В логический терминал, достижимый из корневого
 указателя 8-го информационного блока по меткам
 "прием","по\-вто\-ре\-ние", заносится 0, и таким образом цикл
 тестирования останавливается. Уда\-ля\-ет\-ся комментарий "подраздел".
 Наконец, как и в пункте а), нормализуется содержимое логических
 терминалов "позиция" \ пути в оглавлении базы приемов.

 г) Исходная задача имеет комментарий "команды", указывающий на
 цикл тес\-ти\-ро\-вания синтеза установок на генерацию приемов по
 заданному разделу базы теорем. Аналогично пункту в), но на 0
 заменяется содержимое логического терминала, достижимого из корня
 6-го информационного блока по меткам "при\-ем","повторение".

 \item х14 = "стандменьше". Нажата клавиша F1. Происходит
 обращение к спра\-воч\-ни\-ку по системе.

 \item х14 = "внешнийквантор". Нажата клавиша "г" \ для входа в
 оглавление ба\-зы приемов. В х17 сохраняется номер текущего
 активного информационного блока, активируется 8-й информационный
 блок и находится одноэлементый набор х19, состоящий из ссылки на
 корень оглавления базы приемов. Далее - оператор "повторение", к
 которому будут происходить откаты при возвращении в оглавление
 базы приемов из просмотра приемов концевого пункта этого
 оглав\-ле\-ния. Комментарий (вид $A$), указывающий тип $A$ текущего
 оглавления, пе\-ре\-ус\-та\-навливается на оглавление базы приемов.
 Вводится комментарий "блок\-трас\-си\-ровки", указывающий на обращение
 к базе приемов из трассировки. Сбрасывается, если он
 был, комментарий (прием $\ldots$), указывающий на ра\-нее выбранный
 концевой пункт оглавления базы приемов и прием этого пункта.
 Затем предпринимается обращение к оглавлению базы приемов. Если
 вы\-ход из него происходит по истинностному значению "ложь", то
 восстанавливаются исходные параметры, и выполнение команды
 обрывается. Иначе - вводится комментарий "точкапривязки",
 блокирующий операции изменения базы при\-е\-мов, и предпринимается
 обращение к редактору приемов ГЕНОЛОГа (опера\-тор
 "блокприемов(х20)"). После этого обращения удаляется комментарий
 "точ\-ка\-при\-вязки" \ и проверяется наличие комментария
 "продолжение", иниции\-ру\-ю\-ще\-го выход из прерывания и продолжение
 вычислений. Такой комментарий будет создан, если при просмотре
 базы приемов будет введена установка на прерывание при попытке
 применения заданного приема (нажатием Enter, F9 либо Ctr-Enter). Если
 этого комментария нет, то проверяется наличие ком\-мен\-та\-рия
 "блоктрассировки". Если он был удален при просмотре приема, то
 об\-рыв просмотра базы приемов, иначе - откат к повторному входу в
 ее оглавление. Если же комментарий "продолжение" \ есть, то он
 удаляется; вместе с ним уда\-ля\-ет\-ся также комментарий "блоктрассировки".
 Сбрасывается старая ус\-та\-нов\-ка на прерывание, находится
 комментарий (начало $\ldots$) либо (левыйкрай $\ldots$), в
 котором сохраняется ссылка на прием прерывания, выбранный внутри
 опе\-ра\-то\-ра "блокприемов", и предпринимается установка на
 прерывание при попытке применения этого приема. Под попыткой применения
 приема понимается об\-ра\-ще\-ние к оператору "контрольприема($\ldots$)",
 расположенного в начальной части программы этого приема и
 идентифицирующему данный прием. В первом слу\-чае (F9 при просмотре приема)
 прерывание происходит только при по\-пыт\-ке применения приема в текущем
 кадре, во втором (Ctr-Enter) - безотносительно к кадру. Если при
 просмотре приема была нажата клавиша Enter (прерывание при
 фактическом применении приема), то введен комментарий
 (трассперечисл $\ldots$), однако он не инициирует какой-либо
 установки на прерывание в отладчике, а сохраняется после выхода
 из него. Операторы, выполняющие преобразова\-ния приемов ГЕНОЛОГа
 (их число невелико), контролируют совпадение выз\-вав\-ше\-го их приема
 с приемом, указанным в комментарии (трассперечисл $\ldots$), и
 при наличии такового инициируют вход в отладчик с помощью
 опе\-ра\-то\-ра "трассировка(стоп 0)".

 Во всех трех случаях далее происходит выход из отладчика.

 \item х14 = "внешвывод". Нажата клавиша "щ". Эта клавиша при
 трассировке ис\-поль\-зуется для сохранения текущего значения
 счетчика шагов работы ин\-тер\-претатора, чтобы при повторном запуске
 задачи или процедуры логического вывода с помощью клавиши "а" \
 произошел выход в отладчик на том же самом шагу. Прежде всего,
 проверяется наличие комментария (следствия $\ldots$),
 ука\-зы\-ва\-ющего, что происходит процесс логического вывода в базе
 теорем. В этом случае значение счетчика шагов сохраняется в
 структурах данных базы теорем, которые будут описаны в
 последующих частях книги. Если такого комментария нет, то переход
 через "ветвь 2". Здесь проверяется наличие комментария
 (про\-смотр\-задачи $A$) к текущей задаче либо какой-либо ее
 надзадаче. Если такой комментарий есть, то $A$ - пара (логический
 символ - номер узла), определяющая координаты в задачнике той задачи,
 решение которой реализуется. Находится ссылка х21 на узел этой
 задачи; вычисляется разность х24 текущего номера шага и номера
 шага, на котором было начато решение, и десятичная запись числа
 х24 сохраняется в логическом терминале "повторение" \ узла х21.

 \item х14 = "попыткапараметризации" \ либо х14 = "узелраздела".
 Нажата клави\-ша F2 либо F3. Во втором случае определяется
 заголовок х20 текущего вы\-пол\-ня\-е\-мого оператора либо вычисляемого
 операторного выражения, и предпри\-ни\-ма\-ется обращение к справочной
 информации этого заголовка. В первом случае - обращение к
 справочной информации о логическом символе, вводимом в
 спе\-ци\-альном окне диалога.

 \item х14 = "мышь". Если нажата левая клавиша мыши, то вводится
 комментарий (автоклавиатура $\ldots$), эмулирующий
 последовательное нажатие клавиш "курсор вниз" \ (для перехода в
 режим выделения операторов многоцветной указкой) и "мышь" \ (для
 создания прерывания перед выполнением того оператора, на который
 показывает курсор мыши, и выхода из отладчика).

 \item х14 = "числзначение" \ либо х14 = "подобл". Нажаты клавиша
 "Ч" \ либо "ч" \ для прорисовки текущего чертежа. В первом случае
 прорисовка выполняется в общем потоке информационных элементов,
 вызываемых на экран; во втором - экран расчищается, фрагмент
 программы не прорисовывается, и сразу выдается чертеж.

 \item х14 = "сдвигпеременных". Нажата клавиша Ctr-г для входа в
 оглавление про\-г\-рамм. Комментарий (вид $\ldots$), указывающий тип
 просматриваемого оглавления, переустанавливается на оглавление
 программ; вводится комментарий "блок\-трас\-сировки", указывающий,
 что обращение к этому оглавлению пред\-при\-ни\-ма\-ется из трассировки,
 и происходит вход в данное оглавление. Если был выбран некоторый
 концевой пункт оглавления программ, то определяются логический
 символ х23 и номер х24 контрольной точки "прием(х24)" \ в программе
 симво\-ла х23, после чего устанавливается прерывание при выходе на
 данную контроль\-ную точку, и выход из отладчика.

 \item х14 = "внутрвывод". Нажата клавиша "у" \ (кир.) для установки
 дополнитель\-ных ограничений на прерывание по достижении заданного
 оператора. Пе\-ре\-мен\-ная х17 инициализируется пустым словом; если
 имеется комментарий (кон\-текст $\ldots$), перечисляющий ранее
 установленные дополнительные ограничения на пре\-рывание, то его
 содержимое передается списку х17. Происходит обращение к
 оператору "просмотрсписка" \ для коррекции набора х17; новая
 версия этого набора создается в информационном элементе (набор
 $\ldots$) структуры данных х19 оператора "просмотрсписка". На
 основе этой версии корректируется, вво\-дится либо удаляется
 комментарий (контекст $\ldots$), и далее - выход из отладчика.

 \item х14 = "конъюнктоперанд". Нажата клавиша Ctr-у (кир.) для
 сброса ком\-мен\-та\-рия (контекст $\ldots$).

 \item х14 = "оператор". Нажата клавиша Ctr-р (кир.) для просмотра
 альтернативно\-го шага трассировки при сравнении текущего решения с
 решением, находя\-щим\-ся в техническом протоколе. По комментарию
 (техпротокол $\ldots$) к посылкам исходной задачи находится
 ссылка х21 на узел протокола, соответствующий текущему шагу
 решения. По содержимому х23 логического терминала данного узла
 вводится комментарий (сдвиготкатов х23) к посылкам исходной
 задачи, используемый процедурой просмотра задач при
 трассировке (см. следующий раздел) для выдачи информации об
 альтернативном шаге.

\end{enumerate}

 \chapter{Интерпретатор ЛОСа}

 При развитии логической системы может возникнуть необходимость
 ввести в язык ЛОС различные дополнительные макрооператоры,
 обеспечивающие ускоренную ра\-бо\-ту со специальными объектами. Это,
 а также возможное развитие отладчика ЛО\-Са, потребует внесения тех
 или иных коррекций в программу интерпретатора ЛОСа, а
 следовательно, потребует информации об организации этой
 программы. В дан\-ной главе и содержится такая (в общем,
 достаточно краткая) информация: да\-ет\-ся представление об
 архитектуре и основных функциях интерпретатора ЛОСа.

 Программа интерпретатора хранится в файлах LOGSYST.C, POLINOM.C,
 RISUNOK.C, ARIFM96.C; при ее написании использованы только возможности
 языка C, без выхода в C++. Конечно, использование для реализации
 ЛОС-программ компилятора вместо интерпретатора могло бы ускорить работу
 системы, однако в этом случае усложнилось бы легко доступное для
 интерпретатора изменение программой самой себя в процессе своей
 работы. С другой стороны, быстродействие современных процессоров
 обеспечивает достаточно высокую скорость работы логической
 системы, и проблема ускорения этой работы не представляется
 сейчас, на этапе предварительных исследований в области
 мо\-де\-ли\-ро\-ва\-ния
 логических процессов, слишком актуальной. В перспективе такое
 ускорение могло бы быть обеспечено, например, за счет создания
 ЛОС - процессора.

 Схемная реализация операторов ЛОСа, по сравнению с программной их
 ре\-али\-за\-ци\-ей в интерпретаторе, могла бы уже ускорить работу системы
 на порядок, даже без какого-либо распараллеливания сканирования.
 Так как главную часть времени работы системы составляет сейчас поиск
 очередного приема, то представляется пер\-спективной следующая простая
 схема распараллеливания сканирования: несколько независимых процессоров,
 имеющих каждый в своей памяти некоторое подмножество приемов,
 осуществляет сканирование своей копии задачи и поиск приема.
 Результаты поиска пропускаются через древовидный коллектор, в котором
 отбирается для ре\-али\-за\-ции единственный прием - по наименьшему уровню
 срабатывания. После при\-ме\-не\-ния отобранного приема в центральном
 процессоре, предпринимается рас\-сыл\-ка копий измененной ситуации
 процессорам, продолжающим поиск приема для сле\-ду\-ю\-ще\-го шага.

 \section{Основные структуры данных интерпре\-та\-то\-ра}

 \subsection{Хранение основных данных в оператив\-ной па\-мя\-ти}

 Чтобы хранить в оперативной памяти системы наборы и термы, введен
 специаль\-ный массив, называемый зоной задач. Он имеет размер 2 Мбайт
 и разбит на 64-битные (двойные) слова - всего 262144 таких слов.
 Каждый терм либо набор представ\-лен некоторым отрезком в зоне
 задач (эти отрезки называются текстами зоны задач). Первое
 64-битное слово текста, называемое префиксом текста, имеет вид $N
 \ A$, где $N$ - 32-битная запись длины текста, измеренной в
 32-битных (обычных) словах. $A$ - 32-битная константа, старший
 бит которой равен 1 (этот бит служит индикатором при поиске
 начала текста), а младший бит - является указателем такта
 закрепления текста и используется для расчистки мусора в зоне
 задач. Прочие биты константы $A$ равны 0 (оператор
 "трассировка(суммавсех $\ldots$)" может использовать бит
 кон\-стан\-ты $A$, следующий за старшим битом). Суффикс текста имеет
 вид $C \ D$, где стар\-ший бит 32-битного слова $C$ равен 1 (он
 служит индикатором при поиске конца текста); 32-битное слово $D$
 используется при уплотнении зоны задач как вспомога\-тель\-ная
 информационная емкость.

 Набор $A_1 \ldots A_n$ представляется в виде текста,
 образованного (кроме префикса и суффикса) последовательно
 расположенными двойными словами $B_1, \ldots, B_n$, ко\-ди\-ру\-ю\-щи\-ми
 элементы $A_1, \ldots, A_n$. Фактически используются лишь первые
 (младшие) 32 бита каждого такого слова; вторые 32 бита
 тождественно нулевые (они исполь\-зу\-ют\-ся при задании термов).
 Применяется следующее 32-битное кодирование рас\-смат\-ри\-ва\-е\-мых в
 ЛОСе типов данных:

 а) Логические символы. Набор, кодирующий логический символ с
 номером $N$, имеет вид "x$0008mnpq$", где $m,n,p,q$ -
 шестнадцатиричные цифры записи числа $N$.

 б) Переменные. Набор, кодирующий переменную с номером $N$, имеет
 вид "x$0010m\\ npq$", где $m,n,p,q$ - шестнадцатиричные цифры записи
 числа $N$. Хотя число бит в данной кодировке позволяет работать с
 65535 символами переменных, ряд операторов ЛОСа запрограммирован
 таким образом, что поддерживает лишь 512 первых пе\-ре\-мен\-ных. Это
 связано с применением масок для задания множеств переменных -
 чтобы число ячеек, определяющих такие множества, было не слишком
 большим. Впрочем, на практике 512 переменных до сих пор было
 вполне достаточно - редко приходится использовать в одном
 процессе решения задачи более 100 переменных.

 в) Наборы и термы кодируются 32-битным смещением в зоне задач
 (как в массиве 32-битных слов) своего префикса. Фактически в этом
 32-битном смещении первые 14 бит всегда равны 0. Префикс легко
 отличается от внутреннего двойного слова текста по индикатору
 начала текста (внутри текста его бит всегда равен 0).

 г) Вхождению в набор либо терм соответствует некоторое двойное
 слово внутри текста, представляющего этот набор либо терм. Оно
 кодируется 32-битным сме\-ще\-ни\-ем в зоне задач первого (младшего)
 32-битного подслова этого двойного слова.

 \par\medskip

 Терм представляется в виде последовательности кодов своих
 логических символов и переменных (как и для набора, такой код
 занимает первые 32 бита двойного слова внутри текста). Скобки при
 этом пропускаются; необходимая для их восстановления информация
 сохраняется во вторых 32 битах двойных слов. Если двойное слово
 представляет заголовок подтерма $A$ всего терма (в частности, $A$
 может со\-сто\-ять из одного символа - логического либо переменной),
 то вторые его 32 бита имеют вид $(N \ M)$. Здесь $M$ - младшие 16
 бит - равно числу 32-битных слов, используемых в записи подтерма
 $A$ (фактически это константа сдвига для выхода на начало
 сле\-ду\-ю\-ще\-го за подтермом двойного слова). $N$ равно смещению влево
 для выхода на начало того подтерма $B = f(\ldots A \ldots)$,
 непосредственным операндом которого является $A$. Если же $A$
 было корнем всего терма, то $N = 3$. Однобуквенные наборы,
 составленные из логического символа либо символа переменной,
 автоматически преобразуются к формату терма.

 \par\medskip

 Для вычислений с сопроцессором, а также для вычислений с
 применением обыч\-ной 32-битной машинной арифметики используется
 специальное представление чисел в зоне задач. Форматов таких
 чисел два - "с плавающей запятой" \ (64-битное пред\-став\-ление) и
 "целое со знаком" \ (32 бита). Для каждого из них форматы
 префикса и суффикса - те же, что и для обычных наборов.

 Число "с плавающей запятой" \ представляется в зоне задач набором
 $N$ длины 2. Элементы этого набора кодируются так, чтобы их можно
 было отличить от эле\-мен\-тов "обычных" \ наборов. 64 бита
 стандартного представления числа "с плавающей запятой" \
 разбиваются на два идущих подряд 32-битных слова $A_1,A_2$.
 Каждый из двух элементов набора $N$ представляет собой пару
 32-битных слов. Первое из этих слов имеет шестнадцатиричный код
 (40080001); второе слово для первого набора равно $A_1$, а для
 второго - $A_2$.

 Число "целое со знаком" \ представляется в зоне задач набором
 длины 1. Первые 32 бит единственного элемента этого набора имеют
 шестнадцатиричный код (60080001); далее следуют 32 бита,
 образующие собственно запись целого числа со знаком в стандартном
 машинном формате.

 Операторы ЛОСа предусматривают ввод в процессе вычислений новых
 мас\-си\-вов чисел в одном из указанных выше форматов. Ссылка на
 такой массив для даль\-ней\-ше\-го ма\-ни\-пу\-ли\-ро\-ва\-ния с ним хранится в
 виде набора длины 2 из зоны задач. Первые 32 бита каждого из двух
 элементов данного набора указывают тип представления чисел:
 шестнадцатиричный код (50080001) соответствует формату "с
 плавающей запятой"; (70080001) - формату "целое со знаком".
 Вторые 32 бит первого элемента хранят указатель на начало массива
 (в формате языка C), а вторые 32 бит второго элемента - handle
 массива. Заметим, что длина массива в такой ссылке не указывается
 и (ес\-ли она нужна) должна быть сохранена независимо при создании
 массива. Удаление массива осуществляется автоматически: если при
 расчистке зоны задач удаляется ссылка на массив, то удаляется и
 сам массив.

 \subsection{Хранение программ}

 Прежде чем перейти к описанию структур данных, используемых для
 хра\-не\-ния программы на ЛОСе, остановимся на формате значений
 программных переменных. Такими значениями в ЛОСе служат
 логические символы, символы переменных, на\-бо\-ры, термы, а также
 вхождения в наборы и термы. Они кодируются 32-битными наборами в
 точности так же, как это делалось в текстах зоны задач.

 Для эффективной работы решателя, вообще говоря, нет необходимости
 хранить в оперативной памяти всю (достаточно большую и постоянно
 увеличивающуюся по мере обучения) программу его базы приемов.
 Достаточно использовать буфер, в котором сохранялись бы наиболее
 часто активизируемые при сканировании фраг\-мен\-ты программ. Такой
 буфер называется зоной программ; он состоит из сегментов - массивов
 оперативной памяти по 256 Кбайт. В настоящей версии интерпретатора
 число сегментов зоны программ равно 10; оно легко может быть
 изменено.

 Все ЛОС-программы системы хранятся в блоке программ, образованном
 группой файлов с названиями Lijkl.los; (ijkl) - восьмеричный
 номер файла в группе. Уже при хранении в файле фрагмент программы
 преобразован специальным конвертором к виду, удобному для
 быстрого выполнения (напомним, что при работе с редактором
 программ ЛОСа этот фрагмент имел вид последовательности термов -
 операторов ЛОСа). В файле либо в зоне программ он представляет
 собой последовательность групп ($A_1 \ldots A_n \ B$), где $A_1,
 \ldots, A_n$ - программные переменные либо логические сим\-во\-лы,
 определяющие значения, загружаемые в стэк выражений
 интерпретатора; $B$ - номер процедуры интерпретатора, применяемой
 после указанной загрузки стэка. После группы может быть размещена
 не загружаемая в стэк выражений, но ис\-поль\-зу\-е\-мая процедурой $B$
 информация. Передача управления к следующей группе по завершении
 очередной процедуры в необходимых случаях корректируется этой
 процедурой таким образом, чтобы информационные вставки были
 пропущены.

 Кодируются элементы программы в файле и в зоне программ по-разному:
 в зоне программ кодирование избыточное, ориентированное на быстрейшее
 выполнение про\-це\-дур интерпретатора; в файле - более экономное, хотя
 процедура сжатия здесь тривиальная и состоит, по существу, в
 отбрасывании лишних нулей. Близость двух способов кодирования
 позволяет быстро преобразовывать один формат в другой при
 считывании программы из файла в зону программ.

 \subsubsection{Хранение программы в зоне программ}

 Фрагменты программ размещаются в каждом сегменте зоны программ
 подряд, без переноса окончания фрагмента в следующий сегмент.
 Перед каждый фрагментом размещается обнуленное 32-битное слово.
 Запись фрагмента в зоне программ состоит из префикса, текста
 фрагмента и суффикса.

 Префикс состоит из четырех 32-битных слов $A_1,A_2,A_3$ и $A_4$.
 $A_1$ есть смещение от начала префикса до начала суффикса (все
 смещения берутся в предположении, что сегмент зоны программ есть
 массив 32-битных слов). $A_2$ есть смещение от начала префикса до
 первой ячейки, расположенной после суффикса. $A_3$ есть адрес
 данного фрагмента в блоке программ. Первый (старший) бит этого
 адреса равен 1; следующие (в порядке убывания номеров) 12 бит
 хранят 4 восьмеричных константы ijkl - номер файла Lijkl.los, в
 котором хранится фрагмент. Последние 19 бит хранят сме\-ще\-ние
 начала фрагмента в указанном файле. $A_4$ в случае корневого
 фрагмента представ\-ля\-ет собой набор, старшие 16 бит которого равны
 0, а младшие 16 равны номеру логического символа, корнем
 программы которого служит фрагмент. Если же фраг\-мент не корневой,
 то старшие 16 бит хранят число $N+1$, где $N$ - номер сегмента
 зо\-ны программ, хранящего надфрагмент (от него имеется переход к
 данному фрагменту по "ветвь $\ldots$" \ либо "иначе $\ldots$").
 Младшие 16 бит при этом хранят смещение начала префикса
 надфрагмента в указанном сегменте. Нумерация сегментов зоны
 программ начинается с 0.

 Текст фрагмента состоит из 32-битных слов одного из трех типов:

 а) Слово, хранящее номер $N$ пересылаемой в стэк выражений
 программной пе\-ре\-мен\-ной.

 б) Слово, старшие 16 бит которого имеют вид (0 0 $\ldots$ 0 1 0 0 0),
 а младшие 16 - но\-мер логического символа, пересылаемого в стэк
 выражений.

 в) Слово, старшие 16 бит которого имеют вид (0 0 $\ldots$ 0 0 1),
 а младшие 16 - номер $i$ применяемой процедуры интерпретатора
 $Fi$. Заметим, что все адресуемые из фрагмента программы ЛОСа функции
 программы интерпретатора обозначены буквой $F$ с идущим после нее
 номером.

 \par\medskip

 Специальные информационные слова, группы которых размещаются
 после но\-ме\-ров процедур интерпретатора, описываются в разделе,
 посвященном конвер\-то\-ру интерпретатора (как правило, они
 используются для указания смещений при условных переходах внутри
 фрагмента).

 Суффикс фрагмента представляет собой набор 32-битных слов,
 указывающих адреса переходов из фрагмента по операторам "ветвь
 $\ldots$", "иначе $\ldots$". Они рас\-по\-ло\-же\-ны в суффиксе в том же
 порядке, что и соответствующие операторы перехода в фрагменте.
 Если подфрагмент, к которому нужно перейти, считан в зону
 программ, то адрес перехода к нему имеет в старших 16 битах число
 $N+1$, где $N$ - номер сегмента, содержащего подфрагмент, а в
 младших 16 битах - смещение префикса подфрагмента в этом
 сегменте. Если же подфрагмент не считан в зону программ, то
 указывается адрес его в блоке программ - в том же формате, что и
 элемент $A_3$ из префикса. В принципе, блок программ может
 хранить фрагменты с временно неопределенными переходами (они
 доопределяются в процессе редактирования ЛОС - программы). Если
 такой фрагмент будет считан в зону программ, то у него старшие 13
 бит будут равны 1, а младшие 16 бит - номер логического символа,
 выбранного в качестве временной метки перехода.

 \subsubsection{Хранение программы в блоке программ}

 Блок программ предназначен для хранения ЛОС-программ. В него
 входят файл K.los, называемый каталогом программ, а также файлы
 вида Lijkl.los, где (ijkl) - четырехразрядный восьмеричный номер
 файла. Файл K.los имеет ровно 256 Кбайт; каждый из файлов
 Lijkl.los - длину не более 512 Кбайт.

 Каталог программ определяет адреса корневых фрагментов программ
 логичес\-ких символов в файлах Lijkl.los. Он представляет собой
 последовательность 32-битных слов; $i$-е слово соответствует
 логическому символу с номером $i$ (первое слово имеет в файле
 K.los смещение 0). Если программа $i$-го логического символа
 отсутствует, то соответствующее слово состоит из нулей. Иначе
 старший бит этого слова равен 1; следующие за ним 12 бит
 определяют номер (ijkl) файла Lijkl.los, хранящего корневой
 фрагмент программы $i$-го логического символа, а последние 19 бит
 определяют сме\-ще\-ние начала записи данного фрагмента в файле
 Lijkl.los.

 Файлы Lijkl.los используются для хранения фрагментов
 ЛОС-программ. Фраг\-мен\-ты программы одного и того же логического
 символа хранятся в одном и том же файле. Если размер файла
 Lijkl.los приближается в процессе развития системы к 512 Кбайт,
 причем к нему относятся программы более чем одного логического
 символа, то он автоматически подразбивается на два файла, причем
 нумерация следующих за ним файлов сдвигается на единицу (при этом
 предпринимается необходимая кор\-рек\-ция каталога программ и ссылок
 из зоны программ).

 Запись фрагмента программы в файле блока программ состоит из
 префикса, текста фрагмента и суффикса.

 Префикс имеет ровно 7 байт; он разбивается на слова
 $A_1,A_2,A_3$, первые два из которых имеют по 16 бит, а последнее
 - 24 бит. Старший бит слова $A_1$ - индикатор "мусора"; если он
 равен 1, то это означает, что запись уже не используется.
 Не\-ис\-поль\-зу\-е\-мые записи устраняются при уплотнении блока программ.
 Следующий бит слова $A_1$ - индикатор корневого фрагмента: если
 он равен 1, то фрагмент корневой. Младшие 14 бит слова $A_1$
 равны смещению (здесь все смещения берутся в байтах) от начала
 префикса до начала суффикса. Слово $A_2$ - смещение от начала
 префикса до первого байта после фрагмента (старшие 2 бита слова
 $A_2$ равны 0). Если фрагмент корневой, то слово $A_3$ есть номер
 логического символа, соответствующего программе (тогда старшие 8
 бит равны 0). Иначе младшие 19 разрядов слова $A_3$ - смещение в
 том же файле начала надфрагмента данного фрагмента (от него
 имеется ссылка по "ветвь $\ldots$", "иначе $\ldots$" \ к данному
 фрагменту); старшие биты этого слова равны 0.

 Текст фрагмента образован последовательностью 11-ти и 17-ти
 -битных слов од\-но\-го из трех типов:

 а) Слово, хранящее номер $N$ программной переменной, загружаемой
 в стэк вы\-ра\-же\-ний - набор длины 11. Старшие 9 бит хранят номер
 $N$, а младшие 2 бита равны (01).

 б) Слово, хранящее номер логического символа, загружаемого в стэк
 выражений - набор длины 17; старшие 16 бит этого набора равны
 данному номеру, а младший равен 0.

 в) Слово, хранящее номер процедуры интерпретатора - набор длины
 11; старшие 9 бит этого набора равны данному номеру, а младшие
 равны (11).

 \par\medskip

 Если текст программы завершился раньше конца байта, то до этого
 конца идут нули, а затем начинается суффикс.

 Суффикс фрагмента программы образован последовательностью
 24-битных слов, хранящих ссылки на переходы из фрагмента. Каждая
 ссылка в младших 19 раз\-ря\-дах хранит смещение префикса очередного
 подфрагмента данного фрагмента. Эти смещения располагаются в том
 же порядке, что и соответствующие им операторы перехода. Старшие
 5 бит каждого слова обнулены. Возможен особый случай - если
 переход из фрагмента временно не определен (в процессе
 редактирования про\-грам\-мы). Такой переход имеет метку - некоторый
 логический символ; младшие 16 бит 24-битной ссылки равны
 номеру этого символа, а старший бит равен 1.

 \subsubsection{Представление фрагмента программы в зоне задач}

 Для редактирования фрагментов программы ЛОСа предусмотрены
 считывание их из блока программ в зону задач и запись из зоны
 задач в блок программ. Фрагмент программы в зоне задач
 представляется при этом как набор термов - операторов этого
 фрагмента. Операторы перехода здесь хранятся в виде "ветвь($A_1 \
 A_2$)" \ либо "иначе($A_1 \ A_2$)", где $A_1,A_2$ - пара
 логических символов, кодирующая ссылку на под\-фраг\-мент в блоке
 программ (нумерация ссылок на подфрагменты, используемая при
 отображении программы на экране редактором программ ЛОСа -
 виртуальная, она вводится толкьо при прорисовке на экране).

 Чтобы из пары логических символов $A_1,A_2$ получить ссылку на
 фрагмент прог\-рам\-мы в блоке программ (в том же формате, в каком
 представлена ссылка из хра\-ня\-ще\-го\-ся в зоне программ фрагмента на
 его представление в блоке программ), бе\-рут\-ся числа $N_1$ и $N_2$,
 образованные младшими 16 битами 32-битных слов $A_1,A_2$,
 определяются 16-битное представление $B_1$ числа $N_1 - 1$, а
 также 15-битное пред\-став\-ле\-ние $B_2$ числа $N_2 - 1$
 (отбрасывается старший бит числа $N_2 - 1$, который всегда равен
 0). Затем формируется 32-битный набор ($1,B_1,B_2$) - он и дает
 искомую ссыл\-ку. В этой ссылке первые 12 бит после старшего бита -
 четыре восьмеричных константы номера файла Lijkl.los; младшие 19
 бит - смещение в этом файле начала фрагмента.

 Некоторые операторы ЛОСа (см. серию операторов
 "прогфрайл($\ldots$)") рабо\-та\-ют со ссылками на вхождения
 операторов "ветвь($\ldots$)"; "иначе($\ldots$)" \ в фрагменты,
 хранящиеся в блоке программ. Такая ссылка - хранящийся в зоне
 задач набор дли\-ны 2 (пара), первым элементом которой служит пара
 логических символов ($A_1,A_2$) - ссылка на фрагмент программы в
 указанном выше формате, а вторым элементом является символьный номер
 данного перехода в фрагменте.

 \subsection{Хранение вспомогательной информации в файлах
 ло\-ги\-чес\-кой системы}

 Для хранения вспомогательной информации в системе служат группы
 файлов, на\-зы\-ва\-емые информационными блоками. Информационные блоки
 пронумерованы, и за каждым из них закреплена определенная смысловая
 нагрузка. В каждом ин\-фор\-ма\-ци\-он\-ном блоке файлы обозначаются некоторой
 буквой, после которой идут 4 восьмеричные цифры - номер файла в группе.
 Все такие файлы имеют расширение ".los". Используются следующие
 информационные блоки:

 \begin{enumerate}

 \item 1-й информационный блок хранит шрифты и текстовые заготовки,
 ис\-поль\-зу\-е\-мые в различных интерфейсах. Он образован
 единственным файлом I0000.los.

 \item 2-й информационный блок хранит задачник системы. Он
 образован группой файлов Eijkl.los.

 \item 3-й информационный блок хранит справочную информацию о
 логических сим\-во\-лах. Он образован группой файлов Hijkl.los.

 \item 4-й информационный блок - "почтовый ящик", используемый для
 сохранения технического протокола, передаваемого от одной вер сии
 системы к другой. Он состоит из единственного файла R0000.los.

 \item 5-й информационный блок хранит справочные оглавления,
 используемые в раз\-лич\-ных интерфейсах системы. Он образован
 группой файлов Qijkl.los.

 \item 6-й информационный блок хранит базу теорем. Он образован
 группой файлов Mijkl.los.

 \item 7-й информационный блок хранит общий справочник по системе.
 Он образован группой файлов Wijkl.los.

 \item 8-й информационный блок хранит базу приемов, реализованных
 на ГЕНОЛОГе. Он образован группой файлов Pijkl.los.

 \item 9-й информационный блок хранит оглавление программ. Он
 образован группой файлов Tijkl.los.

 \item 10-й информационный блок хранит архив задачника. Он
 образован группой файлов Aijkl.los.

 \item 11-й - информационный блок - резервный.

 \item 12-й информационный блок хранит контейнер системы (емкость
 для передачи от одной версии системы к другой различных компонент
 - приемов, программ, задач, справочных текстов и т.п.). Он
 образован группой файлов Cijkl.los.

 \item 13-й информационный блок хранит битмэпы задач на анализ
 рисунков. Он образован группой файлов Dijkl.los.

 \end{enumerate}

 \subsubsection{Общая организация информационного блока}

 Информационный блок используется для хранения древовидной
 структуры данных. Эта структура данных состоит из объектоа двух
 типов - указателей и терминалов. Указатели представляют собой
 неконцевые вершины древовидной структуры, от которых ведут
 ориентированные ребра с метками к другим указателям либо
 тер\-ми\-на\-лам. Из терминалов ребра не исходят. Выделен корневой
 указатель, и из не\-го достижимы все остальные указатели и
 терминалы информационного блока.

 Указатели информационного блока бывают двух типов - каталоги и
 списки. Ка\-та\-лог представляет собой вершину, из которой может
 вести очень большое число ребер - равное числу логических
 символов, поддерживаемому интерпретатором (в данной версии
 интерпретатора - 65536). Все эти ребра имеют своими метками
 различные логические символы; фактически число выходящих из
 каталога ребер может быть любым - от 0 до указанного максимума.
 Информационный блок может иметь не бо\-лее одного каталога, причем
 этот каталог обязательно является корневым указателем. Каталога
 не имеют лишь первый и четвертый блоки.

 Указатель-список обычно имеет существенно меньшее число выходящих
 из него ребер - как правило, не более 100. Хотя здесь нет жесткой
 границы, но использование списков с большим ветвлением не
 рекомендуется, так как это может замедлить работу системы. Меткой
 перехода из указателя-списка может служить не только логический
 символ (как в случае каталога), но и терм. Отличие от
 указателя-каталога состоит также в том, что по заданной метке от
 указателя-списка осуществляется переход не к единственному
 объекту, а к нескольким объектам, образующим упо\-ря\-до\-чен\-ный набор.
 Операторы ЛОСа позволяют получать набор ссылок на объекты данного
 набора и работать с каждым таким элементом по отдельности. В
 большин\-ст\-ве случаев указанные наборы - одноэлементные.

 Терминалы информационного блока делятся на текстовые и
 логические. Тексто\-вый терминал хранит последовательность байт,
 кодирующую текст либо битмэп (на\-при\-мер, при задании шрифта);
 логический терминал хранит набор термов и ло\-ги\-чес\-ких символов.
 Допускаются ссылки на один и тот же терминал из раз\-лич\-ных
 указателей (в отличие от указателей, на которые можно ссылаться
 лишь из од\-но\-го указателя). Впрочем, кратные ссылки на терминалы
 почти нигде не используются.

 \subsubsection{Кодирование объектов информационного блока}

 Указатель - каталог информационного блока (если он есть) вынесен
 в отдельный файл этого блока. Номер этого файла всегда состоит из
 нулей - (0000). Каталог состоит из 65536  32-битных слов. Эти
 слова пронумерованы начиная с 1, причем $i$-е слово соответствует
 переходу из указателя по ребру, меткой которого служит $i$-й
 логический символ. Если переход по логическому символу из
 указателя отсутствует, то соответствующее слово состоит из нулей.
 Иначе оно адресует объект, к которому ведет ребро. В этом случае
 старший бит слова равен 1; следующие за ним 12 бит образуют
 четырехразрядный восьмеричный номер файла информационного блока,
 в котором находится объект. Младшие 19 бит равны смещению в
 указанном файле начала объекта.

 Указатели-списки и терминалы хранятся в виде текста,
 начинающегося с 3 об\-ну\-лен\-ных байт (они используются при
 уплотнении информационного блока). Затем размещается 16-битное
 слово $A$, уточняющее тип объекта, задаваемого текстом. На\-ко\-нец,
 после слова $A$ размещается собственно запись объекта, называемая
 полем объекта. Пусть $A = (a_1, \ldots, a_{16})$. Если $a_1=0$,
 то объект представляет собой указа\-тель-список, иначе - терминал.
 Если $a_2=0$, то этот объект используется, иначе он представляет
 собой "мусор". Заметим, что при переводе объекта в катего\-рию
 "мусора" \ в нем может быть размещена ссылка на новую, фактически
 используемую версию, и для выхода на нее интерпретатор будет
 сначала пробегать по цепочке ссылающихся друг на друга объектов
 типа "мусор". Ссылка на новую версию (сме\-ще\-ние его начала в том
 же файле) размещается в первых 3 байтах поля объекта - "мусора".
 В случае терминала $a_3$ уточняет его тип: $a_3 = 0$ означает, что
 терми\-нал текстовый, иначе - логический. В случае указателя $(a_5,
 \ldots, a_{16})$ - число байт в начале поля объекта, уже занятых
 для хранения переходов из данного указателя. В случае терминала
 $(a_5, \ldots, a_{16})$ - число ссылок на данный терминал из
 различных указателей информационного блока.

 Из указателя-списка можно ссылаться лишь на объекты, размещенные
 в том же файле информационного блока, что и этот указатель. Как и
 в случае файлов блока программ, размеры одного файла
 информационного блока ограничены в данной версии интерпретатора
 512 Кбайтами. Это ограничение вытекает из используемой адресации:
 12-битный номер файла в блоке оставляет лишь 20 бит для
 указания смещения в одном файле, причем один из этих 20 бит
 используется для других целей. При необходимости размеры одного
 файла в блоке можно было бы увеличить, уменьшив в соответствующее
 число раз количество самих файлов. Большие файлы, приближающиеся
 по своему размеру к 512 Кбайтам, автоматически разрезаются
 интерпретатором на две части, со сдвигом нумерации последующих
 файлов. Так как из указателя-списка можно ссылаться только на
 объекты того же файла, то фактически за каждым файлом оказывается
 закреплена некоторая группа логи\-чес\-ких символов, по которым
 возможны переходы в него из корневого указателя-каталога (если он
 есть), Разрезание большого файла на две части происходит лишь
 тогда, когда за ним закреплено более одного логического символа.

 Поле указателя-списка состоит из последовательности расположенных
 подряд полей меток, за которыми идет незанятая часть поля. Каждое
 поле метки начинается с 16-битного слова, хранящего длину
 следующей за ним части этого поля метки. Далее располагается сама
 метка (логический символ либо терм), представленная в том же
 формате, как и термы логического терминала (см.ниже). После метки
 размещается последовательность ссылок на те объекта, к которым
 имеется переход по данной метке из данного указателя-списка.
 Каждая такая ссылка представляет собой 24-битное смещение начала
 объекта (объект должен размещаться в том же файле, что и
 указатель - список).

 Поле логического терминала состоит из 24-битных слов. Младшие 16
 бит такого слова образуют номер логического символа либо
 переменной, представляемых дан\-ным словом. Старший байт слова -
 $(a_1, \ldots, a_8)$ - уточняющий. Если $a_1=0$, то слово
 представляет логический символ, иначе - переменную. Если
 $(a_7,a_8) = 00$, то после символа не идет скобки; если
 $(a_7,a_8) = 01$, то после символа идет открываю\-щая скобка; если
 $(a_7,a_8) = 10$, то после символа идет закрывающая скобка. При
 работе с таким форматом записи термов оказываются необходимы
 слова, кодирующие от\-дель\-но идущие закрывающие скобки (если
 закрывающих скобок встречается под\-ряд несколько). Младшие 16 бит
 этих слов содержат нули; $a_1 = 1$; $(a_7,a_8) = 10$. В конце
 логического терминала могут располагаться неиспользуемые
 обнуленные 24-битные слова.

 Поле текстового терминала состоит из произвольной
 последовательности байт.

 При работе с объектами информационных блоков операторы ЛОСа
 ис\-поль\-зу\-ют специальные ссылки на них. Каждая такая ссылка
 представляет собой набор длины 2, хранящийся в зоне задач. Этот
 набор образован двумя логическими символами $A_1,A_2$. Чтобы
 найти номер файла и смещение в нем, интерпретатор вычитает из
 номеров $N_1,N_2$ символов $A_1,A_2$ номер 260 логического
 символа "0". Возникающие при этом числа в 16-битном представлении
 записываются подряд. Старший бит по\-лу\-чен\-но\-го 32-битного слова
 заменяется на 1. Теперь следующие за старшим 12 бит дают номер
 файла, а младшие 19 бит - смещение в нем. Заметим, что в
 действительности такой способ кодирования может привести к
 необходимости использовать логические символы $A_1,A_2$ с
 номерами, большими максимально допустимой величины 65535. Однако,
 так как 15-й бит кода логического символа интерпретатором не
 использу\-ет\-ся, необходимый перенос попадает в него и сохраняется
 вплоть до декодирования.

 \subsection{Вспомогательные файлы}

 Кроме файлов информационных блоков и блока программ, логическая
 система ис\-поль\-зу\-ет ряд вспомогательных файлов, типы которых
 перечисляются ниже.

 \subsubsection{Учет файлов, требующих уплотнения}

 При любом изменении файла $F$ блока программ либо информационного
 блока в файле U.los автоматически регистрируется информация о
 том, что файл $F$ был изменен. Это помогает при уплотнении файлов
 (исключении из них объектов, от\-не\-сен\-ных к категории "мусора") не
 рассматривать уже уплотненные ранее файлы.

 В файле U.los хранится последовательность 32-битных слов,
 ссылающихся на измененные файлы (повторные ссылки не вводятся).
 Старший бит ссылки равен 0; следующие за ним 12 бит определяют
 четырехразрядный восьмеричный номер файла в блоке; младшие 19 бит
 определяют номер информационного блока либо указы\-ва\-ют, что
 рассматривается блок программ - в этом случае данные биты
 обнулены.

 Для уплотнения информационных блоков и блока программ
 предусмотрены спе\-ци\-аль\-ные операторы (в случае информационного
 блока уплотняется только текущий блок, т.е. блок,
 активизированный до этого оператором "файл(актив...)"). После
 выполнения оператора из файла U.los исключаются все ссылки,
 относящиеся к только что уплотненному блоку.

 \subsubsection{Хранение названий логических символов и
 словарных фрагментов}

 Для сохранения названий логических символов, а также для
 сохранения словарных фрагментов, используемых анализатором
 текстов естественного языка, служат две группы файлов. Первая из
 них называется словарем логической системы; вторая - внешним
 словарем.

 Словарь состоит из нескольких файлов вида Vi.los; i - номер файла
 словаря (эти файлы называются также блоками словаря). Каждый файл
 словаря обслуживает ровно 10000 логических символов: V1.los -
 первые 10000; V2.los - следующие 10000, и т.д. Фактически в
 настоящее время существует только V1.los, так как номера
 используемых логических символов пока существенно меньше 10000.
 Файл Vi.los имеет ровно 260000 байт. Первые 20000 байт образуют
 10000 16-битных слов, яв\-ля\-ю\-щих\-ся номерами логических символов,
 расположенными в порядке лексико\-гра\-фи\-чес\-ко\-го возрастания текстов
 названий этих символов. Используется начальный отрезок этих 20000
 байт, после которого все байты (до 20000 -го) обнулены. Байты
 начиная с 20001 разбиты на 10000 групп по 24 байта каждая. Эти
 группы хранят названия логических символов; группа с номером $i$
 (если начинать нумерацию групп с 1) в файле V$j$.los хранит
 название символа с номером $10000(j-1)+i$. Наз\-ва\-ние символа
 завершается группой обнуленных байт (если длина его меньше 24).
 Названия символов, длина которых больше 24, не допускаются.

 Внешний словарь устроен совершенно аналогично словарю; его файлы
 имеют названия Si.los. Отличие между внешним словарем и словарем
 относится, главным образом, к использующим их операторам ЛОСа.
 Словарь нужен просто для иден\-ти\-фи\-ка\-ции названия логического
 символа с этим символом (т.е. с его номером). Внешний словарь
 используется в режиме разбиения слова на группу допустимых фрагментов,
 т.е.нужен для перечисления таких начинающихся с заданной точки слова
 подслов, каждое из которых может рассматриваться в качестве допустимого
 фрагмента.

 \subsection{Вспомогательные массивы}

 Кроме зоны задач и зоны программ, логическая система имеет ряд других
 вспо\-мо\-га\-тель\-ных массивов; некоторые из них перечисляем ниже.

 \subsubsection{Глобальный стэк}

 Структура и принципы использования глобального стэка
 интерпретатора были под\-роб\-но описаны в разделе, посвященном
 отладчику ЛОСа. Глобальный стэк пред\-став\-ля\-ет собой обобщение
 обычного стэка, необходимое для организации режима перечисления;
 в обычном смысле стэком он не является.

 \subsubsection{Стэк выражений}

 Перед обращением к процедуре интерпретатора, реализующей
 некоторый оператор либо операторное выражение, ее входные данные
 пересылаются в специальный стэк, называемый стэком выражений. В
 этот же стэк заносится результат, если вы\-чис\-ля\-ет\-ся значение
 операторного выражения. В отличие от глобального стэка, это - обыч\-ный
 стэк.

 \subsubsection{Буфер текстов}

 Для работы с текстовыми данными в оперативной памяти введен
 массив, называемый буфером текстов. Он состоит из 2000 32-битных
 слов. Старшие 16 бит в каждом таком слове не используются;
 младшие 16 представляются в виде ($A_1 \ A_2 \ A_3$), где $A_1$
 есть 4-битный номер цвета фона; $A_2$ - 4-битный цвет символов;
 $A_3$ - 8-битный но\-мер символа.

 Кроме основного буфера текстов, введены два дополнительных буфера
 текстов (различаемые по номерам 1 и 2), а также буфер текстового
 редактора. Каждый из этих буферов, как и буфер текстов, содержит
 ровно 2000 32-битных слов. Первые два буфера используются для
 временного сохранения содержимого основного буфера; буфер
 текстового редактора используется для сохранения текстового
 фрагмента и многократного его использования при редактировании
 текста.

 \subsubsection{Каталог программ}

 Содержимое файла K.los, хранящего ссылки на корневые фрагменты
 программ ло\-ги\-чес\-ких символов в блоке программ, при запуске
 системы копируется в специальном массиве, называемом каталогом
 программ. Если корневой фрагмент программы ло\-ги\-чес\-ко\-го символа
 считывается в зону программ, то ссылка на этот фрагмент из
 каталога программ обновляется - она начинает указывать на
 положение фрагмента в зоне программ. Формат ссылки - такой же,
 как для ссылок между фрагментами в зоне программ.
 После исключения корневого фрагмента из зоны программ
 ав\-то\-ма\-ти\-чес\-ки восстанавливается ссылка на него в блоке программ.
 При редактировании программы (в том числе в процессах
 автопрограммирования) происходит изменение ее в блоке программ. В зоне
 программ после этого могут оставаться старые, не\-из\-ме\-нен\-ные версии
 фрагментов. Во избежание ошибочного поведения системы, следует в таких
 случаях использовать операторы ЛОСа, сбрасывающие ветвь программы
 заданного логического символа и восстанавливающие ссылку на нее
 из каталога программ по блоку программ.

 \subsubsection{Словарь и внешний словарь}

 Для быстрой работы с текстовыми данными все файлы словаря и внешнего
 словаря считываются в массивы словаря и внешнего словаря,
 пронумерованные так же, как и соответствующие файлы.

 \subsubsection{Буфер рисунков}

 Для анализа одноцветных изображений введен массив в 40000 байт, называемый
 буфером рисунков. В него загружается (в стандартном монохроматическом
 фор\-ма\-те) битмэп рисунка.

 \subsubsection{Буфер линий}

 Буфер линий используется для накопления результатов анализа
 содержимого буфера рисунков - выделения линий и особых точек.
 Он имеет 12500 32-битных ячеек. Пер\-вые 2500 из них образуют
 массив точек; последние 10000 - массив линий.

 Первая ячейка массива точек хранит смещение первой свободной ячейки
 этого массива; далее идут подряд массивы точек. Первая ячейка массива
 точки хранит длину этого массива. Затем идут координаты точки -
 столбец и строка, и после них - ссылки (смещения в буфере линий)
 на линии с концом в данной точке. Завершает список ссылок на
 линии ноль (после этого нуля могут находиться несколько ре\-зерв\-ных
 ячеек массива точки).

 Первая ячейка массива линий хранит смещение в буфере линий первой
 свободной ячейки этого массива. Далее располагаются подряд
 массивы линий. Первая ячейка массива линии хранит длину этого
 массива. Затем идут ссылки на начало и конец линии (смещения в
 массиве точек). Далее - указатель вертикальной (1) либо
 го\-ри\-зон\-таль\-ной (0) развертки линии. После него - абсцисса в
 случае горизон\-таль\-ной развертки и ордината в случае вертикальной
 развертки, указывающая начальную точку развертки линии (на каждом
 шаге развертки абсцисса либо, соответственно, ордината, будет
 увеличиваться на 1). Наконец, размещаются ординаты в случае
 горизонтальной развертки и абсциссы в случае вертикальной
 развертки для после\-до\-ва\-тель\-но проходимых точек линии.

 \subsubsection{Массив текстов}

 Этот массив играет роль памяти, в которой сохраняются извлекаемые
 из буфера текстов фрагменты, для последующей вставки их в буфер текстов
 при сборке нужного текста. В отличие от прочих упомянутых выше массивов,
 он не инициализируется автоматически, а вводится по мере надобности и
 потом удаляется. Размеры его - 256 Кбайт.

 \subsubsection{Стэк установок на прерывание}

 Массив установок на прерывание разбит на шестерки 32-битных ячеек,
 хранящих информацию о ситуациях, в которых нужно выходить в
 отладчик ЛОСа. При каждом обращении к отладчику началом стэка
 становится первая свободная шестерка в конце массива, в которую и
 будет заноситься информация о прерывании, устанавливаемом для обращения
 к отладчику при анализе его же работы. При выходе из отладчика
 начало стэка откатывается на 6 ячеек. Первая из шести ячеек
 каждого кадра хранит номер типа прерывания либо (при отсутствии
 установки на прерывание) 0; вторая хранит смещение кадра глобального
 стэка, к которому относится установка, либо 0; ячейки с третьей по шестую
 хранят информацию, сопровождающую тип прерывания. Третья ячейка
 хранит логический символ, при выходе на программу которого вы\-пол\-ня\-ет\-ся
 прерывание, либо другую специальную информацию; четвертая - ссылку в
 блоке программ на фрагмент прерывания; пятая - ссылку в зоне
 программ на оператор прерывания (старшие 16 бит - смещение в
 сегменте зоны программ; млад\-шие - номер сегмента); шестая - число
 на счетчике шагов работы интерпретатора, по достижении которого
 предпринимается прерывание.

 \subsubsection{Стэк прерываний}

 В этом стэке хранятся группы значений: (peresm, otvet, symbol, ind, ist,
 uro\-ven, delta, cadr, смещение в стэке выражений T до его вершины
 st, текущая операция) - сохраняемых перед входом в прерывание.

 \subsection{Обозначения массивов интерпретатора}

 Перечислим обозначения основных массивов, используемых
 интерпретатором ЛОСа.

 \begin{enumerate}

 \item Зона задач - Z;

 \item Глобальный стэк - S;

 \item Стэк выражений - T;

 \item Зона программ состоит из сегментов (массивов), массив указателей
 на кото\-рые есть P[NP];

 \item Каталог программ - K;

 \item Словарь состоит из массивов, массив указателей на которые
 есть V[NV];

 \item Внешний словарь состоит из массивов, массив указателей на
 которые есть SL[NSL];

 \item Буфер текстов - B;

 \item Буфер рисунков - RS;

 \item Буфер линий - LN;

 \item Стэк установок на прерывания - PR;

 \item Стэк прерываний - SP;

 \item Массив текстов - MT;

 \item Вспомогательные массивы R,F,C, используемые для временного
 хранения раз\-лич\-ных данных. Первые два из них имеют по 60000 байт,
 последний (назы\-ва\-е\-мый буфером битмэпов, так как обычно в нем
 создаются битмэпы не\-по\-сред\-ст\-вен\-но перед прорисовкой функциями
 WINAPI) - 76800 байт.

 \end{enumerate}

 \subsection{Основные регистры интерпретатора}

 Перечислим основные регистры интерпретатора и их названия (более
 подробные пояснения, относящиеся к регистрам, будут даваться по
 мере описания процедур интерпретатора).

 \begin{enumerate}

 \item ind - переключатель обращений в основном цикле работы
 интерпретатора: 0 - к сканированию задачи; 1 - к выполнению
 фрагмента программы; 2 - выход для ввода внешней информации;
 3 - завершение программы; 4 - прерывание при обнаружении ошибки.

 \item peresm - указатель на необходимость пересмотра в
 сканировании задачи (1 - пересмотр, 0 - нет пересмотра);

 \item otvet - регистр ответа задачи (0 - нет ответа);

 \item cadr - смещение в глобальном стэке текущего кадра;

 \item symbol - логический символ, программа которого реализуется;

 \item nomprog - номер текущего сегмента зоны программ, в котором
 находится ре\-али\-зу\-е\-мый фрагмент; нумерация начинается с 0;

 \item A - указатель на начало текущего сегмента зоны программ;

 \item fragm - смещение начала текущего фрагмента программы в
 текущем сег\-мен\-те зоны программ;

 \item tec - указатель на текущую ячейку текущего фрагмента
 программы либо (в паузах между обработкой фрагментов, например,
 при считывании фрагмента в зону программ) 0;

 \item level - текущий уровень перечисления. Уровни перечисления
 вводятся для того, чтобы можно было отличить перечисление,
 организуемое отдельным опе\-ра\-то\-ром, от внутреннего перечисления,
 обеспечиваемого его подоператором. При входе в выполнение
 составного перечисляющего оператора (например, опе\-ра\-то\-ра "или")
 уровень перечисления увеличивается на единицу, так что
 кадры вспомогательных перечисляющих операторов внутри
 этого "или" \ будут по\-ме\-че\-ны ненулевыми уровнями перечисления.
 Такая разметка позволяет иг\-но\-ри\-ро\-вать вспомогательные кадры
 перечисляющего типа при откатах и сбрасывать заданное количество лишь
 основных (имеющих нулевой уровень перечисления) кадров. Напомним,
 что перечисление обеспечивается либо кадром продолже\-ния, либо
 кадром оператора, программа которого предназначена для
 пе\-ре\-чис\-ле\-ния;

 \item st - указатель на первую незанятую ячейку стэка выражений
 (он заполняется в порядке увеличения смещений ячеек);

 \item svob - смещение в зоне задач ячейки, начиная с которой
 происходит поиск свободного места при вводе новых текстов;

 \item lcadr - смещение в глобальном стэке последнего стэкового
 кадра;

 \item ist - регистр истинностного значения оператора (0 - ложь, 1
 - истина);

 \item step - счетчик шагов работы интерпретатора;

 \item suff - указатель на первую ячейку суффикса текущего
 фрагмента в зоне про\-грамм;

 \item svobprog - номер сегмента зоны программ, в которую будет
 считываться оче\-редной фрагмент из блока программ;

 \item svobfrag - смещение в сегменте зоны программ, указанном
 регистром svob\-prog, начальной точки для записи считанного из
 блока программ фрагмента;

 \item prer - смещение в стэке PR установок на прерывания текущего
 стэкового кад\-ра;

 \item tact - указатель такта закрепления в текущем цикле поиска
 места в зоне задач. Этот указатель поочередно принимает значения
 0x80000000 и 0x80000001. Сме\-на значения происходит каждый раз,
 когда при поиске свободного места до\-сти\-га\-ется конец зоны задач.
 Подробнее - см. описание процедур поиска места и расчистки мусора
 в зоне задач.

 \item tipprer - регистр типа обращения к отладчику.

 \item uroven - регистр уровня обращения. Если его содержимое
 отлично от 0, то оно определяет максимальный уровень задачи, к
 которой произойдет ближайшее обращение. После обращения
 автоматически устанавливается на 0.

 \item input - регистр типа возвращения к основному циклу
 интерпретатора: 0 - про\-стое возвращение; 1 - возвращение в
 оператор "клавиатура"; 2 - возвращение в оператор "меню"; 3 -
 возвращение после оператора "карандаш";

 \item shift - флаг нажатой клавиши "shift"; используется в
 драйвере клавиатуры;

 \item ctrl - флаг левой клавиши "ctrl";

 \item ctrr - флаг правой клавиши "ctrl";

 \item rus - флаг русского (1) либо латинского (0) регистров;

 \item stroka - номер текущей строки на экране (от 0 до 479);

 \item stolbec - номер текущего столбца на экране (от 0 до 639);

 \item rectleft, rectright, recttop, rectbottom - левый, правый,
 верхний и нижний края активной рамки экрана;

 \item delta - приращение счетчика шагов (0 при выключенном
 счетчике, иначе 1);

 \item stp - смещение в стэке прерываний первой свободной ячейки;

 \item mousex,mousey - столбец и строка курсора мыши;

 \item mouse - тип сообщения от мыши: 0 - нажатие левой кнопки, 2
 - нажатие правой кнопки;

 \item stop - номер шага, на котором предпринимается анализ
 необходимости откатов согласно ранее выполненным операторам
 "лимит";

 \item nachl - индикатор периода до первого внутреннего
 перезапуска: сначала 0, а затем 1;

 \item iMT - индикатор наличия массива текстов: 0 - нет массива, 1
 - есть массив;

 \item jMT - смещение в массиве текстов MT первой свободной
 ячейки;

 \item kontrhol - индикатор режим контроля холостого хода приемов;

 \item kontrpr - индикатор обращения к программе оператора ЛОСа
 "контрольпри\-ема"; если он равен 1, то обращения к этому оператору
 происходят, иначе - нет;

 \end{enumerate}

 \section{Преобразование программы ЛОСа в фор\-мат, ис\-поль\-зуемый
 интер\-пре\-та\-то\-ром}

 Операторы ЛОСа, представляющие собой некоторые термы, не удобны
 для быстрого выполнения определяемых ими вычислений. Для
 использования интерпретатором эти операторы преобразуются в
 специальный формат - набор 32-битных слов; в этом формате они
 хранятся как в зоне программ, так и (после описанного выше
 сжатия) в блоке программ. Опишем формат, соответствующий хранению
 фрагмента программы в зоне программ.

 \subsection{Переменные и логические символы}

 Программная переменная либо логический символ представляются
 32-битным словом. В случае переменной это слово просто является
 номером переменной; в случае ло\-ги\-чес\-ко\-го символа старшие 16 бит
 образуют набор $(0, \ldots , 0, 1, 0)$, а младшие 16 бит образуют
 номер символа.

 \subsection{Непосредственно реализуемые неперечисляющий опе\-ра\-тор
 ли\-бо опе\-ра\-тор\-ное выражение}

 Непосредственно реализуемые (т.е. обрабатываемые специальной
 функцией ин\-тер\-пре\-татора) неперечисляющий оператор либо
 операторное выражение $f(A_1 \ldots A_n)$ пре\-образуются в
 последовательность 32-битных кодов зоны программ (логических
 сим\-волов, переменных либо номеров процедур интерпретатора)
 следующим образом. Сначала располагаются последовательности $B_1,
 \ldots , B_n$, где $B_i$ получено пре\-об\-ра\-зо\-ва\-нием операторного
 выражения $A_i$. Если число операндов $n$ - плавающее, то затем
 размещается код символьного представления для $n$ (т.е. код
 логического символа с номером $260+n$). Далее идет код номера
 процедуры интерпретатора для реализации $f$ (коды номеров
 процедур интерпретатора имеют в старших 16 битах набор $(0,
 \ldots ,\\ 0, 1)$ а в младших - сам номер). Наконец, если вхождение
 $f(A_1 \ldots \ A_n)$ в опе\-ра\-тор фрагмента программы - корневое,
 в конце добавляется код номера 243 процедуры интерпретатора - эта
 процедура реализует откат, если оператор оказался ложным.

 \subsection{Отрицание оператора}

 Отрицание "не($A$)" оператора $A$ кодируется последовательностью,
 получаемой до\-бав\-ле\-ни\-ем в конце последовательности, кодирующей
 оператор $A$, кода номера 298 процедуры интерпретатора (эта
 процедура меняет значение регистра истинности ist на
 противоположное).

 \subsection{Дизъюнкция операторов}

 Оператор "или($A_1 \ldots A_n$)" \ кодируется последовательностью
 вида $K_1, B_1, K_2, B_2, \ldots,\\ B_n, K_{n+1}$. Здесь $B_1, \ldots,
 B_n$ - последовательности, кодирующие операторы $A_1, \ldots,
 A_n$. Фрагмент $K_1$ состоит из двух 32-битных слов; фрагменты
 $K_2, \ldots, K_n$ - из четырех таких слов каждый; фрагмент
 $K_{n+1}$ - из трех слов. Первое слово в $K_1$ является кодом
 символьного представления смещения при переходе от этого слова к
 третьему слову фрагмента $K_2$ (смещение измеряется в числе
 32-битных слов). Второе слово фрагмента $K_1$ является кодом
 номера 247 процедуры интерпретатора. Первое слово фрагмента $K_i$
 при $2 < i < n+1$ является кодом символьного представления
 сме\-ще\-ния при переходе от этого слова на первый код после
 $K_{n+1}$. Второе слово в $K_i$ - код но\-ме\-ра 248 процедуры
 интерпретатора. Третье слово в $K_i$ - код символьного
 пред\-став\-ле\-ния смещения при переходе от этого слова к третьему
 слову фрагмента $K_{i+1}$. Четвертое слово в $K_i$ - код номера
 249 процедуры интерпретатора. Первые два слова фрагмента
 $K_{i+1}$ устроены так же, как у $K_2, \ldots, K_n$, а третье
 слово является кодом номера 246 процедуры интерпретатора.

 \subsection{Конъюнкция операторов}

 Оператор "и($A_1 \ldots A_n$)" \ кодируется последовательностью
 вида $K_1, B_1, B_2, \ldots , B_n, K_2$. Здесь $B_1, \ldots, B_n$
 - последовательности, кодирующие операторы $A_1, \ldots, A_n$, к
 каждой из которых в конце добавлен код номера 243 процедуры
 интерпретатора. Фрагменты $K_1, K_2$ состоят каждый из двух
 32-битных слов. Первое слово фрагмента $K_1$ есть код символьного
 представления смещения от этого слова до второго слова фрагмента
 $K_2$. Второе слово фрагмента $K_1$ есть код номера 244 процедуры
 интерпретатора. Слова фрагмента $K_2$ суть коды номеров 245 и 246
 процедур интерпретатора.

 \subsection{Оператор "альтернатива"\ }

 Оператор "альтернатива($A_1 \ A_2 \ A_3$)" \ кодируется
 последовательностью $B_1, K_1, B_2, K_2, \\ B_3, K_3$. Здесь $B_1,
 B_2, B_3$ - последовательности, кодирующие операторы $A_1, A_2,
 A_3$. Фрагменты $K_1, K_2$ состоят из четырех 32-битных слов;
 фрагмент $K_3$ - из трех 32-битных слов. Первое слово фрагмента
 $K_1$ является кодом символьного представления смещения при
 переходе от него к третьему слову набора $K_2$. Второе слово
 фрагмента $K_1$ - код номера 295 процедуры интерпретатора. Третье
 слово - код символьного представления смещения от него до
 последнего слова фрагмента $K_3$. Четвертое слово фрагмента $K_1$
 - код номера 247 процедуры интерпретатора. Первое слово фрагмента
 $K_2$ - код символьного представления смещения от него до первого
 слова после $K_3$. Второе слово фрагмента $K_2$ - код номера 256
 процедуры интерпретатора. Третье слово фрагмента $K_3$ - код
 символьного представления смещения от него до последнего слова
 набора $K_3$. Четвертое слово - код номера 247 процедуры
 интерпретатора. Первое слово фрагмента $K_3$ - код символьного
 представления смещения от него до первого слова после $K_3$ (т.е.
 3); второе и третье слова - коды номеров 256 и 246 процедур
 интерпретатора.

 \subsection{Оператор "длялюбого"\ }

 Оператор "длялюбого($x_1 \ldots x_n$ если $A_1 \ldots A_m$ то
 $A_0$)" \ кодируется последователь\-нос\-тью $K_1, B_1, \ldots, B_m,
 B_0, K_2$. Здесь $B_1, \ldots, B_m, B_0$ - последовательности,
 кодиру\-ю\-щие операторы $A_1, \ldots, A_m, A_0$, причем к концу
 каждой из последовательностей $B_1, \ldots, B_n$ добавлен код
 номера 243 процедуры интерпретатора. Фрагмент $K_1$ состоит из
 четы\-рех 32-битных слов; $K_2$ - из двух слов. Первое слово
 фрагмента $K_1$ - код символьного представления смещения от него
 к последнему слову фрагмента $K_2$. Второе слово фрагмента $K_1$
 - код номера 250 процедуры интерпретатора. Третье и четвертое
 слова фрагмента $K_1$ - коды переменных $x_1$ и $x_n$ (в
 кванторных операторах номера переменных связывающей приставки
 образуют отрезок натурального ряда, так что вся эта приставка
 однозначно восстанавливается по данным кодам). Фрагмент $K_2$
 состоит из кодов номеров 294 и 251 процедур интерпретатора.

 \subsection{Оператор "существует"\ }

 Оператор "существует($x_1 \ldots x_n A$)" \ кодируется
 последовательностью $K_1, B, K_2$. Здесь $B$ -
 последовательность, кодирующая оператор $A$. Фрагмент $K_1$
 состоит из четы\-рех 32-битных слов; фрагмент $K_2$ - из двух
 32-битных слов. Первое слово фрагмента $K_1$ - код символьного
 представления смещения от него до второго слова фрагмента $K_2$.
 Второе слово фрагмента $K_1$ - код номера 250 процедуры
 интерпретатора. Третье и четвертое слова фрагмента $K_1$ - коды
 переменных $x_1$ и $x_n$. Первое и второе слова фрагмента $K_2$ -
 коды номеров 254 и 246 процедур интерпретатора.

 \subsection{Операторное выражение "вариант"\ }

 Операторное выражение "вариант($A_1 \ A_2 \ A_3$)" \ кодируется
 последовательностью $B_1, \\ K_1, B_2, K_2, B_3$. Здесь $B_1, B_2,
 B_3$ - последовательности, кодирующие оператор $A_1$ и
 опе\-ра\-тор\-ные выражения $A_2, A_3$. Фрагменты $K_1, K_2$ состоят из
 двух 32-битных слов. Первое слово фрагмента $K_1$ есть код
 символьного представления смещения от этого слова до первого
 слова фрагмента $B_3$. Второе слово фрагмента $K_1$ есть код
 номера 295 процедуры интерпретатора. Первое слово фрагмента $K_2$
 есть код символьного представления смещения от этого слова до
 первого слова после $B_3$. Второе слово фрагмента $K_2$ есть код
 номера 257 процедуры интерпретатора.

 \subsection{Операторные выражения "выписка", "перечис\-ле\-ние",
 \\ "сум\-мавсех"\ }

 Операторные выражения "выписка($x_1 \ldots x_n \ A \ t$)";
 "перечисление($x_1 \ldots x_n \ A \ t$)"; "сум\-мавсех($x_1 \ldots
 x_n \ A \ t$)" \ кодируются последовательностью $K_1, B_1, B_2,
 K_2$. Здесь $B_1, B_2$ - последовательности, кодирующие оператор
 $A$ и операторное выражение $t$. Фрагмент $K_1$ остоит из пяти
 32-битных слов; фрагмент $K_2$ - из двух таких слов. Первое слово
 фрагмента $K_1$ есть код номера 258 (в случаях "выписка",
 "перечисление") либо номера 264 (в случае "суммавсех") процедуры
 интерпретатора. Второе слово фраг\-мен\-та $K_1$ есть код символьного
 представления смещения перехода от этого слова к последнему слову
 фрагмента $K_2$. Третье слово фрагмента $K_1$ есть код номера 259
 процедуры интерпретатора. Четвертое и пятое слова фрагмента $K_1$
 суть коды переменных $x_1$ и $x_n$. Первое слово фрагмента $K_2$
 есть код номера 261 (случай "пе\-ре\-чис\-ление") либо номера 262
 (случай "выписка") либо номера 265 (случай "сум\-ма\-всех")
 процедуры интерпретатора. Второе слово фрагмента $K_2$ есть код
 номера 263 (в случаях "выписка", "перечисление") либо номера 266
 (в случае "сумма\-всех") процедуры интерпретатора.

 \subsection{Программируемые оператор либо опе\-ра\-тор\-ное вы\-ра\-же\-ние}

 Реализованные с помощью ЛОС-программы оператор либо операторное
 выражение $f(A_1 \ldots A_n)$ кодируются последовательностью
 $B_1, \ldots, B_n, K$. Здесь $B_1, \ldots, B_n$ - коды для $A_1,
 \ldots, A_n$. Фрагмент $K$ состоит из трех 32-битных слов; если
 рассматриваемое вхождение оператора $f(A_1 \ldots A_n)$ является
 корневым, то к этому добавляется чет\-вер\-тое слово - код номера 243
 процедуры интерпретатора. Первое слово фрагмента $K$ есть код
 логического символа $f$; второе слово - код символьного
 представления числа операндов $n$. Третье слово есть код номера
 293 (в случае оператора) либо 294 (в случае операторного
 выражения) процедуры интерпретатора.

 \subsection{Непосредственно реализуемый перечисляю\-щий опе\-ра\-тор}

 Непосредственно реализуемый перечисляющий оператор $f(A_1 \ldots
 A_n)$ кодируется по\-сле\-до\-ва\-тель\-ностью $B_1, \ldots, B_n, K$. Здесь
 $B_1, \ldots, B_n$ - коды для $A_1, \ldots, A_n$. Если число
 операндов $n$ для $f$ не фиксировано, то в начале фрагмента $K$
 располагается код символьного представления числа $n$. Далее
 располагаются коды двух номеров $N_1, N_2$ процедур
 интерпретатора. Первый из этих номеров является номером
 логического символа $f$. Соответствующая процедура обеспечивает
 присвоение значений пере\-мен\-ным в начале перечисления
 ("инициализация цикла"). Второй номер относится к процедуре,
 обеспечивающей переприсвоение значений на очередном шаге
 пере\-чис\-ле\-ния ("шаг цикла"). Эти процедуры расположены в конце
 перечня функций интерпретатора $Fi$ - начиная с номера $i = 268$,
 быть может, с некоторыми паузами, и легко находятся по
 сопровождающим их комментариям вида "шаг $f$". В случае корневого
 вхождения оператора фрагмент $K$ завершается кодом номера 243
 про\-це\-ду\-ры интерпретатора.

 \subsection{Операторы перехода "ветвь", "иначе"\ }

 Оператор "ветвь $N$" \ кодируется тройкой $K_1, K_2, K_3$. $K_1$
 есть код номера 290 про\-це\-ду\-ры интерпретатора; $K_2$ - код
 символьного представления числа $N$; $K_3$ - код но\-ме\-ра 291
 процедуры интерпретатора.

 Оператор "иначе $N$" \ кодируется парой $K_1, K_2$. $K_1$ есть
 код номера 297 процедуры интерпретатора; $K_2$ - код символьного
 представления числа $N$.

 \section{Общая схема функционирования интер\-пре\-та\-то\-ра}

 При запуске программы интерпретатора применяется функция
 initsolv(), которая расчищает зону задач и инициализирует
 регистры интерпретатора. Эта же функция используется при внутреннем
 перезапуске системы. Она не за\-тра\-ги\-ва\-ет зоны прог\-рамм.

 Основной цикл работы интерпретатора - функция maincycle(),
 обращения к ко\-то\-рой имеются при запуске программы и при обработке
 сообщений операционной системы. Перед завершением программы
 применяется функция remove(), обес\-пе\-чи\-ва\-ю\-щая освобождение памяти.

 При вводе новых регистров интерпретатора следует обеспечивать их
 ини\-ци\-али-за\-цию, добавляя необходимые операторы к функции
 initsolve.

 Процедура maincycle() состоит из единственного цикла,
 управляемого регистром ind. Значение ind = 0 означает, что
 следует обращаться к сканированию текущей задачи, ind = 1 - к
 обработке текущего фрагмента программы, ind = 2 - запрашивать
 внешнюю информацию, ind = 3 - завершать работу системы, ind = 4 -
 организовывать выход в отладчик ЛОСа. Для сканирования задачи
 служит процедура scanpr(); для обработки текущего фрагмента
 программы - interp(); для выхода в отладчик ЛОСа - initprer(n),
 где в случае обращения из процедуры maincycle параметр n равен 1.

 \subsection{Сканирование задачи}

 Сканирование задачи осуществляется процедурой scanpr(). Прежде
 всего, эта про\-це\-ду\-ра проверяет содержимое регистра ответа otvet.
 Если оно отлично от 0, то является найденным ответом задачи
 (логическим символом либо смещением начала терма в зоне задач).
 Выдача этого ответа осуществляется процедурой endpr(). Если ответ
 был найден для исходной задачи, то работа программы завершается
 (ind := 3, и далее через цикл процедуры maincycle). Если ответ
 был получен для промежуточной задачи, то он регистрируется в
 стэке выражений, и регистр ответа обнуливается. Если же ответ не
 найден, то выполняется шаг сканирования: либо (в начале
 сканирования) обращение к программе типа задачи, либо смена
 текущего терма задачи и рас\-смот\-ре\-ние его первого символа, либо
 смена текущего символа в текущем терме - так, как это указано в
 подразделе "Сканирование задачи" \ главы "Общая схе\-ма функционирования
 решателя".

 Переход к очередному терму и рассмотрение его первого символа
 выполняются процедурой scanblock(). В свою очередь, эта процедура
 использует вспомогательную процедуру scanstep($a$), выполняющую
 переход к очередному терму задачи в кадре глобального стэка,
 соответствующем данной задаче, и выдающую новое смещение $a$
 вхождения веса терма в соответствующий список задачи.
 Рассмотрение каждого последующего символа текущего терма
 выполняется уже процедурой scanpr. Фак\-ти\-чес\-ки "рассмотрение" \
 текущего логического символа в указанных процедурах сво\-дит\-ся к
 тому, что этот символ заносится в регистр symbol (символ,
 программа ко\-то\-ро\-го реализуется); регистр ind устанавливается на 1
 (режим выполнения ЛОС-программы), и в регистр tec (указатель на
 текущую ячейку зоны программ) за\-но\-сит\-ся 0 для инициализации
 поиска начального фрагмента программы символа symbol. Затем
 предпринимается выход в цикл процедуры maincycle, которая далее
 пе\-ре\-да\- ет управление процедуре interp.

 \subsection{Обработка текущего фрагмента программы}

 Рабочий цикл интерпретатора, связанный с последовательным
 выполнением опе\-ра\-то\-ров текущего фрагмента программы, реализуется
 функцией interp().

 Прежде всего, проверяется наличие в регистре tec ссылки на
 текущий оператор фрагмента. Если этот регистр равен 0, то
 происходит обращение к процедуре nachprog(). Она считывает в зону
 программ корневой фрагмент программы симво\-ла, хранящегося в
 регистре symbol (если такой фрагмент уже не считан в зону
 программ). Затем устанавливаются значения следующих регистров,
 необходимые для вы\-пол\-не\-ния фрагмента программы:

 а) nomprog - номер текущего сегмента зоны программ (нумерация
 сегмен\-тов начинается с 0);

 б) fragm - смещение начала текущего фрагмента в текущем сегменте;

 в) A - указатель на начало текущего сегмента зоны программ;

 г) suff - указатель на первую ячейку суффикса текущего фрагмента
 (используется при определении переходов из фрагмента);

 д) tec - указатель на текущую ячейку текущего фрагмента.

 \par\medskip

 Далее начинается цикл загрузки стэка выражений входными данными
 для оче\-ред\-ной процедуры интерпретатора, реализующей оператор либо
 операторное вы\-ра\-же\-ние ЛОСа. Если tec указывает на программную
 переменную $xi$, значение которой определено, то в стэк выражений
 пересылается это значение, иначе в стэк выражений пересылается
 набор, старшие 16 бит которого имеют вид (10 $\ldots$ 0), а
 младшие хра\-нят номер переменной. Такой набор указывает процедуре
 интерпретатора, что со\-от\-вет\-ству\-ю\-щее выходное значение должно быть
 передано переменной $xi$. Если tec ука\-зы\-ва\-ет на логический
 символ, то этот символ заносится в стэк выражений. По окон\-ча\-нии
 загрузки tec будет указывать на номер применяемой процедуры
 интер\-пре\-та\-то\-ра.

 При переходе к выполнению очередной процедуры интерпретатора,
 реализующей ЛОС - вычисления, предпринимается увеличение на
 величину delta регистра step счетчика шагов интерпретатора.
 Обычно delta хранит 1, однако при входе в пре\-ры\-ва\-ние отладчика
 ЛОСа delta временно устанавливается на 0 - чтобы процесс отладки
 не влиял на "пошаговую адресацию" \ анализируемой траектории.

 Далее предпринимается контроль наличия сообщений Windows,
 требующих кор\-рек\-ции регистров (например, переключение режимов
 русской и латинской кла\-ви\-а\-ту\-ры); контроль необходимости отката
 при превышении заданного лимита шагов, а также обработка ранее
 введенных установок на прерывание для выхода в отлад\-чик ЛОСа. При
 отсутствии прерывания происходит обращение к той процедуре
 интер\-пре\-та\-то\-ра, на номер которой указывает tec. Здесь
 используется массив inter[\ ] ука\-за\-те\-лей на функции $Fi$,
 реализующие ЛОС - процедуры интерпретатора.

 Цикл обработки фрагмента программы продолжается до тех пор, пока
 либо ре\-гистр ind не становится отличен от 1, либо tec не
 оказывается равным 0 или ус\-та\-нов\-лен\-ным на начало суффикса
 фрагмента. В первых двух случаях - немедленный выход в maincycle.
 В последнем случае, если сканируется задача, то ind
 уста\-нав\-ли\-ва\-ет\-ся на 0, и (через maincycle) выход в продолжение
 сканирования. Если реализуется оператор ЛОСа, то регистр
 истинности ist устанавливается на 0 (ложное значение); если
 реализуется операторное выражение, то в стэк выражений заносится
 его фик\-тив\-ное значение - логический символ 0. В обоих случаях
 перед выходом в maincycle применяется процедура contin(),
 организующая продолжение вычислений по источнику текущего кадра
 глобального стэка.

 \subsection{Функции вызова фрагментов в зону программ}

 Для считывания фрагмента в блоке программ и перенесения его в
 зону программ служит функция fragment($a$). Она получает в
 качестве значения $a$ ссылку на фраг\-мент в блоке программ и
 возвращает ссылку на начало фрагмента в зоне программ (при
 неудаче возвращает 0).

 Номер того сегмента зоны программ, в который считывается
 очередной фрагмент программы, хранится в регистре svobprog.
 Смещение в этом сегменте точки, начиная с которой записывается
 фрагмент, хранится в регистре svobfrag. Начиная с этой точки и до
 конца данного сегмента все ячейки - неиспользуемые. Если для
 записи фрагмента не хватает места, то происходит переход к
 следующему (в циклическом порядке) сегменту зоны программ.
 Следующий сегмент расчищается: сначала в нем находятся все уже
 вовлеченные в вычисления фрагменты программы, которые
 за\-креп\-ля\-ют\-ся и сдвигаются (сплошным образом друг за другом) в
 начало сегмента; соответственно корректируются все ссылки на
 прерванные вычисления в данных фрагментах. Зона после
 закрепленных и перенесенных в начало сегмента фрагментов -
 свободная для записи новых фрагментов.

 Расчистка очередного сегмента осуществляется функцией
 raschistca(). За\-креп\-ле\-ние фрагмента, расположенного в сегменте с
 номером $a$ по смещению $b$, выполня\-ет\-ся функцией zacrep($a,b$);
 при этом закрепляются также все надфрагменты дан\-но\-го фрагмента.
 Функция perenos($a$) получает смещение $a$ начала заполняемого
 фраг\-мен\-та в текущем сегменте (по svobprog) зоны программ. Она
 переходит к следующему сегменту, расчищает его, переносит в него
 указанное начало фрагмента, и возвращает новое смещение этого
 начала.

 \subsection{Поиск свободного места и расчистка мусора в зоне
 за\-дач}

 Для поиска свободного места в зоне задач служит функция mem($a$).
 Ей сообща\-ет\-ся длина $a$ (в 32-битных словах) необходимого для
 размещения нового текста отрезка; в эту длину включаются префикс
 и суффикс текста. Функция создает в зоне задач пустую заготовку
 текста, с введенными префиксом и суффиксом, и возвращает смещение
 в зоне задач начала этого текста (смещение - в 32-битных словах).
 При необходимости выполняется уплотнение зоны задач (все
 необходимые для даль\-ней\-ше\-го тексты сдвигаются в начало зоны).
 Если, несмотря на предпринятое уплотнение, места не хватило,
 возвращается 0 и регистр ind устанавливается на 4 (для
 по\-сле\-ду\-ю\-ще\-го выхода в отладчик ЛОСа и выдачи сообщения о
 переполнении зоны задач).

 Функция mem($a$) прежде всего обращается к функции mesto($a$),
 которая соб\-ст\-вен\-но и пытается найти необходимое место. Для этого
 используется регистр svob, в котором хранится смещение текста
 зоны задач, начиная с которого ведется поиск свободного места.
 Префикс каждого текста содержит в младшем бите второго 32-битного
 слова указатель такта закрепления. Если этот указатель не
 совпадает с младшим битом регистра tact, то текст заведомо
 является "мусором". Функция "me\-sto($a$)", перемещаясь в
 направлении к концу зоны задач от текста, указанного в svob,
 пытается составить из нескольких идущих подряд текстов "мусора" \
 отрезок необходимой длины. Если такой отрезок найден, то
 начальная часть его пре\-об\-ра\-зу\-ет\-ся в заготовку нового текста (с
 указателем такта закрепления, равным младшему биту регистра
 tact), а конец - помечается как "мусор", и ссылка на него
 заносится в svob.

 Если необходимый отрезок не найден, то это еще не означает, что
 нужно уплот\-нять зону задач - просто поиск мог начаться с позиции,
 близкой к концу этой зоны. Поэтому сначала предпринимается
 переустановка svob на начало зоны задач. Од\-но\-вре\-мен\-но значение
 младшего бита регистра tact меняется на противоположное. При этом
 автоматически все тексты, которые были введены на последнем цикле
 просмотра зоны задач, попадают в категорию "мусора". Так как
 нормальный ре\-жим работы системы - очень мало заполненная зона
 задач, то большинство перенесенных таким образом в "мусор" \
 текстов и в самом деле должны быть отнесены к "мусору". Для
 дальнейшего использования нужна лишь малая их доля. Поэтому
 экономнее выполнить просмотр и закрепление (путем установки
 указателей такта закреп\-ле\-ния по регистру tact) всех нужных
 текстов, а ненужные не просматривать вовсе. К категории нужных
 текстов здесь относятся все такие тексты, к которым возможен
 переход по цепочкам ссылок, начинающимся в глобальном стэке,
 стэке выражений и в ряде специальных регистров интерпретатора -
 прочие тексты все равно для программы уже недостижимы.

 Указанные выше действия по смене такта закрепления выполняются
 функцией retact(). Для закрепления нужных текстов служит функция
 zac($a$) - она закрепляет все тексты, достижимые по цепочкам
 ссылок из текста, у которого смещение на\-ча\-ла равно $a$.

 Если, несмотря на смену такта закрепления, свободное место в зоне
 задач не найдено, предпринимается попытка уплотнения зоны задач.
 При уплотнении все нужные тексты переписываются подряд в начале
 зоны задач, с необходимой кор\-рек\-ци\-ей ссылок на них - как из них
 самих, так и из стэков и регистров. Уплотнение осуществляется
 функцией uplotn(); для коррекции ссылок применяется функция
 correctadr($a$).

 \section{Добавление нового оператора либо опе\-ра\-тор\-но\-го
 вы\-ра\-же\-ния}

 Для добавления нового оператора либо операторного выражения,
 непосредствен\-но реализуемого интерпретатором, следует прежде
 всего выбрать заголовок этого опе\-ра\-то\-ра либо операторного
 выражения - через интерфейс словаря логической системы. Номер
 такого заголовка должен быть не больше 240 - заголовки с большими
 но\-ме\-ра\-ми воспринимаются интерпретатором как указания на обращения
 к программе ЛОСа для соответствующего логического символа.

 Затем следует присоединить к программе интерпретатора функцию
 "Fn", где n - десятичная запись номера выбранного заголовка,
 реализующую новый оператор (операторное выражение). Если это -
 перечисляющий оператор, то данная функция реализует лишь первый
 шаг перечисления. Последующие шаги будут обеспечиваться еще одной
 функцией "Fm", где m - номер, больший последнего из введенных на
 текущий момент для F-функций интерпретатора.

 В массиве inter[\ ] указателей на F-функции, расположенном в
 конце про\-грам\-мы интерпретатора, следует ввести названия новых
 F-функций Fn,Fm (нужные по\-зи\-ции легко устанавливаются по номерам
 соседних F-функций).

 В массиве konv[\ ] указателей на функции, используемые для
 преобразова\-ния операторов ЛОСа в формат, используемый
 интерпретатором (функции "конверто\-ра"), на n-й позиции
 размещается ссылка на необходимую функцию Kp (она опре\-де\-ля\-ет\-ся по
 комментариям к имеющимся K-функциям либо аналогии с ранее
 вве\-ден\-ны\-ми операторами и операторными выражениями). Заметим, что
 K-функция для каждого перечисляющего оператора создается
 индивидуальная (хотя и состоящая из единственного обращения к
 функции konvperechisl), так как в ней содержится ссыл\-ка на
 функцию Fm, обеспечивающую продолжение перечисления (последний
 операнд обращения к оператору konvperechisl имеет вид 0001M,
 где M - шестнадцатиричная запись числа m).

 В массиве dekonv[\ ] указателей на функции, используемые для
 перехода от фор\-ма\-та интерпретатора к представлению операторов
 ЛОСа термами, на n-й позиции размещается ссылка на необходимую
 функцию Dq (она определяется по коммента\-ри\-ям к имеющимся
 D-функциям либо по аналогии с ранее введенными опера\-то\-ра\-ми и
 операторными выражениями).

 \section{Вспомогательные функции интерпрета\-то\-ра}

 В этом разделе перечисляются, для удобства ориентации в программе
 интерпре\-та\-то\-ра, используемые им вспомогательные функции.

 \subsection{Функции, используемые для организации общих дей\-ст\-вий
 ин\-тер\-пре\-та\-то\-ра}

 \begin{enumerate}

 \item initsolv() - инициализация зоны задач, стэков и основных регистров;

 \item maincycle() - основной цикл интерпретатора;

 \item scanpr() - основной цикл сканирования задачи;

 \item ves() - возвращает смещение ячейки, хранящей вес текущего терма
 задачи;

 \item scanblock() - ищет очередной терм задачи и организует переход к
 рас\-смот\-ре\-нию его первого символа;

 \item scanstep($a$) - $a$ есть 0 либо смещение веса текущего терма
 задачи; реализуется переход к очередному текущему терму и возвращается
 новое смещение его веса либо 0;

 \item endpr() - выдача ответа на задачу;

 \item contin() - возвращение к программе источника текущего кадра
 глобального стэка по завершении всех действий (включая перечисление),
 связанных с этим кадром;

 \item interp() - рабочий цикл интерпретатора;

 \item nachprog() - подготовка вычислений по корневому фрагменту
 программы сим\-во\-ла symbol;

 \item fragment($a$) - считывание фрагмента из блока программ по
 ссылке $a$ в зону программ;

 \item raschistca() - расчистка очередного сегмента зоны программ для записи в
 не\-го фрагментов из блока программ;

 \item zacrep($a,b$) - закрепление при расчистке в сегменте зоны программ, имеющем
 номер $a$, фрагмента программы, смещение которого в этом сегменте
 равно $b$;

 \item perenos($a$) - перенесение в следующий сегмент зоны программ фрагмента,
 для которого не хватило при считывании из блока программ места в
 текущем сег\-мен\-те. $a$ - начало фрагмента в текущем сегменте; при
 перенесении происходит расчистка следующего сегмента.

 \item uchhol($a$) - процедура используется в режиме учета
 холостого хода приемов ГЕНОЛОГа при очередном откате к оператору
 "контрольприема". $a$ - число шагов, затраченных на неудачную
 попытку применения приема. Происходит регистрация попытки в
 комментарии (выписка $\ldots$) к посылкам исходной задачи.

 \item otkat() - откат к продолжению перечисления по последнему
 кадру глобального стэка. Заметим, что перечисляющий оператор, к
 которому происходит откат, может оказаться программируемым, и
 тогда при откате нужно продолжать перечисление согласно этой
 "отложенной" \ программе. В свою очередь, ее по\-след\-ний
 перечисляющий оператор тоже может оказаться программируемым, и
 т.д. Таким образом, возможна цепочка "отложенных" \ кадров
 операторов, выполняющих перечисления, каждый предыдущий кадр в
 которой является источником последующего. Начинается эта цепочка
 с текущего кадра cadr той программы, в которой происходит откат.
 Последний ее кадр либо является источником кадра продолжения,
 завершающего глобальный стэк, либо сам за\-вершает глобальный стэк.
 Во втором случае перечисление по последнему кад\-ру закончено;
 он становится текущим, и оператор contin() обеспечивает
 пе\-ре\-ход к продолжению действий согласно его источнику. В
 любой из этих ситуаций при откате предпринимается сброс во всех
 кадрах данной цепочки значений программных переменных,
 определенных после того перечисляющего опе\-ра\-то\-ра, к которому
 происходит откат. Если последний кадр цепочки являл\-ся источником
 завершающего глобальный стэк кадра продолжения, то он ста\-но\-вит\-ся текущим
 кадром. Кроме собственно отката, оператор выполняет ряд
 вспомогательных действий (обращение к процедуре учета холостого
 хода; сброс комментария (буфер $\ldots$), и др.).

 \item raschist() - сброс значений переменных источника последнего
 кадра продол\-же\-ния, определенных после оператора этого кадра, и
 удаление последнего кадра продолжения.

 \item perehod($a$) - изменение регистров, необходимое для
 перехода из текущего фраг\-мен\-та программы по ссылке с символьным
 номером $a$.

 \item zac($a$) - закрепление в зоне задач текста, смещение
 некоторой (не обязательно начальной) ячейки которого равно $a$;
 одновременно закрепляются все до\-сти\-жи\-мые из него по цепочке
 ссылок тексты. Процедура используется при изменении регистра tact.
 Собственно закрепление состоит в изменении указателя такта закрепления
 на новое значение tact. Все тексты со старым значением указателя
 такта при этом автоматически попадают в категорию "мусора".

 \item retact() - изменение регистра tact, перезакрепление всех
 фактически исполь\-зу\-е\-мых текстов зоны задач, и установка регистра
 svob начала поиска свободного места на начало зоны задач.

 \item mesto($a$) - поиск в зоне задач места для текста длины $a$,
 включая суффикс и префикс этого текста. Если место найдено,
 возвращает смещение начала нового текста, в котором создает
 префикс и суффикс. Если место не найдено, возвращает 0. Изменение
 регистра tact и уплотнение зоны задач этой про\-це\-ду\-рой не выполняются.

 \item mem($a$) - поиск в зоне задач места для текста длины $a$.
 Это - основная функция поиска места; при необходимости она
 изменяет регистр tact и уплотняет зону задач. Возвращает
 смещение начала нового текста. Если, все же, место не найдено, то
 возвращает 0 и устанавливает регистр ind на 4 для последующего
 выхода в отладчик с сообщением о переполнении зоны задач.

 \item uplotn() - уплотнение зоны задач. Все используемые тексты
 смещаются в начало этой зоны; корректируются все ссылки на эти
 тексты и на вхождения в них.

 \item correctadr($a$) - используется при уплотнении зоны задач;
 по старому адресу $a$ (текста либо вхождения в текст) определяет
 новый адрес, по которому со\-от\-вет\-ству\-ю\-щая точка окажется после
 уплотнения.

 \end{enumerate}

 \subsection{Функции, используемые при реализации операторов \\
 ЛОСа}

 Здесь перечисляются функции, используемые реализующими операторы
 ЛОСа фун\-к\-ци\-ями F$i$.

 \begin{enumerate}

 \item opr($a,b$) - присвоение в текущем кадре глобального стэка
 переменной $a$ значе\-ния $b$. Здесь $a$ имеет указанный выше формат
 ссылки на не определенную переменную - старшие 16 бит имеют вид
 (10 $\ldots$ 0), а младшие 16 образуют номер переменной. Это - очень
 часто используемая функция; через нее происходит выдача значений
 выходных переменных операторов, реализуемых интер\-пре\-та\-то\-ром.
 Заметим, что размеры кадра глобального стэка могут оказаться
 не\-до\-ста\-точ\-ны\-ми для размещения в нем значения переменной $a$.
 Тогда проце\-ду\-ра выполняет расширение кадра (с небольшим
 запасом) и сдвиг всех последу\-ю\-щих кадров стэка, с необходимой
 коррекцией ссылок.

 \item ravntext($a,b$) - сравнение двух текстов в зоне задач,
 определяемых смеще\-ни\-ями $a,b$ своих начал. При сравнении текстов
 предпринимается сравнение их элементов, расположенных на
 соответствующих позициях. Если эти элементы тоже оказываются
 текстами, то начинается (если не удается сразу установить
 идентичность элементов по идентичности их смещений) просмотр их
 со\-от\-вет\-ству\-ю\-щих позиций, и т.д. - до полного просмотра всех
 достижимых из текстов объектов. Здесь важно, чтобы отсутствовали
 циклические ссылки из текстов на тексты, иначе процедура зациклится.
 Если при просмотре встречается ссылка не на текст, а на вхождение в
 него, то анализ элементов такого текста не выполняется - вхождения
 сравниваются просто как смещения в зоне задач. Поэтому в тех
 случаях, когда есть опасность появления циклов ссылок, при
 программировании на ЛОСе используются ссылки не на текст, а на
 вхождение первого его элемента (т.наз. "левыйкрай").

 При равенстве текстов процедура возвращает 1, иначе 0.

 \item sravn($a,b$) - сравнение объектов $a,b$. При равенстве
 возвращает 1, иначе 0. Для текстов обращается к функции ravntext.

 \item slog($a,b,c$) - Сложение десятичных чисел $a,b$ (в формате
 ЛОСа, т.е. каждое из них - либо логический символ, определяющий
 цифру, либо смещение в зоне задач набора цифр, в котором могут
 также встречаться логические символы запятой и минуса).
 Возвращает (также в формате ЛОСа) сумму модулей чисел $a,b$,
 взятую со знаком "плюс" \ при $c = 0$ и "минус" \ при $c = 1$.

 \item text1($a$) - $a$ есть указатель на некоторую ячейку стэка
 выражений. В зоне задач создается текст набора, разряды которого
 суть объекты стэка выражений начиная с $a$ и кончая последней
 занятой ячейкой этого стэка (т.е. $st-1$). Возвращает смещение
 начала этого текста (при нехватке места в зоне задач возвращает
 0). Если $a = st$, то возвращает логический символ "пустоеслово".
 По окончании формирования текста в регистр $st$ передается значение
 $a$ (объек\-ты, зарегистрированные в тексте, исключаются из стэка
 выражений). Эта и следующая функция - наиболее часто применяемые
 способы создания но\-во\-го текста в зоне задач. Если в процессе
 формирования нового текста могут вводиться еще какие - то тексты,
 то до его создания могут произойти уплотнение зоны задач и
 связанная с этим коррекция всех ссылок на нее. Чтобы кор\-рек\-ция
 затронула и формируемый текст, его следует накапливать
 в стэке выражений, а по завершении накопления - использовать
 данную либо следующую функцию.

 \item text2($a$) - аналогично предыдущему, но считывание объектов
 из стэка выра\-же\-ний в текст происходит в обратном порядке (начиная
 с $st-1$ и кончая $a$).

 \item razn($a,b,c$) - $a,b$ \ суть десятичные числа в формате ЛОСа;
 модуль первого из них не меньше модуля второго. Возвращает
 разность модулей этих чисел, взятую со знаком "плюс" \ при $c =
 0$ и со знаком "минус" \ при $c = 1$.

 \item sravnmod($a,b$) - $a,b$ суть десятичные числа в формате
 ЛОСа. Если модуль первого из них не меньше модуля второго,
 возвращает 0, иначе возвращает 1.

 \item summa($a,b$) - $a,b$ суть десятичные числа в формате ЛОСа.
 Возвращает их сумму.

 \item nomer($a$) - определяет десятичное число в формате ЛОСа,
 являющееся номером логического символа $a$.

 \item lenman($a$) - определяет длину мантиссы десятичного числа
 $a$, представленного в формате ЛОСа. Результат - обычное машинное
 32-битное число.

 \item dopnuli($a,b$) - дописывает к концу мантиссы десятичного
 числа $a$, заданного в формате ЛОСа, $b$ нулей, и возвращает
 смещение начала нового текста.

 \item norman($a$) - $a$ есть указатель на ячейку стэка выражений,
 начиная с которой и до конца стэка (т.е. до $st-1$) расположена
 запись десятичного числа в формате ЛОСа. В ячейке $a$ находится
 младший разряд этой записи. Предпринимается нормализация записи
 (отбрасывание нулей в конце мантиссы и т.п.), и воз\-вра\-ща\-ет\-ся
 указатель на начало в стэке выражений нормализованной записи.

 \item udalmassiv($a$) - $a$ есть смещение в зоне задач начала
 текста. Если этот текст хранит ссылку на массив чисел машинного
 формата ("с плавающей запятой" \ либо "целое со знаком"), то
 происходит удаление этого массива.

 \item udlin($a$) - $a$ есть смещение кадра продолжения,
 введенного при реализации операторного выражения "выписка" \ либо
 "перечисление" \ и имеющего ссылку на непустой накопитель набора,
 создаваемого указанным операторным вы\-ра\-же\-ни\-ем. Предпринимается
 удлинение этого накопителя на 10 разрядов.

 \item novcadr($a,b$) - создает в конце глобального стэка новый
 кадр оператора либо операторного выражения. $a$ - тип кадра; в
 7-ю ячейку этого кадра помещается значение $b$.

 \item tekur() - возвращает текущий уровень последней (по
 глобальному стэку) задачи.

 \item cadrprod($a$) - создает в конце глобального стэка новый
 кадр продолжения длины $a$, используемый при реализации
 перечисляющего оператора.

 \item prfx($a,b$) - вводит текст, получающийся добавлением
 элемента $a$ к началу набора $b$, и возвращает смещение его
 начала.

 \item sffx($a,b$) - вводит текст, получающийся добавлением
 элемента $b$  концу набора $a$, и возвращает смещение его начала.

 \item isklch($a,b$) - вводит текст, получающийся из текста $a$
 исключением разряда по смещению $b$. Возвращает ссылку на этот
 текст.

 \item cmntr($a,b$) - $a$ есть набор (возможно, "пустоеслово");
 $b$ - указатель на ячейку стэка выражений, начиная с которой и до
 конца стэка хранится текст ком\-мен\-та\-рия - набор либо единственный
 логический символ. Если этого коммента\-рия нет в наборе $a$, то
 возвращает 1, иначе возвращает 0.

 \item spskprm() - в первых 16 ячейках массива $R$ хранится маска
 переменных. Номера последовательно проходимых бит этой маски суть
 номера переменных. Соз\-да\-ет\-ся текст списка тех переменных, позиции
 которых в маске помечены единицами, и возвращается смещение
 начала этого текста. Переменные в тексте упо\-ря\-до\-че\-ны по
 возрастанию номеров.

 \item svbvhg($a$) - определяет, является ли свободным вохждение
 $a$ переменной в не\-ко\-то\-рый терм. Если является, возвращает 1,
 иначе возвращает 0.

 \item prmter($a$) - регистрация в маске переменных всех свободных
 переменных терма $a$.

 \item numkey($a$) - $a$ есть некоторый виртуальный код
 клавиатуры. Возвращает со\-от\-вет\-ству\-ю\-щий ему номер строки в
 таблицах драйвера клавиатуры DK0[] - DK6[]. Если $a$ не входит в
 таблицу DK0, возвращает 100.

 \item tekfail($a$) - $a$ есть 32-битная ссылка на объект файла
 активного информа\-ци\-он\-но\-го блока: младшие 19 бит - смещение в файле,
 следующие за ними 12 бит - 4 восьмеричных цифры номера файла. Этот
 файл открывается; если его не было - вводится. В регистр infhndl
 заносится его handle, и корректируется но\-мер файла в строке для
 его пути.

 \item adrcod($a$) - $a$ есть ссылка на пару логических символов в
 зоне задач, коди\-ру\-ю\-щую ссылку на объект файла информационного
 блока. Возвращает 32-битную ссылку на этот объект либо (при
 неудаче) 0.

 \item codadr($a$) - $a$ есть 32-битная ссылка на объект файла
 информационного блока. Создает в зоне задач текст, состоящий из
 пары логических символов, ко\-ди\-ру\-ю\-щих эту ссылку. Возвращает
 смещение начала этой пары. При неудаче возвращает 0.

 \item readinf($a$) - $a$ есть 32-битная ссылка на объект файла
 информационного блока, для которого уже установлен регистр
 infhndl. Этот объект считывается в начало массива $R$. Возвращает
 скорректированную ссылку на считанный объект (если объект был
 достижим по цепочке косвенных ссылок через объекты, ранее
 по\-ме\-чен\-ные как "мусор", то выдается прямая ссылка на конец этой
 цепочки). При неудаче возвращает 0.

 \item poiskmetki($a$) - в массиве $R$ находится содержимое
 некоторого указателя - спис\-ка, считанного из информационного блока.
 $a$ - логический символ либо пе\-ре\-мен\-ная либо смещение начала терма
 в зоне задач. Предпринимается поиск метки $a$ в указателе -
 списке, и если она найдена, то возвращается смещение в байтах в
 массиве $R$ первой ячейки поля данной метки (эта ячейка хранит
 длину поля). При этом регистр $B1$ хранит смещение в байтах
 начала поля ссылок; $B2$ - длину поля метки. При неудаче
 возвращает 0.

 \item sledmetka($a,b$) - $a$ есть число байт в поле
 указателя-списка, считанного в мас\-сив $R$; $b$ - смещение в
 байтах поля метки этого указателя. Если метка не последняя, то
 возвращает смещение начала поля следующей метки. Иначе возвращает
 0.

 \item tekstmetki($a,b$) - $a$ есть смещение в байтах до текста
 метки указателя - списка, считанного в массив $R$. Если $b = 1$,
 то заносит в конец стэка выражений ссыл\-ку на эту метку -
 логический символ либо сформированный данной функцией в зоне задач
 текст терма. При переполнении зоны задач возвращает 0. Если $b =
 0$, то ограничивается поиском конца текста метки и не меняет
 стэка выражений. В обоих случаях возвращает смещение в байтах до
 поля ссылок метки.

 \item infterm($a,b$) - $a$ есть логический символ либо символ
 переменной либо сме\-ще\-ние начала терма в зоне задач. $b$ -
 смещение в байтах в массиве $R$ той точки, начиная с которой
 нужно создать запись метки перехода $a$ в формате указате\-ля -
 списка. Такая запись создается, и возвращается смещение в $R$
 первого байта после нее.

 \item novssilka($a,b$) - $a$ есть метка, по которой в заготовку
 указателя - списка, хра\-ня\-щу\-ю\-ся в массиве $R$, заносится ссылка на
 объект $b$ (дано его смещение в фай\-ле информационного блока).
 Изменяет указатель числа занятых байт, но пока не корректирует
 общего числа байт в $R[0]$. Возвращает число использованных байт
 в $R$; при неудаче возвращает 0.

 \item iskluchssilki($a,b$) - $a$ есть метка в указателе - списке,
 считанном в массив $R$. $b$ - смещение в файле информационного блока
 объекта, на который происходит ссылка по метке $a$. Происходит
 сключение этой ссылки. Возвращает число занятых байт в $R$.

 \item izmenenie($a,b$) - $a$ есть ссылка на объект в текущем
 информационном файле. Новая версия этого объекта хранится в
 массиве $R$, причем в $R[0]$ сохранено число байт старой версии.
 $b$ - число байт новой версии в $R$. Предпринимается изменение
 версии объекта в информационном файле. Возвращает ссылку на новую
 версию либо, при неудаче, 0.

 \item registracia($a,b,c$) - происходит регистрация объекта
 текущего файла, ссылка на который есть $c$, по метке $b$ в
 указателе, ссылка на который равна $a$.

 \item poslednijfail() - устанавливает регистр infhndl для работы
 с последним файлом активного информационного блока. Возвращает
 шаблон ссылок на объекты этого файла (старшие 13 разрядов
 ссылки).

 \item smfail($a,b$) - $a$ есть ссылка на объект файла
 информационного блока либо блока программ. $b$ - 0 в случае блока
 программ, иначе - номер информационного блока. Реализует учет в
 массиве $U$ и файле $U.los$ ссылки для уплотнения файла,
 содержащего $a$. В случае блока программ регистр proghndl,
 хранящий handle текущего файла блока программ, должен быть перед
 обращением установлен согласно $a$.

 \item uplotninf($a,b$) - уплотнение текущего файла активного
 информационного блока, считанного в массив $U2$. $a$ - число байт
 в $U2$. Если информационный блок име\-ет указатель-каталог, то он
 считан в массив $U1$. Предпринимается коррекция ссылок в $U1,U2$.
 Возвращает число байт в $U2$ после уплотнения. $b$ - шаблон
 ссылок на объекты рассматриваемого файла (старшие 13 разрядов).

 \item bufsimv($a,b,c,d$) - заносит в буфер текстов название
 логического символа либо обозначение переменной $a$ начиная с
 ячейки номер $b$. $c,d$ - цвет фона и символов, заданные
 символьными номерами. Возвращает номер первой ячейки в буфере
 текстов после занесенного фрагмента; при нехватке места
 возвращает 0.

 \item prorisovka($a,b$) - выдает на экран содержимое буфера
 текстов начиная с ячейки номер $a$ и кончая ячейкой номер $b-1$.
 Текст выдается с текущей позиции внутри текущей рамки. Возвращает
 номер ячейки буфера текстов, первой после выданной части текста
 (она может отличаться от $b$, если в рамке не хватило места).

 \item bufbukva($a,b,c,d$) - заносит в буфер текстов на позицию
 $a$ букву $b$ с цветом фона $c$ и цветом символов $d$.

 \item poiskslova($a$) - $a$ есть исходная позиция в буфере
 текстов. Если начиная с этой позиции расположено название
 логического символа, то возвращает этот символ и передает в
 регистр $B1$ смещение первой ячейки после названия символа, а в
 $B3$ - номер двух байт в начальной части сегмента словаря, хранящих
 номер логического символа; иначе возвращает 0. В последнем случае в
 регистр $B2$ передается номер первого сегмента словаря, имеющего
 неиспользованный логический символ, а в $B3$ - номер пары байт в
 начальной части сегмента, на которую следует вставить новый
 символ. Регистр $B2$ перед обращением устанавливается либо на
 $0xFFFFFFFF$, либо на номер сегмента словаря, в котором находится
 логический символ с изменяемым названием.

 \item iskluchslova($a$) - $a$ есть исходная позиция в буфере
 текстов. В словаре ищется логический символ, название которого
 расположено начиная с данной позиции, и этот символ исключается
 из словаря. Возвращает данный логический символ, причем в регистр
 $B1$ заносится смещение в буфере текстов первой ячейки после
 названия символа. Если символ не найден, возвращает 0.

 \item novprog() - устанавливает proghndl на последний файл блока
 программ. Воз\-вра\-ща\-ет шаблон ссылок на фрагменты этого файла
 (старшие 13 бит ссылки).

 \item tekprog($a$) - $a$ есть ссылка на объект файла блока
 программ. Этот файл от\-кры\-ва\-ет\-ся, и proghndl становится равен его
 handl'у. Корректируется номер фай\-ла в строке для его пути.

 \item isklprog($a$) - $a$ есть ссылка на фрагмент программы в
 блоке программ. Пред\-при\-ни\-ма\-ет\-ся исключение всей ветви этого
 фрагмента. Внешняя ссылка на фраг\-мент должна быть предварительно
 удалена.

 \item uplotnprog($a,b$) - уплотнение текущего файла блока
 программ, считанного в массив $U2$. $a$ - число байт в $U2$.
 Каталог программ считан в массив $K$. Кор\-рек\-ти\-ру\-ет ссылки в
 $K,U2$. Возвращает число байт в $U2$ после уплотнения. $b$ -
 шаблон ссылок на фрагменты уплотняемого файла (старшие 13 бит).

 \item initprer($d$) - инициализация входа в отладчик ЛОСа. $d$ -
 1 либо 2 - указывает значение регистра blokprer, которое должно
 быть установлено после выхода из отладчика.

 \item confrag($a,b$) - $a,b$ суть указатель на начало фрагмента
 программы в формате блока программ (считанного в некоторый
 массив) и указатель на свободное место для его преобразования в
 формат зоны программ. Выполняется это пре\-об\-ра\-зо\-ва\-ние. При удаче
 возвращает 1, иначе 0. Ссылки из фрагмента содержат только
 смещения в файле, без номера этого файла.

 \item convchisl($a$) - $a$ есть натуральное десятичное число в
 формате ЛОСа. Возвраща\-ет его значение в 32-битном машинном
 представлении "целое без знака".

 \item kodpodobija($a$) - $a$ есть смещение в зоне задач начала
 терма. Возвращает сумму кодов логических символов и переменных в
 этом терме (код переменной равен 1). Используется при поиске
 термов в списке, отличающихся друг от друга переобозначением
 переменных и перестановкой операндов.

 \item dlinazoni($a,b$) - $a$ есть смещение в зоне задач ячейки,
 относящейся к некоторому тексту. Если $b = 1$, то второй бит
 второго слова префикса всех достижимых из указанного текста
 текстов зоны задач изменяется на 1, и возвращается суммарная
 длина таких текстов (кроме тех, у которых рассматриваемый бит уже
 был равен 1). Если $b = 0$, то все введенные при $b = 1$
 вспомогательные единицы заменяются нулями.

 \item smslovo($a,b,c,n$) - $a$ есть номер позиции в буфере
 текстов, начиная с которой должен быть прочитан словарный фрагмент при
 анализе текста. $b$ - указатель на начало сегмента внешнего
 словаря, в котором предпринимается поиск фраг\-мен\-та. $c$ - номер
 разряда слова, до которого включительно происходит сравне\-ние слов
 (изначально равен максимальной длине 24 словарных фрагментов
 внешнего словаря, а в процессе перечисления фрагментов может
 принимать меньшие значения). Перед обращением в регистры $B1,B2$
 заносятся сме\-ще\-ния в нижней части сегмента внешнего словаря
 начала и конца отрезка по\-ис\-ка (в этой части хранятся 16-битные
 номера символов, кодирующих фрагменты, упорядоченные в
 соответствии с лексикографическим упорядочением фраг\-мен\-тов).
 Функция осуществляет поиск на данном отрезке логического символа,
 фрагмент которого является началом текста, расположенного в
 буфере текстов начиная с $a$. В случае неудачи возвращает 0,
 иначе - найденный логический символ. При этом $B1,B2$ указывают
 на новые границы отрезка поиска (если $B1 > B2$, то отрезок
 пуст). В регистр $B5$ заносится смещение в буфере текстов после
 считанного слова. При поиске словарного фрагмента используется метод
 деления отрезка пополам. Так как происходит не идентификация
 слов, а оп\-ре\-де\-ле\-ние допустимого наложения на текст, то возможен
 пропуск более короткого слова, которое допускает наложение на
 текст. Чтобы предотвратить такие про\-пус\-ки, используются регистры
 $B3,B4$. В $B3$ заносится смещение верхнего конца отрезка для
 повторного поиска фрагментов, длина которых ограничена ве\-ли\-чи\-ной $B4$.

 \item sledslovo($a,b$) - $a$ есть номер позиции в буфере текстов;
 $b$ - номер сегмента внешнего словаря, с которого начинается
 поиск словарных фрагментов. Ре\-али\-зу\-ет цикл обращений к оператору
 smslovo, со сменой номера сегмента и с откатами для регистров
 $B3,B4$ при поиске более короткого наложения - до обнаружения
 первого допустимого фрагмента. Возвращает найденный ло\-ги\-чес\-кий
 символ либо (при неудаче) 0. Перед обращением в регистры $B1,B2$
 заносятся смещения в нижней части текущего сегмента внешнего
 словаря на\-ча\-ла и конца отрезка поиска; в регистр $B7$ - номер
 разряда слова, до которого включительно происходит сравнение
 слов.

 \item kluchslova($a,b,c$) - $a,b$ суть начало и конец в буфере
 текстов ключевой по\-сле\-до\-ва\-тель\-нос\-ти $K$; $c$ - номер сегмента
 внешнего словаря. Возвращает смещение в этом сегменте, по
 которому расположен логический символ, обозначающий первое слово
 с заданным началом $K$. Если таких слов нет, возвращает зна\-че\-ние
 $0xFFFFFFFF$.

 \item shagslova() - в массиве teksl[ ] хранятся исходные смещения
 по всем сегментам внешнего словаря. Предпринимается поиск
 лексикографически наименьшего словарного фрагмента начиная с этих
 смещений. Возвращает логический сим\-вол для этого фрагмента; при
 неудаче возвращает 0. Корректирует teksl[ ] для следующего шага.

 \end{enumerate}

 \subsection{Функции, используемые для перевода программы из формата
 зоны задач в формат зоны программ и обратно}

 \begin{enumerate}

 \item konvblock($a,b,c$) - преобразование подтерма оператора ЛОСа из
 формата зоны задач в формат зоны программ (если заголовок этого
 подтерма - непосред\-ст\-вен\-но реализуемый оператор либо операторное
 выражение); результат накап\-ли\-ва\-ет\-ся в массиве $R$. $a$ есть
 смещение начала текста обрабатываемого оператора в зоне задач;
 $b$ - смещение вхождения в этот оператор текущего подтерма;
 $c$ - смеще\-ние первой свободной ячейки в $R$. Используется массив
 ссылок на функции konv[ ], в котором содержатся выполняющие указанное
 преобразова\-ние процедуры для конкретных заголовков операторов и
 операторных вы\-ра\-же\-ний. Возвращает смещение первой свободной ячейки
 в $R$; при неудаче воз\-вра\-ща\-ет 0.

 \item konvoper($a,b,c$) - входные данные и преобразования - те же, что
 для konvblock, но для общего случая подтерма оператора (без условия
 непосредственной ре\-али\-зу\-е\-мос\-ти).

 \item konvert($a$) - $a$ есть смещение в зоне задач набора,
 представляющего фрагмент программы. В массиве $R$ создается текст
 этого фрагмента в формате зоны программ. Ссылки из фрагмента -
 двух типов: либо 2-13 биты равны 0, и тогда младшие 19 бит суть
 смещение в файле блока программ, либо эти биты равны 1, и тогда
 младшие 16 бит - номер логического символа, являющегося меткой
 недоопределенного перехода. Префикс фрагмента размещается в $R$
 начиная с нулевой ячейки (заполняется частично).

 \item konvperechisl($a,b,c,f$) - общая часть функций массива
 konv[ ], обрабатыва\-ю\-щих перечисляющие операторы. $f$ - номер
 $F$-функции интерпретатора для про\-це\-ду\-ры, реализующей шаг
 продолжения перечисления.

 \item konvssilka($a$) - $a$ есть смещение в зоне задач вхождения
 символа "ветвь" \ либо "иначе" \ для оператора перехода в
 фрагменте программы. Формирует в массиве $F$ (где до перенесения
 в массив $R$ накапливаются ссылки из фрагмента) оче\-ред\-ную ссылку
 для этого перехода и корректирует регистр $B1$, указывающий на
 первую свободную ячейку в $F$.

 \item fragfile() - в массиве $R$ находится фрагмент программы,
 сформированный опе\-ра\-то\-ром konvert. Осуществляет преобразование
 этого фрагмента в формат блока программ и формирует результат в
 массиве $F$. Возвращает число байт, занятых данным результатом.

 \item dekop($a,b,p$) - шаг преобразования программы из формата
 зоны программ в формат зоны задач. $a$ - указатель на первую
 ячейку фрагмента программы в зоне программ; $b$ - смещение в этом
 фрагменте текущей ячейки, начиная с которой и до ячейки со смещением
 $p$ (не включая последнюю) следует выпол\-нить преобразование в
 формат зоны задач. Результирующие операторы счи\-ты\-вает в массив
 $R$ начиная с ячейки $B1$. Функция использует массив указателей
 на функции dekonv[ ], в котором содержатся процедуры для
 преобразования конкретных операторов и операторных выражений.

 \item dekonvert($a$) - $a$ есть указатель на первую ячейку
 фрагмента программы в зоне программ. Этот фрагмент преобразуется
 в формат зоны задач и возвращается смещение в зоне задач списка
 операторов фрагмента. Корректируются регистры $FR1$, $FR2$,
 ссылающиеся на фрагмент в зоне программ и его версию в зоне
 задач. В массиве $FR$ создается переходник: на позициях,
 соответствующих обращениям к процедурам интерпретатора в
 фрагменте программы из зоны программ, указываются смещения в зоне
 задач вхождений операторов и опе\-ра\-тор\-ных выражений, реализуемых
 этими процедурами. При неудаче возвращает 0.

 \end{enumerate}

 \subsection{Отладочные функции}

 Несколько функций интерпретатора используются при отладке с
 помощью отладчика СИ.

 \begin{enumerate}

 \item pp() - создает в массиве $nn[\ ]$ последовательность номеров
 переходов от кор\-ня программы символа symbol к текущему
 выполняемому ее фрагменту. Номера расположеы в обратном порядке
 (первый номер перехода - в конце по\-сле\-до\-ва\-тель\-ности).

 \item contprog($a$) - $a$ есть номер файла блока программ (4х3
 бит в младших разрядах). Предпринимается проверка корректности
 этого файла. При обнаружении оши\-бок в массиве CONTR
 перечисляются пары: тип ошибки  - смещение в фай\-ле (либо в
 массиве $U1$, куда считан файл) места расположения ошибки.
 Воз\-вра\-ща\-ет смещение первой свободной ячейки в CONTR. Типы ошибок:

  1 - отсутствие внешней ссылки на фрагмент;

  2 - более одной ссылки на фрагмент, и тогда вместо пары в CONTR
  вво\-дит\-ся тройка - в конце пары добавляется число ссылок на
  фрагмент;

  3 - фрагмент не преобразуется в формат зоны задач;

  4 - более 30 ссылок из фрагмента;

  5 - более 10000 байт в фрагменте;

  6 - ссылка из другого фрагмента оказалась внутри фрагмента, и
  тогда вместо пары в CONTR вводится тройка - в конце пары
  добавляется смещение места внутри фрагмента, на которое имеется
  внешняя ссылка;

  7 - ссылка на объект вне текущего файла; тогда в CONTR к концу
  пары добавляется смещение такой ссылки из фрагмента;

  8 - ссылка на фрагмент, занесенный в категорию "мусора";

  9 - неправильная обратная ссылка.

  \item continf($a,b$) - $a$ есть номер информационного блока;
  $b$ - номер его файла (4х3 бит в младших разрядах). Выполняет
  контроль корректности данного файла. Информация об ошибках
  сохраняется в массиве CONTR. Типы ошибок: 1 - нет внешней ссылки
  на объект; 2 - число ссылок на объект не равно числу его
  закреплений; 3 - ссылка не на начало объекта.

 \end{enumerate}

 \section{Отладка логической системы на уров\-не ин\-тер\-пре\-та\-то\-ра
 ЛОСа}

 Обычно для отладки оказывается достаточно средств, предоставляемых
 отлад\-чи\-ком ЛОСа. Однако, иногда может возникнуть необходимость в
 отладке на уровне интерпретатора ЛОСа - с помощью отладчика СИ.
 Например, это бывает необходимо при вводе новых операторов ЛОСа,
 реализуемых интерпретатором. Не исключена возможность обнаружения
 ошибки и в программах старых операторов. Наконец, ошибки в
 интерпретаторе может и не быть, а причиной неверного выполнения
 ба\-зис\-но\-го оператора ЛОСа оказаться какая-либо ошибка в ЛОС-программе,
 про\-шед\-шая незамеченной в момент ее появления, и лишь косвенным образом
 (например, через изменение каких-либо регистров или массивов)
 сказавшаяся позднее.

 Так или иначе, перед обращением к отладчику СИ необходимо ло\-ка\-ли\-зо\-вать
 момент неверного выполнения интерпретатором конкретного оператора или
 опе\-ра\-тор\-но\-го выражения ЛОСа. Обычно для этого хватает средств отладчика
 ЛОСа (на\-при\-мер, локализация момента ошибки путем деления отрезка
 пополам - по счетчику шагов интерпретатора). Чтобы перейти к
 работе с отладчиком СИ, далее следует вставить перед оператором,
 выполняемым с ошибкой, вспомогательный оператор "тест(0)". Этот
 оператор не выполняет никаких действий, но обращение к нему
 легко отследить из отладчика СИ. Иногда ошибочно выполняемый оператор
 может применяться многократно до момента ошибки. В этом случае нужно
 сфор\-му\-ли\-ро\-вать на ЛОСе какое-либо условие $P$, истинное только перед
 ошибочным обраще\-ни\-ем (например, посмотреть входные данные оператора
 перед ошибочным обраще\-ни\-ем и взять в качестве $P$ оператор, проверяющий
 их совпадение с текущими), и вместо оператора "тест(0)" \ вставить
 оператор "или(не($P$) тест(0))". Наконец, можно обойтись и без
 вставки оператора "тест", войдя в отладчик непосредственно перед
 ошибочным выполнением оператора и нажав Ctr-F3 - это вызовет
 обращение к опе\-ра\-то\-ру "тест(1)" \ внутри программы отладчика,
 причем после выполнения данного оператора произойдет немедленный
 выход из отладчика.

 Для обработки ошибки отладчиком СИ нужно (решив одним из
 указанных выше способов вопрос о локализации ошибки путем
 обращения к оператору "тест" \ не\-по\-сред\-ст\-вен\-но перед ее
 появлением) запустить программу логической системы из этого
 отладчика с прерыванием при обращении к функции $F214$ (она
 реализует оператор "тест"). После прерывания в отладчике СИ
 нужно либо установить прерывание при входе в программу $Fi$
 исполняемого с ошибкой оператора (предварительно установив номер
 $i$ логического символа - заголовка этого оператора), либо дойти
 до начала этой программы пошаговой трассировкой. В обоих случаях
 далее - анализировать выполнение программы по шагам.

 Заметим, что обычно при отладке интерпретатора наибольший интерес
 пред\-став\-ля\-ет участок программы рабочего цикла interp,
 предшествующий оператору inter[(a \& T4)-1](). Здесь расположен
 оператор if(step == Step || symbol == Symbol || fragm == Fragm ||
 Cadr == cadr) \{pp();\}, позволяющий делать прерывания при
 дости\-же\-нии регистрами step, symbol, fragm, cadr заданных значений,
 устанавливаемых в начале СИ-трассировки в регистры Step, Symbol,
 Fragm, Cadr. После прерывания можно посмотреть в массиве nn
 номера переходов к текущему фрагменту ЛОС-программы символа
 symbol от корня этой программы (взятые в обратном порядке).
 Еще один аналогичный оператор расположен после обращения к
 inter[$\ldots$] - с его помощью можно устанавливать прерывания по
 обнаружении заданного значения в заданной точке зоны задач,
 глобального стэка либо зоны программ. Наконец, еще дальше идут
 (занесенные в комментарии) фрагменты, содержащие обращения
 к функциям contprog и continf для контроля корректности
 файлов блока программ и информационных блоков.

\chapter{Программы просмотра списков задач}

Фактически в разделе описываются две процедуры - "списокзадач" \ и
"цепьза\-дач", обеспечивающие просмотр задач, редактирование,
запуск и пошаговый про\-смотр решения. Приводятся достаточно
подробные описания программ, реа\-ли\-зу\-ющих
пе\-ре\-чис\-лен\-ные операции, так как при дальнейшем развитии
системы не\-од\-но\-крат\-но может возникать необходимость
модифицировать эти программы.

Задачник логической системы организован в виде оглавления,
концевые пункты которого соответствуют отдельным задачам. Концевые
меню задачника определяют линейные цепочки задач, причем для
просмотра и редактирования всей цепочки используется отдельная
процедура - "списокзадач". Эта же процедура позволяет запускать
процесс решения задачи.

Если решение задачи выполняется с пошаговым показом преобразований
(так называемая семантическая трассировка), то на каждом шаге,
кроме информации о текущем действии решателя, для просмотра
предлагается также вся текущая цепь задач. Последняя задача этой
цепи (она размещена непосредственно перед ин\-фор\-ма\-цией о
текущем действии) - та задача, к которой, собственно, и относится
текущее действие. Предпоследняя задача - та, для решения которой
некоторый прием об\-ра\-тил\-ся к последней задачи, и т.д., вплоть
до задачи, извлеченной из задачника, быть может, измененной в
процессе решения. Исходный вариант этой задачи (в задачнике он
сохраняется без изменений) в просматриваемый список задач не
включается.

После информации о текущем действии могут быть размещены несколько
вспо\-мо\-га\-тельных задач, которые были решены в процессе
выполнения данного действия. Таким образом, при просмотре текущего
шага решения обеспечивается прос\-мотр некоторой
последовательности задач и кадров вспомогательной информации
(ко\-то\-рые для удобства рассматриваются как обобщенные задачи).
Этот просмотр ана\-ло\-ги\-чен просмотру списка задач из
задачника, хотя и реализован другим оператором - процедурой
"цепьзадач". Обращается к процедуре "цепьзадач" \ отладчик ЛОСа, и
при описании ее будет разобрана ветвь отладчика, извлекающая из
анализа гло\-баль\-ного стэка необходимые для обращения данные.

\section{Просмотр списка задач из задач\-ни\-ка}

Как уже было отмечено в подразделе "Обращение к оглавлению
задачника" раздела, посвященного главному меню системы, для
просмотр списка задач концевого меню задачника используется
процедура "списокзадач(х1 х2 х3)". Она получает в качестве входной
информации: набор х1 меток пути в оглавлении задачника к
указателю-списку х2, подпункты которого ссылаются на задачи
списка, а также логический символ х3, по которому от х2 имеется
переход к текущей задаче списка.

Прежде, чем перейти к программе оператора "списокзадач", приведем
описание основных структур данных задачника. Оглавление задачника
хранится во 2-м ин\-фор\-ма\-ци\-онном блоке. Концевой логический
терминал этого оглавления содержит терм "задача($A_1 \ A_2$)",
ссылающийся на узел задачи (терм такого вида в терминале один).
Здесь $A_2$ - номер узла в статье логического символа $A_1$.

Для указания на режим серийного решения задач используется
логический тер\-ми\-нал, достижимый из корневого
указателя-каталога 2-го информационного блока по метке "метка".
Этот терминал содержит терм "задачи($R$)". Если $R=0$, то серийный
режим решения задач отсутствует. Если $R=1$, то имеет место режим
серийного решения задач из заданного раздела задачника. Если
$R=2$, то при серийном решении дополнительно предпринимается
анализ холостого хода приемов - накапливается статистика о
трудоемкости неудачных попыток применения приема и о числе его
применений. Если $R=3$, то имеет место режим серийного решения
лишь тех задач выбранного раздела задачника, у которых по ходу
решения встречался хотя бы один из логических символов заданного
списка $S_1, \ldots, S_n$. Данные о символах, встречавшихся при
решении задачи, сохраняются в 10-м информационном бло\-ке - архиве
задачника. Список $S_1, \ldots, S_n$ содержится в логическом
терминале, дос\-ти\-жи\-мом из корня 2-го информационного блока по
метке "не". Случай $R=5$ - вспомогательный; он возникает после
получения ответа задачи и служит для вос-ста\-нов\-ления просмотра
задачи в задачнике. Одновременно в логический терминал, достижимый
из корня 2-го информационного блока по меткам "сброс", "вре\-мя" \
передается информация о времени решения (минуты и секунды) для
прорисовки ее после текста задачи.

Из узла задачи могут иметься переходы по следующим меткам:

\begin{enumerate}

\item "задача" \ - переход к указателю-списку, представляющему
задачу. По метке "цели" \ от него - переход к логическому
терминалу, содержащему логические символы и термы $A_0, \ldots,
A_n$. Здесь $A_0$ - тип задачи; $A_1, \ldots, A_n$ - коды ее
целей. По метке "посылка" \ - переход к группе логических
терминалов, каждый из которых хранит посылку задачи. После посылки
могут быть размещены ком\-мен\-та\-рии к ней (те комментарии,
которые суть наборы, преобразуются в фор\-мат термов). Аналогичным
образом, по метке "условие" \ - переход к груп\-пе терминалов,
каждый из которых хранит условие задачи. Если задача
со\-про\-вож\-дается чертежом, то по метке "точка" \ - переход к
логическому терминалу, хранящему описание чертежа. Формат этого
описания представлен в спра\-воч\-ной информации логического
символа "точка". По метке "комментарии" \ (если она есть) -
переход к логическому терминалу, перечисляющему комментарии к
задаче.

\item "оглавление" \ - переход к логическому терминалу,
содержащему термы "на\-бор($A_1 \ldots \ A_n$)", определяющие
последовательности $A_1, \ldots, A_n$ меток перехода от корня
оглавления задачника к концевым пунктам, ссылающимся на данную
задачу.

\item "ответ" \ - переход к логическому терминалу, хранящему ответ
либо отказ на задачу узла. Если после того, как система находила
ответ на задачу, она пе\-ре\-ста\-ла ее решать, то перед старой
версией ответа помещается логический символ "отказ". В случае
задачи на текстовый анализ по метке "ответ" \ - переход к
текстформульной ветви (см. описание текстформульного редактора),
хранящей текст ответа.

\item "время" \ - переход к логическому терминалу, хранящему термы
"время($A_1$)", "вычитание($A_2$)", "минимум($A_3$)", где $A_1$ -
число шагов, затрачиваемых сис\-те\-мой на решение задачи; $A_2$ -
приращение данного числа шагов в последнем цикле решения задачи;
$A_3$ - наименьшее из зарегистрированных в про\-цес\-се изменений
системы значений $A_1$ для данной задачи.

\item "повторение" \ - переход к логическому терминалу, хранящему
десятичную за\-пись номера шага, на котором предпринимается
прерывание при повторном решении задачи (используется при
отладке).

\item "текстформ" \ - переход к текстформульной ветви, хранящей
текст задачи. Ис\-поль\-зу\-ется для представления задачи на
анализ текста, причем в этом случае переход по метке "задача" \
отсутствует.

\item "блок" \ - переход к логическому терминалу, хранящему ссылки
"прием($A_1 \ A_2 \\ A_3$)" \ на приемы, применение которых при
решении задачи блокируется. $A_1$ - логи\-чес\-кий символ; $A_2$ -
номер узла этого символа; $A_3$ - заголовок приема. Заготовка
отладчика процедур синтеза приемов, используемых в процессе
ре\-шения задачи.

\item "битмэп" \ - переход к логическому терминалу, хранящему
ссылку на рисунок. Используется для представления задачи на анализ
рисунка, причем в этом случае переход по метке "задача" \
отсутствует. Битмэпы рисунков хранятся не во 2-м информационном
блоке задачника, а в специально выделенном для них 13-м
информационном блоке. Ссылкой на рисунок является терм
"битмэп($A_1 \ A_2 \\ A_3$)". Здесь $A_1$ - логический символ, по
которому из корневого указателя-ка\-та\-ло\-га 13-го
информационного блока имеется пере\-ход к указателю-списку, из
которого по метке "битмэп" \ - переход к текстовому терминалу,
хранящему битмэп рисунка. $A_2$ - ширина рисунка в 16-битных
словах; $A_3$ - число 16-битных слов текстового терминала,
загружаемых в буфер битмэпов при считывании рисунка из
информационного блока.

\item "структура" \ - переход к указателю-списку, ветвь которого
определяет задачу на моделирование процесса. В этой ветви
выделяются узлы объектов (корень ветви сам является узлом
объекта). От каждого узла объекта по метке "элемент($t$)", где $t$
- обозначение элемента либо серии однотипных элементов, имеется
переход к узлу объекта, представляющему элемент (серию элементов)
$t$. В случае серии выражение $t$ имеет параметры, определяющие
конкретный элемент серии. По метке "условие" \ из узла объекта -
переход к группе логических терминалов, содержащих утверждения
логического описания структуры (элементы и связи между ними) и
параметров состояния объекта. Переменные в описаниях объ\-ек\-тов
- локальные; из внешнего контекста переносятся, если они есть,
только параметры серии элементов. Если узел объекта представляет
серию однотипных объектов, то по метке "параметры" \ от него -
переход к логическому терминалу, хранящему условия на параметры,
определяющие элемент серии. В случае задачи на моделирование
процесса переход по метке "задача" \ отсутствует.

\end{enumerate}


Начало программы символа "списокзадач" \ можно найти, например,
через ог\-лав\-ле\-ние программ - пункт "Интерфейс просмотра и
редактирования задач" \ - "про\-це\-ду\-ра СПИСОКЗАДАЧ" \ -
"Исходная точка".

После оператора "повторение", к которому будут происходить откаты
при пов\-тор\-ном входе в обработку списка задач (например, если
он был изменен), ини\-ци\-али\-зируется накопитель х4 троек,
описывающих задачи списка и их прорисовку на экране. Каждая тройка
($A_1 \ A_2 \ A_3$) этого накопителя состоит из: логического
символа $A_1$, являющегося меткой перехода к концевому терминалу
оглавления задачника, ссылающемуся на задачу, задачи $A_2$, и
набора $A_3$ информационных элементов для последовательно
прорисовываемых фрагментов изображения задачи. Эти фрагменты далее
называем полосами изображения. В наборе $A_3$ используются
информационные элементы следующих типов:

\begin{enumerate}

\item (терм $B_1 \ B_2$). $B_1$ - очередной терм задачи (посылка
либо условие); $B_2$ - либо 0 (в отсутствии прорисовки), либо пара
$(C_1 \ C_2)$ (в случае прорисовки текстовым редактором), где
$C_1$ - исходная строка для прорисовки; $C_2$ - высота полосы
прорисовки, либо тройка $(C_1 \ C_2 \ C_3)$ (в случае прорисовки
формульным ре\-дак\-то\-ром), где $C_1,C_2$ - те же, $C_3$ -
корень дерева указателей формульного редактора для прорисовки
терма.

\item (отрезок $B$) - указатель на горизонтальную линию, с которой
начинается про\-ри\-сов\-ка задачи. $B$ - либо 0, либо символьный
номер строки для проведения горизонтальной линии.

\item (слово $B1 \ B_2$) - ссылка на текстовый терминал,
достижимый из корневого указателя 2-го информационного блока по
меткам $B_1$, "слово". $B_2$ - либо 0, либо пара ($C_1 \ C_2$),
где $C_1$ - исходная строка для прорисовки текста, $C_2$ - высота
полосы прорисовки.

\item (набор $B_1 \ B_2$) - указатель прорисовки последовательно
расположенных в общей полосе текстовых фрагментов, термов и букв.
$B_1$ - набор троек одного из сле\-ду\-ю\-щих типов:

а) (слово $C_1 \ C_2$) - ссылка на текстовый терминал, достижимый
из корня 2-го информационного блока по меткам $C_1$, "слово".
$C_2$ - либо 0, либо пара (столбец - строка) для начала прорисовки
текста.

б) (буква $C_1 \ C_2$) - $C_1$ есть логический символ, кодирующий
прорисовываемую букву; $C_2$ - такое же, как и выше.

в) (терм $C_1  C_2$) - $C_1$ есть терм либо логический символ;
$C_2$ - либо 0, либо пара (столбец - строка) для начала прорисовки
терма текстовым редактором, либо тройка (столбец - строка - корень
дерева указателей формульного редактора для прорисовки терма).

$B_2$ - либо 0, либо пара (исходная строка полосы - высота
полосы).

\item (геомредактор $B_1 \ B_2$) - ссылка на чертеж. $B_1$ есть
тройка (описание чертежа в формате оператора "геомредактор" \ -
верхняя строка рамки - нижняя строка рамки). $B_2$ - либо 0, либо
пара ($C_1 \ C_2$), где $C_1$ - исходная строка для прорисовки
чертежа; $C_2$ - высота полосы чертежа. До прорисовки чертежа в
списке задач последние два элемента тройки $B_1$ могут отличаться
от значений $C_1,C_1 + C_2$, а затем становятся им равны.

\item (пусто $B$). Указатель на пропуск горизонтальной полосы
высотой в 19 пикселей. $B$ - либо 0, либо набор ($C$), где $C$ -
номер строки, с которой начинается полоса.

\item (текстформ $B_1 \ B_2$). $B_1$ - текстформульная структура
(см. описание текст\-фор\-муль\-ного редактора); $B_2$ - либо 0,
либо пара (исходная строка для прорисовки текстформульного
элемента - высота ткстформульной полосы).

\item (шахматы $B_1 \ B_2$). $B_1$ - задача на исследование,
описывающая текущую шах\-мат\-ную позицию; $B_2$ - либо 0, либо
пара (исходная строка для прорисовки шахматной позиции - высота
полоы прорисовки).

\item (битмэп $B_1 \ B_2$). $B_1$ - тройка ($C_1 \ C_2 \ C_3$,
представляющая собой ссылку на рисунок в 13-м информационном
блоке. $C_1$ - логический символ, такой, что по меткам $C_1$,
"битмэп" \ от корня указанного блока - переходы к текстовому
терминалу, хранящему битмэп. $C_2$ - ширина рисунка в
16-пиксельных единицах. $C_3$ - число 16-битных слов в битмэпе.
$B_2$ - либо 0, либо пара (исходная стро\-ка рисунка - высота
полосы рисунка).

\end{enumerate}


После инициализации набора х4 программа "списокзадач" \ обращается
к опе\-ра\-то\-ру "извлечениезадачи", который определяет в
указанном выше формате тройку х5 для текущей задачи, после чего
эта тройка заносится в х4. Основную часть работы по созданию
информационных элементов полос изображения при этом выполняет
оператор "элементызадачи", который будет описан в разделе,
посвященном по\-ша\-го\-во\-му просмотру решения (см. подраздел
"Создание набора информационных эле\-мен\-тов полос изображения
об\-об\-щен\-ной задачи"). Далее - переход через "ветвь 2".

Здесь, после проверки непустоты набора х4 (если он пуст, то -
внутренний пе\-ре\-за\-пуск), располагается оператор "повторение",
к которому будут происходить откаты для перерисовки. Если нет
комментария (транскоммент $\ldots$) - при его наличии
пе\-ре\-ри\-совка не нужна, так как сразу запускается решение
текущей задачи, - то происхо\-дит расчистка экрана. Далее
инициализируются переменные: х6 - вхождение в х4 текущей
прорисовываемой задачи (изначально - левый край набора х4); х7 -
номер первой свободной строки на экране; х8 - набор информационных
элементов для прорисовки полос текущей задачи; х9 - сначала 0, а
затем вхождение в х8 первого непрорисованного элемента.
Просматриваются все вхождения х10 в х4, начиная с вхождения х6.
Для текущего вхождения х10 определяется список х11
информа\-ци\-он\-ных элементов про\-ри\-сов\-ки полос
соответствующей задачи. Просматриваются вхождения х12 в список х11
эле\-мен\-тов х13. Если последний элемент набора х13 не равен 0,
то он содержит всю необходимую для прорисовки полосы на экране, и
тогда оператор "смполоса($\ldots$)" \ фактически выполняет данную
прорисовку. При этом переменной х6 присваивает\-ся значение х10,
переменной х9 - значение х12, переменной х7 - номер строки,
распо\-ло\-жен\-ной после прорисованной полосы. Таким образом,
реализуется цикл повторной прорисовки на расчищенном экране тех
элементов, для которых информация о про\-ри\-сов\-ке сохранилась
после выполнения предшествовав\-шей перерисовке операции. По
завершении этого цикла - переход через "ветвь 2".

Если исходная задача имеет комментарий "элементызадачи", то вход в
процедуру "списокзадач" \ произошел в результате внутреннего
перезапуска после получения ответа задачи. В этой ситуации после
прорисовки текущей задачи нужно указать время (в минутах и
секундах) решения задачи. Комментарий "элементызадачи" \
уда\-ля\-ется, и проверяется наличие комментария "транзитпереход".
Он возникает, если решалась задача на исследование, и прорисовка
времени не нужна, так как та\-кие задачи в задачнике - только
фиктивные (например, используемые для представле\-ния исходной
игровой позиции). Если указанного комментария нет, то количества
за\-тра\-чен\-ных на решение минут и секунд извлекаются из
логического терминала, дос\-ти\-жи\-мого из корневого указателя
2-го информационного блока по меткам "сброс","время". После
последней полосы первой задачи набора х4 (она и будет только что
решавшей\-ся задачей) вставляются элементы, необходимые для
прорисовки текста "Время ре\-ше\-ния: $\ldots$ мин. $\ldots$
сек.". Затем - переход через "ветвь 3", где происходит такая
переустановка значения х9, чтобы вместо прорисовки всей задачи
была прорисована лишь ее часть, идущая после слов "Ответ:" \ либо
"Ответ утерян" \ (эти текстовые заготовки хранятся в текстовых
терминалах 2-го информационного блока, дос\-ти\-жи\-мых из корня,
соответственно, по меткам "суммавсех","слово" \ и
"выписка","слово").

Далее - цикл дорисовки экрана до его заполнения оставшимися
элементами за\-да\-чи, прорисовка которой уже начата, и
последующими задачами. Переход к нему - через оператор "ветвь 1",
предшествующий оператору "исходнаязадача(х10)".

Цикл дорисовки начинается с оператора "повторение", откаты к
которому будут выполняться после прорисовки очередной полосы.
Затем идет оператор, заменяющий значение переменной х8 на набор
информационных элементов, определяющих про\-ри\-сов\-ку полос
изображения задачи, соответствующей вхождению х6 в набор х4. Если
х9 равно 0 (прорисовка полос задачи еще не начиналась), причем
набор х8 непуст, то х9 заменяется на вхождение первого разряда
набора х8. Если х9 не равно 0, причем соответствующая х9 полоса
уже прорисована, то находится следующее после х9 вхождение х10 в
набор х8. Если х10 не равно х9, то х9 заменяется на х10, иначе -
находится следующее после х6 вхождение х11. Если такого вхождения
не было (т.е. х11 оказалось равно х6), то из задачника считывается
задача, следующая за последней считанной в набор х4, и тройка х12,
представляющая ее, добавляется в конец набора х4. х6 становится
равно вхождению в х4 только что добавленной тройки, а х9 -
вхождению первого из элементов прорисовки полос считанной задачи.
Если же х11 было отлично от х6, то х6 присваивается х11, а х9 -
вхождение первого из элементов прорисовки полос задачи по х11. Во
всех перечисленных выше случаях далее - переход через "ветвь 1".

Проверяется отсутствие комментария (транскоммент $\ldots$), а
также равенство нулю последнего разряда информационного элемента
по вхождению х9. Предпринимается обращение к оператору
"высотаполосы", который изменяет последний разряд этого
информационного элемента на данные, необходимые для прорисовки
полосы, и оп\-ре\-де\-ляет высоту полосы х10. Если места для
прорисовки полосы достаточно, то оператор "смполоса" \ выполняет
эту прорисовку, корректируется номер х7 первой свободной строки, и
откат к оператору "повторение" \ для прорисовки следующей полосы.
Если же места для прорисовки полосы недостаточно, то последний
раз\-ряд элемента по х9 снова заменяется на 0, и цикл дорисовки
завершается (переход через "ветвь 1").

Если х9 не равно 0 и вхождение х6 в набор х4 - не последнее, то
отбрасываются все идущие после него разряды, причем значением х6
становится вхождение последнего разряда набора х4. Далее - переход
через "ветвь 1", и рассматривается первый элемент х10 набора х4.
Если он отличен от последнего элемента и ни одна его полоса не
прорисована, то отбрасывается, причем эта операция повторяется в
цикле, пока набор х4 не окажется одноэлементным либо не будет
прорисована хотя бы одна полоса его первой задачи.

После такой расчистки набора х4 - переход через "ветвь 1" \ к
фрагменту, в котором начинается обработка команд просмотра списка
задач. Альтернативный выход к данному фрагменту - через пункт
"Цикл обращений к клавиатуре - Исходная точка" \ ветви процедуры
"списокзадач" \ в оглавлении программ. Фрагмент начинается с
оператора "повторение" \ (откаты к получению очередных команд),
после которого идет оператор "автоменю(х10)", запрашивающий
очередную команду х10. Если эта команда отлична от "тринадцать",
"обл","мышь" \ (клавиши Enter, пробел и нажатие кнопки мыши), то
перед обработкой команды предпринимается обращение к
про\-це\-ду\-ре "коррекциязадач(0)". Эта процедура анализирует
комментарий (коррекцияза\-дач $\ldots$), в котором накапливаются
указания на изменения задач, выполненные пре\-дыдущей командой и
еще не зарегистрированные в файлах задачника, и регистри\-ру\-ет
та\-кие изменения. Далее идет последовательность фрагментов
обработчика ко\-манд:

\begin{enumerate}

\item х10 = "Плюс" \ либо х10 = "циклвариантов". Соответственно,
нажаты кла\-ви\-ши Esc либо "курсор влево". В этом случае
происходит выход из програм\-мы "списокзадач" \ для возвращения в
процедуру просмотра оглавления задачника. Так как в процессе
прокрутки списка задач текущей задачей может оказать\-ся не та
задача, через которую первоначально произошел вход в просмотр
списка, то перед выходом предпринимается переустановка оглавления
задачника на новую "текущую" \ задачу. Ее роль теперь играет
первая из задач, для которых на экране прорисована верхняя
отделяющая горизонтальная линия. Для пе\-ре\-ус\-та\-нов\-ки
рассматриваются первая тройка х11 набора х4 и следующая за ней
тройка х13. Если первый элемент полосы задачи, соответствующей
тройке х11, не прорисован (условие равенства нулю конца первого
информационного элемента списка х14), а первый элемент полосы
задачи х13 - прорисован (от\-ли\-чие от нуля конца первого
информационного элемента списка х15), то метка х12 перехода к
текущей задаче берется из х13, иначе - из х11. Затем - переход
через "ветвь 3" \ к оператору "путьвоглавлении", выполняющему
переуста\-нов\-ку текущего пути в оглавлении задачника.

\item х10 = "подстановка". Нажата клавиша "курсор вниз" \ для
прокрутки списка задач вверх на минимально возможный шаг. При
сдвиге в верхней части экрана убирается ровно одна полоса. Если
снизу после этого оказывается достаточно места, и список задач не
завершен, то добавляется некоторое количество новых полос.

Прежде всего, проверяется, не осталась ли на экране единственная
полоса, завершающая прорисовку всего списка задач. В этом случае
сдвиг вверх бло\-ки\-ру\-ет\-ся. Иначе - переход через "ветвь 2".

Здесь инициализируется нулем переменная х11 - накопитель величины
сдвига вверх в пикселах. Просматривается список х4, и для текущей
тройки х13 этого списка (х12 - текущее вхождение ее в х4)
просматриваются информационные элементы х16 прорисовки полос.
Находится первый такой элемент, у которого конец ненулевой - он
определяет первую полосу изображения. х11 увеличива\-ет\-ся на
высоту этой полосы (используются символьные номера). Если элемент
оп\-ре\-де\-лял прорисовку разделяющей горизонтальной линии либо
вертикального 19-пиксельного пробела, то просмотр и увеличение
значения х11 продолжается. Иначе - откат к оператору "ветвь 1",
перед которым проверяется, не оказа\-лась ли первая задача списка
х4 в результате прокрутки полностью устраненной с экрана; в этом
случае она исключается из списка х4.

Если величина х11 оказалась не равной 0, то предпринимается
просмотр всех определяющих прорисовку полос информационных
элементов и коррекция их параметров, соответствующая сдвигу
изображения на х11 пикселей вверх. Затем - прокрутка изображения
вверх на х11 пикселей, коррекция номера х7 первой свободной
строки, и откат к дорисовке.

\item х10 = "внешсумма". Нажата клавиша "курсор вверх" \ для
прокрутки списка задач вниз на минимально возможный шаг. При этом
сверху оказывается про\-ри\-со\-ва\-на ровно одна дополнительная
полоса изображения (не считая по\-лос горизонтальной разделяющей
линии и 19-пиксельного вертикального пробела), а снизу может быть
удалено с экрана сразу несколько полос. Каждая полоса удаляется
целиком, и каких-либо ее частей на экране не остается.

Прежде всего, инициализируются значения переменных х11, х12, х13,
х14. В х11 будут накапливаться пары (вхождение информационного
элемента для про\-ри\-сов\-ки полосы, добавляемой при сдвиге вниз
в верхней части экрана - номер метки перехода к задаче, в
изображение которой входит данная полоса). х12 - накопитель
величины сдвига вниз (символьный номер); х13 - вхождение в набор
х4 тройки для той задачи, к которой относится первая полоса
изображения до сдвига вниз; х14 - вхождение информационного
элемента для прорисовки этой полосы. После инициализации
предпринимается просмотр набора х4 и определение указанных
значений х13, х14. Далее - переход через "ветвь 2".

Выполняется цикл просмотра информационных элементов полос
изображения, предшествующих элементу по х14, и заполнение набора
х11 до тех пор, пока в нем не окажется ровно одна ссылка на
информационный элемент для про\-ри\-сов\-ки полосы изображения,
отличной от горизонтальной разделяющей линии и вертикального
19-пиксельного пробела. Если при этом просмотре оказывается, что в
задаче по х13 такой полосы нет, то переход через "иначе 2", где из
задачника извлекается предыдущая задача списка, и ее тройка х19
заносится в начало списка х4. По окончании цикла - переход через
"ветвь 1".

Если накопитель х11 оказался пустым (на экране уже было
прорисовано начало списка задач), то откат к запросу очередной
команды. Иначе просматриваются информационные элементы полос
изображения, прорисованных на экране до сдвига вниз, и их
параметры корректируются для сдвига вниз на х12 пикселей. Затем -
переход через "иначе 1".

Изображение сдвигается вниз на х12 пикселей. Последовательно
просмат\-ри\-ва\-ют\-ся пары х16 из накопителя х11; для каждой
такой пары оператор "вы\-со\-та\-по\-ло\-сы" \ подготавливает ее
информационный элемент полосы изображения для прорисовки, после
чего оператор "смполоса" \ выполняет прорисовку. Далее - переход
через "ветвь 1".

Находится информационный элемент х19 последней прорисованной на
экране полосы изображения и вычисляется номер х21 строки,
следующей после полосы этого элемента. х7 присваивается значение
х21; если строка х21 расположена выше нижнего края экрана, то
экран под ней расчищается. Значения х6 и х9 корректируются так,
чтобы они указывали на задачу, с которой будет нужно продолжать
прорисовку, и на вхождение того информационного элемента
по\-ло\-сы, с которого ее нужно продолжать. Если в наборе х4
имеются тройки, следующие после вхождения х6, то они удаляются.
Затем - откат к запро\-су следующей команды.

\item х10 = "точкапривязки". Нажата клавиша PageDown для перехода
к следующей странице изображения списка задач. Если вхождение х9 -
последнее в списке информационных элементов полос изображения
последней прорисованной на экране задачи, то считывается тройка
х11 для прорисовки следующей задачи, и х4 заменяется на
одноэлементный набор, состоящий из х11. х6 и х9
кор\-рек\-ти\-ру\-ют\-ся для начала прорисовки новой задачи, экран
расчищается, и откат к дорисовке. Если же вхождение х9 - не
последнее, то в наборе х4 оставляется только его последний
элемент, корректируется х6, и последние разряды всех
информационных элементов полос изображения оставшейся задачи
об\-ну\-ли\-ва\-ют\-ся (так как эти элементы уже не являются
прорисованными). Значение х9 сохраняется, так как дорисовка
начнется с первого непрорисованного ранее элемента. Далее
расчищается экран, указатель первой свободной строки х7
устанавливается на верхнюю строку экрана, и откат к дорисовке.

\item х10 = "контрольунификации". Нажата клавиша Page Up для
перехода к пре\-ды\-ду\-щей странице изображения списка задач.
Последовательно просматриваются тройки х12 набора х4 и
информационные элементы полос изображения х14 в этих тройках -
пока не оказывается найден первый прорисованный на экране элемент
х14. Инициализируется нулем счетчик х15 суммарной высоты полос
изображения, которые будут выданы на предыдущей странице.
Переменным х16 и х17 присваиваются значения х11, х13 - вхождения
тройки х12 и ин\-фор\-ма\-ционного элемента х14 в свои списки. Эти
переменные будут указывать на текущий анализируемый информационный
элемент полосы изображения при перечислении элементов, которые
будут составлять предыдущую страницу. Далее, начиная с оператора
"повторение", идет цикл перечисления. Если вхож\-де\-ние х17 - не
первое в своем списке, находится предшествующее ему вхождение х18.
Определяется высота х19 полосы элемента по вхождению х18, и х15
уве\-ли\-чи\-ва\-ет\-ся на х19. Если х15 оказывается меньше, чем
х5, то-есть при добавлении полосы к предыдущей странице эта
страница помещается на экране, то х17 присваивается значение х18,
и продолжение цикла; иначе цикл обрывается. По завершении
просмотра всех х17, относящихся к тройке по вхождению х16,
проверяется, является ли х16 началом набора х4. Если нет, то
находится вхож\-де\-ние х19, предшествующее х16, и переменной х20
присваивается вхожде\-ние последнего информационного элемента
полосы изображения тройки по х19. Определяется высота х21 полосы
элемента х20, и х15 увеличивается на х21. Если результат
оказывается меньше х5, то х16 заменяется на х19, х17 - на х20, и
продолжение цикла; иначе - обрыв цикла. Наконец, в случае, когда
х16 было началом списка х4, находится тройка х21, представляющая
задачу, предшествующую первой задаче в х4. Эта тройка добавляется
к началу списка х4, и цикл просмотра информационных элементов
полос изображения про\-дол\-жа\-ет\-ся с последнего такого
элемента тройки х21. По завершении цикла - переход через "ветвь
2".

Просматриваются все информационные элементы полос изображения
текущей страницы, и их последний разряд заменяется на 0. Затем
переменным х6, х9 присваиваются значения х16, х17, экран
расчищается, и откат к дорисовке.

\item х10 = "мышь". Нажата кнопка мыши для выделения задачи либо
ее элемента. Выделение задач и элементов задач является сквозным
для всего задачника - оно сохраняется при выходе из одного
концевого списка задач и переходе в другой список. Для выделения
используется комментарий (смполоса $A$) к списку посылок исходной
задачи. Каждый информационный элемент набора $A$ выделяет задач у
либо элемент задачи; в этом наборе используются
инфор\-ма\-ци\-он\-ные элементы следующих типов:

 а) $(B_1 \ B_2)$. Выделение целой задачи. $B_1$ - путь в
 оглавлении задачника к пред\-кон\-це\-вому указателю-списку; $B_2$ -
 метка перехода в этом указателе-списке к логическому терминалу,
 содержащему ссылку на задачу.

 б) $(B_1 \ B_2 \ B_3 \ B_4)$. Выделение целой полосы изображения
 в задаче. $B_1,B_2$ оп\-ре\-де\-ля\-ют ссылку на задачу - как и выше.
 $B_3$ - номер вхождения выделенной полосы в список полос. $B_4$ -
 информационный элемент данной полосы.

 в) $(B_1 \ B_2 \ B_3 \ B_4 \ B_5)$. $B_1 - B_4$ - те же, что и
 выше, причем $B_4$ имеет вид (набор $\ldots$). В этом случае полоса
 состоит из последовательности элементов; выделен один из этих
 элементов, и $B_5$ есть номер вхождения данного элемента.

 г) $(B_1 \ B_2 \ B_3 \ B_4 \ B_5)$. $B_1 - B_4$ - те же, что и
 выше, причем $B_4$ имеет вид (терм $\ldots$). В этом случае
 полоса образована изображением терма; выделен некоторый его
 подтерм, и $B_5$ - указатель вхождения выделенного подтерма в
 терм. Указателем вхождения одного терма в другой здесь и далее
 называется терм "фикс($i_1 \ldots \ i_n$)", где
 $i_1, \ldots, i_n$ - номера операндов, по которым нужно двигаться
 от корня терма в направлении к подтерму. Если рассматривается
 вхождение в кванторную импликацию "длялюбого(х1 $\ldots$ хn если
 $A_1 \ldots A_m$ то $A_0$)", то в качестве $i_1$ берется номер
 $j$ того $A_j$, в котором расположен подтерм.

 д) $(B_1 \ B_2 \ B_3 \ B_4 \ B_5 \ B_6)$. $B_1 - B_5$ - такие же,
 как в случае в). В одном из элемен\-тов полосы, представляющем
 собой терм, выделен подтерм. $B_6$ - указатель вхож\-де\-ния этого
 подтерма.

Определяются столбец х12 и строка х13 курсора мыши. Если нажата
правая кнопка (х11 = 2), то должна быть выделена задача. Для
нахождения этой задачи инициализируется нулем переменная х14, и
просматриваются тройки х15 набора х4. Если строка полосы
изображения для х15, определяющей верх\-нюю отделяющую линию
задачи, расположена не ниже курсора мыши, то х14 заменяется на
номер задачи х15 в списке задач. По окончании просмотра
зна\-че\-ние х14 оказывается равно номеру той задачи, в зоне
которой расположен курсор мыши. Затем - переход через "иначе 3".

Создается информационный элемент х15, ссылающийся на выделенную
за\-да\-чу в формате комментария (смполоса $A$). Если такой
комментарий уже был, при\-чем элемент х15 не входил в $A$, то он
заносится в $A$, иначе - исключается из $A$. Если же такого
комментария не было, то он вводится, с одноэлементным  набором
$A$, состоящим из х15. Предпринимается перерисовка всех полос
изо\-бра\-же\-ния, относящихся к задаче с номером х14 - при этой
перерисовке они перекрашиваются в голубой цвет. Далее - откат к
получению очередной ко\-ман\-ды.

Если была нажата левая кнопка мыши (х11 = 0), то должен быть
выделен тот элемент задачи, на котором находится курсор мыши.
Инициализируются нулями переменные х14, х15, и предпринимается
просмотр всех полос изо\-бра\-же\-ния, прорисованных на экране и
отличных от горизонтальной разделяющей линии либо 19-пиксельного
вертикального пробела. Находится последняя из таких полос, для
которых курсор мыши расположен не выше ее верхней строки, и
переменной х14 присваивается номер задачи, к которой относится
полоса, а переменной х15 - вхождение информационного элемента
данной полосы в свой список. Затем - переход через "иначе 1", где
переменной х16 присваивается информационный элемент по вхождению
х15.

Сначала рассматривается случай, когда х16 имеет заголовок "набор",
т.е. опре\-де\-ля\-ет последовательность размещаемых друг за
другом разнородных эле\-мен\-тов изображения. Переменной х17
присваивается список троек, опреде\-ля\-ю\-щих эти элементы.
Просматриваются вхождения х18 в список х17 троек х19, имеющих
заголовок "терм". Эти тройки определяют прорисовку терма
тек\-сто\-вым либо формульным редактором. Отбирается та тройка,
для которой курсор мыши попадает в вертикальную полосу прорисовки
терма. Переменной х20 присваивается последний элемент тройки х19 -
пара (столбец - строка начала прорисовки терма) в случае текстовой
прорисовки либо тройка (столбец - строка - корень дерева
указателей формульного редактора) в случае фор\-муль\-ной
прорисовки. Проверяется, что в случае текстовой прорисовки курсор
мыши попадает на 19 - пиксельную горизонтальную полосу текста, а в
случае формульной прорисовки - на горизонтальную полосу, в которой
располагается формула. Создается информационный элемент х21,
ссылающийся на выде\-лен\-ный элемент полосы изображения в формате
комментария (смполоса $\ldots$). Как и в случае выделения всей
задачи, х21 учитывается в таком комментарии (до\-бав\-ля\-ет\-ся
либо удаляется). Далее происходит перекраска выделенного элемента
изображения, и откат к получению очередной команды.

Если х16 не имел заголовка "набор", то создается информационный
элемент х17, ссылающийся на выделенную полосу изображения в
формате комментария (смполоса $\ldots$), который учитывается в
таком комментарии. После перекраски полосы - откат к получению
очередной команды.

\item х10 = "подборнеизвестных". Нажата клавиша "з" \ для ввода
пустой заготовки новой задачи. Если имеется комментарий (смполоса
$A$), то информационные элементы х15 набора $A$ просматриваются от
конца к началу, пока не встретится элемент х15 длины 2. Он
соответствует последней выделенной задаче; про\-ве\-ря\-ется, что
верхняя горизонтальная линия этой задачи прорисована на экране и
что под ней достаточно места для ввода пустой заготовки новой
задачи. Если удовлетворяющий таким условиям элемент х15 найден, то
новая задача будет вводиться непосредственно перед его задачей.

Прежде всего, здесь удаляется комментарий (смполоса $\ldots$).
Затем в цикле просматриваются все задачи текущего списка задач,
начиная с той выделенной задачи, переж которой осуществляется
вставка. х20 - номер текущей про\-смат\-ри\-ва\-е\-мой в этом
цикле задачи. При просмотре корректируется ссылка из узла задачи
на путь в оглавлении задачника, ведущий к ее концевому терминалу -
последние элементы этих путей увеличиваются на 1. По завершении
цикла - переход через "ветвь 3".

Здесь увеличиваются на 1 все метки перехода в указателе-списке
рас\-смат\-ри\-ва\-е\-мо\-го списка задач, начиная с метки
перехода к выделенной задаче. Затем выбирается тот логический
символ х23, в статье которого будет введен новый узел задачи. Для
этого используется следующий простой датчик случайных чисел:
находится номер х20 текущего шага работы интерпретатора;
вычисляется остаток х22 от деления х20 на 1000, и в качестве х23
берется символ с номером х20 + 300. Вводится новый узел статьи х25
символа х23; х26 - номер этого узла. От этого узла создаются
переходы: по метке "задача" \ - к новому пустому указателю-списку;
по метке "оглавление" \ - к логическому терминалу, в который
заносится терм "набор($\ldots$)", определяющий путь в оглавлении
задачника к концевому логическому терминалу, ссылающемуся на новую
задачу. Здесь же вводятся сам этот концевой терминал, а также
сопровождающий его текстовый терминал, содержащий текст из трех
тире. Затем - переход через "ветвь 2".

Расчищается область экрана, расположенная вниз от верхней
горизонтальной линии выделенной задачи (сама эта линия теперь
будет рассматриваться как верхняя отделяющая линия новой задачи).
Позиция х16 набора х4, со\-от\-вет\-ствующая выделенной задаче,
изменяется на тройку, определяющую бланк но\-вой задачи. Этот
бланк представляет собой набор (0 пустоеслово пустоеслово
набор(пустоеслово)), причем информационных элементов полос
изображения новой задачи - два. Первый из них - для горизонтальной
отделяющей линии, второй - для вертикального 19-пиксельного
пробела. Все тройки набора х4, расположенные после х16,
отбрасываются. Корректируются для дорисовки зна\-че\-ния х6,х9,х7.
Вводится комментарий (смполоса $\ldots$), выделяющий новую
за\-да\-чу (так как обычно сразу после ее ввода приходится с ней
работать). Кор\-рек\-ти\-ру\-ет\-ся комментарий (списокзадач
$\ldots$), указывающий путь в оглавлении задачника к изменявшейся
в последний раз задаче. После этого - откат к до\-ри\-сов\-ке.

Если элемент х15, определяющий выделенную задачу, перед которой
долж\-на вставляться новая задача, не найден, то переход через
"иначе 2" \ для ввода новой задачи в конце списка задач. Здесь
проверяется, что последняя тройка набора х4 действительно
определяет последнюю задачу списка и что про\-ри\-со\-ва\-ны все
ее полосы изображения. Кроме того, проверяется, что на экране
достаточно места для ввода заготовки новой задачи. После этого
переменной х15 присваивается номер новой задачи. Как и выше, с
помощью номера те\-ку\-ще\-го шага работы интерпретатора,
рассматриваемого как случайное число, определяется тот логический
символ х19, в статье которого будет введен узел новой задачи.
Вводится этот узел х21; х22 - его номер. Дальнейшие действия
аналогичны случаю ввода новой задачи перед выделенной;
единственное не\-боль\-шое отличие - дорисовка после отката
начинается не с последнего эле\-мен\-та бланка новой задачи
(вертикального пробела), а с первого элемента - еще не
прорисованной горизонтальной отделяющей линии.

\item х10 = "обл". Нажата клавиша "пробел" \ для сброса всех
выделений задач и их элементов. Удаляется, если он есть,
комментарий (смполоса $\ldots$) к посылкам исходной задачи.
Согласно этому комментарию, восстанавливается черный цвет
прорисовки ранее вы\-де\-лен\-ных задач и элементов задач,
находящихся на экране.

\item х10 = "десчастное". Нажата клавиша Ctr-PageUp для перехода к
просмотру первой задачи списка задач. Находится первая тройка х11
набора х4. Если она соответствует не первой задаче списка, либо
верхняя горизонтальная ли\-ния этой задачи не прорисована на
экране, то определяется тройка х12 для про\-ри\-сов\-ки первой
задачи списка; х4 заменяется на одноэлементный набор, состоя\-щий
из х12, и откат к перерисовке всего экрана.

\item х10 = "отрезок". Нажата клавиша Ctr-PageDown для перехода к
просмотру последней задачи списка задач. Находится символьный
номер х12 последней задачи списка задач. Если первая тройка х13
набора х4 соответствует другой задаче, либо верхняя горизонтальная
линия последней задачи не прорисована на экране, то определяется
тройка х14 для прорисовки последней задачи списка; далее - как в
предыдущем случае.

\item х10 = "модули". Нажата клавиша Ctr-Del для удаления
выделенной задачи либо выделенного элемента задачи. Находится
комментарий (смполоса $A$) к посылкам исходной задачи, и этот
комментарий удаляется. Проверяется, что набор $A$ состоит из
единственного элемента х14. Далее рассматриваются сле\-ду\-ю\-щие
случаи:

 а) Длина набора х14 равна 2, т.е. удаляется выделенная задача.
 Проверяется, что эта задача относится к текущему списку задач
 (началом пары х14 служит значение х1). Находится номер х15
 выделенной задачи в данном списке задач, и в наборе х4 выбирается
 тройка х16, соответствующая номеру х15. Переменной х17
 присваивается список информационных элементов полос изображения
 уда\-ля\-е\-мой задачи. Проверяется, что первая из этих полос (верхняя
 отделяющая линия) прорисована на экране. В концевом логическом терминале
 оглавления задачника, соответствующем удаляемой задаче, находится терм
 х21 вида "за\-да\-ча($A_1 \ A_2$)", определяющий логический символ $A_1$ и
 номер узла задачи $A_2$. Находится ссылка х25 на узел задачи.
 Проверяется, что ссылка на него из оглавления задачника - единственная,
 после чего этот узел удаляется. Затем просматриваются все
 концевые логические терминалы рассматриваемого кон\-це\-во\-го меню
 задачника, номер х28 перехода к которым больше х15.
 Кор\-рек\-ти\-ру\-ют\-ся возвратные ссылки на оглавление из узлов задач,
 соответствующих этим терминалам, так как после удаления задачи
 номера переходов здесь умень\-шатся на единицу. Далее - переход
 через "ветвь 3".

 Исключаются переходы от определяющего список задач указателя х2
 оглав\-ле\-ния задачника к логическому и текстовому терминалам
 удаленной задачи. Метки переходов от х2, номера которых больше
 х15, уменьшаются на 1. Нахо\-дит\-ся вхождение х28 в набор х4 тройки
 х16 удаляемой задачи и создается список х29 всех предшествующих
 х28 элементов набора х4. Расчищается об\-ласть экрана вниз от
 верхней отделяющей линии удаленной задачи. Если список х29 непуст,
 то х4 заменяется на х29; корректируются для дорисовки значения
 х7,х6,х9, и откат к дорисовке. Если же х29 пуст, то переход через
 "иначе 1".

 Если в текущем списке задач, после удаления из него задачи,
 остается задача с тем же номером, что и удаленная, то находится
 тройка х30, представляющая эту задачу, х4 заменяется на
 одноэлементный набор, состоящий из х30, и откат к перерисовке
 всего экрана. Иначе - переход через "иначе 1".

 Если номер х15 удаленной задачи был больше 1, то находится
 тройка х30, представляющая задачу с номером, на единицу меньшим,
 и далее - как в пре\-ды\-ду\-щем случае. Иначе - переход через "иначе 1".

 Это - ситуация, складывающаяся при удалении единственной задачи списка
 задач из просмотра этого списка. В этом случае осуществляется ввод
 пустого бланка новой задачи взамен удаленной задачи (совершенно
 аналогично тому, как было описано ранее). Заметим, что при удалении
 единственной зада\-чи списка не из просмотра задач, а из оглавления
 задачника такие действия не выполняются.

 б) Длина набора х14 равна 4, то есть удаляется выделенная полоса
 задачи. Проверяется, что выделенная полоса относится к задаче
 рассматриваемого спи\-с\-ка задач (х1 равно началу набора х14) и что она
 прорисована на экране. Находятся номер х15 задачи, в которой
 выделена полоса, и тройка х16 этой задачи в наборе х4.
 Определяются список х17 информационных элементов по\-лос
 изображения данной задачи, а также вхождение х18 в этот список
 инфор\-ма\-ци\-он\-но\-го элемента х19 удаляемой полосы. Далее
 рассматриваются следующие подслучаи:

 б1) Элемент х19 имеет заголовок "терм", то есть удаляется терм
 задачи (по\-сыл\-ка либо условие). Переменной х20 присваивается
 задача с номером х15, а переменной х21 - удаляемый терм.

 Сначала рассматривается случай, когда либо х21 является посылкой задачи
 х20, либо х20 - задача на описание и х21 - ее условие.
 Переменной х22 при\-сва\-ивается вхождение х21 в список посылок
 либо условий, а х23 - 0 в случае посылки и 1 в случае условия.
 Проверяется, что число вспомогательных ин\-фор\-ма\-ци\-онных элементов с
 заголовками "набор","слово", предшествующих х18, равно х23 (перед
 условиями задачи должна размещаться полоса с целе\-вой установкой задачи,
 которая и определяется информационным элементом дан\-ного типа).
 Переменной х24 присваивается символьный номер вхождения
 уда\-ля\-е\-мого терма задачи х20 в его список. Затем находится узел
 х30 задачи х20, определяется список х33 ссылок на логические терминалы,
 хранящие посылки (при х23 = 0) либо условия (при х23 = 1) задачи, и
 удаляется терминал, хранящий терм х21. Далее - переход через
 "ветвь 3".

 Происходит исключение терма х21 из списка посылок либо условий
 задачи х20 и соответствующее исключение разрядов в наборе весов и
 наборе списков комментариев. Информационный элемент х19 удаляется
 из списка х17, причем х18 устанавливается на вхождение в х17
 элемента, следующего за удаленным. Полосы изображения, следующие
 за удаляемой, сдвигаются вверх на вели\-чи\-ну ее высоты. Предпринимается
 коррекция информационных элементов этих полос, соответствующая их сдвигу.
 Корректируются для дорисовки изо\-бра\-же\-ния значения х7,х6,х9, и откат к
 дорисовке.

 Далее рассматривается случай, когда х21 - условие задачи на
 доказатель\-ство либо преобразование. Этот случай аналогичен
 предыдущему; основное отличие состоит в том, что условие задачи х20,
 вес условия и комментарии к задаче заменяются на нули.

 б2) Элемент х19 имеет заголовок "набор". Здесь происходит
 удаление целевой установки задачи. Определяется ссылка х25 на узел
 задачи, и исключаются логические терминалы "цели","время","ответ",
 хранящие целевую установку и данные о предыдущих попытках
 решения. Условия и посылки задачи объе\-ди\-ня\-ются (в файле задачника)
 в один общий список посылок - в том же порядке, в каком они
 прорисованы на экране. Затем происходит повторное считывание задачи из
 задачника, и х4 заменяется на одноэлементный набор, состоящий из
 тройки х27 для считанной задачи.

 б3) Элемент х19 имеет заголовок "геомредактор". Находится ссылка
 х25 на узел задачи; удаляется логический терминал "точка",
 хранящий чертеж задачи. Если имелся терминал "точки" \ со старой
 версией чертежа, то эта версия пре\-об\-ра\-зуется в текущую. Затем
 откат к перерисовке.

 \item х10 = "прогрпеременная". Нажата клавиша "ы" \ для смены
 режима полной либо сокращенной прорисовки задачи. В обычном
 режиме происходит со\-кра\-щен\-ная прорисовка задачи - отбрасываются
 простейшие посылки и условия, определяющие тип значения
 переменной. В полном режиме прорисовываются все посылки и
 условия. Указателем на наличие режима полной прорисов\-ки служит
 комментарий "полный" \ к посылкам исходной задачи. В зависимости
 от того, имелся ли этот комментарий, он вводится либо удаляется.
 Затем происхо\-дит повторное считывание оператором "извлечениезадачи" \
 первой задачи на\-бо\-ра х4. При считывании используется подоператор
 "элементызадачи", учи\-ты\-ва\-ю\-щий наличие комментария "полный".
 Переменной х4 присваивается одно\-эле\-мен\-тный набор, образованный
 тройкой для считанной задачи, и откат к пе\-ре\-ри\-сов\-ке.

 \item х10 = "тринадцать" \ либо х10 = "число". Нажата клавиша
 Enter либо "Т" \ (кир.) для ввода нового условия либо новой
 посылки. В случае Enter для ввода используется формульный
 редактор, в случае "Т" \ - текстовый. Ини\-ци\-али\-зи\-ру\-ются переменные
 х11 и х12. Первая из них будет указывать тройку набора х4 для задачи,
 в которую заносится новый терм (сначала х11 присваивается последняя
 тройка набора х4); вторая - номер этой задачи. Инициализируются
 нулями переменные х13 и х14. Первая из них - индикатор вставки
 нового терма в последнюю задачу списка (значение 0) либо перед
 какой-либо задачей спис\-ка (значение 1). Вторая определяет номер строки, с
 которой набирается новый терм.

 Находится, если он есть, комментарий (смполоса $A$),
 определяющий список выделенных задач и элементов задач. При наличии
 выделенной задачи либо элемента задачи вставка нового терма будет
 происходить непосредственно пе\-ред этой задачей либо элементом. Если
 выделена задача, последняя полоса изображения которой прорисована
 на экране, то х11 заменяется на трой\-ку выделенной задачи из набора х4,
 х12 - на номер выделенной задачи. Значение х14 сначала изменяется на
 номер х7 первой свободной строки. Если после выделенной задачи
 на экране прорисована верхняя отделяющая линия сле\-ду\-ю\-щей задачи, то
 х14 изменяется на номер строки этой линии, х13 изменяется на 1. Далее -
 откат к переходу через "ветвь 2".

 Если выделенных задач в списке $A$ нет, то переход через "иначе
 4", где рас\-смат\-ри\-ва\-ется случай выделенной полосы изображения некоторой
 задачи. х18 - четверка из $A$, определяющая эту полосу. Находятся
 номер х19 задачи, в которой выделена полоса, и тройка х20 этой
 задачи в наборе х4. Переменной х21 присваивается вхождение
 информационного элемента х22 выделенной полосы изображения в
 список информационных элементов полос изображения тройки х20.
 Проверяется, что элемент х22 относится к целевой установке задачи
 либо к ее терму (посылке либо условию). Переменной х23
 приваивается номер строки, с которой начинается выделенная
 полоса, и проверяется, что начиная с этой строки имеется
 минимально необходимое для ввода нового терма место. Пе\-ре\-мен\-ной
 х24 присваивается набор информационных элементов полос
 изобра\-же\-ния тройки х20. Находится число х25 предшествующих
 выделенной полос изображения, определяемых информационными
 элементами типа "набор" \ либо "слово", и проверяется, что оно не
 превосходит 1. Если оно равно 0, то водимый терм нужно относить к
 списку посылок, иначе - к условиям. Проверяется, что в случае
 ввода условия задачи на доказательство либо преобразование эта
 задача еще не имеет условия (соответствующий разряд задачи есть
 логический символ "пустоеслово"). Номер выделенной полосы в
 наборе х18 увеличивается на 1 - чтобы после вставки посылки или
 условия выделенной оказалась прежняя полоса и можно было
 продолжить ввод новых термов.

 Расчищается область экрана вниз от начала х23 выделенной полосы.
 Кор\-рек\-ти\-руются все информационные элементы полос изображения,
 начиная с выделенной полосы - их последний разряд обнуливается,
 чтобы при откате они рассматривались как непрорисованные. х6 и х9
 корректируются для дорисовки начиная с полосы, в которой будет
 вводиться новый терм. Затем - переход через "ветвь 2", где отдельно
 рассматриваются случаи ввода терма формульным и текстовым
 редактором.

 Формульным редактором вводится терм х27 (при отказе от его ввода
 - откат к дорисовке начиная с полосы редактирования и отмена
 выделений). Переменной х30 присваивется задача, в которую
 происходит вставка, а переменной х31 - вхождение списка посылок
 этой задачи при х25 = 0 и списка условий (условия) при х25 = 1.

 Если вводится условие, и тип задачи отличен от "описать", то по
 вхождению х31 регистрируется терм х27, и откат к оператору "ветвь 3".
 Иначе - находится число х32 информационных элементов полос
 изображения, предшествующих выделенной полосе и содержащих тот же
 терм, что и выделенная полоса. Про\-с\-мотр элементов обрывается, как только
 встречается элемент, не имеющий заголовка "терм". Это число
 позволит идентифицировать в списке посылок либо условий то
 конкретное вхождение терма выделенной полосы (если таких вхождений
 несколько), перед которым нужно добавлять новый терм. После
 определения х32 - переход через "ветвь 5".

 Если выделенная полоса содержала терм х33, то просматривается
 список по\-сы\-лок либо условий, в котором происходит вставка, и в
 нем находится вхождение терма х33, перед которым имеется ровно
 х32 вхождений этого же терма. Затем х32 заменяется на номер
 найденного вхождения, и переход через "ветвь 1".

 Переменной х33 присваивается тот список посылок либо условий, в
 который вставляется новый терм. Предпринимается собственно
 регистрация в этом спи\-с\-ке терма х27, с соответствующим пополнением
 списков весов и комментариев. Затем - откат к переходу через
 "ветвь 3".

 Создается информационный элемент х32 полосы, в которой был введен
 новый терм, и этот элемент регистрируется в списке информационных
 элементов трой\-ки х20 перед информационным элементом выделенной
 полосы. В файле за\-дач\-ника пока никаких изменений задачи не
 происходит - такое изменение будет выполнено впоследствии, при
 выполнении операции, отличной от ввода ново\-го терма задачи.
 Это позволяет уменьшить число перезаписей в файле и замедлить
 накопление в нем "пустот", заполненных старыми версиями текстов.
 Инфор\-ма\-ция о необходимости коррекции в файле сохраняется в виде
 комментария (коррекциязадач $\ldots$), ссылающегося на задачу и
 измененный ее список ("по\-сыл\-ка" \ либо "условие"). Такой
 комментарий вводится; корректируются для дорисовки значения
 х7,х9, корректируется комментарий (списокзадач $\ldots$), и откат
 к дорисовке.

 Действия, предпринимаемые при вводе новой посылки либо условия
 текстовым редатором, аналогичны описанным выше. Перед обращением
 к текстовому ре\-дак\-то\-ру прорисовывается переходник для обозначений
 используемых в задаче переменных формульным и текстовым
 редакторами.

 \par\medskip

 Выше рассматривался случай вставки перед выделенным элементом
 задачи. Если никаких выделений не было, причем на экране
 прорисован последний элемент последней задачи списка, то
 переменной х14 переприсваивается номер х7 первой свободной
 строки (см. фрагмент, достижимый по "ветвь 3" \ от на\-чаль\-ной
 точки обработки данной команды х10). В этом случае, а также в
 рассмотренном ранее случае выделенной целиком задачи, далее -
 переход че\-рез "ветвь 2" \ в начальном фрагменте обработки
 команды.

 Новый терм здесь вводится в конце изображения задачи и регистрируется
 в списке посылок, если еще не была введена целевая установка, иначе -
 в условиях задачи. Прежде всего, в случае пустого бланка задачи номер
 х14 строки для ввода нового терма уменьшается на 19 (отбрасывается
 вертикальный 19-пик\-сель\-ный пробел после разделяющей линии, вводимый
 для удобства работы с пустым бланком задачи). Далее идут
 действия, аналогичные описанным выше: проверяется наличие
 свободного места для ввода терма; находится число х16 полос типа
 "набор" \ либо "слово", относящихся к задаче; если задача, в
 которой происходит ввод терма, не последняя, то вниз от строки
 х14 расчищается экран и все информационные элементы полос в
 последующих задачах помечаются как непрорисованные. Собственно
 ввод нового терма и его регистрация аналогичны случаю вставки
 терма перед выделенным элементом. В тех случаях, когда пополняется
 список посылок либо условий, терм заносится в конец этого списка.

 \item х10 = "транслвыражения" \ либо х10 = "кортеж" \ либо х10 =
 "нормпроиз\-ве\-де\-ниевсех". Соответственно, нажаты клавиши "Ctr-ф" \
 (изменение выделенного терма задачи формульным редактором) либо
 "Ctr-т" \ (изменение выделенного терма текстовым редактором) либо
 "ф" \ (продолжение редактирования вы\-де\-лен\-но\-го терма задачи
 формульным редактором).

 Находится комментарий (смполоса $\ldots$) к посылкам исходной
 задачи и про\-ве\-ря\-ет\-ся, что он определяет выделение единственного
 объекта - полосы некото\-рой задачи. Переменной х15 присваивается
 информационный элемент выделенной полосы. Проверяется, что он
 имеет заголовок "терм" \ и что его полоса прорисо\-ва\-на на экране.
 Переменной х17 присваивается номер задачи, к которой от\-но\-сит\-ся
 выделенная полоса, а х18 - определяющая задачу тройка набора х4.
 Переменной х19 присваивается список информационных элементов
 полос изо\-бра\-же\-ния данной задачи, а переменной х20 - вхождение в
 х19 информационного элемента выделенной полосы. Находится номер
 х21 строки, с которой будет происходить ввод новой версии
 изменяемого терма. В случае Ctr-ф эта строка - первая строка под
 полосой изменяемого тер\-ма, а в двух оставшихся слу\-ча\-ях - первая
 строка данной полосы. Проверяется, что для ввода новой версии
 терма имеется минимально необходимое место. Переменной х22
 присваивается число полос типа "набор" \ или "слово",
 предшествующих полосе изменяемого элемента. В случае равенства
 х22 нулю изменяется посылка, иначе - условие задачи. Проверяется,
 что в случае изменения условия задачи, не имеющей типа "описать",
 это условие уже имелось. Комментарий (смполоса $\ldots$) удаляется.
 Расчищается область экрана начиная со строки х21. Все информационные
 эле\-мен\-ты полос изображения, идущие после изменяемой полосы, помечаются
 как непрорисованные. х6, х9 переустанавливаются на дорисовку начиная
 с из\-ме\-ня\-емой полосы. Затем - переход через "ветвь 2".

 Сначала рассматриваются два случая изменения терма формульным
 ре\-дак\-то\-ром ("Ctr-ф" \ либо "ф"). Во втором случае вводится
 комментарий "форм\-опе\-ран\-ды" \ к посылкам исходной задачи. При
 обращении к формульному редак\-то\-ру в первом случае происходит
 обычный ввод новой версии терма под его старой версией; во втором
 случае - формульному редактору вместо указателя цвета символов
 передается старая версия терма. Это приводит к автоматическому
 перенабору старой версии, причем комментарий "формоперанды" \
 переключает формульный редактор, по завершении автоматического
 перенабора, на обыч\-ный режим ручного набора формулы. В обоих
 случаях, по завершении ре\-дак\-ти\-ро\-вания, получаем новую версию
 терма х24. Переменной х27 присваивается задача, в которой
 происходит изменение, а х28 - вхождение в х27 списка посылок либо
 списка условий (условия), в зависимости от того, изменяется ли
 посылка или условие.

 Если изменяется условие задачи на доказательство либо
 преобразование, то переход через "иначе 3", где сразу же старая
 версия, расположенная по вхож\-де\-нию х28, заменяется на х24. Такая
 же замена происходит в информационном элементе х15, а также в
 файлах задачника. Экран расчищается вниз от начала изменяемой
 полосы, корректируется комментарий (списокзадач $\ldots$),
 ука\-зы\-ва\-ющий на последнюю измененную задачу, и откат к дорисовке.

 Если изменяется посылка либо условие задачи на описание, то для
 иден\-ти\-фи\-ка\-ции нужного вхождения изменяемого терма (если задача
 имеет несколько одинаковых посылок либо условий) определяется
 число х29 полос изображения рассматриваемой задачи, предшествующих
 изменяемой полосе и содержащих тот же терм (сичтая изменяемую
 полосу). С помощью х29 определяется вхож\-де\-ние х31 изменяемого
 терма, и это вхождение заменяется на х24. Обнуливается вес
 измененного терма; новая версия его регистрируется в
 информационном элементе х15 и в файлах задачника. Экран
 расчищается вниз от начала из\-ме\-нен\-ной полосы, и откат к
 дорисовке.

 Если терм изменяется текстовым редактором (Ctr-т), то действия
 аналогичны описанным выше. Перед обращением к текстовому
 редактору предпринимается прорисовка переходника, указывающего
 соответствие обозначений ис\-поль\-зу\-емых в задаче переменных для
 формульного и текстового редакторов.

 \item х10 = "подобл". Нажата клавиша "ч" \ для ввода либо
 изменения чертежа. Инициализируется нулем переменная х11. Если
 выделен единственный объект - задача, верхняя отделяющая линия
 которой прорисована на экране, то х11 заменяется на тройку набора
 х4, представляющую выделенную задачу, и ком\-мен\-та\-рий (смполоса
 $\ldots$) удаляется. Иначе проверяется, что верхняя линия
 по\-след\-ней задачи списка прорисована на экране, и х11 заменяется
 на последнюю тройку набора х4. Далее - переход через "ветвь 2".

 Проверяется, что х11 не равно 0. Теперь х11 - тройка набора х4,
 представ\-ля\-ю\-щая ту задачу, для которой будет редактироваться
 чертеж. х12 присваивается эта задача.

 Сначала рассматривается случай изменения ранее введенного
 чертежа. На\-хо\-дит\-ся информационный элемент х13 полосы изображения
 задачи х12, оп\-ре\-де\-ля\-ющий чертеж. Переменной х14 присваивается
 тройка (описание чертежа в формате оператора "геомредактор" \ -
 верхняя строка чертежа - нижняя стро\-ка чертежа). В верхней части
 экрана устанавливается меню редактирования чер\-те\-жа, и происходит
 обращение к геометрическому редактору. После редак\-ти\-ро\-вания восстанавливается меню
 просмотра списка задач; определяются нижняя строка чертежа х15 и
 верхняя строка х16, и эти новые значения регистрируются в
 тройке х14 вместо старых. Описание чертежа модифицируется в
 фай\-лах задачника и в комментариях к посылкам задачи х12. Переменной х4
 при\-сва\-и\-ва\-ется одноэлементный набор, состоящий из тройки х11; все
 информационные элементы полос изображения в х11 помечаются как
 непрорисованные, и откат к перерисовке.

 В случае ввода нового чертежа (переход через "иначе 1") -
 устанавливает\-ся меню геометрического редактора, расчищается область
 экрана вниз от верхней отделяющей линии задачи х12, и происходит
 обращение к геометрическому редактору. После редактирования
 восстанавливаетя меню просмотра списка задач; определяются нижняя
 и верхняя строки чертежа х16,х17; чертеж ре\-гис\-три\-ру\-ется в
 комментариях к посылкам задачи х12 и в файлах задачника; в тройке х11
 вводится информационный элемент полосы чертежа (с удалением
 вертикального 19-пиксельного пробела, если чертеж вводится
 непосредственно на пустом бланке задачи); набор х4 преобразуется,
 как и в случае изменения чертежа, и откат к перерисовке.

 \item х10 = "облнорм". Нажата клавиша "Ц" \ для просмотра и
 редактирования оглав\-ле\-ния типов целевых установок. Переменной х12
 присваивается тип текущего оглавления - согласно комментарию (вид
 $\ldots$). Находится одноэлементный набор х14, образованный
 ссылкой на корневой указатель оглавления типов целевых установок,
 и комментарий (вид $\ldots$) переустанавливается на данное
 оглавление. Текущее содержимое экрана сохраняется в буфере, и
 предпринимается обра\-ще\-ние к оглавлению типов целевых установок.
 При отказе от выбора его конце\-во\-го пункта восстанавливаются
 экран и исходный комментарий (вид $\ldots$), после чего - откат к
 запросу очередной команды. Если концевой пункт оглавле\-ния выбран,
 то расчищаются экран и буфер текстов; в верхней части экрана
 пере\-ри\-со\-вы\-ва\-ется текст выбранного концевого пункта, под которым
 проводится горизонтальная линия. Находится содержимое логического
 терминала выб\-ран\-но\-го концевого пункта. Если оно отлично от терма
 "фикс($\ldots$)", то представляет собой логический символ, и этот
 символ прорисовывается под горизонтальной линией. Затем - вход в
 цикл обработки команд редактирования данного символа (этот символ
 используется как указатель процедуры, обрабатывающей ввод целевой
 установки данного типа).

 \item х10 = "верхняяоценка". Нажата клавиша "ц" \ для выбора
 целевой уста\-нов\-ки задачи через оглавление типов целевых
 установок. Переменной х11 при\-сва\-и\-ва\-ется последняя тройка набора
 х4, переменной х12 - задача этой тройки, переменная х13
 инициализируется нулем. Далее этим переменным будут
 пере\-при\-сво\-ены, соответственно, тройка набора х4, определяющая
 задачу, в которой редактируется целевая установка; данная задача,
 и номер строки, с которой будет происходить редактирование.

 Если имеется комментарий (смполоса $A$), то просматривается
 список $A$. Если в нем имеется пара х17, выделяющая задачу с
 номером х18, то находится тройка х19 набора х4, соответствующая
 данной задаче. Если в задаче еще не была введена целевая
 установка (отсутствует информационный элемент полосы изображения
 с заголовком "набор"), то переменным х11, х12 присваиваются тройка
 х19 и задача этой тройки, а переменной х13 - первая строка
 изображения следующей задачи (при отсутствии таковой - первая
 свободная строка х7). Если же целевая установка имелась, то
 проверяется, что она прорисована на экране, и тогда переменной х13
 присваивается первая строка полосы прорисовки це\-ле\-вой установки.
 Переменные х11, х12 корректируются так же, как и выше. В обоих
 случаях далее - откат к оператору "ветвь 2".

 Отдельно рассматривается случай, когда в списке $A$ имеется
 четверка, вы\-де\-ля\-ю\-щая полосу изображения некоторой задачи (переход
 к рассмотрению этого случая - через "иначе 4"). Определяются
 номер х18 этой задачи и ее тройка х19 в наборе х4. Проверяется,
 что целевая установка задачи еще не была введена (заголовок
 задачи есть 0, то есть это бланк задачи с не определенным
 пока ее типом). Данная ситуация означает, что целевая установка
 задачи вводится перед выделенной полосой, причем все термы,
 предшествующие полосе, будут отнесены к посылкам задачи, а все
 термы начиная с полосы - к ее условиям. Изначально все
 прорисованные на экране термы бланка задачи относились к ее
 списку посылок. Находится информационный элемент х21 выделенной
 полосы изображения; проверяется, что он имеет заголовок "терм".
 Удаляется комментарий (смполоса $\ldots$); текущий экран
 сохраняется в буфере; комментарий (вид $\ldots$)
 переустанавливается на оглавление типов целевых установок, и
 пред\-при\-ни\-ма\-ется обращение к этому оглавлению. После выбора
 концевого пункта оглавления указатель (вид $\ldots$)
 переустанавливается обратно на оглавление за\-дач\-ника, и находится
 содержимое х28 логического терминала выбранного кон\-це\-вого пункта.
 Экран восстанавливается и сразу же снова сохраняется. Зна\-че\-ни\-ем
 х28 теперь является одноэлементный набор, состоящий из
 логи\-чес\-ко\-го символа $S$, к программе которого нужно обращаться
 через справочник "см\-цель" \ для реализации диалога ввода целевой
 установки. После обращения к данному справочнику определяется
 тройка х29 (информационный элемент по\-ло\-сы изо\-бра\-же\-ния для целевой
 установки - список целей - тип задачи). Здесь определя\-ет\-ся список
 х30 термов, располагавшихся в списке посылок задачи начиная с
 выделенной полосы, и переход через "ветвь 3".

 Проверяется, что в случае неодноэлементного набора х30
 рассматриваемая за\-да\-ча имеет тип "описать". В файлах задачника
 предпринимается коррекция списков посылок, условий и целевой
 установки задачи. Затем - переход через "ветвь 1".

 Переменной х31 присваивается текущая (до изменения целевой
 установки) вер\-сия рассматриваемой задачи. Тип ее изменяется
 согласно тройке х29. Далее предпринимается доопределение задачи
 х31, в зависимости от ее типа. Заметим, что до этого х31
 представляло собой лишь бланк задачи, то есть являлось набором
 длины 4: тип задачи, список посылок, список весов посылок и
 список комментариев к посылкам. Поэтому при формировании задачи
 конкретного типа к набору х31 добавляется необходимое число
 разрядов. По окончании преобразований набора х31 - переход через
 "ветвь 1" \ (измененная версия задачи сохраняется в тройке х19).

 Здесь происходит вставка информационного элемента полосы
 изображения це\-ле\-вой установки в список информационных элементов
 полос изображения трой\-ки х19; все информационные элементы полос
 изображения, начиная с поло\-сы целевой установки, помечаются как
 непрорисованные; корректируются для до\-ри\-совки х6, х7 и х9;
 расчищается област экрана вниз от начала полосы целевой
 установки; корректируется комментарий (списокзадач $\ldots$), и
 откат к дорисовке.

 \par\medskip

 Выше рассматривался случай вставки целевой установки перед
 выделенной полосой. Если никаких выделений не было, то в исходном
 фрагменте обработки команды - переход через "ветвь 3", где
 проверяется, что на экране прорисована верхняя линия последней
 задачи списка. Если эта задача уже имела целевую установку, то
 проверяется, что она прорисована на экране и переменной х13
 присваивается верхняя строка полосы целевой установки; если
 целевой ус\-та\-нов\-ки еще не было, то проверяется, что последний
 элемент задачи прорисован, и переменной х13 присваивается номер
 х7 первой свободной строки. В обоих случаях (а также в
 разобранном выше случае выделенной задачи) далее - от\-кат к
 оператору "ветвь 2".

 Здесь проверяется, что х13 не равно 0. Если редактируется пустой
 бланк задачи, то х13 уменьшается на величину вертикального
 19-пиксельного пробела. За\-тем - переход через "ветвь 1".

 Текущий экран сохраняется в буфере. Далее, как и выше,
 реализуется обраще\-ние к оглавлению типов целевых установок и
 считывание содержимого х18 логического терминала выбранного
 концевого пункта. Экран восстанавливается и соазу же снова
 сохраняется. Если х18 содержало логический символ, отно\-ся\-щий\-ся к
 "шахматной ситуации" \ - инициализации партии либо вводу
 про\-ме\-жу\-точ\-ной игровой позиции, то организуется специальный
 интерфейс ввода задачи на выбор очередного хода в шахматах (она
 оформляется как задача на исследование). Переход к программе
 этого интерфейса - через "ветвь 3". Иначе - переход через "ветвь
 2".

 Предпринимается обращение к справочнику "смцель", которое
 приводит к по\-яв\-ле\-нию тройки х19 (информационный элемент для
 прорисовки целевой ус\-та\-нов\-ки - список целей - тип задачи).
 Проверяется, что в случае уже опреде\-лен\-но\-го типа задачи этот тип
 совпадает с указанным в х19. Скорректированная либо новая целевая
 установка регистрируется в файлах задачника, и переход через
 "ветвь 1".

 Если задача уже имела ненулевой тип, то ее список целей
 изменяется согласно х19. Иначе - в зависимости от определившегося
 типа ее набор пополняется необходимыми разрядами, как это
 делалось в разобранном выше случае. Затем - переход через "ветвь
 1".

 Просматриваются информационные элементы полос изображения
 ре\-дак\-ти\-ру\-емой задачи. При обнаружении элемента типа "набор" \ он
 заменяется на ин\-фор\-ма\-ционный элемент полосы целевой установки из
 тройки х19. Далее рас\-чи\-ща\-ет\-ся область экрана вниз от верхней линии
 редактируемой задачи; все ее информационные элементы полос
 изображения помечаются как непро\-ри\-со\-ван\-ные; удаляется комментарий
 (смполоса $\ldots$); корректируется для дорисовки х9, и откат к
 оператору "ветвь 1". Если же информационного элемента типа
 "набор" \ не обнаружено, то переход через "иначе 2".

 Если редактируется пустой бланк задачи, то отбрасывается
 информационный элемент вертикального 19-пиксельного пробела.
 Затем к концу списка ин\-фор\-ма\-ци\-он\-ных элементов полос изображения
 добавляется элемент из тройки х19. Особо рассматривается случай,
 когда редактируется задача на преобразование. Если ее целевая
 установка вводится после того, как было введено преобразуемое
 выражение, то предусмотрено автоматическое перенесение данного
 выражения в условия задачи (до ввода целевой установки оно
 попадало в список посылок). При отсутствии данного особого случая
 - как и выше, откат к оператору "ветвь 1" \ из предыдущего
 фрагмента.

 Здесь завершаются необходимые для отката к дорисовке коррекции:
 все инфор\-ма\-ци\-он\-ные элементы полос изображения задач, следующих
 после редакти\-ру\-е\-мой, помечаются как непрорисованные; изменяются
 х7 и х6; комментарий (списокзадач $\ldots$) переустанавливается на
 редактируемую задачу. Затем - от\-кат к дорисовке.

 \item х10 = "приведение". Нажата клавиша Home для завершающей
 обработки вве\-ден\-ной задачи. Такая обработка приводит к расширению
 списков посылок и условий простейшими утверждениями о типах значений
 переменных, одно\-знач\-но извлекаемых "по умолчанию" \ из контекста,
 в котором они встречаются; коррекцией символов для неоднозначно
 расшифровываемых обозначений (ис\-поль\-зование знака суммы как для
 сложения чисел, так и для сложения векто\-ров, и т.п.) на основе
 анализа контекста, и т.п. В принципе, эта обработка выполняется
 автоматически при каждом запуске решения задачи, так что дан\-ная
 команда почти избыточна.

 Сначала определяется та задача, к которой относится команда.
 Здесь при\-ме\-ня\-ется стандартная процедура: сначала переменным х11 и
 х12 присваиваются последняя тройка набора х4 и номер задачи этой
 тройки, причем х13 ини\-ци\-али\-зи\-руется нулем. Затем проверяется
 наличие комментария (смполоса $\ldots$), определяющего выделенную
 задачу, верхняя линия которой прорисована на экране; х11 и х12
 переустанавливаются на эту задачу, а х13 заменяется на 1. При
 отсутствии такой выделенной задачи проверяется, что последняя
 задача набора х4 является последней задачей списка и ее верхняя
 линия прорисована на экране. Тогда х13 тоже заменяется на единицу.
 Далее в обоих случаях - переход через "ветвь 2".

 Здесь проверяется, что х13 равно 1; переменной х15 присваивается
 номер строки верхней линии модифицируемой задачи, и выполняется
 обращение к оператору "завершзадачи", модифицирующему задачу и
 выполняющему изменение за\-пи\-си ее в задачнике. Из набора х4
 отбрасываются все тройки, следующие после тройки х11; повторно
 считывается из задачника модифицированная задача, и
 корректируется ее тройка в конце набора х4. Расчищается экран в
 области, расположенной ниже верхней линии модифицированной
 задачи; значения х6, х7, х9 корректируются для дорисовки, и откат
 к дорисовке.

 Оператор "завершзадачи" \ выполняет следующие действия по
 модификации задачи:

 а) Если список посылок задачи пуст, то в нем регистрируется
 единственное утверждение "истина".

 б) Для каждой посылки и условия выполняются обращения к оператору
 "кор\-рек\-ци\-я\-обо\-значений", уточняющему расшифровку введенного
 символа с учетом типов объектов, к которым он относится
 (например, выбор одной из операций: умножение чисел, умножение
 вектора на число, умножение матриц; все эти операции вводятся
 формульным редактором одинаково, но обозначаются раз\-ными
 символами).

 в) Определение с помощью справочника "типданных" \ типов значений
 пе\-ре\-мен\-ных, встречающихся в задаче и пополнение списков посылок
 и условий (в случае неизвестных задачи на описание) утверждениями,
 фиксирующими эти типы значений. Аналогичное пополнение
 утверждениями о типе значений переменных конструкций со
 связанными переменными.

 г) В случае неодноэлементного списка посылок - удаление посылки
 "истина".

 д) Ввод посылки "планиметрия" \ для тех геометрических задач,
 которые ус\-мат\-ри\-ва\-ют\-ся как заведомо планиметрические.

 е) Сопровождение задачи на доказательство комментарием "одз".

 \item х10 = "помощь". Нажата клавиша Ctr-ц для просмотра и
 редактирования целевой установки текстовым редактором.
 Последовательность действий здесь мало чем отличается от случая
 ввода целевой установки через оглавление ти\-пов целевых установок.
 Сначала в наборе х4 определяется тройка х11 редакти\-ру\-е\-мой задачи,
 и переменной х12 присваивается номер этой задачи, а переменной х13
  - строка, с которой начинается редактирование списка целей. В
 качестве х11 берется сначала последняя тройка набора х4; если
 есть выделенная задача, то она заменяется на ее тройку. Если была
 выделена полоса изображения бланка задачи с не определенным пока
 типом, то далее выполняется ветвь программы, переход к которой -
 через оператор "иначе 4"; в противном случае - ветвь программы,
 переход к которой - через "ветвь 2". Перед обращением к
 тек\-сто\-вому редактору прорисовывается переходник для обозначений
 входящих в задачу переменных формульным и текстовым редакторами.
 Затем про\-ри\-со\-вы\-ваются в скобочной записи цели задачи (если они
 уже были введены), причем в начале списка целей присоединяется
 тип задачи. При редактировании целей первым элементом
 списка должен быть введен тип задачи. Для определения
 информационного элемента полосы изображения целевой установки
 при\-ме\-ня\-ет\-ся оператор "элементызадачи", который будет описан в
 разделе, посвященном программам пошагового просмотра решения.

 \item х10 = "внешдизъюнкция". Нажата клавиша Insert для вставки
 копий вы\-де\-лен\-ных термов. Находится комментарий (смполоса
 $A$), и переменной х13 при\-сва\-и\-ва\-ется набор указателей выделенных
 объектов $A$. Проверяется, что этот набор непуст. Переменной х14
 присваивается последний элемент набора $A$. Он определяет, куда
 нужно производить вставку копий: если выделена задача, то - в
 конце ее полос изображения; если выделена полоса изображения, то
 - перед ней. Элемент х14 исключается из набора х13. Далее
 предпринимается просмотр набора х13 и заполнение накопителя х15
 вставляемых термов на основе тех элементов из х13, которые определяют
 выделенные термы либо подтермы. После этого - переход через
 "иначе 2".

 Проверяется наличие комментария (Смполоса $\ldots$),
 аналогичного комментарию (смполоса $\ldots$), но сохраняющему
 выделенные объекты текущей задачи процесса пошагового просмотра
 решения. Формат этого комментария будет описан в разделе,
 посвященном программам пошагового просмотра. Здесь его следует
 учитывать потому, что из текущего кадра пошагового просмотра
 можно (не обрывая решения) перейти к просмотру задач задачника и
 воспользоваться выделенными в текущей задаче термами для
 регистрации их в этих задачах. Если комментарий есть, то
 извлекаемые из него выделенные термы добавля\-ют\-ся в начале списка
 х15. Далее - переход через "ветвь 1".

 Проверяется, что список х15 непуст. Затем рассматриваются два
 случая: эле\-мент х14 определяет выделенную задачу либо выделенную
 полосу.

 Если х14 определяет задачу, то находится ее номер х16 в
 рассматриваемом списке задач. Находится узел х21 этой задачи,
 и предпринимается регистрация термов списка х15 в ее посылках
 (если еще не введена целевая установка задачи) либо в ее
 условиях (пока - только в файла задачника). Затем - переход через
 "ветвь 2".

 Находится тройка х17 для выделенной задачи в наборе х4, и из
 нее извлекается сама задача х18. Предпринимается вставка термов
 набора х15 в задачу х18 - так же, как это было сделано в файлах
 задачника. В случае условия задачи на доказательство либо
 преобразование происходит замена старой версии условия на первый
 терм набора х15 (остальные термы из х15 здесь не используются).
 Переменной х19 присваивается список информационных элементов полос
 изо\-бра\-же\-ния задачи х18. Этот список просматривается для
 определения вхожде\-ния х21 в него того элемента, после которого
 будут вставляться термы. Пе\-ре\-мен\-ная х20 при этом играет роль
 индикатора перехода через полосу целевой установки: до нее она
 равна 0, а затем 1. Далее - переход через "ветвь 2". Здесь
 проверяется, не имеет ли места работа с пустым бланком задачи.
 Если это так, то в х19 отбрасывается вертикальный 19-пиксельный
 пробел. Затем - пе\-ре\-ход через "ветвь 1".

 Создается список х22 информационных элементов полос изображения
 для тер\-мов набора х15, и находится результат х23 вставки этого
 списка в набор х19 после вхождения х21. В тройке х17 набор х19
 заменяется на х23. В зависимости от того, был ли прорисован
 элемент по вхождению х21, выполняется подготовка к дорисовке, и
 затем - откат к дорисовке. Перед откатом вводится коммента\-рий
 (автоклавиатура $\ldots$), инициирующий нажатие после дорисовки
 клавиши пробела, сбрасывающей все выделения.

 Если х14 определяет не задачу, а полосу изображения, то
 выполняется похо\-жая последовательность действий. Для уточнения
 того, добавляются ли термы к условиям или к посылкам задачи,
 находится число х22 информационных элементов типа "набор" \ либо
 "слово", предшествовавших элементу выделенной полосы. При х22 = 0
 термы относятся к посылкам, иначе - к условиям.

 \item х10 = "транзитпереход". Нажата клавиша Ctr-Ins для
 перенесения выде\-лен\-но\-го терма на новое место. Находится
 комментарий (смполоса $\ldots$), определяющий список х13 выделенных
 объектов. Проверяется, что таких объектов ровно два, причем
 первый из них - полоса, в которой прорисован терм (его нужно пере\-нес\-ти),
 а второй - задача либо полоса (куда будет перенесен терм). Находятся
 тройка х16 набора х4, соответствующая второму выделенному объекту,
 и список х17 информационных элементов полос изображения этой тройки.
 Проверяется, что если второй выделенный объект - полоса, то
 ей предшествует (в той же самой задаче) не более одной полосы
 типа "набор" \ либо "слово". Комментарий (смполоса $\ldots$)
 удаляется. Определяется ссылка х23 на узел той задачи, из которой
 берется переносимый на новое место терм. Переменной х25
 при\-сва\-и\-ва\-ет\-ся эта задача, и находится список х26 информационных
 элементов ее по\-лос изображения. Проверяется, что выделенная
 полоса, определяющая перено\-си\-мый терм, имеет не более одной
 предшествующей полосы типа "набор" \ либо "слово". Находится
 число х29 информационных элементов в х26, пред\-шес\-тву\-ю\-щих элементу
 выделенной полосы и определяющих тот же самый терм. Это число
 нужно для идентификации удаляемого терма в списке посылок (х28 = 0)
 либо условий (х28 = 1). Далее предпринимается исключение
 переносимого терма из представления задачи х25 в задачнике.
 Затем - откат к оператору "ветвь 2".

 Находится ссылка х22 на узел задачи, в которую переносится терм;
 переменной х24 присваивается сам этот терм. Если задача была
 выделена целиком, то предпринимается регистрация х24 в конце
 списка условий, а если целевая ус\-та\-нов\-ка задачи еще не введена,
 то - списка посылок. Если был выделен терм задачи, то х24
 регистрируется перед соответствующей посылкой либо условием
 (аналогично тому, как это делалось при вставке группы термов).
 Все изменения затрагивают здесь только файлы задачника. Затем -
 откат к оператору "ветвь 1".

 В наборе х4 оставляется только тройка, к которой относится первый
 про\-ри\-со\-ван\-ный на экране элемент, причем эта повторно считыается из
 задачника; экран расчищается; значения х6, х7, х9 переустанавливаются
 для дорисовки начиная с первого ранее прорисованного элемента, и
 откат к дорисовке.

 \item х10 = "Стандплюс" \ или х10 = "Обобщподст". Нажата клавиша
 "к" \ либо "Ctr-к" \ (в обоих случаях кир.) для копирования
 выделенной задачи либо перенесения ее на новое место. Находится
 комментарий (смполоса $\ldots$) и проверяется, что он определяет
 выделение не более чем двух объектов, причем оба эти объекта -
 задачи. Комментарий удаляется, и находится ссылка х20 на
 узел первой из задач (она должна быть скопирована либо перенесена
 на новое место).

 Сначала расматривается случай, когда выделен один объект (список х13
 имеет длину 1). Тогда копирование либо перенесение происходит в
 конец списка за\-дач. Проверяется, что последняя тройка набора х4
 относится к последней зада\-че списка. Выбирается случайным образом
 логический символ х27, в статье ко\-то\-ро\-го будет введен новый узел
 задачи, и такой узел х29 вводится; х30 - его номер. В оглавлении
 задачника ссылка на новый узел заносится в конец рассматриваемого
 списка задач; создается встречная ссылка из узла на ог\-лав\-ле\-ние, и в
 новом узле копируется представление задачи узла х20 (перенесение
 задачи выполняется последовательным копированием и удалением).
 Пред\-при\-ни\-ма\-ется считывание только что созданной задачи, и переменной
 х4 при\-сва\-и\-ва\-ет\-ся одноэлементный набор из считанной тройки. Затем -
 откат к оператору "ветвь 2".

 Если выделены две задачи, то переход через "иначе 3", где
 переменной х22 присваивается ссылка на вторую задачу, а переменной
 х23 - метка перехода к ней. Проверяется, что вторая задача
 относится к текущему списку задач. В этом списке увеличиваются на
 1 номера меток перехода к задачам, начиная с метки х23. Сначала
 это делается в возвратных ссылках на оглавление из узлов задач, а затем
 (после перехода через "ветвь 1") - в самом оглавлении. Далее, как
 и выше, выбирается случайным образом логический символ х27, в
 статье которого вводится новый узел задачи х29. Ссылка на новый
 узел задачи из оглавления делается по метке х23; прочие действия
 аналогичны действиям для одноэлементного х13. Далее, как и выше,
 переход к оператору "ветвь 2".

 Здесь сначала рассматривается случай перенесения задачи, в
 котором, после регистрации копии задачи, нужно еще удалить исходный
 ее экземпляр. Если задача переносится на новое место в рамках одного
 и того же списка задач, то за счет вставки копии номер ее удаляемого
 экземпляра может увеличиться на 1. Поэтому сначала уточняется номер
 удаляемой задачи списка, и лишь затем выполняются действия по
 удалению. Далее - откат к перерисовке.

 \item х10 = "Текзадача". Нажата клавиша Ctr-F4 для сброса информации
 об ответе на выделенную задачу, полученном при предыдущем запуске
 ее решения. На\-хо\-дится комментарий (смполоса $\ldots$) и
 проверяется, что в нем выделена един\-ствен\-ная задача; определяется
 тройка х16 этой задачи в наборе х4. Комментарий (смполоса
 $\ldots$) удаляется. Проверяется, что верхняя линия задачи
 прорисована на экране. Находится ссылка х21 на узел задачи, и
 удаляются, если они есть, логические терминалы "ответ" \ и
 "время" \ данного узла. Из набора х4 удаляются все тройки, следующие
 за тройкой х16. Повторно считывается из задачника выделенная задача, и
 тройка х16 заменяется на новую свою версию. Фактически так из нее
 удаляются информационные элементы полос, в которых про\-ри\-со\-вы\-ва\-лись
 ответ и данные о трудоемкости решения. Экран расчищается начиная с
 верхней линии выделенной задачи, значения х6, х7, х9 корректируются
 для дорисовки, и откат к дорисовке.

 \item х10 = "внешконъюнкция". Нажата клавиша "курсор вправо" \
 для входа в вы\-де\-ле\-ние подтерма выделенного терма. Находится
 комментарий (смполоса $A$), и рассматривается последний
 элемент х14 набора $A$. Определяется тройка х15 набора х4,
 соответствующая задаче, к которой относится выделенный элемент х14.

 Если длина набора х14 равна 4, то есть выделена полоса изображения
 задачи, то находитя информационный элемент х17 данной полосы и
 проверяется, что он имеет заголовок "терм". В случае прорисовки
 терма формульным редактором переменной х16 присваивается пара
 (терм - корень дерева указателей для про\-ри\-сов\-ки терма); в случае
 прорисовки его текстовым редактором переменной х16 присваивается
 тройка (терм - 0 - строка для начала прорисовки).

 Если длина набора х14 равна 5, то находится информационный
 элемент х17 полосы изображения, к которой относится выделенный
 элемент, и проверяется, что он имеет заголовок "набор". В х17
 находится тройка х18, соответствующая выделенному элементу
 полосы, и проверяется, что она имеет заголовок "терм". Если терм
 тройки х18 прорисовывается формульным редактором, то пе\-ре\-мен\-ной
 х16 присваивается пара (терм - корень дерева указателей), иначе -
 тройка (терм - столбец начала прорисовки - строка начала
 прорисовки).

 После того, как значение переменной х16 определилось для двух
 указанных выше случаев (изначально эта переменная была
 инициализирована нулем) - откат к оператору "ветвь 2".

 Сначала рассматривается случай прорисовки терма формульным
 редактором; здесь длина набора х16 равна 2. Оператор
 "формоперанды" \ определяет мак\-си\-маль\-ные по включению допускающие
 независимую прорисовку формульным редактором собственные подтермы
 терма $T$ из х16 и присваивает переменной х17 набор пар (корень дерева
 указателей для прорисовки подтерма - вхождение подтерма). В
 стандартных ситуациях данные подтермы суть просто корневые
 операнды терма $T$. Инициализируется стэк х18 просмотра подтермов
 терма $T$; в него заносится пара (выделенный подтерм списка х17 -
 список х17). Пос\-ле\-до\-ва\-тель\-ность пар стэка х18 (просматриваемых с конца
 к началу) будет определять путь в терме $T$ к текущему выделенному
 подтерму. Терм $T$ при выделении был перекрашен в светло-синий цвет;
 теперь он обратно перекрашивается опе\-ра\-то\-ром "блокредактора" \ в
 черный цвет. Переменной х21 присваивается вхождение заголовка
 терма $T$ (далее эта переменная будет указывать вхождение
 вы\-де\-лен\-ного подтерма). Затем - оператор "повторение", к которому
 будут происходить откаты при смене выделенного подтерма.

 Переменной х22 присваивается пара (корень дерева указателей для
 прорисовки подтерма - вхождение подтерма) для того подтерма,
 который выделен согласно первому элементу стэка х18; х23
 становится равно первому элементу пары х22, а х24 - второму.
 Переменной х21 переприсваивается значение х24. Подтерм
 перекрашивается в светло-синий цвет. Переменной х27 присваивается
 вхожде\-ние пары х22 в список, перечисляющий такие пары для
 текущего слоя подтер\-мов. Далее - оператор "повторение", к
 которому будут происходить откаты при обработке команд просмотра
 подтермов. Запрашивается очередная такая команда х28.
 Рассматриваются следующие подслучаи:

  а) х28 - "внешсумма" \ либо "внешконъюнкция" \ либо
  "циклвариантов". Со\-от\-вет\-ственно, нажаты клавиша "курсор вверх" \
  для возвращения к надтерму, либо клавиши "курсор вправо"; "курсор
  влево" \ для смены подтерма в одном слое. Восстанавливается черный
  цвет ранее выделенного подтерма, корректи\-ру\-ет\-ся необходимым
  образом стэк х18, и откат к перекраске нового выделенного терма.
  В том случае, когда надтерм отсутствовал, первая из указанных
  ко\-манд приводит к обрыву выделения подтерма и восстановлению
  изначального светло-голубого цвета всего терма $T$.

  б) х28 - "подстановка". Нажата клавиша "курсор вниз" \ для
  перехода к сле\-ду\-ю\-ще\-му слою подтермов (обычно - операндов).
  Корректируется стэк х18; текущий выделенный подтерм
  перекрашивается обратно в черный цвет, и откат к пе\-ре\-крас\-ке
  нового выделенного подтерма (то есть первого из списка подтермов
  нового слоя).

  в) Нажата какая-либо клавиша, отличная от перечисленных выше.
  Выделение подтерма обрывается и к определяющему выделенный
  элемент набору х14 до\-бав\-ля\-ет\-ся указатель вхождения выделенного
  подтерма.

  \par\medskip

  В случае прорисовки терма текстовым редактором для выделения
  подтерма используется оператор "просмотртерма", перед обращением
  к которому соз\-да\-ет\-ся комментарий (указательвхождения 0). Через
  этот комментарий пе\-ре\-сы\-ла\-ет\-ся указатель выделенного вхождения.
  Кроме того, данный комментарий инициирует выход по истинностному
  значению "ложь" \ из оператора "прос\-мотр\-терма" \ при нажатии любой
  клавиши, кроме клавиш выделения подтермов.

  \item х10 = "усмчисло". Нажата клавиша "с" \ для включения либо
  выключения ре\-жи\-ма просмотра выделенного терма в скобочной записи.
  Находится ин\-фор\-ма\-ционный элемент (смполоса $\ldots$) и
  проверяется, что он выделяет единственный объект, представляющий
  собой полосу изображения задачи. Находится тройка х16 набора х4,
  соответствующая этой задаче. Проверяется, что выделенная полоса
  изображения определяется информационным элементом х18, имеющим
  заголовок "терм" \ и что она прорисована на экране. Если
  выделенный терм был прорисован формульным редактором, то
  вводится комментарий "терм" \ к посылкам исходной задачи. Все
  информационные элементы полос изображения рассматриваемой
  задачи, начиная с х18, помечаются как непрорисованные.
  Предпринимается обращение к оператору "высотаполосы",
  корректирующему информационный элемент х18 для прорисовки терма
  с учетом наличия или отсутствия комментария "терм" \ (в первом
  случае в х18 вводится информация для прорисовки текстовым редактором,
  во втором случае - формульным). Ком\-мен\-та\-рий "терм", если он был
  введен, удаляется. Экран расчищается вниз от выделенной полосы;
  оператор "смполоса" \ прорисовывает эту полосу согласно
  скорректированному элементу х18. Затем помечаются как
  непрорисованные все информационные элементы полос изображения
  задач, идущих после рас\-смат\-ри\-ва\-емой задачи; х6, х7, х9
  корректируются для дорисовки, и откат к дорисовке.

  \item х10 = "блокприемов". Нажата клавиша "Ctr-курсор вверх" \
  для просмотра частично прорисованной в верхней части экрана задачи
  с ее начала, либо (если экран уже начинается с верхней отделяющей
  задачу линии) для перехода к просмотру предыдущей задачи.
  Находятся первая тройка х11 набора х4 и спи\-сок х12 ее
  информационных элементов полос изображения. Если первый из этих
  элементов не прорисован на экране, то экран расчищается; х6, х7, х9
  кор\-рек\-ти\-ру\-ют\-ся на дорисовку начиная с первого элемента
  набора х12; все информа\-ци\-он\-ные элементы полос изображения в х4
  помечаются как непрорисованные, и откат к дорисовке. Если же первый
  элемент набора х12 про\-ри\-со\-ван, то про\-ве\-ря\-ет\-ся, что номер х13 задачи
  тройки х11 больше 1; из задачника считывается предыдущая задача, и
  переменной х4 присваивается одноэлементный набор, образованный
  тройкой х14 считанной задачи. Далее - откат к перерисовке.

  \item х10 = "символтеоремы". Нажата клавиша "Ctr-курсор вниз" \
  для перехода к просмотру задачи, следующей за той задачей,
  которая частично или полностью прорисована в верхней части
  экрана. Если набор х4 одноэлементный, то на\-хо\-дит\-ся номер х11
  задачи, представленной в этом наборе. Если в списке задач
  имеется задача с номером х12, на единицу большим номера х11, то
  эта задача считывается, и х4 заменяется на одноэлементный набор,
  образованный тройкой х13 считанной задачи. Затем - откат к
  перерисовке. Если же набор х4 имеет более одного элемента, то
  его первый элемент отбрасывается; экран расчища\-ет\-ся; значения
  х6, х7, х9 корректируются для дорисовки начиная с верхней линии
  первой из оставшихся в х4 задач; все информационные элементы
  полос изображения помечаются как непрорисованные, и откат к
  дорисовке.

  \item х10 - один из символов "деление" \ (клавиша "а"),
  "частичныйответ" \ (кла\-ви\-ша "о"), "числитель" (клавиша "р")\ ,
  "внешнийквантор" \ (клавиша "г"), "минимум" \ (клавиша "л"),
  "область" \ (клавиша "Л"), "оператор" \ (клавиша "Ctr-р"),
  "на\-ту\-ральное" \ (клавиша "Ш"), ","  \ (клавиша "Р"),
  "прообраз" \ (клавиша "П"), "новыесвязки" \ (клавиша "и"),
  "пе\-ре\-обо\-зна\-чение" \ (клавиша "Ctr-п"),
   "числ\-зна\-чение" \ (клавиша "Ч"), "дроб\-на\-я\-ве\-ли\-чина"
   \ (клавиша "Ctr-ч").

  Все обозначения клавиш здесь взяты на основе кириллицы. Эти
  команды за\-пус\-ка\-ют процесс решения выделенной задачи (при отсутствия
  выделения - задачи, к которой относится первая сверху отделяющая
  горизонтальная линия) в различных режимах. Напомним эти режимы:

   а) клавиша "а" \ - решение с выходом в отладчик ЛОСа на шаге, номер
  которого для данной задачи ранее был сохранен путем нажатия
  клавиши "щ" \ в процессе трассировки;

  б) клавиша "о" \ - решение без трассировки;

  в) клавиша "р" \ - решение с трассировкой;

  г) клавиша "г" \ - переход в оглавление ГЕНОЛОГ'а для выбора
  приема пре\-ры\-ва\-ния и запуска решения;

  д) клавиша "л" \ - переход в оглавление программ для выбора
  точки прерыва\-ния и запуска решения;

  е) клавиша "Л" \ - указание логического символа, при обращении к
  программе которого следует выйти в отладчик ЛОСа, и запуск
  решения;

  ж) клавиша "Ctr-р" \ - решение задачи на текстовый анализ с
  полным показом как синтаксического разбора, так и процесса
  решения.

  з) клавиша "Ш" \ - указание номера шага работы интерпретатора
  ЛОСа, на котором следует выходить в отладчик ЛОСа, и запуск
  решения;

  и) клавиша "Р" \ - двойное решение задачи: сначала в обычном режиме,
  с оп\-ре\-де\-ле\-ни\-ем по окончании решения тех шагов, которые оказались
  ненужными; при повторном решении происходит пошаговый показ
  решения с пропуском этих шагов;

  к) клавиша "П" \ - решение задачи с созданием технического
  протокола;

  л) клавиша "и" \ - запуск игровой задачи с ручным вводом всех
  ходов (игра нескольких игроков без решателя либо пошаговый просмотр
  известной партии);

  м) клавиша "Ctr-п" \ - запуск решения задачи до выявления
  отличия от тех\-ни\-чес\-ко\-го протокола;

  н) клавиша "Ч" \ - запуск решения геометрической задачи для
  построения чер\-те\-жа после первых шагов решения задачи;

  о) клавиша "Ctr-ч" \ - запуск решения геометрической задачи для
  пост\-ро\-е\-ния чертежа по исходному условию задачи.

  \par\medskip

 Программа обработки указанных выше команд прежде всего проверяет,
 не реализуется ли оператор "списокзадач" \ внутри внешней
 программы оператора "цепьзадач". При наличии такой программы
 выполнение команд блокируется, так как в этом случае обращение к
 просмотру списка задач имеет место из процесса трассировки ранее
 запущенного решения некоторой задачи.

 Далее предпринимается определение той задачи х11, к которой относится
 ко\-ман\-да запуска решения. Сначала переменным х11 и х12 присваиваются
 нули; впоследствии х12 станет номером выбранной задачи в списке
 задач.

 При наличии комментария (транскоммент $\ldots$) задача х11 определяется
 сразу - это первая задача списка х4. Напомним ситуацию, в которой
 применяется такой комментарий. При пошаговом просмотре решения задачи
 очередное пре\-об\-ра\-зо\-вание сопровождается списком вспомогательных
 задач, которые были решены для выполнения данного преобразования.
 Интерфейс предоставляет две возможности для пошагового просмотра решения
 вспомогательной задачи - либо запуск этого решения в контексте
 прерванного на текущем шаге реше\-ния основной задачи, либо откат
 к повторному решению задачи из списка задач, с прерыванием перед
 решением данной вспомогательной задачи. Во втором случае, после
 внутреннего перезапуска, и возникает комментарий
 (транс\-ком\-мент $A_1 \ A_2$) - он указывает номер $A_1$ шага, на котором
 следует устанав\-ли\-вать прерывание при обращении к решению задачи
 типа $A_2$ (она и будет рас\-смат\-ри\-ва\-емой вспомогательной задачей).

 Если комментария (транскоммент $\ldots$) нет, то проверяется
 наличие выделенной задачи. Если такая задача есть, то решаться
 будет она. Перед запуском решения эта задача обрабатывается
 оператором "завершзадачи", что делает избы\-точ\-ной указанную выше
 команду "Home". Исключение составляют обобщенные задачи с
 заголовками "текстформ" \ и "структура" \ - соответственно,
 анализ русского текста и численное моделирование процесса.

 Далее, если задача не выделена, но имеется комментарий
 (списокзадач $\ldots$), указывающий на последнюю измененную
 задачу, то в случае, когда эта задача относится к текущему списку
 задач, решаться будет она. Наконец, во всех остальных случаях решается
 та задача, которая определяется первой про\-ри\-со\-ван\-ной на экране
 верхней отделяющей линией. Во всех этих случаях к выб\-ран\-ной для
 решения задаче применяется оператор "завершзадачи".

 После переопределения значений х11 и х12 проверяется, что х11
 не равно 0 и не является недоопределенным бланком задачи - то есть
 что заголовок х11 отличен от 0. В случае команды "новыесвязки" \
 проверяется, что х11 есть задача на исследование с целью
 "шахматы", причем вводится цель "смход" \ этой задачи,
 указывающая на режим разыгрываемой вручную партии двух игроков.
 Если не имеет место режим серийного решения задач из заданного
 раздела, то указа\-тель текущего пути в оглавлении задачника
 переустанавливается на выбранную для решения задачу.
 Далее - переход через "ветвь 1" \ к фрагменту, в котором
 осу\-щес\-т\-вля\-ется разветвление дальнейших действий в зависимости
 от типа за\-да\-чи.

 Прежде всего, рассматривается случай обычной задачи, имеющей тип
 "пре\-об\-ра\-зо\-вать", "доказать", "описать" \ либо "исследовать".

 Если обрабатываются команды построения чертежа "дробнаявеличина",
 "числ\-зна\-че\-ние", либо имеется комментарий "чертеж", указывающий на
 серийное построение чертежей для заданного раздела задачника, то
 задача х11 снаб\-жа\-ет\-ся целью ( в случае задачи на доказательство -
 комментарием) "чертеж". Для команды усиленного построения чертежа
 "числзначение" \ вводится так\-же цель либо комментарий
 "геомформат". Далее сбрасывается, если он был, ком\-мен\-та\-рий
 (геомредактор $\ldots$) к посылкам задачи х11 - при построении
 чертежа старая его версия не используется. Продолжение действий
 по запуску решения - через оператор "ветвь 2".

 Здесь задача х11 снабжается комментарием посылок
 (просмотрзадачи $A_1 \ A_2$), представляющим собой ее координаты
 в задачнике ($A_1$ - логический символ; $A_2$ - номер узла статьи
 символа $A_1$, являющегося узлом задачи). Затем - переход через
 "ветвь 1".

 Инициализируется нулем переменная х13 - она будет преобразована в
 номер шага работы интерпретатора, по достижении которого нужно выйти
 в отладчик ЛОСа. Переменной х14 присваивается исходная задача.
 Если х10 = "," \ (реше\-ние с пропуском показа неиспользуемых
 шагов), то вводится комментарий "см\-ис\-точ\-ник" \ к посылкам задачи
 х14, указывающий на режим двукратного ре\-ше\-ния с расчисткой
 выдаваемых на экран шагов. Затем переход через "ветвь 1".

 Сбрасываются все ранее введенные установки на прерывание. Далее
 рас\-смат\-ри\-ва\-ются следующие случаи:

 а) х10 = "числитель" \ (решение с трассировкой).
 Вводятся комментарий (пре\-ры\-ва\-ние решить) к задаче х11,
 который в начале ее решения инициирует ввод установки на
 трассировку по шагам решения данной задачи. Кроме того, вво\-дит\-ся
 комментарий (буфер пустоеслово) к посылкам исходной задачи, в
 кото\-ром будут накапливаться данные о вспомогательных задачах, решенных
 перед сра\-ба\-ты\-ва\-нием очередного приема. Подробнее о нем будет сказано
 в следующем разделе, посвященном пошаговому просмотру решения. Сразу
 заметим, что ряд связанных с этим комментарием действий выполняется
 на уровне интер\-пре\-та\-то\-ра ЛОСа. При наличии комментария (буфер
 $\ldots$) включаются процедуры отладчика, обеспечивающие
 обращение к пошаговому показу решения.

 б) х10 = "внешнийквантор" \ (установка прерывания через оглавление
 базы при\-е\-мов). Активируется 8-й информационный блок; текущий
 экран сохраняется в буфере, и находится корень оглавления базы
 приемов. Затем - оператор "пов\-то\-ре\-ние", к которому будут
 происходить откаты при возвращении из просмотра концевого пункта
 оглавления базы приемов в это оглавление. Комментарий (вид
 $\ldots$) к посылкам исходной задачи переустанавливается на
 оглавление базы приемов. Огранизуются обращение к оглавлению базы
 приемов, и вслед за этим - обращение к редактору приемов
 ГЕНОЛОГа (процедура "блокприемов") для просмотра выбранного
 концевого пункта оглавления. Если был выбран прием прерывания, то по
 выходе из редактора приемов появится комментарий "продолжение" \
 к посылкам исходной задачи. Кроме того, будет введен ком\-мен\-та\-рий
 (левыйкрай $A_1 \ A_2 \ A_3$) либо (начало $A_1 \ A_2 \ A_3$) к
 посылкам той же задачи. Здесь $(A_1, A_2, A_3)$ - ссылка на прием
 прерывания. Этот комментарий переда\-ет\-ся от исходной задачи задаче
 х11, причем заголовок "начало" \ заменяется на "контрольприема" \ и
 в начале набора добавляется логический символ "пре\-ры\-ва\-ние", который
 становится новым заголовком комментария. В начале реше\-ния задачи
 х11 на основе данного комментария будет создана установка на
 прерывание при обращении к указанному приему (для второго
 комментария - только в стэковом кадре задачи х11).

 в) х10 = "минимум" \ (установка прерывания через оглавление программ).
 Ак\-ти\-ви\-руется 9-й информационный блок; комментарий (вид $\ldots$)
 переустанав\-ли\-ва\-ет\-ся на оглавление программ; находится корень
 этого оглавления, и текущий экран сохраняется в буфере. Далее
 предпринимается обращение к оглавлению программ, и после выбора
 концевого пункта находится содержимое х18 его логического
 терминала. По х18 определяются логический символ $S$
 и номер $N$ оператора "прием($N$)", при достижении которого
 следует делать прерывание. Далее вводится комментарий
 (текоператор $S \ N$) к посылкам задачи х11; если $N$ - цифра,
 то она в комментарии преобразуется в одноэлементный набор. Этот
 комментарий в начале решения задачи х11 инициирует ввод уста\-нов\-ки
 на прерывание при достижении указанной контрольной точки.

 г) х10 = "прообраз" \ (решение с созданием технического
 протокола). Если от\-сут\-ству\-ет 4-й информационный блок (он
 используется для хранения технического протокола), то этот блок
 вводится. Его корневым объектом служит не каталог, а
 указатель-список. 4-й информационный блок активируется, и
 хранящийся в нем технический протокол (если он есть)
 сбрасываается. Затем предпринимаются уплотнение 4-го
 информационного блока и повторная его активация. Вводятся
 комментарий (прерывание решить) к посылкам задачи х11 и
 комментарий (тех\-про\-то\-кол (новый) $\ldots$) к посылкам исходной задачи.
 Первый из них инициирует установку на прерывания по шагам
 решения задачи х11, но в сочетании со вторым, используемым как
 вспомогательный регистр процесса создания тех\-ни\-чес\-ко\-го протокола,
 эта установка приведет лишь к сохранению в техническом протоколе
 кадров решения, без вывода их на экран.

 д) х10 = "переобозначение" \ (решение до выявления отличия от
 технического протокола). Проверяется наличие 4-го информационного
 блока и наличие тех\-ни\-чес\-кого протокола в этом блоке. Затем
 вводятся комментарий (прерывание решить) к посылкам задачи и
 комментарии (техпротокол (различны) $\ldots$), (бу\-фер
 пустоеслово) к посылкам исходной задачи.

 е) х10 = "область" \ (решение с прерыванием при обращении к
 программе за\-дан\-но\-го логического символа). Текущий экран
 сохраняется в буфере; в левом нижнем углу экрана прорисовывается
 текст "Логический символ:", и под ним реализуется обращение к
 текстовому редактору для ввода названия логического символа х21.
 Затем сбрасываются все установки на прерывания и водится
 ус\-та\-нов\-ка на прерывание при обращении к программе символа х21.
 Экран вос\-ста\-нав\-ли\-вается.

 ж) х10 = "натуральное" \ (решение с прерыванием при достижении
 заданного шага работы интерпретатора). Если имеется комментарий
 (транскоммент $A_1 \ A_2$) к посылкам исходной задачи, то номер
 шага прерывания берется из него: этот номер полагается равным
 уменьшенному на 100 числу $A_1$ (поправка на воз\-мож\-ные
 рассогласования в подсчете шагов при использовании режима
 трассировки и без этого режима). Номер шага прерывания
 передается переменной х13 (ус\-та\-нов\-ка прерывания по х13 будет
 выполнена непосредственно перед началом решения, чтобы сделать ее
 не зависящей от трудоемкости дальнейших процедур, предваряющих
 это начало). При отсутствии комментария (транскоммент $\ldots$)
 для ввода номера шага прерывания предпринимается обращение к
 текстовому редактору; введенное значение передается переменной
 х13.

 з) х10 = "деление" \ (решение с прерыванием по достижении точки,
 за\-фик\-си\-ро\-ван\-ной на предыдущем запуске с помощью клавиши "щ").
 Находится ссылка х19 на узел задачи х11, и переменной х21
 присваивается содержимое логичес\-ко\-го терминала "повторение" \
  этого узла (если он есть). Находится номер х23 шага, сохраненный
 в данном терминале, и переменной х13 присваивается ре\-зуль\-тат
 вычитания из х23 единицы (именно при такой коррекции обеспечи\-ва\-ет\-ся
 точное восстановление ситуации, имевшей место при нажатии "щ").

 \par\medskip

 После рассмотрения перечисленных выше случаев - откат к оператору
 "ветвь 1", расположенному непосредственно перед оператором
 "равно(х10 числитель)".

 Если исходная задача имеет комментарий "внешконтроль",
 указывающий на режим серийного решения задач из некоторого
 раздела задачника, со\-про\-вож\-да\-е\-мый анализом холостого хода
 приемов, то проверяется наличие комментария (выписка $\ldots$) к
 посылкам исходной задачи, и если такого комментария нет, то вводится
 комментарий (выписка пустоеслово). Включается режим учета
 хо\-лос\-то\-го хода приемов: при откате к оператору
 "контрольприема($\ldots$)", обозна\-ча\-ю\-ще\-му начало некоторого
 приема, счетчик холостого хода данного приема, создаваемый в
 комментарии (выписка $\ldots$), увеличивается на число тысяч
 ша\-гов работы интерпретатора, затраченных на попытку применения
 приема.

 Если исходная задача имеет комментарий "задачи", указывающий на
 нали\-чие серийного решения задач из некоторого раздела задачника,
 то находится список х15 всех логических символов, встречающихся
 в посылках и условиях задачи х11, и создается комментарий (задачи
 х15 пустоеслово) к посылкам исходной задачи. В этом комментарии
 будет накапливаться информация о всех логических символах,
 возникающих в процессе решения задачи, а также о всех приемах,
 которые применяются хотя бы однажды. По окончании решения эта
 информация будет зарегистрирована в архиве задачника; она
 используется при поиске в задачнике.

 Если в буфере задачника введены разделы, перечисляющие задачи,
 в которых срабатывают заданные приемы, то оператор "буферзадачника" \
 создает ком\-мен\-та\-рий (список $\ldots$) для учета срабатываний этих
 приемов в буфере задачника.

 По комментарию (просмотрзадачи $\ldots$) к посылкам задачи х11 находится
 ссыл\-ка х19 на узел этой задачи. Если имеется логический терминал
 "блок" \ данного узла, то переменной х21 присваивается его
 содержимое - список термов "при\-ем($\ldots$)", перечисляющий те
 приемы ГЕНОЛОГа, применение теорем кото\-рых должно быть заблокировано
 при решении задачи х11. Эта блокировка дос\-ти\-га\-ет\-ся с помощью
 оператора "трассировка(фильтр $\ldots$)". После ее установки
 интерпретатор ЛОСа отслеживает попытки обращения к оператору
 "кон\-т\-роль\-приема" \ для заблокированных приемов и делает результат
 обращения ложным.

 Инициализируется пустым словом переменная х15, которой затем
 пере\-при\-сва\-ивается содержимое логического терминала, достижимого
 из корня 2-го ин\-фор\-ма\-ционного блока по меткам "трассировка",
 "трассировка". Это содержимое представляет собой набор установок
 на режим трассировки решения задачи (ручной либо автоматический
 вход в подпроцессы; пропуск приемов некоторых типов и т.п.).
 На его основе создается либо корректируется комментарий
 (трас\-с\-на\-бор х15) к посылкам исходной задачи, который учитывается
 отладчиком ЛОСа при пошаговом показе решения.

 Если х10 = "," \ (двойное решение задачи с отбрасыванием ненужных
 действий при пошаговом показе), то создается комментарий (Копия
 $\ldots$) к посылкам исходной задачи, в котором сохраняется копия
 исходной версии задачи х11 для повторного запуска решения.

 Если логический терминал, достижимый из корня 2-го
 информационного блока по меткам "приемы", "стоп", непуст, то для
 каждого находящегося в нем терма "прием($A_1 \ A_2 \ A_3$)",
 ссылающегося на прием, применение которого блокируется, создается
 комментарий (приемы $A_1 \ A_2 \ A_3$) к посылкам исходной
 задачи. Этот комментарий обеспечивает блокировку при обращении
 приема к процедуре, реализующей собственно изменение задачи.

 Если в серийном решении задач встречается задача на исследование,
 то она пропускается (такие задачи обычно определяют игровые
 процессы).

 Наконец, начинающийся с оператора "прием(3 8)" \ фрагмент, в
 котором соб\-ствен\-но происходит обращение к решению задачи. Если не
 имеет места серий\-ный режим решения задач и не происходит
 построение чертежа, то в верхней части экрана вводится меню
 интерфейса пошагового просмотра решения. Оп\-ре\-де\-ляется начальный
 момент запуска решения (х15 - часы, х16 - минуты, х17 - секунды,
 х18 - сотые доли секунды). Устанавливается максимальный уровень
 16 для решения задачи х11 (в процессе развития базы приемов этот
 уровень несколько раз повышался, и при необходимости его можно
 будет повышать и далее; впрочем, вряд ли он будет увеличен сколь-
 нибудь значительным образом). Определяется номер х19 текущего
 шага работы интерпретатора и устанавливается прерывание по достижении
 шага с номером х13 + х19 (случай х13 = 0 означает, что прерывание
 данного типа отсутствует, так как шаг х19 уже достигнут).
 Вводится комментарий (трассировка х19 0), сохраняющий номер х19
 начального шага запуска задачи и указывающий, что при работе с
 от\-лад\-чи\-ком и трассировке будут предприниматься попытки прорисовки
 термов в стандартной математической записи. После этого предпринимается
 обращение к решению задачи х11, и переменной х20 присваивается ответ
 (либо "отказ"), полученный при решении.

 Определяется момент окончания решения: переменным х21 - х24
 присваиваются, соответственно, часы, минуты, секунды и сотые доли
 секунды. Предприни\-ма\-ет\-ся обращение к оператору "учетответа",
 выполняющему регистрацию ре\-зуль\-та\-тов решения (ответ,
 трудоемкость, данные для архива задачника) в задачнике.
 Оператор "буферзадачника" \ регистрирует решавшуюся задачу в
 буфере за\-дач\-ни\-ка, если при ее решении сработал прием, для которого
 в этом буфере был введен подраздел.

 Если исходная задача имела комментарий "смисточник", указывающий
 на ре\-жим двойного запуска решения с исключением из пошагового
 показа не\-ис\-поль\-зо\-ван\-ных приемов, то реализуется повторный запуск
 решения задачи - на этот раз с фактическим показом шагов решения.
 Сохраненный после пер\-во\-го запуска комментарий (повтор $\ldots$)
 позволяет при этом определять, было ли использовано введенное при
 срабатывании приема утверждение. По заверше\-нии трассировки
 происходит откат к просмотру списка задач. Для этого в логический
 терминал "метка" \ корневого каталога задачника заносится терм
 "задачи(5)", обеспечивающий вход в задачник при перезапуске, и
 осущест\-вля\-ет\-ся внутренний перезапуск системы. Предварительно текущий
 путь за\-дач\-ни\-ка устанавливается на решавшуюся задачу.

 Если исходная задача имеет комментарий (техпротокол $\ldots$), то
 пред\-при\-ни\-ма\-ет\-ся уплотнение 4-го информационного блока. Затем
 прорисовываются из\-вле\-ка\-е\-мые из указанного комментария данные о 5
 наибольших замедлениях на промежутках между срабатываниями приемов
 текущего решения по сравнению с решением, хранящимся в техническом
 протоколе.

 Если имеется комментарий "задачи", указывающий на режим серийного
 ре\-ше\-ния, то происходит внутренний перезапуск.

 Если решалась задача на преобразование, имеющая цель "график",
 то есть после выполнения преобразований условия задачи нужно
 войти в интерфейс построения и просмотра графика, то реализуется
 обращение к выполняющей эти действия процедуре "график". По
 окончании работы с графиком - пе\-ре\-мен\-ной х4 присваивается
 одноэлементый набор, соответствующей текущей задаче построения
 графика, и откат к перерисовке.

 В логический терминал "метка" \ корневого каталога задачника
 заносится терм, обеспечивающий возвращение к просмотру задачника
 (в случае задачи на ис\-сле\-до\-вание - к предоставлению хода игроку)
 после внутреннего перезапуска, и текущий путь оглавления
 задачника устанавливается по решавшейся задаче. В случае задачи
 на исследование (игровая задача) после этого предпринимает\-ся
 внутренний перезапуск.

 Определяется время, затраченное на решение - в минутах и
 секундах, - и де\-ся\-тич\-ные записи этих величин регистрируются в
 логическом терминале, до\-сти\-жи\-мом из корневого указателя задачника
 по меткам "сброс", "время". Они будут использованы для прорисовки
 ответа после внутреннего перезапуска. Далее - внутренний
 перезапуск.

 \par\medskip

 Кроме описанных выше действий, выполняемых при решении обычной
 задачи, предусмотрены действия для решения извлекаемых из
 задачника "обобщен\-ных" \ задач.

 Прежде всего, это задачи на текстовый анализ. Они представляют собой
 тройки (текстформ $A_1 \ A_2$), где $A_1$ - пара (логический символ -
 номер узла статьи этого символа), ссылающаяся на узел задачи в
 задачнике; $A_2$ - текстформульная структура, определяющая считанный
 из задачника текст задачи. В зависимости от команды ("Ctr-р" \ либо
 "р"), вводится комментарий (схемафразы 0) либо (схемафразы 3),
 определяющий режим трассировки. Собственно решение за\-да\-чи на
 анализ текста выполняется процедурой "текстоваязадача". После
 по\-лу\-че\-ния ответа и регистрации его в задачнике - экран расчищается, и откат к дорисовке решавшейся
 задачи начиная с текста ответа.

 Наконец, для работы с обобщенной задачей на моделирование процесса
 (набор с заголовком "структура") используется оператор "структура".
 Он реализует интерфейс просмотра и редактирования логического описания
 моделируемого объекта (это описание имеет иерархический характер и
 требует специального интерфейса; в просматриваемом списке задач на
 экран выводится лишь текст концевого пункта оглавления, являющийся
 названием объекта), а также за\-пус\-ка\-ет процесс моделирования.

 \item х10 = "схемаидентификации". Нажата клавиша "ш" \ для
 перехода к про\-смот\-ру следующего элемента списка просматриваемых
 задач. Такой список фор\-ми\-ру\-ет\-ся заранее различными интерфейсами
 (например, для просмотра задач с измененным ответом либо
 имеющих наибольшие замедления, и т.п.) и хранится в комментарии
 (подборнеизвестных $\ldots$). Программа создает комментарий
 (ав\-то\-кла\-ви\-атура $\ldots$) для повторного нажатия клавиши "ш" \
 и выводит во внешнюю программу оглавления задачника, где нажатие
 "ш" \ обеспечивает переход к следующему элементу списка.

 \item х10 = "старшийчлен". Нажата клавиша "э" \ для просмотра и
 редактирова\-ния комментариев к задаче либо ее выделенному терму.
 Находится комментарий (смполоса $\ldots$), определяющий
 выделенные объекты; проверяется, что такой объект единственный, и
 переменной х14 присваивается набор, выделяющий этот объект.

 Сначала рассматривается случай, когда х14 - набор длины 2,
 выделяющий некоторую задачу. Переменной х19 присваивается ссылка
 на узел этой задачи в задачнике; переменной х21 - список
 комментариев к задаче. Экран сохраняется в буфере, и
 предпринимается обращение к оператору "просмотрсписка", ко\-то\-ро\-му
 передается список комментариев. С помощью интерфейса указанного
 оператора осуществляется редактирование списка комментариев.
 При выходе из оператора "просмотрсписка" \ - восстанавливается
 экран и изменения ком\-мен\-та\-ри\-ев регистрируются в задачнике.

 Если набор х14 имеет длину 4, то проверяется, что информационный
 элемент х18 выделенной полосы изображения имеет заголовок терм.
 Для определения того, относится ли этот терм к посылкам или
 условиям задачи, подсчитывается число х19 предшествующих выделенной
 полосе полос изображения той же за\-да\-чи, имеющих тип "набор" \
 либо "слово" (0 - посылки, 1 - условия). Для иден\-ти\-фи\-кации
 вхождения выделенного терма в соответствующий список зада\-чи
 подсчитывается число х20 предшествующих выделенной полос изображения,
 в которых находится терм, совпадающий с выделенным; просмотр обрывается
 при обнаружении полосы, тип которой отличен от "терм". Находится узел
 задачи, к которой относится выделенный терм; дальнейшие действия
 ана\-ло\-гич\-ны первому случаю.

 \item х10 = "правмногоугольник". Нажата клавиша "я" \ для
 инициализации задачи на анализ текста. Предварительно был введен
 пустой бланк задачи.

 Сначала переменной х11 присваивается последняя тройка набора х4,
 пе\-ре\-мен\-ной х12 - номер задачи этой тройки в списке задача.
 Переменные х13 и х14 ини\-циа\-ли\-зи\-ру\-ют\-ся нулями. Если выделена
 единственная задача списка, то пе\-ре\-мен\-ной х11 переприсваивается
 ее тройка, х12 - соответствующий номер; х13 становится равно 1, а х14 -
 номеру строки, следующей за последней ис\-поль\-зо\-ванной для прорисовки
 выделенной задачи. Если никаких задач не выделено, причем
 последняя задача списка целиком прорисована на экране, то
 переменной х14 переприсваивается номер первой свободной строки.

 Далее - переход через "ветвь 2", где сначала проверяется, что х14
 отлично от 0, т.е. имел место один из указанных выше двух
 случаев. В случае пустого бланка задачи (он и должен здесь быть)
 х14 уменьшается на высоту вертикального 19-пиксельного пробела.
 Проверяется, что рассматриваемая задача х15 пред\-став\-ля\-ет собой
 пустой бланк. Переменной х16 присваивается пустая текст\-фор\-муль\-ная
 структура, и предпринимается обращение к оператору "текстформ" \
 для ввода условия задачи на анализ текста. Затем находится узел
 х22 рас\-смат\-ри\-ва\-е\-мо\-го бланка задачи; отбрасывается ветвь "задача"
 \ этого узла, и вводится ветвь "текстформ", содержащая введенное
 условие. Наконец, корректируется список информационных полос
 изображения тройки х11, и откат к перерисовке.

 \item х10 = "учетобоснований". Нажата клавиша Ctr-я для
 редактирования вы\-де\-лен\-ной задачи на анализ текста. Находится
 тройка х15 набора х4, соответствующая выделенной задаче, и
 проверяется, что ее текстформульная полоса прорисована на экране.
 Эта полоса повторно обрабатывается оператором "текстформ", и
 изменения регистрируются в задачнике.

 \item х10 = "группировки". Нажата клавиша End для возвращения в
 главное меню либо (при просмотре списка задач из трассировки) для
 возвращения в кадр трассировки. Если имеется внешняя (по цепочке
 обращений) процедура "цепь\-задач", т.е. происходит трассировка, то
 выход из текущей процедуры "спи\-сок\-за\-дач". Иначе - текущий путь в
 оглавлении задачника переустанавливается на первую из задач,
 верхняя линия которой прорисована на экране, и внутренний
 перезапуск.

 \item х10 = "заменазнака". Нажата клавиша "С" \ (кир.) для ввода
 либо отмены режима просмотра всех задач в скобочной записи.
 Соответственно, вводится либо удаляется определяющий такой режим
 комментарий "терм" \ к посылкам исходной задачи.

 \item х10 = "извлечениеварианта". Нажата клавиша "т" \ (кир.) для
 входа в ди\-а\-ло\-го\-вый блок установки режима трассировки.
 Сначала переменной х11 при\-сва\-и\-ва\-ет\-ся список логических символов -
 установок на трассировку, содержа\-щий\-ся в логическом терминале,
 достижимом из корня 2-го информационного блока по меткам
 "трассировка","трассировка". Затем создается структура данных х12
 блока диалога, обеспечивающего просмотр и изменение установок
 режима трассировки, и прорисовывается его пустая рамка.
 В начало буфера текстов заносится символ "+", который далее
 прорисовывается против тех пунктов блока диалога, для которых в х11
 имеется соответствующая установка. Про\-ис\-хо\-дит обращение к
 процедуре "диалог" \ для ввода команд диалога. Эти команды либо
 корректируют список х11 (с соответствующей прорисовкой либо
 удалением плюсов), либо, по завершении диалога по Enter,
 модифицируют содержимое логического терминала
 "трассировка","трассировка" \ корня 2-го ин\-фор\-ма\-ци\-он\-но\-го блока.

 \item х10 = "редакторответа". Нажата клавиша "Б" \ для просмотра
 и редактирования списка приемов, заблокированных при решении
 задачи. Переменной х11 при\-сва\-и\-ва\-ет\-ся номер в списке задач выделенной
 задачи, либо, если ее нет, номер первой из задач, верхняя линия
 которой прорисована на экране. Находит\-ся ссылка х18 на узел х11-й задачи
 и определяется содержимое х20 \ ее ло\-ги\-чес\-ко\-го терминала "блок". В этом
 терминале перечисляются ссылки "прием($A_1 \ A_2 \ A_3$)" \ на приемы,
 применение теорем которых должно быть заблокировано. Пе\-ре\-мен\-ной х21
 присваивается список этих теорем. Список х21 передается для
 ор\-га\-ни\-за\-ции просмотра оператору "просмотрсписка". Если при
 просмотре выбирает\-ся некоторая теорема, то далее предпринимается
 обращение к просмотру всех ее приемов оператором "блокприемов".
 Если при просмотре некоторые теоремы заносятся в буфер путем нажатия
 клавиши "б", то после отмены просмотра их приемы исключаются из
 логического терминала "блок". Заметим, что команда "Б" \ может
 только отменить ряд ранее введенных блокировок; ввод новых
 бло\-ки\-ро\-вок осуществляется через редактор приемов.

 \item х10 = "заменагруппы". Нажата клавиша "б" \ для перехода к
 основной версии задачи, скопированной в буфер задачника. Сначала
 определяется номер х11 той задачи, к которой относится команда
 (так же, как в предыдущем пункте). Определяется узел этой задачи;
 находится возвратная ссылка на оглав\-ле\-ние (она указывает только
 на основную версию задачи); текущий путь в оглавлении задачника
 устанавливается по этой возвратной ссылке, и выход по
 истин\-ност\-но\-му значению "ложь" \ для отката к процедуре оглавления
 задачника.

 \item х10 = "стандменьше". Нажата клавиша F1. Осуществляется
 обращение к про\-це\-ду\-ре "Помощь", реализующей интерфейс справочника по
 логической системе.

 \item х10 = "верхняягрань". Нажата клавиша "И" \ для
 инициализации либо ре\-дак\-ти\-ро\-вания задачи на анализ рисунка.
 Значения х11 - х14 определяются аналогично случаю инициализации
 задачи на анализ текста. Рисунок создается либо кор\-рек\-ти\-ру\-ется
 при помощи оператора "рисунки". Он формируется в специ\-аль\-ном массиве
 интерпретатора ЛОСа, называемом буфером рисунков. Чтобы не
 перегружать информационный блок задачника, битмэпы задач на
 анализ ри\-сун\-ков хранятся в отдельном, тринадцатом, информационном
 блоке. Из узла задачи по метке "битмэп" \ - переход к логическому
 терминалу, хранящему терм "битмэп($A_1 \ A_2 \ A_3$)", являющийся
 ссылкой на битмэп рисунка в 13-м ин\-фор\-ма\-ци\-он\-ном блоке. Здесь
 $A_1$ - логический символ, по которому от корневого каталога
 13-го блока имеется переход к указателю-списку, текстовый
 терминал "битмэп" \ которого содержит битмэп. $A_2,A_3$ - ширина
 рисунка и длина его двоичного кода в 16-битных словах.

 \item х10 = "значение". Нажата клавиша "М" \ для инициализации задачи
 на мо\-де\-ли\-ро\-ва\-ние процесса. Редактирование этой задачи можно
 выполнить после этого, нажав клавишу "р" \ и войдя в просмотр
 иерархической структуры данных, описывающей объект моделирования.
 Инициализация состоит в отбрасывании ветви "задача" \ узла
 пустого бланка задачи и создании пустой ветви "структура" \ этого
 узла.

\end{enumerate}

\section{Пошаговый просмотр решения}

Пошаговый просмотр решения инициируется установкой прерывания по
пре\-об\-ра\-зо\-ва\-ни\-ям выбранной задачи из задачника и вводом
комментария (буфер пустоеслово) к посылкам исходной задачи. При
применении очередного преобразования этой задачи происходит
обращение к отладчику ЛОСа, который отображает на экране
ин\-фор\-ма\-цию о преобразовании и о контексте, в котором оно
применено. Очередной шаг решения реализуется после нажатия клавиши
Enter. При этом, в зависимости от установленного режима
трассировки, отладчик может самостоятельно принять ре\-ше\-ние о
показе шагов решения какой-либо вспомогательной задачи, или же
такое решение принимает пользователь, нажимая клавишу Ctr-Enter.

Отображение информации об очередном шаге сначала подготавливается
от\-лад\-чи\-ком ЛОСа, который анализирует текущий контекст, а
затем полученные данные передаются процедуре "цепьзадач", которая,
собственно, и реализует интерфейс про\-смотра.

\subsection{Структура данных для описания текущего ша\-га ре\-ше\-ния}

Информация о текущем шаге решения представляется в виде так
называемой цепи обобщенных задач. Обобщенная задача - либо обычная
задача, либо описание об\-ра\-ще\-ния к некоторому макрооператору,
либо вспомогательная конструкция, опи\-сы\-ва\-ю\-щая текущее
преобразование или вводящая другие пояснения.

Сначала в цепи перечисляются обобщенные задачи $Z_1, \ldots, Z_n$,
где каждое $Z_{i+1}$ возникло как подзадача для $Z_i; i = 1,
\ldots, n-1$. Эта часть цепи определяет те\-ку\-щий контекст
решения; после нее размещается фиктивная задача, описывающая
соб\-ст\-вен\-но преобразование. Если для выполнения
преобразования были решены какие-либо вспомогательные задачи либо
осуществлены обращения к макрооператорам, то некоторые из них
отбираются отладчиком, и соответствующие обобщенные задачи
помещаются в конце цепи. Кроме указанных элементов цепи обобщенных
задач, могут вводиться элементы, указывающие на наличие разбора
случаев и пе\-ре\-чис\-ля\-ю\-щие результаты уже разобранных
подслучаев. Такие элементы размещаются между задачей,
инициировавшей разбор случаев, и задачей, соответствующей текущему
подслучаю.

Перечислим типы обобщенных задач и используемые для их
представления струк\-ту\-ры данных:

\begin{enumerate}

\item Обычные задачи на доказательство, преобразование, описание и
исследование.

\item Задача на анализ текста - тройка (текстформ $A_1 \ A_2$),
где $A_1$ - пара (логический символ - номер узла статьи этого
символа), ссылающаяся на узел задачи в задачнике; $A_2$ -
текстформульная структура, определяющая условие задачи.

\item Задача нормализатора - набор (нормализатор $A_1 \ A_2 \ A_3
\ A_4$). Эта задача пред\-став\-ля\-ет собой информацию об
обращении к операторному выражению ЛОСа, называемому
нормализатором. $A_1$ - заголовок этого оператора; ($A_3,A_2,A_4$)
- значения входных переменных. Первая входная переменная
нормализатора име\-ет своим значением некоторый терм; вторая -
список утверждений, называемых посылками. Нормализатор выполняет
тождественные либо (если указанный терм является утверждением)
эквивалентные преобразования терма в пред\-по\-ло\-же\-нии
истинности посылок. $A_4$ - набор вспомогательных информационных
элементов, используемых для передачи нормализатору управляющей
ин\-фор\-ма\-ции и для получения такой информации от него. Эти
элементы называются комментариями.

Нормализатор аналогичен задаче на преобразование, однако он
использует для преобразований лишь ограниченное число приемов, и
это существенно ускоряет получение результата. Его приемы, как и
приемы решения задач, обычно (хотя не всегда) задаются на
ГЕНОЛОГе; часто они дублируют друг друга. Воз\-ни\-ка\-ет
некоторый "пакет" \ отобранных в нормализатор приемов, из-за чего
нормализаторы, а также операторные аналоги задач на описание,
до\-ка\-за\-тель\-ство и исследование называются пакетными
операторами. Эти операторы ока\-за\-лись чрезвычайно эффективным
средством для ускорения вычислений и ор\-га\-низации локального
перебора. Подробнее об их устройстве будет рассказано в разделах,
посвященных ГЕНОЛОГу.

\item Задача проверочного оператора - набор (легковидеть $A_1 \
A_2 \ A_3 \ A_4$). Здесь $A_1$ - название оператора; $A_3$ -
проверяемое утверждение; $A_2$ - список утверждений, в
предположении истинности которых предпринимается проверка
(посылок); $A_4$ - список комментариев. Проверочный оператор
является пакетным оператором, аналогичным задаче на
доказательство.

\item Задача синтезатора - набор (синтезатор $A_1 \ A_2 \ A_3 \
A_4$). Здесь $A_1$ - название оператора; $A_3$ - утверждение, для
обеспечения истинности которого выполня\-ет\-ся подбор значения
заданной его переменной; $A_2$ - список утверждений, в
предположении истинности которых предпринимается подбор; $A_4$ -
список ком\-мен\-та\-ри\-ев. Синтезатор является пакетным
оператором, аналогичным задаче на описание.

\item Задача анализатора - набор (анализатор $A_1 \ A_2 \ A_3 \
A_4$). Здесь $A_1$ - название оператора; $A_3$ - задача на
доказательство либо на исследование, для которой анализатор
предпринимает вспомогательный вывод следствий. Эти следствия,
однако, не заносятся непосредственно в список посылок задачи, а
ре\-гис\-три\-ру\-ют\-ся в буфере анализатора $A_2$. Этот буфер
представляет собой тройку (на\-бор полученных следствий - набор
наборов комментариев к этим следствиям - конкатенация набора
следствий и списка посылок рассматриваемой задачи). Лишь
специально отобранные следствия переносятся при работе
ана\-ли\-за\-то\-ра в список посылок задачи. $A_4$ есть список
комментариев анализатора.

\item Фиктивная задача для выдачи информации о примененном приеме
- (прием $A$). Здесь $A$ - набор информационных элементов
следующих типов:

а) (замена $B_1 \ B_2$) - применяется преобразование замены
посылки либо усло\-вия задачи, либо замены преобразуемого
нормализатором терма, либо замены следствия, выведенного
анализатором. $B_1$ - указатель на заменяемый терм, представляющий
собой в случае задачи пару (вхождение заменяемой посылки либо
условия в свой список - 0 в случае посылки и 1 в случае условия);
в случае нормализатора равный 0, а в случае анализатора
представляющий со\-бой заменяемое утверждение из буфера
анализатора. $B_2$ - заменяющий терм.

б) (вывод $B_1 \ B_2$) - вывод новой посылки (при $B_1 = 0$) либо
нового условия ($B_1 = 1$). $B_2$ - выведенное утверждение.

в) (исключение $B_1 \ B_2$) - исключение посылки либо условия
задачи. $B_1$ - вхож\-де\-ние исключаемого утверждения; $B_2$ -
указатель посылки (0) либо условия (1).

г) (прием $B$) - $B$ есть ссылка на примененный прием - тройка
(логический символ - номер узла приема в статье этого символа -
заголовок приема) для приема, заданного на ГЕНОЛОГе, и пара
(логический символ - номер узла) для приема, реализованного
непосредственно на ЛОСе.

д) (ответ $B$) - выдается ответ $B$. Если $B$ - логический символ
"легковидеть", то выдается ответ "истина" \ проверочного
оператора.

е) (текзадача $B$) - $B$ есть вхождение текущей обобщенной задачи
(обычной задачи либо обращения к пакетному оператору) в цепь
обобщенных задач.

ж) (замечание $B_1 \ B_2 \ B_3 \ B_4$) - вводится (при $B_1 = 1$)
либо удаляется (при $B_1 = 0$) комментарий $B_4$. $B_2$ -
указатель посылок (0) либо условий (1). $B_3$ - 0 в слу\-чае
общего комментария, иначе - тот терм, к которому относится
комментарий.

з) (титр $B_1 \ B_2 \ C_1 \ldots \ C_n$) - информационный элемент,
сформированный про\-грам\-мой приема и определяющий текст
сопровождающих срабатывание приема пояснений. Здесь $B_1$ - тройка
(логический символ - номер узла - заголовок приема), ссылающаяся
на примененный прием. Сопровождающий текст соз\-да\-ет\-ся на
основе текстового шаблона, хранящегося в текстовом терминале
"титр" \ узла приема. Этот шаблон распадается на несколько
независимых фрагментов, каждый из которых начинается с символа
$\neg$, вслед за которым идет номер фрагмента - последовательность
цифр, завершающаяся пробелом. Нумерация начинается с 1; если
фрагмент всего один, то заголовок $\neg 1$ отбрасывается. Для
указания мест в шаблоне, на которые должны вставляться формулы,
ис\-поль\-зу\-ют\-ся пары скобок (). $B_2$ есть номер (десятичное
число) фрагмента шаблона, используемого в сопровождающем тексте (в
зависимости от ситуации, прием выбирает один из нескольких
фрагментов для сопровождения; со\-про\-вож\-да\-ю\-щий текст может
также быть составлен из нескольких фрагментов). $C_1, \ldots, C_n$
- термы, вставляемые в шаблон вместо его пар скобок.

и) (попыткаспуска $B_1 \ B_2$) - предпринимается попытка замены
условия задачи на описание либо доказательство на новое условие,
следствием которого оно является. $B_1$ - вхождение заменяемого
условия; $B_2$ - заменяющее условие.

к) (Замена $B_1 \ B_2 \ B_3$) - замена группы утверждений $B_2$ на
группу утверждений $B_3$. $B_1$ - указатель посылки (0) либо
условия (1).

л) (разборслучаев $B$) - инициируется разбор случаев в пакетном
нормализаторе по дизъюнкции $B$.

м) (подслучаи $B$) - переход к разбору подслучая в пакетном
нормализаторе, определяемого конъюнкцией утверждений списка $B$.

н) (сборкатекста $B$) - формирование поясняющего текста,
составляемого при помощи стандартных заготовок, хранящихся во 2-м
информационном блоке. $B$ - последовательность определяющих
последовательные элементы текста пар следующих типов: (слово $C$)
- текстовая заготовка, достижимая из корня 2-го информационного
блока по меткам $C$, "слово"; (буква $C$) - логический символ $C$
является кодом выдаваемой буквы; (терм $C$) - выдается терм $C$.
Обычно такой способ создания поясняющего текста используется, если
прием не создал указанного выше элемента (титр $\ldots$).

\item (разборслучаев $A_1 \ A_2 \ A_3$) - фиктивная задача для
отображения информации о ранее рассмотренных подслучаях при
разборе случаев по дизъюнктивному условию либо дизъюнктивной
посылке задачи. $A_1$ - дизъюнктивный член,
со\-от\-вет\-ству\-ющий подслучаю; $A_2$ - найденный для него
ответ; $A_3$ - задача, для которой проводится разбор случаев.

\item (подслучаи $A$) - фиктивная задача для отображения
информации о текущем рассматриваемом подслучае при разборе случаев
в нормализаторе. $A$ - набор утверждений, конъюнкция которых
определяет подслучай.

\item (битмэп $A_1 \ A_2$) - задача на анализ рисунка. $A_1,A_2$ -
логический символ и номер узла этого символа, определяющие узел
задачи в задачнике.

\item (структура $A_1 \ A_2$) - задача на моделирование процесса.
$A_1,A_2$ - логический символ и номер узла этого символа,
определяющие узел задачи в задачнике.

\end{enumerate}

\subsection{Определение цепи обобщенных задач отладчиком ЛОСа}

Цепь обобщенных задач создается отладчиком ЛОСа в процессе анализа
текущего контекста. При описании отладчика мы обозначили лишь
точку входа в ветвь его программы, выполняющую эти действия;
теперь вернемся к рассмотрению данной ветви. Выйти на ее начало
можно, например, через оглавление программ - пункт "Отладчик ЛОСа
- Просмотр текущей информации с помощью оператора ЦЕПЬ\-ЗА\-ДАЧ -
Исходная точка".

Напомним прежде всего, что значением переменной х5 на момент входа
в нашу ветвь служит набор ссылок на кадры глобального стэка,
начинающийся с того кадра, информация о программе которого должна
быть выдана на экране (обычно это кадр текущей задачи либо
текущего пакетного оператора), и заканчивающийся кадром прерывания
(т.е. кадром программы отладчика). Ссылка на кадр прерывания
при\-сва\-и\-ва\-ет\-ся переменной х15, после чего
инициализируется пустым словом накопи\-тель х16 цепи обобщенных
задач. Инициализируемая пустым словом пе\-ре\-мен\-ная х17
яв\-ля\-ет\-ся накопителем ссылок на кадры этих обобщенных задач в
глобальном стэке; для фиктивных задач в х17 заносится 0.
Инициализируется нулем пе\-ре\-мен\-ная х18 (в случае приема,
обращающегося к вспомогательной задаче либо к пакетному оператору,
значение этой переменной будет изменено на 1).

После оператора "прием(7 1)" \ размещается оператор "повторение",
к которому будут происходить откаты при просмотре кадров
глобального стэка, предшеству\-ю\-щих кадру прерывания. х15 -
ссылка на текущий такой кадр (напомним, что из\-на\-чаль\-но это
ссылка на сам кадр прерывания). Переменной х20 присваивается
ссыл\-ка на источник кадра х15 (в случае не имеющего источника
кадра прерывания - ссылка на непосредственно предшествующий кадр);
переменной х21 - тип этого кадра. Ти\-пы кадров глобального стэка
были перечислены в начале раздела, посвященного отладчику ЛОСа.

Кадр х20, непосредственно предшествующий кадру прерывания, может
оказать\-ся кадром продолжения перечисления, не представляющим
интереса для постро\-е\-ния цепи обобщенных задач; для отсечения
рассмотрения его в этих случаях предус\-мот\-рен оператор
"(или(длинатекста(х5 1) $\ldots$ равно(х20 правпозиция(х5 1))".
При от\-ка\-те к оператору "ветвь 3" \ происходит замена х15 на
х20, т.е. происходит очередной шаг вдоль цепи кадров глобального
стэка.

Далее сначала рассматривается случай х21 = 1 - кадр х20 оказался
кадром задачи. Определяется набор х22, несущий информацию об этом
стэковом кадре. Последний разряд набора х22 - набор значений
определенных в кадре программных пе\-ре\-мен\-ных. Переменной х23
присваивается задача кадра х20. Если она совпадает с исходной
задачей, то цикл просмотра глобального стэка обрывается. Иначе -
находится зна\-че\-ние х24 в кадре х20 программной переменной "х2"
\ и проверяется, что оно пред\-став\-ля\-ет собой вхождение
символа дизъюнкции. В этом случае проверяется, что накопитель х16
обобщенных задач непуст и его первая задача - того же типа, что и
х23, причем этот тип - "описать" \ либо "преобразовать". Эти
признаки указывают на возможное применение приема разбора случаев
по дизъюнктивному условию либо дизъюнктивной посылке - тогда в
данной точке нужно будет вставлять фиктивные обобщенные задачи,
выводящие на экран результаты уже разобранных подслучаев.

По ссылке х15 на кадр, источником которого служит х20,
определяется ссылка х26 на прием, который реализуется в кадре х20.
Проверяется, что она имеет длину 2 - то есть прием реализован на
ЛОСе и выделяется своей контрольной точкой "прием($N$)". Пара х26
состоит из логического символа, к программе которого относится
прием (этот символ расположен по вхождению х24, то есть является
символом "или"), и номера $N$. Если $N$ есть 33, то прием
осуществляет разбор случаев по дизъюнктивному условию задачи на
описание. Его несложно найти через пункт "Приемы решателя - Общие
приемы - дизъюнкция - разбор случаев по дизъюнктивному условию
задачи на описание - рассмотрение подслучая для дизъюнктивного
условия" \ оглавления программ. Известно, что на момент
рассмотрения подслучая значением переменной х8 служит набор
наборов конъюнктивных членов ответов уже рассмотренных
под\-слу\-ча\-ев, а значением переменной х14 - набор дизъюнктивных
членов рас\-смат\-ри\-ва\-е\-мой дизъюнкции. Эти значения
находятся в наборе х22 и присваиваются, со\-от\-вет\-ствен\-но,
переменным х28 и х29. Далее в начале набора х16 вставляются
об\-об\-щен\-ные задачи (разборслучаев $\ldots$), определяющие
результаты разбора случаев, а в начале набора х17 добавляется
такое же количество нулей.

Аналогичным образом обрабатывается случай, когда $N$ = 24 (разбор
случаев по посылке задачи на описание) и $N$ = 38 (разбор случаев
по посылке задачи на преобразование).

Мы видим из данного примера, что программа формирования цепи
обобщенных задач использует конкретные номера контрольных точек и
переменных отдельных приемов, реализованных на ЛОСе. Это
обстоятельство следует учитывать при вне\-се\-нии в такие приемы
каких-либо изменений.

После вставки фиктивных задач для разбора случаев (если она нужна)
- переход через оператор "ветвь 6", где к началу набора х16
присоединяется задача х23, а к началу набора х17 - ссылка на кадр
х20.

\par\medskip

Если х21 $\ne 1$, то происходит переход через "иначе 4", где
переменной х22 снова присваивается информация о стэковом кадре
х20. Проверяется, что этот кадр яв\-ля\-ет\-ся кадром оператора
(тип 2) либо операторного выражения (тип 3). Если х20 оказывается
кадром прерывания, предшестующим последнему кадру прерывания
(тогда в наборе х22 на втором месте расположена переменная), то
просмотр гло\-баль\-но\-го стэка обрывается. Такая ситуация
возможна при запуске из текущего кадра трассировки решения одной
из вспомогательных задач, в процессе которого воз\-ни\-ка\-ет
прерывание. Если х20 не является кадром прерывания, то переход
через "ветвь 1".

Переменной х23 присваивается заголовок оператора либо операторного
вы\-ра\-же\-ния кадра х20. Если этот заголовок - название
вспомогательного оператора, раз\-ме\-ща\-е\-мо\-го в начале
программы пакетного оператора ("контрольнормализации",
"кон\-т\-роль\-бу\-фера", и т.п.), то переменной х18 присваивается
1 (см. переход через "ветвь 2"), чтобы отметить тот факт, что
выводимое на экран преобразование - обращение к пакетному
оператору. Предварительно анализируется случай оператора
"кон\-т\-роль\-бу\-фера". Если он расположен в программе
синтезатора, то вывод на экран информации об обращении
блокируется, так как это уже сделано предшествующим
вспомогательным оператором "синтезатор", располагаемым в начале
программ син\-те\-за\-то\-ров. Такая же блокировка предпринимается
для внешней программы про\-ве\-роч\-но\-го оператора, если
установка на трассировку отключает показ обращений к этим
операторам. Блокировка достигается выходом из отладчика (оператор
"от\-вет(1)"). При отсутствии блокировки - переход через "ветвь
1", где переменной х24 присваивается ссылка на источник кадра х20.

Далее сначала рассматривается случай, когда х20 - кадр
операторного выражения. Проверяется, что х23 - заголовок
некоторого пакетного нормализатора (используется справочник
"быстрпреобр", определяющий тип нормализатора). Затем переменной
х25 присваивается набор значений переменных, определенных в кадре
х20, а пе\-ре\-мен\-ной х26 - обобщенная задача нормализатора для
кадра х20. Если в комментариях к нормализатору имеется набор
(разборслучаев $\ldots$), указывающий на наличие режима разбора
случаев (подробнее об этом режиме будет сказано в разделах,
посвященных ГЕНОЛОГу), то создается вспомогательная обобщенная
задача (подслучаи $A$), у которой $A$ - список утверждений,
определяющий текущий рассматриваемый под\-слу\-чай. Эта задача
регистрируется в списке х16, а к началу списка х17
до\-бав\-ля\-ет\-ся 0. Затем в начале списка х16 регистрируется
задача нормализатора х26, а в начале списка х17 - ссылка на кадр
х20. Далее - продолжение просмотра глобального стэка.

Если х20 - кадр оператора, то после "заголовок(х22 3)" \ - переход
через "ина\-че 1", где переменной х25 присваивается список
значений программных переменных, определенных в этом кадре.

Если справочник "очевидно" \ определяет, что х23 есть заголовок
проверочного оператора, присваивая переменной х26 пару (набор
входных переменных провероч\-но\-го оператора - вид проверяемого
утверждения), то далее создается задача про\-ве\-роч\-но\-го
оператора х30; она регистрируетсяв списке х16, к началу списка х17
при\-со\-еди\-ня\-ет\-ся ссылка на кадр х20, и продолжение
просмотра глобального стэка. Аналогич\-ным образом, используя
справочники "синтезатор" \ и "анализатор", программа
ус\-мат\-ри\-ва\-ет обращения к пакетным операторам этих типов и
добавляет в список х16 их обобщенные задачи.

\par\medskip

По окончании просмотра глобального стэка в наборе х16 возникает
начальная часть цепи обобщенных задач - она предшествует фиктивной
задаче, описывающей текущее шаг решения. Дальнейшие действия
выполняются ветвью программы, пе\-ре\-ход к которой осуществляется
через оператор "ветвь 2", расположенный после "равно(х18 0)".

Здесь нам понадобится уточнить структуры данных, используемые для
сохра\-не\-ния информации о вспомогательных обобщенных задачах,
решенных для выпол\-не\-ния текущего приема. При поиске того
приема, который будет осуществлять оче\-ред\-ной шаг решения,
реализуется достаточно большое число вспомогательных процедур, в
том числе обобщенных задач. Однако, далеко не все они завершаются
срабаты\-ва\-ни\-ем приема. Отображение на экране всех таких
попыток загромождает картину решения и в обычной ситуации (за
исключением некоторых отладочных случаев) нежелательно. С другой
стороны, отображение хода решения вспомогательных задач в
большинстве случаев необходимо для понимания того, что произошло
на очередном шаге. Иногда основная задача вообще сводится к
вспомогательной, и на очередном шаге сразу выдается ответ. Так как
непосредственно во время решения вспо\-мо\-га\-тель\-ной задачи
еще неясно, нужно ли будет ее отображать, приходится сохра\-нять
до срабатывания приема информацию о всех таких задачах - чтобы
выдать ее после срабатывания приема. Разумеется, можно было бы
сохранять здесь вообще полный протокол решения вспомогательных
задач, и как только прием сработал, отображать сначала его, а лишь
затем само срабатывание приема. Однако, этот вариант технически
сложен, и в настоящее время реализован более простой вариант -
сохранять лишь информацию об обращениях к вспомогательным
обобщенным за\-да\-чам, а ход их решения отображать при повторном
запуске такого решения. По\-втор\-ный запуск инициируется
непосредственно из текущего кадра прерывания, причем на каждом
шаге повторного решения можно запускать повторное решение своих
вспомогательных задач, и т.д.

Для сохранения информации о вспомогательных задачах служит
комментарий (буфер $A$) к посылкам исходной задачи. Здесь $A$ -
накопитель наборов ($B_1 \ B_2 \ B_3 \ B_4 \\ B_5$), хранящих
информацию об отдельных обращениях к решению вспомогательных
задач. $B_1$ есть первая программная переменная, значение которой
в момент об\-ра\-ще\-ния было не определено. $B_2$ - копия
вспомогательной задачи либо пара (название пакетного оператора -
набор значений его входных переменных); $B_3$ - число на
счет\-чи\-ке шагов интерпретатора в момент обращения; $B_4$ -
сначала 0, а затем число на счетчике шагов в момент выхода. $B_5$
- сначала 0, а затем результат обращения - ответ задачи, либо
выданный нормализатором терм, либо набор значений переменных,
полученный синтезатором, либо логический символ "истина" \ в
случае обращения к проверочному оператору, либо символ "отказ".
Наборы размещаются в накопителе $A$ в том же порядке, в котором
происходили обращения.

Если вспомогательная задача зарегистирована в комментарии "буфер",
а затем произошел откат к точке, предшествующей обращению, то она
автоматически ис\-клю\-ча\-ет\-ся из данного комментария. Это
делает при откатах интерпретатор ЛОСа, используя номер первой не
определенной при обращении переменной $B_1$ - после отката такой
номер почти всегда уменьшается (в особых точках, где при откате
но\-мер может сохраниться, используется дополнительная коррекция).

Вернемся к рассмотрению указанной выше ветви программы отладчика.
В тех случаях, когда текущий шаг решения заключается в обращении к
пакетному опе\-ра\-то\-ру либо к решению задачи, отладчик должен
принять решение - перевести ли трассировку вглубь процесса решения
этой вспомогательной задачи, либо за\-ре\-гист\-ри\-ро\-вать
обращение в комментарии "буфер". Сначала рассматривается случай
об\-ра\-ще\-ния к пакетному опе\-ра\-то\-ру. После проверки того,
что отсутствует режим ручного выбора входа в подпроцессы и имеет
место обращение к пакетному оператору (х18 = 1), переменной х19
присваивается извлекаемая из набора х16 обобщенная задача
пакетного оператора, к которому происходит обращение (с
отбрасыванием послед\-ней фиктивной задачи разбора подслучаев в
нормализаторе, если она есть, - чтобы для каждого очередного
подслучая процесс преобразований нормализатора отображался
независимо). Если в установке на режим трассировки заблокирован
вход в любые подпроцессы (элемент "обращение" \ в комментарии
"трасснабор"), то выход из от\-лад\-чи\-ка. Иначе - переход через
"ветвь 2".

При наличии комментария (титр стоп) к пакетному оператору,
блокирующему показ обращения к нему - тоже выход из отладчика.

Если пакетный оператор имеет комментарий "обращение", то отладчик
осу\-щест\-вля\-ет вход в пошаговый показ его действий. Оператор
"трассировка(процедура $\ldots$)" \ переустанавливает для этого
трассировку так, чтобы обращение к отладчику про\-ис\-хо\-ди\-ло в
кадре рассматриваемого пакетного оператора при инициализации его
действий операторами "контрольнормализации", "контрольбуфера",
"синтезатор", "подслучаи", либо при изменении значения переменной
х1 (т.е. при изменении об\-ра\-ба\-ты\-ва\-е\-мо\-го
нормализатором терма).

Если же пакетный оператор не имеет комментария "обращения", то
осущест\-вля\-ет\-ся регистрация в комментарии (буфер $\ldots$)
факта обращения к нему. Для этого определяется первая не
определенная при обращении к оператору переменная х20; переменной
х21 присваивается заголовок оператора; переменной х23 - список
зна\-че\-ний переменных программы оператора, определенных на
момент прерывания. Для проверочного оператора и синтезатора,
имеющих выходные переменные, в наборе х23 их значения заменяются
на логический символ "неопред". Все наборы из х23 заменяются их
копиями - чтобы возможные изменения этих наборов при работе
оператора не изменили сохраненных первоначальных версий. Для
сохранения в ком\-мен\-та\-рии (буфер $\ldots$) вводится, согласно
указанному выше формату, набор х25 с информацией о данном
обращении, и далее - выход из отладчика.

После ветви программы, анализирующей обращение к пакетному
оператору, рас\-по\-ла\-га\-ет\-ся похожая ветвь, анализирующая
обращение к вспомогательной задаче. Она начинается с того же
оператора "не(существует(х19
и(ключ(комментариипо\-сы\-лок(х14)трасснабор х19(входит(полный
конец(х19)))))))", что и предыдущая ветвь - для отсечения случаев
ручного выбора входа в подпроцессы. Затем проверяется, что имеет
место установка на прерывания типа 2 (преобразования задачи
задан\-но\-го кадра) либо 17 (действия пакетного оператора),
причем заголовок оператора, при обращении к которому произошло
обращение к отладчику - "ответзадачи" \ ли\-бо "прямойответ". Если
просмотр подпроцессов заблокирован (элемент "обращение" \ в
установке на режим трассировки), то выход из отладчика, иначе -
переход че\-рез "ветвь 2".

Здесь значение переменной х18 изменяется на 1 (эта переменная, как
уже го\-во\-ри\-лось выше, является индикатором шага решения,
заключающегося в обращении к вспомогательной задаче либо к
пакетному оператору). Переменной х21 при\-сва\-и\-ва\-ет\-ся
смещение последнего кадра задачи - это и есть вспомогательная
задача, к которой произошло обращение. Находится набор х22,
описывающий содержимое кадра х21, и по нему определяется сама
задача х23. Если она имеет комментарий либо, в случае задачи на
исследование, комментарий посылок (титр стоп), то выход из
отладчика. Иначе - переход через оператор "ветвь 1".

Если задача х23 имеет комментарий (в случае задачи на исследование
- ком\-мен\-та\-рий посылок) "обращение", то происходит
переустановка трассировки на пре\-об\-ра\-зо\-ва\-ния кадра х21.
Иначе - проверяется, что обращение к вспомогательной за\-да\-че
произошло непосредственно либо через посредство вспомогательных
процедур "вспомописание", "быстрописание", "попыткаспуска",
"преобразование", "вспом\-пре\-об\-ра\-зо\-ва\-ние", "следствие" \
из того кадра х20, по преобразованиям в котором бы\-ла установлена
трассировка. Если это не так, то выход из отладчика. В противном
случае определяется первая не определенная перед обращением
переменная х24 кад\-ра х20; находится копия х25 исходной версии
вспомогательной задачи; эта копия снабжается комментарием посылок
(максимальныйуровень $\ldots$), сохраняющим зна\-че\-ние
максимального уровня обращения к задаче; список комментария (буфер
$\ldots$) пополняется набором х27, характеризующим обращение, и
выход из отладчика.

\par\medskip

После указанных выше действий, включающих регистрацию в
комментарии (бу\-фер $\ldots$) данных об обращении, если таковое
имело место, - переход к фраг\-мен\-ту, начинающемуся с
контрольной точки "прием(7 8)". Здесь начинается заполнение набора
х19 информационных элементов, используемого при обращении к
оператору "цепьзадач" \ (выйти на данный фрагмент можно через
пункт оглавления программ, в котором упоминается х19). На основе
набора х19 будет также создаваться фиктивная задача цепи
обобщенных задач, описывающая текущее преобразование. Сначала в
х19 заносятся информационные элементы (смкадр х17) и (Текзадача
$A$), где $A$ - вхождение текущей задачи в цепь обобщенных задач
х16. Если х18 равно 1 (оче\-ред\-ной шаг решения состоит в
обращении к вспо\-мо\-га\-тель\-ной задаче либо к пакетному
опе\-ра\-то\-ру), то в х19 заносится символ "обраще\-ние". Далее
при х18 = 0 рас\-смат\-ри\-ваются следующие случаи А) - Д),
связанные с шагом выдачи ответа задачи либо завершения работы
пакетного оператора, а при х18 = 1 - случай Е), связанный с
инициализацией разбора случаев в нормализаторе:

 А) Случай, когда на текущем шаге был выдан ответ некоторой задачи
(либо х7 = 1, т.е. имелась установка на прерывание при выдаче
ответа, либо х7 = 2 - уста\-нов\-ка на прерывание при
преобразовании задачи, причем реализуется оператор "ответ").

Проверяется наличие внешнего оператора "редакторответа". Если он
есть, то находится первый внешний кадр задачи либо пакетного
оператора, предпринимается переустановка трассировки на этот кадр,
и выход из отладчика. Сразу после опе\-ра\-то\-ра "редакторответа"
\ в программах приемов идет оператор выдачи ответа в том кадре, на
который произошла переустановка трассировки, и отображение на
экране полученного ответа будет выполнено при его реализации.

Если внешнего оператора "редакторответа" \ нет, то из стэка
выражений из\-вле\-ка\-ет\-ся значение х20 - объект, выданный в
качестве ответа. Если х20 - терм либо логический символ, то в х19
заносится информационный элемент (ответ х20); иначе х20 - ответ
задачи на исследование, совпадающий с текущей версией этой задачи,
и тогда в х19 заносится элемент (ответ исследовать). В обоих
случаях предпринимается переустановка трассировки на первый
внешний кадр задачи либо пакетного опе\-ра\-то\-ра, и далее -
откат к оператору "ветвь 1", расположенному перед контрольной
точкой "прием(7 9)", где продолжается заполнение набора х19. К
этому же опера\-то\-ру происходят откаты по завершении остальных
случаев, кроме случая Г).

Б) Случай, когда на текущем шаге выдается результат применения
пакетного оператора (переход через "иначе 3" \ в фрагменте,
содержащем контрольную точку "прием(7 8)"). В зависимости от того,
как выдается результат (операторы "ответ", "результат", "стоп"
либо выход по откату), создается заготовка х20 ответа: сим\-вол
"отказ" \ при выходе по оператору "стоп" \ либо по откату;
содержимое последней заполненной ячейки стэка выражений при выходе
по оператору "ответ", и константа "истина" \ при выходе по
оператору "результат". Если реализуется пакетный син\-те\-за\-тор,
определяющий значения $t_1, \ldots , t_n$ своих выходных
переменных $x_1, \ldots, x_n$, то х20 заменяется на терм
"и(равно($x_1 \ t_1$) $\ldots$ равно($x_n \ t_n$))". Затем в
накопитель х19 заносится элемент (ответ х20) и предпринимается
переустановка трассировки на первый внешний кадр задачи либо
пакетного оператора. Специально отслежива\-ет\-ся случай попадания
на кадр оператора "цепьзадач", которое может произойти, если
трассировка происходит при повторном запуске вспомогательной
обобщенной задачи. Выход за рамки данного кадра блокируется, и
трассировка переустанавливается по тому кадру, источником которого
он является.

В) Случай выдачи отказа на задачу по исчерпании средств (текущий
уровень становится больше максимального уровня задачи). Тогда в
х19 заносится пара (ответ отказ), а трассировка
переустанавливается так же, как и выше.

Г) Случай завершения применения пакетного анализатора по оператору
"выход". Тогда просто осуществляется выход из отладчика.

Д) Случай завершения решения задачи, сведенной при помощи
оператора "по\-пыт\-ка\-спуска" \ к некоторой вспомогательной
задаче. Здесь обращение к отладчику инициируется оператором
"смпрер", размещенным в программе "попыткаспуска" \ после того,
как вспомогательная задача оказалась решенной. При идентификации
такого контекста отладчик заносит в набор х19 элемент
(попыткаспуска $A \ B$), оп\-ре\-де\-ля\-ю\-щий вхождение $A$
заменявшегося при сведении к вспомогательной задаче условия
основной задачи и заменяющее условие $B$. Убедившись в том, что
при обращении к оператору "попыткаспуска" \ не был введен
информационный элемент (титр стоп), блокирующий показ результата
обращения, отладчик пересылает в х19 все информационные элементы
(титр $\ldots$) указанного обращения; с их помощью будет
определяться сопровождающий текст. Далее переменной х26
присваивается ответ вспомогательной задачи, и в х19 заносится пара
(ответ х26).

Е) Реализуется оператор "подслучаи", инициирующий разбор случаев в
пакетном нормализаторе. Определяется утверждение х21, по которому
происходит разбор слу\-чаев. Если оно не имеет заголовка "или", то
выход из отладчика. Иначе - к набору х19 присоединяется элемент
(разборслучаев х21).

\par\medskip

Далее происходит откат к ветви оператора "ветвь 1", расположенного
перед "при\-ем(7 9)". Здесь, после контрольной точки "прием(8 0)",
начинается анализ текущего преобразования, если оно отлично от
рассматривавшихся выше случаев обращения к вспомогательной задаче
(оператору) либо выдачи результата. Переменной х20
при\-сва\-и\-ва\-ется логический символ, определяющий тип
преобразования - это либо за\-го\-ло\-вок оператора, вызвавшего
обращение к отладчику, либо, в специальных случаях, название
текущей процедуры ("внутрвывод", "внутрпреобр",
"контрольнор\-ма\-ли\-за\-ции", "контрольтитра",
"контрольбуфера"), к которой относится данный оператор.

Сначала рассматривается случай преобразования замены в задаче либо
нор\-ма\-ли\-за\-торе - здесь х20 есть "замена" \ либо
"заменаусловия" \ либо "заменапо\-сыл\-ки". Переменным х21 и х22
присваиваются значения предпоследней и последней входных
переменных реализуемого оператора х20, извлекаемые из стэка
выражений.

Если х20 = "замена", то переменной х23 присваивается обобщенная
задача нор\-ма\-ли\-за\-тора, в которой происходит обращение к
оператору х20.

Если заменяющий терм х22 совпадает с текущим термом нормализатора
(пе\-ре\-ход через "ветвь 6"), то выход из отладчика. Если
нормализатор допускает режим разбора случаев, причем реализуется
его прием с заголовком "окончание" \ и пред\-при\-ни\-ма\-ет\-ся
извлечение из комментария (разборслучаев $\ldots$) очередного
случая для преобразований, то при инициализации новой серии
альтернатив в х19 заносится набор (подслучаи $\ldots$),
определяющий рассматриваемую альтернативу, иначе - выход из
отладчика.

В остальных случаях замены в нормализаторе - переход через "ветвь
5". Здесь предпринимается регистрация в х19 информационных
элементов (титр $\ldots$), оп\-ре\-де\-ля\-ю\-щих сопровождающий
текст замены. Такие элементы создаются приемом
нор\-ма\-ли\-за\-то\-ра и присваиваются с помощью вспомогательного
оператора "титр" \ последней определенной перед выполнением замены
программной переменной. Если имелся единственный элемент (титр
стоп), то выход из отладчика.

Если х20 отлично от символа "замена", то переход через "иначе 4".
Здесь рас\-по\-ла\-га\-ет\-ся ветвь программы, усматривающая
случаи, в которых отображение шага замены нецелесообразно, а в
остальных случаях пополняющая набор х19 сфор\-ми\-ро\-ван\-ны\-ми
приемом элементами (титр $\ldots$). Прежде всего, блокируется
выдача на экран замены утверждения "$A$ - число" \ на логическую
константу "истина". Затем переменной х23 присваивается ссылка на
контрольную точку "прием($\ldots$)", пред\-шест\-ву\-ю\-щую
замене.

Сначала рассматривается случай, когда эта точка расположена внутри
оператора "заменавхождения". Если ее номер отличен от 27 и 42, то
есть замена терма задачи - не основная, реализуемая указанным
оператором, а сопровождающая основную, то выход из отладчика. Если
оператор "заменавхождения" \ реализуется внутри другого обращения
к оператору "заменавхождения", то в набор х19 заносится элемент
(титр 0).

Если контрольная точка х23 расположена внутри программы "равно" \
и номер ее - 16, 12, 55, либо 57, то реализуется прием,
усматривающий в задаче на исследование систему из $N$ уравнений с
$N$ числовыми неизвестными ($N = 2,3,4$) и обращающийся к
вспомогательной задаче для ее решения. Обращение к этому приему на
экран не выводится (в случае удачной попытки отображается лишь
достигнутый результат) - здесь пред\-при\-ни\-ма\-ет\-ся выход из
отладчика.

Если контрольная точка х23 расположена внутри программы "и" \ и
номер ее равен 4, то есть реализуется прием замены условия "и($A_1
\ldots A_n$)" \ задачи на описание на группу условий $A_1, \ldots,
A_n$, то в х19 заносится элемент (Замена 1 $A$ \ $B$) ,
опреде\-ля\-ю\-щий заменяемый и заменяющий наборы термов $A,B$.

Наконец, если точка расположена внутри программы "описать" \ и
номер ее равен 34, то применяется прием перехода к новой
несущественной неизвестной. При его выполнении реализуется серия
замен условий задачи. Чтобы избежать повторений, вся информация о
приеме выдается при первой из этих замен (в х19 заносится элемент
(Замена $\ldots$), а также элемент (сборкатекста $\ldots$),
определяющий поясняющий текст), а при последующих заменах
происходит выход в отладчик.

\par\medskip

После рассмотрения подслучаев. связанных с контрольной точкой х23,
происходит откат к оператору "ветвь 1", расположенному перед
оператором "приемкадра(ко\-нец(х5)х23)". Здесь анализируется
случай, когда оператор замены терма задачи рас\-по\-ло\-жен внутри
процедуры "заменавхождения". В случае режима двойного решения
задачи с блокировкой показа неиспользованных действий отменяется
выдача на эк\-ран преобразования посылки, снабженной комментарием
"следузел". Затем в х19 пе\-ре\-но\-сят\-ся из информационных
элементов оператора "заменавхождения" \ все наборы (сборкатекста
$\ldots$) и (титр $\ldots$), определяющие сопровождающие тексты.
Если ока\-зы\-ва\-ет\-ся, что здесь имеется единственный элемент
(титр стоп), то выход из отладчика.

Завершает действия по обработке преобразования замены для задачи
либо нор\-ма\-ли\-за\-то\-ра регистрация в наборе х19 элемента
(замена $A_1
 \ A_2$). Здесь $A_1$ - указатель на преобразуемый терм: 0 для
 нормализатора и пара (вхождение посылки либо усло\-вия - указатель
 посылки (0) либо условия (1)) для задачи; $A_2$ - заменяющий терм.

\par\medskip

Далее рассматривается случай занесения новой посылки либо условия
- х20 = "занесениеусловия" \ либо х20 = "занесениепосылки".
Переменной х22 присваивается ссылка на кадр, в котором
предпринимается обращение к оператору х20, а переменной х23 - тип
этого кадра. Сначала рассматриваются случаи, в которых отображение
преобразования на экране блокируется либо организуется специальным
образом; общий случай будет обрабатываться ветвью оператора "ветвь
2".

Прежде всего, рассматривается случай х23 = 1 - кадр задачи.
Переменной х25 при\-сва\-и\-ва\-ет\-ся набор значений программных
переменных в этом кадре задачи, а переменной х26 - значение
переменной "х2" \ этого кадра.

Если значением х26 служит вхождение символа "равно", то
определяется ссылка х27 на идущую перед выполнением оператора х20
контрольную точку "при\-ем($\ldots$)". Если номер этой точки - 24
либо 56 (приемы перехода к новым неизвестным при решении числовых
уравнений и решения уравнения из списка посылок задачи на
исследование относительно числовой неизвестной), то выход из
отладчика. В этих случаях реализуются группа операторов занесения
и оператор удаления; чтобы вся информация о срабатывании приема
выдавалась за один шаг, она связывается с оператором удаления.
Если номер контрольной точки равен 34, то реализуется прием
решения системы уравнений относительно параметров, если она
линейна по этим параметрам. Здесь снова реализуется группа
операторов занесения и группа опе\-ра\-то\-ров удаления.
Информация отображается только для первого оператора
за\-не\-се\-ния; при этом в х19 заносится соответствующий элемент
(Замена $\ldots$).

Если значением х26 служит вхождение символа "и" \ и контрольная
точка ука\-зы\-ва\-ет на упоминавшийся выше прием замены условия
"и($A_1 \ldots A_n$)" \ на группу условий $A_1, \ldots, A_n$, то
выдача на экран информации о преобразовании - добавлении условия
$A_i; i \ge 2$ - блокируется, так как она уже была выдана при
применении оператора замены указанного условия на $A_1$.

Если значением х26 служит вхождение символа "меньше" \ либо
"мень\-ше\-или\-рав\-но" \ и номер контрольной точки равен 6, то
реализуется прием перехода к новым неизвестным при решении
строгого либо нестрогого неравенства. В этих случаях - выход из
отладчика, так как отображение информации о приеме происходит при
реализации первого из операторов удаления.

Если х26 равно 0, причем реализуется уже встречавшийся выше прием
символа "описать", номер контрольной точки которого равен 34, то
выход из отладчика - информация о применении этого приема выдается
при выполнении оператора замены.

\par\medskip

Далее рассматривается случай х23 = 2 - кадр оператора.

Сначала выделяется подслучай заголовка "вывод" \ этого оператора.
Проверяется, что внутри программы "вывод" \ реализуется оператор
"занесениепосылки". На\-хо\-дит\-ся контрольная точка
"прием($\ldots$)", локализующая последний оператор, и
про\-ве\-ря\-ет\-ся, что ее номер равен 2 - т.е. выполняется
основное преобразование занесения выведенной посылки. Переменной
х26 присваивается список значений програм\-м\-ных переменных в
кадре оператора "вывод". Если выводимое утверждение име\-ет вид
"и($A_1 \ldots A_n$)", то оператор "вывод" \ последовательно
заносит в список посылок утверждения $A_1, \ldots , A_n$.
Отображение информации о преобразовании пред\-при\-ни\-мается
только при занесении первого из этих утверждений: в набор х19
добавляются элемент (список $\ldots$) и извлекаемые из обращения к
оператору "вывод" \ элементы (титр $\ldots$); в остальных случаях
- выход из отладчика.

Далее рассматривается случай заголовка "заменагруппы" \ внешнего
оператора. После проверки соответствия значения программной
переменной "х2" \ этого опе\-ра\-то\-ра типу выполняемого
действия, в х19 заносится элемент (Замена $\ldots$), описываю\-щий
преобразование замены. К нему добавляются извлекаемые из обращения
к оператору "заменагруппы" \ элементы (титр $\ldots$).

\par\medskip

Наконец, переход через оператор "ветвь 2", расположенный после
оператора "или \\ (равно(х20 занесениеусловия)равно(х20
занесениепосылки))", приводит к ветви, в которой рассматривается
общий случай преобразования вывода посылки либо ус\-ло\-вия.
Переменной х21 присваивается извлекаемое из стэка выражений
выводимое утверждение. Если оно имеет один из заголовков "актив",
"истина", "число", "точ\-ка", то выход из отладчика, так как показ
данного шага на экране малоинформати\-вен. Аналогично, блокируется
показ шага вывода, если он происходит внутри опе\-ра\-то\-ра
"заменавхождения" \ (занесение утверждений, сопровождающих
основное пре\-об\-ра\-зо\-ва\-ние замены) либо внутри оператора
"одз" \ при режиме трассировки, от\-клю\-ча\-ю\-щем показ действий
данного оператора. Далее в набор х19 заносится элемент (вывод
$\ldots$), описывающий выполняемое преобразование. Если внешний
оператор имеет заголовок "вывод" \ либо "выводусловия", то в х19
заносятся также извлека\-е\-мые из обращения к этому оператору
элементы (титр $\ldots$). В первом случае пред\-ва\-ри\-тель\-но
проверяется, не имеет ли место режим двойного решения задачи с
бло\-ки\-ров\-кой показа неиспользуемых выводов, и если имеет, то
используется ли данный вы\-вод. Это делается с помощью комментария
(повтор $\ldots$), перечисляющего все ис\-поль\-зо\-ван\-ные на
первом запуске решения выводы.

\par\medskip

Следующий случай - удаление посылки либо условия; х20 =
"удалениеусло\-вия" \ либо х20 = "удалениепосылки". Как и выше,
переменной х22 присваивается ссыл\-ка на кадр, в котором
предпринимается обращение к оператору х20, а переменной х23 - тип
этого кадра.

Сначала рассматривается случай кадра задачи - х23 = 1. Переменной
х26 при\-сва\-и\-ва\-ет\-ся значение переменной "х2" \ в кадре
х22.

Если х26 - вхождение символа "равно", то определяется
предшествующая пре\-об\-ра\-зо\-ва\-нию контрольная точка
"прием($\ldots$)". Если ее номер равен 56 (указанный выше прием
решения числового уравнения в посылках задачи на исследование), то
в х19 заносится элемент (Замена $\ldots$), описывающий выполняемую
приемом груп\-по\-вую замену. Аналогичным образом обрабатываются
случаи номеров 16,12,55,57,24 (эти приемы также были указаны
выше), причем в случае, когда удаляются несколько утверждений,
показ преобразования происходит только для первого удаления.

Если х26 - вхождение символа "меньше" \ либо "меньшеилиравно", а
номер кон\-т\-роль\-ной точки "прием($\ldots$)" \ равен 6, то для
первого удаления в набор х19 также заносится элемент (Замена
$\ldots$), а остальные удаления игнорируются.

Если х23 = 2 и внешний оператор имеет заголовок "заменагруппы", то
вы\-ход из отладчика - в этом случае отображение действий
происходит при обращении к оператору занесения посылки либо
условия.

Как и при занесении утверждения, общий случай при удалении
обрабатывается в ветви оператора "ветвь 2". Блокируется показ
удаления утверждения "исти\-на"; кроме того, показ любого удаления
(кроме перечисленных выше специальных слу\-ча\-ев, где удаление
являлось одним из элементарных действий в составе большой
процедуры) блокируется, если такая блокировка имеется в установке
на режим трас\-си\-ров\-ки. Наконец, показ удаления не происходит,
если оно реализуется внутри опе\-ра\-то\-ра "заменавхождения" \
при режиме блокировки показа изменений со\-про\-вож\-да\-ю\-щих
утверждений. В остальных ситуациях набор х19 пополняется элементом
(исключение $\ldots$), описывающим преобразование удаления.

\par\medskip

Далее идет случай преобразований, изменяющих общие комментарии.
Здесь х20 - один из символов "замечание", "примечание",
"удалениезамечания", "удалениепри\-ме\-ча\-ния". Переменной х21
присваивается последний занесенный в стэк выражений элемент. Для
первых двух случаев (ввод комментария) этот элемент есть
символьное число операндов оператора х20, для последних двух -
удаляемый комментарий. В первых двух случаях переменной х23
присваивается вводимый комментарий (если он представлял собой
логический символ, то преобразуется к виду односим\-воль\-но\-го
набора), после чего происходит переприсвоение переменной х21
значения х23. Затем в набор х19 заносится элемент (замечание
$\ldots$), определяющий рассматриваемое пре\-об\-ра\-зо\-ва\-ние
комментариев.

Аналогичным образом обрабатывается случай занесения либо удаления
ком\-мен\-та\-рия к отдельному терму задачи. Здесь х20 - один из
символов "замечусловие", "примечпосылки", "удалениепримечпосылки",
"удалениезамечусловия".

Если х20 = "внутрвывод", то реализуется прием вывода в пакетном
анализаторе. Здесь х19 пополняется элементами (вывод $\ldots$) и
(титр $\ldots$); последние извлекаются из входных данных оператора
"внутрвывод". Аналогичным образом, х20 = "внутр\-пре\-обр" \
означает применение приема замены подтерма в анализаторе. Здесь в
х19 вместо элемента (вывод $\ldots$) заносится элемент (замена
$\ldots$).

\par\medskip

Для дальнейших действий выполняется откат к оператору "ветвь 1",
рас\-по\-ло\-жен\-но\-му в том же фрагменте, что и контрольная
точка "прием(8 0)". Прежде всего, оператор "поискприема" \
определяет ссылку х20 на текущий примененный прием. В случае
приема ГЕНОЛОГа она представляет собой тройку (логический символ -
номер его узла - заголовок приема); в случае приема,
реализованного на ЛОСе - одноэлементный набор, образованный
номером контрольной точки "прием($\ldots$)", предшествующей точке
выхода в отладчик. К началу этого одноэлементного на\-бо\-ра
присоединяется символ, в программе которого расположена
контрольная точка. Затем в набор х19 заносится элемент (прием
х20).

Наконец, предпринимается добавление к цепи обобщенных задач
фиктивной за\-да\-чи, описывающей текущее действие. Это происходит
после контрольной точки "прием(8 2)". Проверяется, что набор х19
содержит элемент, заголовок которого указывает на подлежащее
отображению на экране действие, отличное от обращения к
вспомогательной задаче либо пакетному оператору - "замечание",
"ответ", "замена", "вывод", и т.д. После этого из набора х19 в
поднабор х20 отбираются те элементы, которые войдут в описание
фиктивной задачи; небольшая коррекция здесь про\-ис\-хо\-дит лишь
для элемента (ответ $\ldots$) в случае проверочного оператора.
Далее к концу цепи обобщенных задач х16 присоединяется фиктивная
задача (прием х20), и пе\-ре\-ход через "ветвь 1".

Переменной х20 присваивается вхождение в х16 фиктивной задачи,
описывающей текущее действие. В случае шага решения, на котором
предпринимается обращение к вспомогательной задаче либо пакетному
оператору, переменной х20 оказывается присвоено вхождение в х16
такой новой задачи. Если это действие связано со вводом либо
удалением коммента\-ри\-ев, то добавление к цепи обобщенных задач
тех вспо\-мо\-га\-тель\-ных задач, решение которые ему
предшествовало, блокируется. Здесь сразу предпринимается переход
через оператор "ветвь 1". Иначе - переход через "ветвь 2" \ для
присоединения к х16 вспомогательных задач.

Инициализируется пустым словом накопитель х21 вспомогательных
обобщен\-ных задач, и переменной х22 присваивается комментарий
(буфер $\ldots$) к посылкам исходной задачи. Последовательно
просматриваются наборы х23 из данного комментария, описывающие
имевшие место обращения к вспомогательным задачам и пакетным
операторам. Переменной х24 присваивается копия вспомогательной
задачи либо, для пакетного оператора, пара (заголовок оператора -
набор его входных данных).

Сначала рассматривается случай, когда х24 - задача. Если она имеет
тип "пре\-об\-ра\-зо\-вать" \ и ее ответ совпадает с исходным
видом преобразуемого терма, то эта за\-да\-ча игнорируется. В
противном случае задача х24 снабжается комментарием посылок (буфер
$A$), ссылающимся на вхождение $A$ первого разряда набора х23, и
зано\-сит\-ся в список х21.

Если х24 - указатель обращения к пакетному оператору, то
переменной х25 при\-сва\-и\-ва\-ет\-ся его заголовок, а переменной
х26 - набор входных данных.

В случае пакетного нормализатора (справочник "быстрпреобр" \ имеет
на за\-го\-лов\-ке оператора ненулевое значение) проверяется, что
результат нормализации отличен от исходного терма. Отбрасывается
также, кроме особых случаев, отображение пре\-об\-ра\-зо\-ва\-ний
константного терма и терма, имеющего логические константы
"истина", "ложь". Проверяется, что в х21 не было уже обобщенной
задачи нормализатора с теми же обрабатываемым термом, посылками и
комментариями. Затем создается обобщенная задача нормализатора
х27, к комментариям которой добавляется, как и в случае обычных
задач, ссылка (буфер $A$) на набор х23. Предпринимается обращение
к справочнику "титр", определяющему элемент (титр $\ldots$) для
сопровождаю\-ще\-го обращение к вспомогательной задаче текста.
Однако, этот элемент нигде не ре\-гист\-ри\-ру\-ет\-ся, а нужен
здесь лишь для проверки того, что отображение обращения к
нормализатору не заблокировано элементом (титр стоп). После этого
х27 заносится в накопитель х21.

В случае проверочного оператора (ненулевое значение справочника
"очевидно" \ на заголовке оператора) из набора х26 входных данных
выделяется поднабор х28 значений переменных утверждения,
подлежащего проверке. Этот поднабор под\-став\-ля\-ет\-ся вместо
самих переменных в шаблон проверяемого утверждения, после че\-го
возникает проверяемое утверждение х29. Отбрасываются случаи, когда
это ут\-вер\-жде\-ние не имеет свободных переменных либо
представляет собой указатель на тип объекта. Затем создается
обобщенная задача проверочного оператора х31, и эта задача
заносится в накопитель х21.

Аналогичным образом в накопитель х21 заносятся обобщенные задачи
син\-те\-за\-то\-ра и анализатора. По окончании просмотра
комментария (буфер $\ldots$) к кон\-цу списка х16 добавляется
содержимое списка х21; значение переменной х20 при этом изменении
набора х16 корректируется так, чтобы оно по-прежнему
ука\-зы\-ва\-ло на вхождение фиктивной задачи, описывающей текущее
действие. Далее - откат к оператору "ветвь 1", расположенному
после "равно(х20 правыйкрай(х16))".

В случае повторного просмотра процесса применения проверочного
оператора на экране сначала будет прорисовываться обращение к
этому оператору, и лишь затем - кадр фиктивной задачи, поясняющий,
каким образом выполнена проверка. Для этого в указанной ситуации
переменной х20 переприсваивается вхождение, пред\-шест\-ву\-ю\-щее
фиктивной задаче.

После контрольной точки "прием(8 4)" \ идет обращение к процедуре
"цепьза\-дач", реализующей собственно просмотр цепи обобщенных
задач х16; эта процеду\-ра описывается в следующем подразделе.
Если при просмотре цепи задач была нажата клавиша для продолжения
трассировки, то оператор "цепьзадач" \ присваивает вы\-ход\-ной
переменной х21 набор, содержащий символ "трассировка". В этом
слу\-чае перед выходом из отладчика выполняются следующие
действия:

а) Удаляется комментарий (Смполоса $\ldots$) к исходной задаче, в
котором содер\-жат\-ся выделения задач и их элементов, сделанные
при просмотре цепи задач.

б) Расчищается комментарий (буфер $\ldots$), кроме случая приемов,
преобра\-зу\-ю\-щих комментарии.

в) Удаляется комментарий "обращение" \ к нормализатору либо
задаче, ини\-ци\-иро\-вав\-ший вход в трассировку внутри этого
нормализатора либо задачи. Чтобы такое удаление не повлияло на
работу счетчика шагов в отсутствии трассиров\-ки, фактически
комментарий "обращение" \ просто заменяется на другой логический
сим\-вол - "нормимп", с которым не связано никакой специальной
функциональной на\-груз\-ки.

г) Восстанавливается активация того информационного блока, который
был ак\-ти\-ви\-ро\-ван до обращения к отладчику.

Если же при просмотре цепи задач не была нажата клавиша,
продолжаю\-щая трассировку, то экран расчищается, и откат к
обработчику команд отладчика ЛО\-Са. В этом случае комментарий
(автоклавиатура $\ldots$) хранит код команды,
обеспе\-чи\-ва\-ю\-щей прорисовку при откате текущей программы.

\subsection{Просмотр и редактирование цепи обобщенных задач}

Интерфейс просмотра и редактирования цепи обобщенных задач,
созданной от\-лад\-чи\-ком при анализе текущего шага решения,
осуществляется оператором "цепьзадач(х1 х2 х3 х4)". Значением
входной переменной х1 служит цепь обобщенных задач; х2 - вхождение
в х1 фиктивной задачи, описывающей текущее действие, либо
вхожде\-ние той обобщенной задачи, к которой происходит обращение;
х3 - набор информацион\-ных элементов, характеризующих контекст
срабатывания приема. Фактически, это формируемый программой
отладчика набор х19 из предыдущего подраздела. Список типов
элементов в наборе х3 находится в справочной информации для
символа "цепь\-задач". Оператор "цепьзадач" \ реализует интерфейс
просмотра, а при необходимости и изменения задач набора х1
(вспомогательные задачи изменениям не подлежат). Он позволяет
также сохранить выделенные элементы задач в файлах задачника.
Выходной переменной х4 присваивается набор информационных
элементов, пе\-ре\-да\-ва\-е\-мых отладчику. В частности, наличие
в х4 логического символа "трассировка" \ означает, что после
выхода из оператора нужно будет про\-дол\-жить трассировку
ре\-ше\-ния (т.е. выйти из отладчика).

\subsubsection{Создание набора информационных элементов полос
изображения об\-об\-щен\-ной задачи}

Определение набора информационных элементов полос изображения
обобщен\-ной задачи осуществляется оператором "элементызадачи(х1
х2 х3)". Этот же оператор использовался и в случае просмотра задач
из задачника, причем там были пере\-чис\-ле\-ны типы создаваемых
им информационных элементов полос изображения. Описание его было
отложено до данного момента по той причине, что обобщенные задачи
возникли лишь в связи с пошаговым просмотром решения. Значением
входной пе\-ре\-мен\-ной х1 является обобщенная задача; значением
х2 - набор элементов, содержащий дополнительную информацию для
прорисовки. Выходной переменной х3 при\-сва\-и\-ва\-ет\-ся набор
информационных элементов полос изображения.

В наборе х2 могут встречаться элементы следующих типов:

\begin{enumerate}

\item (ответ $A$) - $A$ есть ответ на задачу, который должен быть
прорисован после ее текста;

\item (отказ $A$) - $A$ есть утерянный ответ на задачу;

\item (изменение $A$) - $A$ есть старая версия изменившегося
ответа на задачу;

\item (число $A$) - $A$ есть десятичная запись числа шагов,
затраченных на решение задачи;

\item (время $A_1 \ A_2$) - $A_1$ и $A_2$ суть четверки (часы,
минуты, секунды, сотые доли секунды) для обращений к часам на
моменты запуска и окончания задачи;

\item (вычитание $A$) - $A$ есть десятичная запись величины
замедления при последнем решении задачи.

\end{enumerate}

Эти элементы вводятся при просмотре задачи из задачника; при
пошаговом про\-смот\-ре решения входной набор х2 пуст.

Войти в просмотр программы "элементызадачи" \ можно, например, из
раз\-де\-ла "Интерфейс просмотра и редактирования задач -
Процедура ЭЛЕМЕНТЫЗАДАЧИ" \ оглавления программ.

Накопителем результата служит переменная х4, которая
инициализируется од\-но\-эле\-мент\-ным набором, содержащим
информационный элемент для прорисовки верх\-ней отделяющей линии
задачи.

Сначала рассматривается случай, когда х1 - обычная задача либо
заготовка та\-кой задачи (если набор х1 начинается с 0). В случае
задачи на выбор хода в шахматах к списку х4 добавляется
информационный элемент (шахматы $\ldots$), и процедура
за\-вер\-ша\-ет\-ся. Иначе - проверяется наличие комментария
(геомредактор $\ldots$), и к х4 присоединяется информационный
элемент для прорисовки чертежа.

Начиная с контрольной точки "прием(2)", происходит создание
элементов для прорисовки посылок задачи. Переменной х6
присваивается список посылок. Если отсутствует комментарий
"полный" \ к посылкам исходной задачи, то из х6 удаляются
вспомогательные посылки "актив($\ldots$)",
"фиктпосылка($\ldots$)", логические константы "истина" \ и
простейшие утверждения о типе значения переменных. Затем - переход
через "ветвь 2".

В случае задачи на преобразование, имеющей цель "преобразование" \
либо "вспом\-пре\-об\-ра\-зо\-ва\-ние", прорисовка посылок
блокируется. Такие цели указывают на вспо\-мо\-га\-тель\-ные
задачи, посылки которых малоинформативны - здесь нужно в пер\-вую
очередь показывать преобразуемый терм. В прочих случаях к набору
х4 добавля\-ют\-ся элементы, определяющие последовательную
прорисовку утверждений набора х6. Затем - откат к оператору "ветвь
1".

Если в х4 нет элементов для прорисовки посылок, то вводится
элемент (пусто 0) для вертикального 19-пиксельного пробела. Далее
начинается определение ин\-фор\-ма\-ци\-он\-ных элементов для
прорисовки целевой установки задачи. Если список целей
укладывается в рамки одного из стандартных случаев, то для
прорисовки целевой установки используется соответствующий
текстформульный шаблон. Иначе цели просто перечисляются, будучи
предварительно преобразованы к виду термов.

Прежде всего, рассматриваются задачи на описание. Если задача
имеет цель "редакция" \ и непустой список неизвестных $X$, то к х4
добавляются элементы, оп\-ре\-де\-ля\-ю\-щие текст "Упростить
ответ для $X$". Если в указанной ситуации список неизвестных пуст,
а целями задачи, кроме указанной выше, являются только символы
"полный", "прямойответ", то задается текст "Переформулировать
условие". Далее - переход через "ветвь 4", где переменной х6
присваивается тройка логических сим\-во\-лов "полный", "явное",
"прямойответ".

Если х6 включается в список целей, то ищется цель х7,
перечисляющая не\-из\-вест\-ные. Если такой цели нет, то
проверяется, что список целей, кроме набора х6, может иметь лишь
цели "одз", "проверка". Тогда задается текст "Определить
истинность или ложность". Если же цель х7 имеется, то находится
список х8 всех остальных (кроме х6, х7) целей задачи, за
исключением ряда целей, наличие либо отсутствие которых не влияет
на создание стандартного текста целевой установки. Наличие в х8
символа "учетответа" \ приводит к созданию текста вида
"Редактирование па\-ра\-мет\-ри\-чес\-ко\-го описания относительно
$\ldots$".

Если х8 не имеет никаких целей, кроме, быть может, цели
"упростить", то про\-ве\-ря\-ет\-ся наличие цели (параметры
$\ldots$). Если она есть и все неизвестные задачи являются
несущественными, то создается текст "Определить условие
существования для $\ldots$". Если же некоторые неизвестные не
являются несущественными, то соз\-да\-ет\-ся текст "Найти
$\ldots$, для которых существуют $\ldots$". При отсутствии цели
(параметры $\ldots$) создается текст "Найти $\ldots$".

Если х8 имеет цель "числрешение", а кроме нее - никаких целей,
кроме, быть может, цели "упростить", то создается текст "Найти
приближенное значение $\ldots$".

Если х8 имеет цель вида (известно $\ldots$) и не содержит других
целей, кроме, быть может, целей "упростить", "вспомпараметр", то
создается текст вида "Найти значения $\ldots$" \ либо "Выразить
$\ldots$ через $\ldots$". При наличии цели "вспомпараметр" \ к
нему добавляются слова "Предпочтительно параметрическое описание".

Если х8 имеет цель (связка $\ldots$) и не имеет других целей,
кроме, быть может, "упростить", то создается текст "Найти
$\ldots$", в котором перечисляются выражения $y(x)$ для
неизвестных функций задачи.

Наконец, если х8 имеет цель "исследовать", то создается один из
стандартных текстов для задачи на исследование свойств функции
либо (при отсутствии цели "функция") задачи на исследование типа
кривой или поверхности.

\par\medskip

Если х6 не включается в список целей задачи, то проверяется, что
задача имеет цели "полный", "прямойответ", "пример", и создается
текст "Найти пример для $\ldots$".

\par\medskip

Далее рассматривается случай задачи на преобразование.

Сначала разбирается подслучай, когда задача имеет единственную
цель, от\-лич\-ную от целей "упростить", "одз", "видУмножение". В
случае цели (рядтейлора $\ldots$) к набору х4 присоединяются
элементы, образующие текст "Разложить в ряд Тей\-ло\-ра по
переменной $\ldots$". Аналогичным образом, для цели (рядфурье
$\ldots$) созда\-ет\-ся текст "Разложить в ряд Фурье по переменной
$\ldots$"; для цели (формулатейлора $\ldots$) - текст "Разложить в
ряд Тейлора по переменной $\ldots$ до членов степени $\ldots$";
для це\-ли (числоценка $\ldots$) - текст "Вычислить с точностью до
$\ldots$"; для целей "раз\-ло\-жить\-на\-мно\-жи\-те\-ли",
"простейшиедроби", "раскрытьскобки" \ - тексты "Разложить на
множители" \ (при наличии дополнительной цели "видУмножение" \ -
"Разложить на комплексные множители"), "Представить в виде суммы
простейших дробей", "Рас\-крыть скобки".

Затем (переход через "ветвь 2") рассматривается подслучай, когда
задача имеет цель "упростить". Если число целей равно 2, то при
наличии цели "одз" \ создается текст "Упростить в о.д.з. выражение
", а при наличии цели "число" \ - "Вычислить". В случае трех целей
- "одз", "класс" \ и "упростить", - создается текст "Найти яв\-ное
задание класса". Если, кроме цели "упростить", задача имеет цель
"нормИнтеграл", то создается текст "Преобразовать выражение к
виду, удобному для интегри\-ро\-ва\-ния". В прочих случаях, если
имеется цель "упростить", то проверяется, является ли условие
задачи утверждением либо выражением. В первом случае создается
текст "Упростить утверждение", во втором - "Упростить выражение".

Если задача имеет цель "график", то создается текст "Построить
график"; в случае цели "выч" \ - текст "Найти приближенное
значение"; в случае двух целей - "учетрезультата" \ и "длина" \ -
текст "Упростить утверждение" \ либо "Упрос\-тить выражение".

Для задачи на доказательство к набору х4 добавляется элемент,
определяющий текст "Доказать"; для задачи на исследование, имеющей
непустой список неиз\-вест\-ных - вводится элемент вертикального
19-пиксельного пробела и элементы, об\-ра\-зу\-ю\-щие текст
"$\ldots$ - не известны".

\par\medskip

Если список целей задачи не укладывается ни в один из
перечисленных выше стандартных случаев, то предпринимается откат к
оператору "ветвь 2" \ (он рас\-по\-ло\-жен в одном фрагменте с
контрольной точкой "прием(3)"). Здесь созда\-ют\-ся элементы для
прорисовки списка целей в виде термов. Прежде всего, проверяется,
что х1 не имеет типа "доказать" \ и не является заготовкой задачи
с недоопределен\-ным пока типом. Переменной х6 присваивается
список целей; он преобразуется в список х7 термов, обозначающих
эти цели. Здесь применяется переход от цели ($A \ b_1 \ldots b_n$)
к терму $A(b_1 \ldots b_n)$, причем делается это только в тех
случаях, когда каждое $b_i$ - сим\-вол либо терм (иначе цель в
списке х7 не регистрируется). Если список х7 непуст, то в набор х4
вводится элемент для текста "Цели задачи:", после которого идут
эле\-мен\-ты для термов набора х7. В случае пустого списка х7
после текстового эле\-мен\-та вводится элемент для прорисовки
логического символа "пусто".

\par\medskip

После прорисовки целевой установки - откат к оператору "ветвь 1",
где к набору х4 добавляется вертикальный 19-пиксельный пробел.
Затем начинается создание элементов для прорисовки условий задачи.

Если тип задачи - "описать", то переменной х6 присваивается ее
список условий. При отсутствии комментария "полный" \ к посылкам
исходной задачи из х6 ис\-клю\-ча\-ют\-ся вспомогательные либо
малоинформативные условия (например, указатели типа значения
неизвестных, кроме указателей "целое", "натуральное"). Затем к х4
добавляются элементы, задающие прорисовку термов списка х6.

В случае задач на доказательство либо преобразование к х4
добавляется элемент, определяющий прорисовку единственного
условия. Блокируется прорисовка усло\-вия "пустоеслово" \ задачи
на доказательство - это случай недоопределенной задачи, еще не
имеющей никакого условия.

Завершают формирование списка х4 информационных элементов полос
изо\-бра\-же\-ния обычной задачи действия по присоединению в конце
ее текста сведений о ранее полученном, утерянном либо изменившемся
ответе (согласно входному набору х2); сведений о трудоемкости
решения задачи, а также сведений о времени, затраченном на
решение. Если набор х4 оказался одноэлементным (пустой бланк
задачи), то к нему добавляется элемент вертикального
19-пиксельного пробела - чтобы на экра\-не бланк задачи был
достаточно различим.

\par\medskip

Далее рассматриваются случаи обобщенных задач.

Для задачи на текстовый анализ (заголовок "текстформ") происходит
регис\-тра\-ция в х4 ее текстформульной структуры, после которой,
как и в случае обычной задачи, добавляется информация об ответе и
времени решения.

В случае задачи нормализатора список посылок х6 обрабатывается,
как и для обычной задачи - при отсутствии комментария "полный" \
из него отбрасы\-ва\-ют\-ся малоинформативные элементы.
Регистрация в списке х4 элементов, обеспечива\-ю\-щих показ термов
списка х6, происходит только при наличии комментария "смпосылка" \
к нормализатору. После отката к оператору "ветвь 2" \ начинается
прорисовка об\-ра\-ще\-ния к нормализатору. Переменной х5
присваивается его название. Сначала про\-грам\-ма символа х5
справочника "титр" \ создает по задаче нормализатора х1
коммен\-та\-рий (титр $\ldots$), определяющий текстформульный
фрагмент, объясняющий выполня\-е\-мое нормализатором
преобразование. Затем процедура "тексттитра" \ определяет по этому
комментарию (он присвоен переменной х6) текстформульную структуру
х7 данного фрагмента, и в х4 заносится элемент полосы прорисовки
структуры х7. Для создания текстформульных заготовок, объясняющих
действия нормализа\-то\-ра $A$, нужно ввести на ГЕНОЛОГе прием
справочника "титр" \ с "теоремой" \ данного приема "титр($A$ х1)",
а текстформульные шаблоны связать с описанием этого при\-ема. Если
прием справочника "титр" \ для нормализатора $A$ не создан, либо в
нем не предусмотрен шаблон для текущей ситуации, то в х4 заносятся
элементы, соз\-да\-ю\-щие текст "Применить нормализатор "$A$" \ к
выражению:". После прорисовки обраще\-ния к нормализатору в набор
х4 вводится элемент, определяющий преобразуемый терм.

Случаи задач проверочного оператора и синтезатора аналогичны
случаю нор\-ма\-ли\-за\-то\-ра. Если справочник "титр" \ для этих
операторов не определяет специаль\-ное текстформульное
сопровождение обращения к ним, то в х4 заносятся элементы,
создающие текст "Проверить утверждение" \ для проверочного
оператора и "По\-до\-брать значение переменной" \ для синтезатора.

Для задачи анализатора $A$ сначала предпринимается попытка
определить текст\-фор\-муль\-ное сопровождение обращения к нему
при помощи справочника "титр"; ес\-ли это не удается, то выдается
стандартный текст "Применить анализатор $A$". Далее в х4 заносится
элемент вертикального пробела, и за ним - элементы для прорисовки
утверждений, выведенных в процессе применения анализатора.

В случае фиктивной задачи, описывающей текущий шаг решения
(заголовок ее - логический символ "прием"), прежде всего
проверяется, является ли текущая обобщенная задача обычной задачей
и имеет ли она сопровождающий чертеж; если имеет, то в х4
заносится элемент, определяющий прорисовку этого чертежа. Затем
рассматриваются следующие типы выполняемых на текущем шаге
действий:

\begin{enumerate}

\item Преобразование замены. В списке информационных элементов
задачи х1 на\-хо\-дит\-ся набор (замена $A_1 \ A_2$). Если $A_1$ -
набор, то имеет место замена условия либо посылки задачи, причем
$A_1$ - пара (вхождение заменяемого терма задачи - указатель
посылки (0) либо условия (1)); $A_2$ - заменяющий терм. Тогда в х4
заносятся элементы для выдачи текста "Посылка (либо условие)
$\ldots$ заменяется на $\ldots$". Если $A_1$ - терм, то имеет
место замена в анализаторе этого терма на терм $A_2$. В х4
заносятся элементы для текста "$\ldots$ заменяется на $\ldots$".
Наконец, если $A_1$ равно 0, то имеет место замена в
нормализаторе, и создается текст "Условие $\ldots$ заменяется на
$\ldots$".

\item Замена группы утверждений. В х1 находится элемент (Замена
$A_1 \ A_2 \ A_3$). Здесь $A_1$ - указатель посылок (0) либо
условий (1); $A_2$ - набор заменяемых ут\-вер\-ж\-де\-ний; $A_3$ -
набор заменяющих утверждений. Создается текст "Условия (ли\-бо
посылки; условие; посылка) $\ldots$ заменяются (заменяется) на
$\ldots$".

\item Вывод новой посылки либо условия. В х1 находится элемент
(вывод $A_1 \ A_2$). Здесь $A_1$ - указатель посылки либо условия;
$A_2$ - выводимое утверж\-де\-ние. Создается текст "Добавление
посылки (условия) $\ldots$".

\item Вывод группы новых посылок. В х1 находится элемент (список
$A$), где $A$ - выводимые посылки. Создается текст "Добавление
посылок $\ldots$".

\item Попытка замены условия задачи на описание либо
доказательство на но\-вое условие, следствием которого оно
является. В х1 находится элемент (по\-пыт\-ка\-спус\-ка $A_1 \
A_2$). Здесь $A_1$ - вхождение заменяемого условия; $A_2$ -
заменяющее условие. Создается текст "Для получения условия
$\ldots$ реализуем далее усло\-вие $\ldots$".

\item Удаление условия либо посылки задачи. В х1 находится элемент
(исключе\-ние $A_1 \ A_2$). Здесь $A_1$ - вхождение удаляемого
утверждения; $A_2$ - указатель посылки либо условия. Созадется
текст "Удаление условия (посылки) $\ldots$".

\item Выдача ответа. В х1 находится элемент (ответ $A$), где $A$ -
ответ либо (в слу\-чае положительного результата применения
проверочного оператора) символ "легковидеть" \ либо (при выдаче
ответа задачи на исследование) символ "ис\-сле\-до\-вать".
Пополнение списка х4 предпринимается только в первой ситуации.
Если ответ распадается на подслучаи, то для организации прорисовки
схе\-мы этих подслучаев используются специальные операторы
"случаи" \ (для задач на описание) и "варианты" \ (для задач на
преобразование). Затем создается текст "Ответ: $\ldots$".

\item Ввод либо удаление комментария. В х1 находится элемент
(замечание $A_1 \ A_2 \ A_3 \\ A_4$). Здесь $A_1$ - указатель
ввода (1) либо удаления (0); $A_2$ - указатель по\-сы\-лок либо
условий; $A_3$ - 0 в случае общего комментария либо тот терм, к
которому относится комментарий; $A_4$ - сам комментарий.
Переменной х8 присваивается логический символ, определяющий текст
для названия выполняемой операции - "Удаляется комментарий
посылок"; "Удаляется комментарий"; "Вводится ком\-мен\-тарий
посылок"; "Вводится комментарий". Для прорисовки коммента\-рия
применяется текстформульная структура; те разряды комментария,
которые представляют собой символы, выдаются непосредственно, а
прочие - заменя\-ют\-ся на символ "в" \ (вхождение) либо "н" \
(набор).

\item Инициализация разбора случаев в нормализаторе. В х1
находится элемент (раз\-бор\-слу\-ча\-ев $A$). Здесь $A$ -
утверждение "или($\ldots$)", определяющее рас\-смат\-ри\-ва\-емые
подслучаи. Создается текст "Будем рассматривать альтернативные
слу\-чаи $\ldots$. Пусть сначала выполнено $\ldots$".

\item Переход к рассмотрению очередного подслучая в нормализаторе.
В х1 нахо\-дит\-ся элемент (подслучаи $A$). Здесь $A$ - набор
утверждений, конъюнкция кото\-рых определяет новый подслучай.
Создается текст "Переход к рассмот\-ре\-нию подслучая $\ldots$".

\end{enumerate}

По завершении приведенного выше рассмотрения вариантов - откат к
опера\-то\-ру "ветвь 1", где предпринимается создание элементов
поясняющего текста, рас\-по\-ло\-жен\-но\-го после описания
выполненного действия. Инициализируется нулем пе\-ре\-мен\-ная х7,
которая используется в качестве указателя наличия специальных
пояснений. Такие пояснения определяются элементами (титр $\ldots$)
из х1. Если последний раз\-ряд такого элемента отличен от 0, то
оператор "тексттитра" \ преобразует его в текст\-фор\-муль\-ную
структуру х9, регистрируемую в наборе х4. Если же последний
элемент равен 0, то создается текст "(Простейшая стандартизация)".
Специальные поясне\-ния могут определяться также элементами
(сборкатекста $\ldots$) из х1. Отличие их от элементов (титр
$\ldots$) состоит в том, что первые используют для создания
тек\-ста текстовые заготовки из 2-го информационного блока,
закрепленные за различными логическими символами, а вторые -
текстформульные шаблоны, связанные с при\-е\-ма\-ми.
Преобразование элементов (сборкатекста $\ldots$) в текстформульную
структу\-ру осуществляется оператором "сборкатекста".

Если специальные пояснения имелись, то х7 заменяется на 1, и тогда
достижимый через "ветвь 3" \ оператор "обрыв" \ отменяет откат к
оператору "ветвь 2". Иначе - откат к "ветвь 2". Здесь в качестве
поясняющего текста вводится текст того конце\-во\-го пункта
оглавления базы приемов, к которому относится применяемый прием.
Отбрасываются случаи, когда пояснения представляются избыточными
(пре\-об\-ра\-зо\-ва\-ния, изменяющие комментарии, и т.п.).

Далее - к концу набора х4 добавляется элемент вертикального
19-пиксель\-но\-го пробела, и этот набор выдается в качестве
результата обращения к операто\-ру "элементызадачи".

\par\medskip

Однако, в случае пошагового показа решения нужно не просто
отображение за\-да\-чи в цепи обобщенных задач, но еще и пояснение
того, с какой целью она введена. Эти и некоторые другие пояснения
создаются оператором "инфзадачи(х1 х2 х3 х4)", обращение к
которому предпринимается сразу после получения от оператора
"эле\-мен\-ты\-за\-да\-чи" \ заготовки х3 набора информационных
элементов полос изображе\-ния. Значением х1 является здесь
вхождение рассматриваемой задачи в цепь обобщен\-ных задач; х2 -
набор информационных элементов, характеризующих контекст
сраба\-ты\-ва\-ния приема (т.е. набор х19 отладчика). Выходной
переменной х4 присваива\-ет\-ся окончательная версия набора
информационных элементов полос изображения. Оператор "инфзадачи" \
извлекает дополнительную информацию для пояснений из анализа
стэковых кадров интерпретатора ЛОСа, начатого отладчиком ЛОСа при
формировании цепи обобщенных задач.

Выйти в начало программы оператора "Инфзадачи" \ можно, например,
че\-рез пункт "Интерфейс просмотра и редактирования задач -
Процедура ЦЕПЬЗАДАЧ - Оператор ИНФЗАДАЧИ" \ оглавления программ.

Для вставки пояснений о внешнем приеме, обратившемся к обобщенной
зада\-че, прежде всего проверяется, что заголовок этой обобщенной
задачи отличен от символов "разборслучаев", "подслучаи", "прием".
Затем переменной х5 при\-сва\-и\-ва\-ет\-ся цепь обобщенных задач,
а переменной х6 - элемент (смкадр $A$), где $A$ - на\-бор ссылок
на стэковые кадры для обобщенных задач цепи х5, предшеству\-ю\-щих
фиктивной задаче, хранящей информацию о текущем действии.
Проверяется, что вхождение х1 расположено в цепи задач до
указанной фиктивной задачи, и пере\-мен\-ной х7 присваивается
ссылка на стэковый кадр рассматриваемой задачи. Опера\-тор
"приемкадра" \ находит ссылку х8 на прием, реализация которого
начата в кадре х7. Напомним, что такая ссылка - либо тройка
(логический символ - номер уз\-ла статьи этого символа - заголовок
приема), определяющая прием ГЕНОЛОГа, либо пара (логический символ
- номер контрольной точки "прием($\ldots$)" \ программы этого
символа) в случае приема, реализованного непосредственно на ЛОСе.
Для ссылки второго типа - х8 есть пара ($s,N$) - рассматриваются
следующие случаи:

\begin{enumerate}

\item s = "или"; $N = 33$. Это - прием разбора случаев по
дизъюнктивному ус\-ло\-вию задачи на описание. Определяется набор
х11 значений программ\-ных переменных того кадра, в котором
происходит реализация приема. Переменной х12 присваивается
значение переменной "х16" \ в наборе х11; этим значением является
тот дизъюнктивный член условия, который определяет текущий
под\-слу\-чай. Затем создается текстформульная структура х13 для
поясняющего тек\-ста "Рассмотрение подслучая: $\ldots$", и
информационный элемент полосы изо\-бра\-же\-ния для этой
текстформульной структуры вставляется в набор х3
не\-по\-сред\-ствен\-но после первого элемента, задающего верхнюю
отделяющую линию задачи.

\item s = "или"; $N = 24$. Это - прием разбора случаев по
дизъюнктивной посылке задачи на описание. Отличие от предыдущего
пункта здесь лишь в том, что дизъюнктивный член текущего подслучая
определяется не переменной "х16", а переменной "х9" из набора х11.

\item s = "или"; $N = 38$. Это - прием разбора случаев по
дизъюнктивной посылке задачи на доказательство либо на
преобразование. Аналогично предыдущим двум случаев, но текущий
дизъюнктивный член определяется переменной "х8".

\item s = "равно"; $N = 48$ либо $N = 24$. Это - приемы решения
числовых уравнения путем перехода к новым неизвестным,
инициируемые в различных ситуациях (первый - в задаче на
исследование, второй - в задаче на описание). Перемен\-ной х11
присваивается набор значений переменных в кадре приема; переменной
х12 присваивается значение переменной "х22" \ в первом случае и
"х20" \ - во вто\-ром. Это значение представляет собой четверку
(набор уравнений, в которых предпринимается замена неизвестных -
набор выражений с неизвестными, для которых вводятся новые
неизвестные - набор уравнений после перехода к но\-вым неизвестным
- список новых неизвестных). Переменной х13 присваивается список
новых неизвестных, а переменной х14 - набор обозначаемых ими
вы\-ра\-же\-ний. Затем создается текстформульная структура х15 для
текста "Вво\-дим вспомогательные неизвестные $\ldots$ для
выражений $\ldots$", которая вставляется в набор х3.

\item s = "меньше" \ либо s = "меньшеилиравно"; $N = 6$. Это -
прием перехода к новым неизвестным при решении строгого либо
нестрогого неравенства. Создается текстформульная структура,
аналогичная предыдущей.

\end{enumerate}

В остальных случаях (кроме обращения к задаче из оператора
"списокзадач", которое происходит при первоначальном запуске
решения) в качестве по\-яс\-не\-ния того, откуда возникла задача,
используется текст того концевого пункта оглавления базы приемов
либо оглавления программ, в котором зарегистрирован прием.
Текст\-фор\-муль\-ная структура для него создается оператором
"титрприема".

\par\medskip

В том случае, когда рассматривается фиктивная задача, описывающая
текущее действие, предпринимается переход из корневого фрагмента
оператора "инфзада\-чи" \ через оператор "иначе 3". Если в
фиктивной задаче содержится указание на то, что предпринимается
выход из задачи на исследование (элемент (ответ исследо\-вать))
либо получен положительный результат при обращении к проверочному
оператору (элемент (ответ легковидеть)), причем не предусмотрено
специального поясняющего текста (отсутствует элемент (титр
$\ldots$), то находится ссылка х6 на прием, выполнение которого
привело к данному действию. Если этот прием определяется парой
("рав\-но", 14), то-есть имеет место возвращение к условиям задачи
на описание после того, как анализ объединенного списка условий и
посылок привел к явному выраже\-нию для одной из неизвестных, то
создается текстформульная структура для тек\-ста "Возвращение к
условиям исходной задачи после получения выражения $\ldots$ для
неизвестной $\ldots$". В прочих случаях для пояснения действия
используется текст то\-го концевого пункта оглавления приемов либо
программ, в котором зарегистриро\-ван примененный прием.

Для фиктивной задачи, указывающей на найденный результат обращения
к па\-кет\-но\-му синтезатору, в качестве пояснения также
используется текст со\-от\-вет\-ству\-ю\-ще\-го концевого пункта
оглавления приемов либо программ.

\par\medskip

После всех перечисленных выше пунктов - откат к оператору "ветвь
2", где рассматривается случай вспомогательной задачи,
расположенной в цепи обобщен\-ных задач после фиктивной. Напомним,
что пока информационные элементы полос изображения вспомогательной
задачи не содержат данных об ответе, полученном при ее решении.
Для нахождения этих данных переменной х6 присваивается
коммента\-рий (буфер $A$) к посылкам вспомогательной задачи (для
обобщенной задачи пакет\-но\-го оператора - просто комментарий
этого оператора). Здесь $A$ - вхождение в набор $B$ комментария
(буфер $B$) к посылкам исходной задачи той пятерки, которая
со\-хра\-ня\-ет информацию о решении данной вспомогательной
задачи.

Однако, перед добавлением элементов прорисовки ответа,
анализируется ис\-точ\-ник данной вспомогательной задачи, и после
верхней разделяющей линии встав\-ля\-ют\-ся необходимые пояснения
о цели ее решения. Для этого сначала проверяется нали\-чие
комментариев (титр $\ldots$), сформированных при обращении к
задаче использующим ее приемом; если они есть, то оператор
"тексттитра" \ создает текстформульную струк\-ту\-ру х8
поясняющего текста и вставляет ее в набор х3. Если таких
комментариев нет, но есть комментарий (сборкатекста $\ldots$), то
текстформульная структура х8 соз\-да\-ет\-ся оператором
"сборкатекста". Если список информационных элементов х2 име\-ет
элемент (попыткаспуска $\ldots$), то создается элемент для текста
"(Попытка ре\-шить задачу после перехода к новому условию)". В
остальных случаях вставля\-ет\-ся пояснение "(Вспомогательная
задача)".

Далее - откат к оператору "ветвь 2", где предпринимаются действия
по ре\-гис\-тра\-ции в х3 ответа задачи. Проверяется, что
рассматриваемая обобщенная задача не имеет типа "исследовать" \ и
не является обращением к пакетному анализатору. После этого
переменной х7 присваивается ответ задачи - он хранится в последнем
разряде той пятерки, вхождение $v$ которой определяется парой
(буфер $v$), присвоенной ранее переменной х6. Если рассматриваемая
обобщенная задача является обращением к проверочному оператору и
х7 отлично от символа "отказ", то оно заменяется на утверждение
"истина". Если обобщенная задача является обращением к
синтезатору, то х7 - набор термов $t_1, \ldots, t_n$, найденных в
качестве значений для переменных $x_1, \ldots, x_n$. Тогда х7
заменяется на утверждение "и(равно($x_1 \ t_1$) $\ldots$
равно($x_n \ t_n$))". Далее х7 обрабатывается для выдачи в
стандартном виде оператором "нормформ" \ (в частности, здесь
нормализуется упорядочение слагаемых и сомножителей). Если ответ
представляет собой перечисление подслучаев, то информационные
эле\-мен\-ты для отображения схемы этих подслучаев создаются
операторами "случаи" \ (для за\-дач на описание) либо "варианты"
 \ (для задач на преобразование и нормализа\-то\-ров). Перед
 информационными элементами, обеспечивающими собственно прорисовку
 от\-ве\-та, вставляются элементы для текста "Ответ:". После этого -
 выход из опера\-то\-ра "инфзадачи".

 \subsubsection{Прорисовка цепи обобщенных задач}

 Оператор "цепьзадач" \ начинает свою работу с активации второго
 информацион\-но\-го блока и прорисовки в верхней части экрана меню
 просмотра цепи задач. Далее идет оператор
 "повторение", к которому будут происходить откаты при
 восстановлении исходного изображения просмотра цепи задач.
 Инициализируется пустым словом накопитель х5 пар (вхождение
 обобщенной задачи в цепь х1 обобщенных задач - набор
 информационных элементов полос изображения данной задачи). В х5
 за\-но\-сит\-ся пара для задачи, указанной по вхождению х2 в цепь задач -
 это либо фик\-тив\-ная задача, поясняющая текущее действие, либо новая
 задача, в обращении к которой состоит это действие. Для этого
 применяются операторы "элементыза\-да\-чи" \ и "инфзадачи". Затем -
 переход через "ветвь 2".

 Здесь располагается оператор "повторение", к которому будут
 происходить от\-ка\-ты при перерисовке цепи задач согласно набору х5.
 Переменной х7 - ука\-за\-те\-лю вхождения в х5 текущей прорисовываемой
 задачи - присваивается левый край на\-бо\-ра х5. Ини\-ци\-али\-зи\-ру\-ет\-ся
 нулем номер х8 первой свободной строки. Инициализируется нулем
 переменная х9, которая будет использоваться для указания на
 вхождение текущего прорисовываемого информационного элемента
 полосы изображения.

 После контрольной точки "прием(2 9)" \ располагается ветвь,
 обеспечива\-ю\-щая выделение голубым цветом отличающихся частей
 заменяемого и заменяющего тер\-мов при преобразовании замены.
 Для идентификации такого преобразования среди информационных
 элементов полос изображения первой пары набора х5 ищется эле\-мент
 (слово смисточник), определяющий прорисовку текста "заменяется
 на:". Пред\-шествующий и последующий элементы (терм $\ldots$)
 определяют, соответственно, за\-ме\-ня\-емый и заменяющий термы задачи;
 эти элементы присваиваются переменным х15 и х16. Переменной х17
 присваивается пара (вхождение корня заменяемого терма - вхождение
 корня заменяющего терма). Далее предпринимается цикл коррекций
 пары х17. Если на очередном шаге первый и второй элементы этой
 пары определя\-ют вхождения термов $f(A_1 \ldots A_n)$ и $f(B_1
 \ldots B_n)$, имеющих одинаковые заголовки и оди\-на\-ко\-вое число
 операндов, причем для некоторого $i$ термы $A_i,B_i$ различаются,
 а при всех $j \ne i$ термы $A_j,B_j$ совпадают, то х17 заменяется на
 пару вхождений $A_i,B_i$. По окончании цикла коррекций - переход
 через оператор "ветвь 3", где проверяется, что х17 выделяет два
 подтерма, отличных от самих термов. Для выделения подтермов
 используется комментарий (Смполоса $\ldots$) к посылкам исходной задачи,
 аналогич\-ный комментарию (смполоса $\ldots$), выделявшему элементы и
 задачи при просмотре задач в задачнике. Выделенные таким комментарием
 задачи и их элементы бу\-дут прорисовываться в цепи обобщенных
 задач голубым цветом.

 Для дальнейшего определим формат комментария (Смполоса $A$).
 Здесь $A$ - набор выделений в цепи обобщенных задач, имеющих один
 из следующих типов:

 \begin{enumerate}

 \item ($B$) - $B$ есть вхождение выделенной задачи в цепь
 обобщенных задач;

 \item ($B_1 \ B_2 \ B_3$) - $B_1$ есть вхождение задачи, в
 которой выделена полоса; $B_2$ - но\-мер вхождения выделенной
 полосы в список полос изображения задачи; $B_3$ - информационный
 элемент, определяющий эту полосу;

 \item ($B_1 \ B_2 \ B_3 \ B_4$) - $B_1 - B_3$ те же, что и выше;
 $B_4$ имеет вид (набор $\ldots$), а $B_4$ определяет номер
 вхождения выделенного элемента полосы изображения.

 \item ($B_1 \ B_2 \ B_3 \ B_4$) - $B_1 - B_3$ те же, что и выше;
 $B_3$ имеет вид (терм $\ldots$), а $B_4$ - указатель вхождения в
 этот терм выделенного подтерма.

 \item ($B_1 \ B_2 \ B_3 \ B_4 \ B_5$) - $B_1 - B_4$ те же, что и
 выше для случая $B_3$ вида (на\-бор $\ldots$); выделен элемент
 полосы - терм, и $B_5$ - указатель вхождения в этот терм
 выделенного подтерма.

 \end{enumerate}

 По завершении выделения различающихся фрагментов заменяемого и
 заменя\-ю\-ще\-го термов - откат к оператору "ветвь 1". Здесь
 размещается оператор "повторе\-ние", к которому происходят откаты
 при дорисовке.

 Переменной х9, если она равна 0 (экран пуст), присваивается
 вхождение пер\-во\-го информационного элемента полосы изображения
 текущей прорисовываемой задачи. Если х9 было не равно 0, то определяло
 вхождение последнего прорисованного эле\-мен\-та. Если этот элемент
 не последний в своем списке, то х9 переустанавливается на
 вхождение следующего элемента. Если же он последний, то
 проверяется, является ли вхождение х7 последним в наборе х5.
 Если не последнее, то х7 присваивается вхождение следующей пары
 набора х5, а х9 - вхождение первого информационного элемента
 полосы изображения задачи новой пары. Если вхождение х7 было
 по\-след\-ним, то рассматривается соответствующее ему вхождение
 х12 обобщенной задачи в цепь обобщенных задач. Если х12 - не
 последнее, то берется следующее за ним вхождение х13. Для
 обобщенной задачи по вхождению х13 операторы "элементыза\-да\-чи",
 "инфзадачи" \ определяют набор х15 информационных элементов полос
 изо\-бра\-же\-ния; пара (х13 х15) заносится в конец набора х5, после
 чего х7 и х9 пере\-ус\-та\-нав\-ли\-ва\-ют\-ся на прорисовку данной обобщенной
 задачи. После перечисленных действий по коррекции ссылки х9 на
 текущий информационный элемент прорисовки - откат к оператору
 "ветвь 1", расположенному после "повторение".

 Если информационный элемент по х9 не прорисован (его последний
 разряд ра\-вен 0), то оператор "высотаполосы" \ корректирует этот
 элемент, доопределяя все необходимые для прорисовки параметры,
 и присваивая переменной х10 вы\-со\-ту его полосы.
 Если места для прорисовки оказывается недостаточно, то последний
 раз\-ряд информационного элемента обратно устанавливается на 0.
 Иначе - опе\-ра\-тор "Смполоса" \ выполняет прорисовку.
 Корректируется номер х8 первой свободной
 стро\-ки, и откат к переустановке х9 на следующий элемент. По
 завершении цикла до\-ри\-сов\-ки - переход через "ветвь 1" \ в начале
 рассматриваемого фрагмента.

 Если прорисовка оборвалась не на последнем элементе набора х5, то
 этот набор укорачивается - из него исключаются пары, идущие после
 вхождения х7. Аналогично, от начала набора х5 отбрасываются пары,
 соответствующие задачам, у которых не прорисована ни одна полоса.
 Затем - переход к циклу обработки команд интер\-фей\-са просмотра
 цепи обобщенных задач.

 \subsubsection{Обработка команд интерфейса просмотра цепи
 обобщенных задач}

 Выйти на начальную точку обработчика команд можно через пункт
 "Цикл об\-ра\-ще\-ний к клавиатуре - Исходная точка" \ подраздела
 оператора "цепьзадач" \ в оглав\-ле\-нии программ. После оператора
 "повторение", к которому происходят откаты к за\-про\-су очередной
 команды, расположен оператор "автоменю(х10)", запрашивающий
 но\-вую команду х10. Рассматриваются следующие типы команд:

 \begin{enumerate}

 \item х10 = "Плюс". Нажата клавиша "Esc" \ для обрыва решения
 задачи. Логичес\-кий терминал "метка" \ корневого указателя второго
 информационного блока корректируется так, чтобы после внутреннего
 перезапуска был выполнен вы\-ход на просмотр того концевого пункта
 оглавления задачника, в котором на\-хо\-дит\-ся решавшаяся задача.
 Затем - внутренний перезапуск. Отдельно обрабатывается случай
 обрыва вывода следствий в базе теорем, где перед внутренним
 пе\-ре\-за\-пус\-ком активируется 6-й информационный блок.

 \item х10 = "частичныйответ" \ либо х10 = "нормпроизведениевсех".
 Нажата кла\-ви\-ша "о" \ либо "ф" \ для прорисовки текущего
 реализуемого фрагмента програм\-мы и перехода в отладчик ЛОСа.
 Клавиша "о" \ вызывает прорисовку фрагмента лишь до текущего
 оператора, клавиша "ф" \ - полную прорисовку. Сбрасывается массив
 текстов - в нем сохранялись текстовые фрагменты текстформуль\-ных
 структур информационных элементов полос изображения, и его нужно
 пе\-ри\-оди\-чес\-ки расчищать во избежание переполнений. Фактически
 данная команда через комментарий (автоклавиатура $\ldots$)
 передается отладчику ЛОСа, где она обрабатывается так, как было
 описано выше. Перед выходом в отладчик ЛОСа удаляется, если он
 имелся, комментарий "цепьзадач" \ к посылкам исходной задачи.
 Этот комментарий был нужен, если велась техническая трас\-си\-ров\-ка
 на уровне отладчика ЛОСа, и требовалось просмотреть текущую цепь
 задач.

 \item х10 = "подстановка". Нажата клавиша "курсор вниз" \ для
 прокрутки изо\-бра\-же\-ния вниз. Эта и последующие операции прокрутки
 в операторе "цепьза\-дач" \ реализованы практически так же, как в операторе
 "списокзадач". Отли\-чие состоит лишь в том, что вместо переменной х4
 оператора "списокза\-дач", определявшей набор троек (номер задачи в списке
 - задача - список ин\-фор\-ма\-ци\-он\-ных элементов полос изображения),
 берется переменная х5 для на\-бо\-ра пар (вхождение задачи в цепь
 обобщенных задач - список информацион\-ных элементов полос
 изображения).

 \item х10 = "внешсумма". Нажата клавиша "курсор вверх" \ для
 прокрутки изо\-бра\-же\-ния вверх. Аналогично оператору "списокзадач".

 \item х10 = "точкапривязки". Нажата клавиша "PageDn" \ для
 прокрутки изо\-бра\-же\-ния на одну страницу вниз. Аналогично оператору
 "списокзадач".

 \item х10 = "контрольунификации". Нажата клавиша "PageUp" \ для
 прокрутки изо\-бра\-же\-ния на одну страницу вверх. Аналогично
 оператору "списокзадач".

 \item х10 = "мышь". Нажата кнопка мыши для выделения задачи либо
 ее элемента. Аналогично оператору "списокзадач", однако при
 выделении вместо ком\-мен\-та\-рия (смполоса $\ldots$) используется
 комментарий (Смполоса $\ldots$).

 \item х10 = "обл". Нажата клавиша пробела для отмены выделений.
 Анало\-гич\-но оператору "списокзадач", с переходом от комментария
 (смполоса $\ldots$) к ком\-мен\-та\-рию (Смполоса $\ldots$).

 \item х10 = "отрезок". Нажата клавиша Ctr-PageDown для перехода
 к просмот\-ру обобщенной задачи, описывающей текущее действие.
 Если прорисовка нача\-та с задачи, отличающейся от расположенной по
 вхождению х2 в цепь обобщен\-ных задач, либо прорисован лишь конец
 этой задачи, то набор х5 повтор\-но инициализируется парой,
 задающей прорисовку задачи по х2, и откат к перерисовке.

 \item х10 = "десчастное". Нажата клавиша Ctr-PageUp для перехода
 к про\-смот\-ру первой задачи цепи обобщенных задач. Аналогично
 предыдущему, но х5 инициализируется для прорисовки начиная с
 первой задачи цепи.

 \item х10 = "модули". Нажата клавиша Ctr-Del для удаления
 выделенной посылки либо выделенного условия задачи на описание.
 Это удаление затрагивает толь\-ко текущий процесс трассировки и
 используется в отладочных целях. Находит\-ся комментарий (Смполоса
 $\ldots$) к посылкам исходной задачи, который сразу же исключается.
 Проверяется, что он определяет выделение единственного эле\-мен\-та -
 полосы изображения некоторой задачи, содержащей терм этой зада\-чи.
 Переменной х18 присваивается вхождение в список х17 информаци\-он\-ных
 элементов полос изображения указанной задачи выделенного элемента
 х19. Проверяется, что х19 определяет прорисовку терма. Переменной
 х20 при\-сва\-и\-ва\-ет\-ся задача, в которой выделен терм. Переменная х22
 перечисляет вхож\-де\-ния данного терма в список посылок задачи, либо,
 если задача - на опи\-са\-ние, в ее список условий. При этом переменной
 х23 передается значение 0 в слу\-чае списка посылок и 1 в случае
 условий. Проверяется, что выделенная по\-ло\-са соответствует значению
 х23 (по наличию либо отсутствию предшеству\-ю\-щих выделенному элементов
 типа "набор" \ либо "слово"). Затем предпринимается удаление в
 задаче х20 найденного вхождения х22 посылки либо условия. Кор\-рек\-ти\-руется
 изображение на экране: следующие после удаленной полосы сме\-ща\-ют\-ся
 вверх и корректируются их информационные элементы. Уменьшается
 значение х8 первой свободной строки; изменяется для дорисовки
 значение х9 (вхождение того информационного элемента полосы
 изображения, с которого начинается дорисовка), и откат к дорисовке.

 \item х10 = "прогрпеременная". Нажата клавиша "ы" \ для включения
 либо вы\-клю\-че\-ния режима полного просмотра списков посылок и
 условий (без про\-пус\-ков утверждений сопровождающего характера).
 Как и в случае оператора "спи\-сок\-за\-дач", это достигается вводом
 либо удалением комментария "полный" \ к посылкам исходной задачи.
 Каждый раз происходит повторная инициали\-за\-ция набора х5, в
 который заносится пара для задачи, отображающей теку\-щее действие,
 и далее - откат к перерисовке.

 \item х10 = "Неизвестная" \ либо х10 = "число". Соответственно,
 нажаты кла\-ви\-ша "Ф" \ либо "Т" \ для ввода нового условия либо
 новой посылки, соответственно, формульным либо текстовым
 редактором. Как и в случае удаления, ко\-ман\-да используется
 для ручной коррекции действий решателя при отладке. Сна\-ча\-ла
 переменной х11 присваивается последняя из пар набора х5, а
 пере\-мен\-ной х12 - вхождение в цепь обобщенных задач определяемой
 этой парой задачи. Переменная х13 инициализируется нулем. Далее
 находится комментарий (См\-полоса $\ldots$) и просматриваются
 наборы х17 из этого комментария, определя\-ю\-щие выделения задач и
 их элементов.

 Если встречается одноэлементный набор х17, т.е. выделена
 некоторая задача, то переменной х18 присваивается ее вхождение в
 цепь обобщенных задач, а переменной х19 - соответствующая задаче
 пара из набора х5. Проверя\-ет\-ся, что выделенная обобщенная задача -
 обычная и что последняя из ее полос изображения прорисована на
 экране. После этого х11 заменяется на пару х19, х12 - на
 вхождение х18, а х13 - на номер строки, начиная с которой нуж\-но
 вводить дополнительный терм в конце выделенной задачи. Для дальней\-ших
 действий по добавлению терма в данном случае - откат к оператору
 "ветвь 2".

 Если встречается набор х17 длины 3, т.е. выделена полоса
 некоторой задачи, то проверяется, что отсутствует выделенная
 задача. Как и в предыдущем слу\-чае, переменной х18 присваивается
 вхождение рассматриваемой задачи в цепь обобщенных задач, а
 переменной х19 - ее пара из набора х5. Проверяется, что эта
 задача - обычная. Переменной х20 присваивается вхождение
 инфор\-ма\-ци\-он\-но\-го элемента выделенной полосы, а переменной х21 -
 сам этот элемент. Проверяется, что полоса прорисована на экране и что
 заголовок элемента х21 - один из символов "терм", "набор", "слово".
 В первом случае добавление нового терма происходит внутри списка
 посылок либо условий, во втором - в конце этого списка. Находится
 число х24 предшествующих выделенной полосе полос изображения той
 же задачи, определяемых элементами типов "набор", "слово". Если
 х24 равно 0, то вставка происходит в список посылок, иначе - в
 список условий, и тогда проверяется, что тип задачи - "описать".
 При вставке в конце списка выделение сохраняется, но номер
 выделенной полосы увеличивается на 1, иначе - выделения
 сбрасываются. Экран расчищается начиная с выделенной полосы, и все
 информационные элементы последующих полос помечаются как
 непрорисованные. х7, х9 соответствующим образом корректируются
 для до\-ри\-сов\-ки.

 Далее вводится (в зависимости от команды, формульным либо текстовым
 ре\-дак\-то\-ром) новый терм, и переменной х30 присваивается вхождение в
 задачу списка посылок при х24 = 0 и списка условий при х24 = 1.
 В этом списке локализуется точка вставки нового терма: если была
 выделена полоса, со\-дер\-жа\-щая терм $T$, то находится вхождение того
 же терма $T$, имеющее тот же порядковый номер, что и в списке
 информационных элементов полос. Затем предпринимается собственно
 вставка нового терма в список по х30, причем два соседних справа
 списка - веса и комментарии - изменяются соответствующим образом. После
 изменения задачи предпринимается занесение в список
 ин\-фор\-ма\-ци\-он\-ных элементов полос изображения пары х19 нового
 элемента для до\-бав\-лен\-но\-го терма, и откат к дорисовке.

 Если, была выделена целая задача (см. выше), то после отката к
 опе\-ра\-то\-ру "ветвь 2" \ предпринимаются действия по вводу нового терма,
 анало\-гич\-ные только что описанным.

 \item х10 = "транслвыражения" \ либо х10 = "кортеж". Нажата
 клавиша "Ctr-ф" \ ли\-бо "Ctr-т" \ для изменения выделенного терма
 задачи формульным либо тек\-сто\-вым редактором. Операция
 используется при отладке. Прежде всего, нахо\-дит\-ся комментарий
 (Смполоса $\ldots$), и проверяется, что он выделяет един\-ствен\-ный
 элемент - полосу изображения, определяемую информационным
 элементом х15 типа "терм". Проверяется, что эта полоса
 прорисована на экране. Нахо\-дит\-ся пара х17 набора х5, определяющая
 задачу, в которой выделена поло\-са. Переменной х18 присваивается
 набор информационных элементов по\-лос изображения данной задачи;
 переменной х19 - вхождение в х18 элемента вы\-де\-лен\-ной полосы.
 Переменной х20 присваивается номер строки, начиная с кото\-рой
 будет происходить ввод новой версии терма. Обычным образом
 определяется указатель х21 принадлежности изменяемого терма
 посылкам (0) либо усло\-ви\-ям (1). Выделения сбрасываются; экран
 расчищается начиная со строки х20. Дальнейшие действия аналогичны
 случаю добавления нового терма, но вмес\-то вставки происходит
 замена.

 \item х10 = "подобл". Нажата клавиша "ч" \ для ввода либо
 изменения чертежа. Эта операция - тоже отладочная; в обычном
 режиме пошагового решения чер\-теж корректируется автоматически.
 Проверяется, что выделена един\-ствен\-ная задача, отделяющая линия
 которой прорисована на экране, и переменной х11 присваивается
 пара х17 из набора х5, определяющая данную задачу. Пере\-мен\-ной х12
 присваивается выделенная задача.

 Если имеется информационный элемент (геомредактор $\ldots$) ее
 полос изо\-бра\-же\-ния, то он присваивается переменной х13. Затем
 переменной х14 присваи\-ва\-ет\-ся тройка (описание чертежа в формате
 оператора "геомредактор" \ - верхняя строка рамки чертежа -
 нижняя строка рамки). Предпринимается обра\-ще\-ние к оператору
 "геомредактор" \ для изменения чертежа; в х14 корректиру\-ют\-ся
 верхняя и нижняя строки рамки; корректируется комментарий
 (геомре\-дак\-тор $\ldots$) к посылкам задачи х12, и откат к
 перерисовке.

 При отсутствии элемента (геомредактор $\ldots$) - аналогичные
 действия для ввода чертежа.

 \item х10 = "верхняяоценка". Нажата клавища "ц" \ для изменения
 целевой установки с помощью оглавления типов целевых установок.
 Снова отладочная операция; реализация ее аналогична случаю процедуры
 "списокзадач".

 \item х10 = "помощь". Нажата клавиша "Ctr-ц" \ для изменения
 списка целей че\-рез текстовый редактор. Отладочная операция,
 реализованная так же, как в процедуре "списокзадач".

 \item х10 = "внешдизъюнкция". Нажата клавиша "Insert" \ для
 вставки набора вы\-де\-лен\-ных термов. Редко используемая отладочная
 операция. Термы выделя\-ют\-ся как в цепи обобщенных задач, так и в
 задачнике (при просмотре цепи об\-об\-щен\-ных задач можно перейти в
 задачник и снова вернуться к просмотру цепи), так что при
 определении их списка используются оба комментария (Смполоса
 $\ldots$) и (смполоса $\ldots$).

 \item х10 = "внешконъюнкция". Нажата клавиша "курсор вправо" \
 для входа в вы\-де\-ле\-ние подтерма последнего выделенного терма.
 Аналогично оператору "спи\-сок\-за\-дач".

 \item х10 = "усмчисло". Нажата клавиша "с" \ для включения либо
 выключения ре\-жи\-ма просмотра термов в скобочной записи. Аналогично
 оператору "списокзадач".

 \item х10 = "блокприемов". Нажата клавиша "Ctr-курсор вверх" \
  для перехода к началу задачи, для которой на экране прорисована
  лишь нижняя часть, либо для перехода к предыдущей задаче.
  Аналогично оператору "списокзадач".

 \item х10 = "символтеоремы". Нажата клавиша "Ctr-курсор вниз" \
 для перехода к следующей задаче: в верхней части экрана
 оказывается верхняя отделяющая линия задачи, следующей за той, к
 которой относится первый прорисованный на экране элемент.
 Аналогично оператору "списокзадач".

 \item х10 = "старшийчлен" \ либо х10 = "натурстепень". Нажата
 клавиша "э" \ либо "Э". В первом случае предпринимается просмотр
 и редактирование ком\-мен\-та\-ри\-ев к выделенному терму либо выделенной
 задаче; во втором случае - просмотр и редактирование комментариев
 к списку посылок выделенной задачи. На\-хо\-дит\-ся комментарий
 (Смполоса $\ldots$) к посылкам исходной задачи и проверяется, что
 он выделяет единственный объект. Переменной х14 присваивается
 набор, определяющий это выделение.

 Сначала рассматривается случай, когда х14 определяет выделение
 задачи; эта задача присваивается переменной х15, и проверяется,
 что она является обычной задачей. Если тип задачи - "исследовать"
 \ либо была нажата клавиша "Э", то переменной х16 присваивается
 список комментариев к посылкам задачи х15, иначе - список
 комментариев к этой задаче. Текущий экран сохраняется в буфере, и
 предпринимается обращение к оператору "сквознойпросмотр" \ для
 просмотра и редактирования списка х16. По завершении
 редактирования экран восстанавливается. Одноэлементные наборы из
 измененного списка х16 за\-ме\-ня\-ют\-ся на символы, из которых они
 составлены, после чего предпринимается регистрация измененного
 списка в задаче, и откат к запросу очередной команды.

 Если х14 определяет выделение полосы задачи, то действия
 аналогичны. При этом сначала происходит локализация в задаче
 выделенного терма - так же, как это делалось при изменении терма
 задачи.

 \item х10 = "тринадцать". Нажата клавиша Enter для продолжения
 трассировки либо для повторного решения вспомогательной задачи.
 В случае, когда не было установлено трассировки по шагам решения, а
 просмотр цепи обобщенных задач был инициирован командой отладчика ЛОСа,
 выполнение данной команды блокируется. Иначе - переход через "ветвь 3",
 где анализируется наличие си\-ту\-а\-ции повторного решения вспомогательной
 задачи. Переменные х12 и х13 инициализируются нулями. Если
 имеется комментарий (Смполоса $\ldots$), вы\-де\-ля\-ю\-щий некоторую
 обобщенную задачу, то он присваивается переменной х12, а переменной х13
 присваивается одноэлементный набор, состоящий из вхождения этой
 задачи в цепь обобщенных задач. Если такого комментария нет, то
 про\-ве\-ря\-ет\-ся, что в верхней части экрана находится верхняя
 отделяющая линия некоторой обобщенной задачи, следующей после
 фиктивной задачи, опи\-сы\-ва\-ю\-щей текущий шаг. После этого переменной
 х13 присваивается одноэлементный набор, состоящий из вхождения
 указанной обобщенной задачи в цепь об\-об\-щен\-ных задач. В обоих
 случаях далее - откат к оператору "ветвь 1".

 Проверяется, что х13 не равно 0, т.е. представляет собой
 одноэлементный на\-бор, образованный вхождением некоторой
 вспомогательной задачи в цепь об\-об\-щен\-ных задач. Переменной х14
 присваивается это вхождение.

 Из набора х3 извлекается информационный элемент (смкадр $\ldots$),
 пере\-чис\-ля\-ю\-щий стэковые кадры обобщенных задач, предшествующих
 фиктивной задаче. Если х14 относится к одной из таких задач, то
 переменной х17 присваива\-ет\-ся ссылка на ее стэковый кадр. В этой
 ситуации нажатие Enter означа\-ет продолжение трассировки с
 переустановкой ее на шаги решения выделенной задачи. Такая
 переустановка предпринимается, и выход из процедуры "цепь\-за\-дач" \ с
 выдачей указателя "трассировка".

 Если же х14 относится к вспомогательной задаче, то откат к
 оператору "ветвь 1", где х14 присваивается рассматриваемая
 вспомогательная задача. Пере\-мен\-ной х15 присваивается текущее
 значение счетчика шагов интерпретатора.

 Далее сначала рассматривается случай, когда х14 - обычная задача.
 Удаляются комментарии к посылкам исходной задачи, сохраняющие
 результаты обращений к пакетнмы операторам - чтобы они не влияли
 на ход решения вспомогательной задачи при повторном запуске.
 Сбрасываются имевшие место выделения. На\-хо\-дит\-ся комментарий
 (буфер $A$) к посылкам задачи х14; у него $A$ есть вхож\-де\-ние в
 комментарий (буфер $\ldots$) к посылкам исходной задачи набора
 $(B_1 \ldots B_5)$, описывающего результат обращения к задаче х14
 в процессе применения при\-ема. Этот набор присваивается переменной
 х17. Здесь $B_2$ - задача х14 на мо\-мент обращения к ее решению.
 Для повторного решения создается копия х18 данной задачи, причем
 копируются и те поднаборы, изменение которых мо\-жет изменить
 $B_2$. Из комментариев к посылкам х18 извлекается ука\-за\-тель х19
 на максимальный уровень обращения, имевший место при первом
 за\-пус\-ке ее решения. Чтобы после повторного решения вспомогательной
 задачи можно было восстановить текущее состояние комментария (буфер $C$)
 к посылкам ис\-ход\-ной задачи и текущее значение $N$ счетчика шагов
 интерпретатора, пара ($C, N$) сохраняется в стэке комментария
 (наборзначений $\ldots$). На счетчике ша\-гов устанавливается то
 значение, которое имелось на момент первого запус\-ка решения
 задачи х14. Стэк комментария (буфер $\ldots$) к посылкам ис\-ход\-ной
 задачи расчищается; для пошагового просмотра повторного решения
 вво\-дит\-ся комментарий (прерывание решить) к посылкам задачи х18,
 и предпри\-ни\-ма\-ет\-ся запуск ее повторного решения с максимальным
 уровнем, определя\-е\-мым элементом х19. По окончании решения
 восстанавливаются коммента\-рий (буфер $\ldots$) и число на
 счетчике шагов, извлекаемые из стэка комментария (наборзначений
 $\ldots$). Затем - откат к повторной выдаче исходного экрана для
 просмотра цепи обобщенных задач.

 Повторное обращение к пакетному оператору реализуется по
 аналогичной схе\-ме.

 При нажатии клавиши Enter в ситуациях, отличных от перечисленных вы\-ше,
 предпринимается продолжение трассировки - выход из оператора "цепьзадач"
 \ с выдачей указателя "трассировка".

 \item х10 = "числитель". Нажата клавиша "р" \ для повторения
 исходного кад\-ра. Происходит откат к первому оператору
 "повторение" \ процедуры "цепьза\-дач".

 \item х10 = "внешнийквантор". Нажата клавиша "г" \ для перехода в
 оглавление ба\-зы приемов ГЕНОЛОГа. Вводится комментарий
 (автоклавиатура $\ldots$), ини\-ци\-и\-ру\-ю\-щий повторное
 нажатие данной клавиши, и выход из процедуры "цепьза\-дач".
 Фактический переход в оглавление базы приемов произойдет после этого
 из программы отладчика.

 \item х10 = "минимум". Нажата клавиша "л" \ для перехода в
 оглавление программ. Аналогично предыдущему, но в комментарии
 (автоклавиатура $\ldots$) сохраня\-ет\-ся нажатие клавиши "л".

 \item х10 = "префикснаярекурсия" \ либо х10 = "заменагруппы".
 Нажаты клавиша "Ctr-б" \ либо "б". В первом случае
 предпринимается переход к просмотру опи\-са\-ния альтернативного
 приема, который должен был бы сработать на дан\-ном шаге согласно
 техническому протоколу; во втором случае - переход к про\-с\-мот\-ру
 описания текущего приема. Аналогично предыдущему - выход во
 вне\-ш\-нюю программу отладчика и повторное выполнение той же
 команды.

 \item х10 = "группировки". Нажата клавиша "End" \ для обрыва
 повторной трас\-си\-ров\-ки вспомогательной задачи. Находится
 комментарий (наборзначений $\ldots$), с помощью которого
 восстанавливаются комментарий (буфер $\ldots$) и число на
 счетчике шагов интерпрератора, имевшие место перед обращением к
 по\-втор\-ной трассировке. Затем находится ссылка х15 на кадр
 прерывания, пред\-шес\-тву\-ю\-щий текущему кадру прерывания; предпринимаются
 откат к этому кадру и повторное обращение к отладчику.

 \item х10 = "анализатор". Нажата клавиша "п" \ для включения либо
 вы\-клю\-че\-ния просмотра список посылок выделенного пакетного
 оператора. Определяется обобщенная задача х14 этого оператора;
 если она не имела комментария "см\-по\-сыл\-ка", то такой комментарий
 вводится, иначе - удаляется. Сбрасывается комментарий, определяющий
 выделения. Повторно (с учетом удаленного либо введенного
 комментария "смпосылка") определяется список информационных
 элементов полос изображения задачи х14; набор х5
 переустанавливается на прорисовку начиная с х14, и откат к
 перерисовке.

 \item х10 = "заменазнака". Нажата клавиша "С" \ для включения
 либо выключения режима просмотра всех термов в скобочной записи.
 Если имелся комментарий "терм" \ к посылкам исходной задачи, то
 он удаляется, иначе - вводится. Затем - откат к повторной
 обработке цепи обобщенных задач.

 \item х10 = "извлечениеварианта". Нажата клавиша "т" \ для
 просмотра и изменения режима трассировки. Аналогично тому, как
 эта команда обрабатывается в опе\-ра\-то\-ре "списокзадач".

 \item х10 = "фигуры". Нажата клавиша "Ctr-Enter" \ для входа в
 трассировку реше\-ния задачи либо выполнения пакетного оператора,
 обращение к которым про\-ис\-хо\-дит на текущем шаге. Переменной х13
 присваивается ссылка на стэковый кадр данной задачи либо
 пакетного оператора, и предпринимается пере\-ус\-та\-нов\-ка на
 трассировку внутри данного кадра. Затем - выход в отладчик с
 указа\-те\-лем "трассировка".

 \item х10 = "оператор". Нажата клавиша "Ctr-р" \ (кир.) для
 просмотра аль\-тер\-на\-тив\-но\-го действия, которое должно было бы
 выполняться согласно техническому протоколу. Переменной х13
 присваивается комментарий (техпротокол $\ldots$) к посылкам
 исходной задачи. С помощью этого комментария определяется текст\-фор\-муль\-ная
 струк\-ту\-ра х20, кратко характеризующая очередной шаг соглас\-но
 техническому про\-то\-ко\-лу. После ее выдачи - пауза до нажатия любой
 клавиши, после чего - откат к началу выполнения процедуры
 "цепьзадач" \ (т.е. повтор\-ная выдача исходного кадра).

 \item х10 = "приведение". Нажата клавиша Home для перехода к
 просмотру за\-дач\-ни\-ка. Этот переход не является откатом к внешней
 процедуре "списокзадач", из которой была инициирована трассировка
 решения. Он представляет со\-бой повторные обращения к оглавлению
 задачника и процедуре "списокзадач". Так как используется "память"
 \ оглавления, то прорисовка начинается с той задачи задачника,
 которая последней просматривалась до этого. По выходе из
 просмотра - откат к повторной выдаче исходной кадра текущего шага
 трас\-си\-ров\-ки.

 \item х10 = "префиксныйфильтр". Нажата клавища "0" \ для сброса
 всех установок на прерывания и немедленного продолжения решения
 задачи. Кром сброса установок на прерывания, удаляется
 комментарий (буфер $\ldots$).

 \item х10 = "унисборка". Нажата клавиша "1" \ для перехода к
 пошаговой трассировке.

 \item х10 = "прогрблок". Нажата клавиша F5 для полного повторения
 всей трас\-си\-ров\-ки до момента входа в решение выделенной
 вспомогательной задачи после внутреннего перезапуска. Это - отладочная
 функция, которая используется в тех редких случаях, когда изолированное
 повторное решение вспомогательной задачи не дает всей необходимой
 информации. Переменной х14 присваивается вхождение выделенной
 обобщенной задачи х15 в цепь обобщенных задач. Затем переменной
 х16 присваивается пара (заголовок задачи либо оператора - номер
 шага, на котором предпринималось обращение к ним). Переменной х18
 при\-сва\-ива\-ет\-ся номер шага обращения, отсчитываемый с момента
 запуска решения задачи из задачника. Наконец, пара (десятичная
 запись числа х18 - заголовок задачи либо оператора)
 регистрируется в логическом терминале, достижи\-мом из корня 2-го
 информационного блока по меткам "альтернатива", "альтер\-на\-ти\-ва",
 и предпринимается внутренний перезапуск.

 \item х10 = "конст". Нажата клавиша "Ctr-End" \ для обрыва
 решения и возвращения в главное меню. Предпринимается внутренний
 перезапуск.

 \item х10 = "внешвывод". Нажата клавиша "щ" \ для сохранения
 номера текущего шага решения, на котором будет предпринят выход в
 отладчик при авто\-по\-вто\-ре. Корректируется содержимое логического
 терминала "повторение" \ уз\-ла задачи. Особо рассматривается
 случай автоповтора при выводе следствий в базе теорем.

 \item х10 = "попытка". Нажата клавиша Ctr-F3 для отладочного
 выхода в просмотр отладчиком выполнения процедуры "цепьзадач".

 \end{enumerate}
\chapter{Программа редактора приемов}

Редактор приемов является не только средством для создания приемов
вручную, но и интерфейсом для работы с генератором приемов.
Поэтому, по мере развития логической системы, время от времени
возникает необходимость ввести в него новые функции либо
модифицировать старые. В этой главе мы приведем техническую
информацию, необходимую для выполнения таких операций.

\section{Структуры данных, используемые для хра\-не\-ния при\-емов}

База приемов ГЕНОЛОГа размещается в 8-м информационном блоке.
Файлы этого блока расположены в поддиректории GEN и имеют
заголовки вида $Pi_1i_2i_3i_4$, где $i_1i_2i_3i_4$ - номер файла в
блоке, образованный четырьмя восьмеричными цифрами. Файл $P0000$
содержит корневой указатель - каталог; прочие файлы - собственно
база приемов.

Корневой указатель 8-го информационного блока представляет собой
каталог. Общие принципы организации информационных блоков с
корневым каталогом уже были изложены ранее, в разделах,
посвященных ЛОСу. Ссылка из каталога по ло\-ги\-чес\-кому символу
$f$ осуществляется на указатель - список, являющийся корнем статьи
символа $f$. Из корня статьи могут иметься переходы к следующим
логическим терминалам:

\begin{enumerate}

\item По метке "мощность" \ - переход к логическому терминалу,
хранящему де\-ся\-тич\-ную запись числа вхождений символа $f$ в
теоремы приемов;

\item По метке "длина" \ - переход к логическому терминалу,
хранящему десятич\-ную запись высоты дерева номеров узлов статьи
символа $f$;

\item По метке "новыйузел" \ - переход к логическому терминалу,
перечисляющему те цифры - метки входа в дерево номеров узлов, по
которым расположены частично заполненные ветви. Эта информация
нужна для поиска первого не\-ис\-пользуемого номера в дереве при
регистрации новой теоремы приема.

\end{enumerate}

Из корня статьи символа $f$ выходят цифровые метки, представляющие
собой корневые ребра дерева номеров узлов статьи данного символа.
Это дерево образовано указателями - списками, причем концевые его
вершины суть указатели, называемые узлами статьи символа $f$.
Последовательность цифр, проходимых от корня дерева к узлу,
образует номер узла. Нумерация начинается с 1 и не обязана быть
сплошной. Пробелы в нумерации могут возникать при удалении ранее
введенных узлов. Одна\-ко, при вводе новых узлов имеется тенденция
заполнять пробелы - каждый раз выбирается первый из неиспользуемых
номеров.

Каждый узел статьи логического символа в 8-м информационном блоке
опре\-де\-ля\-ет некоторую теорему приема, а также группу приемов,
основанных на этой теореме. Из него имеются переходы по следующим
меткам:

\begin{enumerate}

\item По метке "терм" \ - переход к логическому терминалу,
хранящему теорему при\-ема;

\item По метке "команды" \ - переход к указателю-списку $U$,
перечисляющему заго\-лов\-ки приемов, основанных на теореме узла.
Обычно при вводе нового приема, основанного на той же теореме, что
и предыдущий прием, происходит дуб\-ли\-ро\-вание теоремы, и тогда
из $U$ будет выходить единственное ребро. Однако, можно вводить
приемы более экономно, и тогда будут возникать
неодно\-эле\-мент\-ные списки переходов из $U$. По меткам -
заголовкам приемов из $U$ ведут переходы к указателям - спискам,
называемым узлами приемов.

\item По метке "геомредактор" \ - переход к логическому терминалу,
хранящему опи\-са\-ние чертежа, сопровождающего теорему приема.

\end{enumerate}

Для работы с логическими терминалами, хранящими описания чертежа,
су\-щест\-ву\-ют операторы ЛОСа "регистрациячертежа" \ и
"чтениечертежа", записывающие структуру данных геометрического
редактора в информационный блок либо счи\-ты\-ва\-ющие ее оттуда.
Форматы хранения чертежа в информационных блоках были приведены
при описании операторов ЛОСа.

Узел приема является корнем ветви, хранящей всю основную
связываемую с приемом информацию. Из него имеются следующие
переходы:

\begin{enumerate}

\item По метке "команда" \ - переход к логическому терминалу,
хранящему описание приема. Это описание имеет следующие
компоненты:

а) Терм "условие(и($A_1 \ldots A_n$))" \ задает список фильтров
приема $A_1, \ldots , A_n$. Не\-ко\-то\-рые $A_i$ могут
представлять собой логический символ ","; они суть раз\-де\-лители
между выводимыми на экран страницами, перечисляющими фильтры;

б) Термы и логические символы с заголовками, отличными от символов
"ус\-ло\-вие", "быстрпреобр" \ - указатели приема. Фиктивные
однобуквенные термы "," \ используются как разделители между
страницами, перечисляющими указа\-те\-ли;

в) Термы вида "быстрпреобр($t$ $A_1 \ldots A_n$)" \ - группы
нормализаторов приема. Для краткости, иногда эти термы тоже
называем нормализаторами приема. Здесь $t$ - нормализуемый терм,
заданный либо непосредственно, либо с помощью ука\-за\-теля
вхождения в теорему приема "фикс($\ldots$)". Выбирается тот из
вари\-ан\-тов задания $t$, который короче. $A_1,\ldots A_n$ -
последовательность нормализа\-то\-ров терма $t$.

\item По метке "прием" \ - переход к логическому терминалу,
хранящему название логического символа, за которым закреплена
программа приема, и несколько первых операторов этой программы.
Этот терминал вводится для откомпи\-ли\-ро\-ван\-ных приемов; если
его нет, то под описанием просматриваемого прие\-ма проводится
красная черта.

При поиске программы приема в программе заданного логического
символа, указанного в терминале "прием", используется ключевой
оператор "кон\-троль\-приема($A_1$ $A_2$ $A_3$)". При обращении к
нему $A_1$ равно логическому символу, за которым закреплен прием,
$A_2$ - номеру узла этого логического символа (числу в формате
ЛОСа); $A_3$ - заголовку приема (логическому символу либо терму).
В обычных режимах данный оператор не выполняет никаких действий, а
нужен лишь для поиска той начальной точки, после которой все
операторы ЛОСа относятся только к данному приему. Этот поиск может
осуществляться либо компилятором ГЕНОЛОГа, либо системой
трассировки, определяющей прием, к которому относится текущая
точка выполняемой программы.

\item По метке "текстблок" \ - переход к указателю-списку, из
которого по меткам 1,2,3,$\ldots$ - переходы к текстовым
терминалам, хранящим ком\-мен\-та\-рии к приему. Это - записная
книжка, в которую можно заносить раз\-лич\-ные пометки при работе
с приемами. В сложившейся практике обучения решателя она так и не
была востребована. Вероятно, это произошло из-за того, что
описание приема на ГЕНОЛОГе и без того оказалось достаточно
доступ\-ным для понимания.

\item По метке "оглавление" \ - переход к логическому терминалу,
хранящему набор логических символов - меток перехода, определяющих
путь в оглавлении базы приемов к его концевому пункту,
ссылающемуся на данный прием. Такие воз\-вратные ссылки на
оглавление бывают нужны, например, для переключения его текущего
пути на текущий применяемый прием. При перестановке пунктов
оглавления происходит автоматическая коррекция возвратных ссылок.
Если, однако, по каким-либо причинам обратные ссылки оказались
испорчены, их можно восстановить, войдя в корневое меню оглавления
базы приемов и на\-жав клавишу "Ctr-т" \ (кир.).

\item По метке "начало" \ - переход к логическому терминалу,
хранящему терм "при\-ем($A_1$ $A_2$ $A_3$)", ссылающийся на
сохраненную в буфере базы приемов исход\-ную версию приема. Здесь
и далее используемый для ссылки на прием терм "прием($\ldots$)" \
имеет своим первым операндом $A_1$ логический символ, за которым
закреплено описание приема, вторым операндом $A_2$ - номер узла
этого символа, хранящего теорему приема; третьим операндом $A_3$ -
заголовок приема. На\-пом\-ним, что в буфер базы приемов
заносятся: а) исходные версии изменен\-ных приемов (для таких
исходных версий вводятся новые узлы); б) удаленные приемы (их узлы
сохраняются); в) новые приемы (здесь нет дублирова\-ния приема, а
есть только ссылки на него из двух разных точек).

\item По метке "конец" \ переход осуществляется только для приема,
находящегося в буфере после изменения либо удаления. Он ведет к
логическому терминалу, хранящему ссылку "прием($\ldots$)" \ на
текущую версию этого приема буфера, а если прием попал в буфер не
при изменении, а при удалении, то вместо ссылки "прием($\ldots$)"
\ в терминале находится символ "пусто".

\item По метке "переменные" \ - переход к логическому терминалу,
хранящему набор термов "знач($x$ $A$)", перечисляющий программные
выражения $A$ для термов, идентифицированных с теоремными
переменными $x$. Такой терминал вводится только для приемов,
скомпилированных нажатием клавиши $F6$. При пере\-ком\-пи\-ляции
их через $F3$ либо $F5$ он удаляется.

\item По метке "титр" \ - переход к текстовому терминалу,
хранящему шаблоны для текстформульного сопровождения срабатывания
приема.

\item По метке "примечание" \ - переход к логическому терминалу,
хранящему уста\-нов\-ку на синтез приема. Такая установка
представляет собой, по существу, прообраз описания приема на
ГЕНОЛОГе, но гораздо более компактный. Из нее и из теоремы приема
генератор приемов создает описание приема. При этом он использует
ряд дополнительных источников информации, и в первую очередь -
базу теорем. Фактически, генератор приемов здесь в значительной
степени выполняет функции компилятора. Развитие процедур
генератора приемов осу\-щест\-вляется на основе анализа массивов
приемов, созданных вручную. Первым шагом в этом направлении
явилось построение предварительной классифи\-ка\-ции типов приемов
ГЕНОЛОГа. Ссылка на тип приема в данной классифика\-ции играет в
установке на синтез приема роль, аналогичную роли заголовка
прие\-ма в его описании. Автоматизация синтеза приемов потребовала
"встречного движения" \ со стороны самой базы приемов - чтобы
можно было объяснить программе принципы создания приема, его
сначала необходимо освободить от различных предрассудков,
накопившихся при быстрой проработке потока за\-дач. Если же
какие-то компоненты описания приема устранить не удается, то
обычно бывают ясны и их источники. Таким образом, работа над
генератором приемов оказалась одновременно организующим началом
для работы над оп\-ти\-ми\-зацией решателя. Так как она в
настоящее время продолжается, оста\-вим изложение подробностей до
третьего тома монографии, посвященного базе те\-о\-рем.

\item По метке "сравнениеприемов" \ - переход к логическому
терминалу, содер\-жа\-ще\-му шестерку чисел ($A_1$ $A_2$ $A_3$
$A_4$ $A_5$ $A_6$). $A_1,A_2,A_3$ - число различий междй
автоматически сгенерированной версией приема и его "ручной" \
версией из базы приемов, соответственно, в фильтрах,
нормализаторах и указателях. $B_1,B_2,B_3$ - те же значения на
предыдущем цикле тестирования генератора приемов. Эти терминалы
составляют часть системы обучения генратора приемов. Они нужны для
контроля за его способностью создавать ранее проработанные приемы
по мере внесения в него изменений.

\item По метке "теорема" \ - переход к логическому терминалу,
хранящему ссылку "теорема($A_1$ $A_2$)" \ на узел теоремы в базе
теорем, являющийся источником данного приема. Здесь $A_1$ -
логический символ, за которым закреплена теорема, $A_2$ - номер ее
узла в базе теорем. Предполагается постепенно связать почти все
теоремы приемов с реальными теоремами, размещаемыми в базе теорем.
Исключение будут составлять только псевдотеоремы, имеющие заведомо
тех\-ни\-чес\-кий характер. Для них будет предусмотрен другой
способ указания ис\-точ\-ни\-ка их возникновения. Как уже
отмечалось, теорема приема является ком\-по\-нен\-той
алгоритмического языка и может несколько отличаться от той
реальной теоремы, из которой она возникла. Интерфейс привязки
приема к теореме несложен - из просмотра приема нажимается клавиша
$Ctr-F9$, после чего на экране появляется либо описание теоремы,
ранее связанной с приемом, либо (если таковой еще нет) -
появляется оглавление базы теорем. В этом оглавлении нужно войти в
просмотр теоремы - источника теоремы приема, и нажать "И" \ для
закрепления ее в качестве источника. Из узла теоремы при этом
возникнет встречная ссылка на прием. Обе ссылки автоматически
удаляются, если уда\-ля\-ется либо прием, либо теорема.

\item По метке "заголовокприема" \ - переход к логическому
терминалу, храняще\-му пару логических символов $A_1,A_2$. $A_1$
характеризует последнюю попытку автоматического синтеза по теореме
базы теорем установки на синтез данного приема; $A_2$ -
предпоследнюю. Символ 1 означает, что попытка была удачной, символ
0 - что установка не была создана. Установки на синтез приемов
соз\-да\-ют\-ся процедурами базы теорем на основе некоторой
целевой характеризации теоремы, в частности, с учетом того, для
чего она была выведена. Терминалы "заголовокприема" \ составляют
часть системы обучения этих процедур.

\end{enumerate}

\par\medskip

Структуры данных оглавления базы приемов тоже располагаются в 8-м
инфор\-ма\-ци\-онном блоке. Чтобы найти корень этого оглавления,
нужно перейти от корневого каталога информационного блока по
меткам "оглавление", "прием". Концевые ло\-ги\-ческие терминалы
оглавления базы приемов содержат термы "прием($A_1$ $A_2$ $A_3$)",
ссылающиеся на приемы в уже описанном выше формате. Чтобы выделить
в этом списке ссылок на приемы ссылку на текущий прием (он будет
прорисовываться при входе в просмотр концевого терминала
оглавления), соответствующий терм "при\-ем($\ldots$)" \ заменен на
терм "текприем($\ldots$)". Все процедуры переустановки текущего
пути оглавления базы приемов на найденный прием (например, на
текущий прием трассировки) дополняются коррекцией выделения
заголовком "текприем" \ не\-по\-сред\-ст\-венной ссылки на прием.

Указатели и концевые пункты оглавления базы приемов могут
снабжаться тех\-ни\-чес\-кими пометками - комментариями.
Комментарии к указателю-списку, пред\-став\-ля\-ющему меню
оглавления, хранятся в логическом терминале "замечание" \ этого
указателя. Комментарии $A_1, \ldots, A_n$ к концевому пункту
оглавления, который сам является логическим терминалом,
размещаются в нем же. При этом они груп\-пи\-ру\-ют\-ся в терм
"замечание($A_1 \ldots A_n$)", что позволяет отличить их от ссылок
"прием($\ldots$)". Для выделения буфера базы приемов и его
разделов используются следующие типы комментариев:

\begin{enumerate}

\item "буфер" \ - ветвь оглавления является буфером базы приемов;

\item "исключение" \ - ветвь буфера базы приемов, используемая для
сохранения ин\-фор\-ма\-ции о последних удаленных приемах;

\item "изменение" \ - ветвь буфера базы приемов, используемая для
сохранения ин\-фор\-мации об измененных приемах;

\item "новый" \ - ветвь буфера базы приемов, используемая для
сохранения ин\-фор\-мации о новых приемах.

\item "копия" \ - логический терминал ветви "новый" \ буфера базы
приемов.

\end{enumerate}

По мере развития базы приемов происходит рост ее оглавления. К
сожалению, в нынешней версии интерпретатора ЛОСа все оглавление
(как и вообще любая корне\-вая ветвь информационного либо
программного блока, соответствующая заданному логическому символу)
должно целиком размещаться в одном файле информаци\-он\-но\-го
блока. Размер такого файла ограничен сверху 512 Кб. Это
ограничение на\-кла\-ды\-вается 19-битной кодировкой смещений в
файлах, принятой в интерпретаторе (еще 12 бит приходятся на
4-значный восьмеричный номер файла в блоке). В принципе, можно
модифицировать интерпретатор, выделив для нумерации файла в блоке
лишь три восьмеричных цифры и увеличив размеры одного файла в 8
раз. Пока этого нет, приходится следить за возникновением
переполнений в отдельных файлах инфор\-ма\-ци\-онного блока.
Разумеется, при приближении этих размеров к 512 Кб происходит
автоматическое разрезание файла на две примерно равные части,
между которыми перераспределяются ветви логических символов,
объединенные ранее в одном файле. Однако, в редких случаях
оказывается, что почти весь файл был занят ветвью одного символа,
и тогда разрезание практически ничего не дает. Эти редкие случаи
до сих пор были связаны с двумя причинами - ростом размеров
оглавления либо неравномерным распределением приемов по логическим
символам. Для борьбы с ситуациями первого типа нужно время от
времени разрезать оглавление, выделяя какую-либо большую его ветвь
и закрепляя ее за отдельным логическим символом (см. описание
структуры данных оглавлений и интерфейс их разрезания). Для
борь\-бы с ситуациями второго типа можно "разгружать" \ чрезмерно
часто используемый логический символ, перезакрепляя приемы за
другим символом. Выбор такого сим\-вола вообще несущественен, и
его не обязательно связывать с символами, встре\-ча\-ющимися в
теореме приема.

\section{Обращение к редактору приемов}

Программа редактора приемов реализуется оператором
"блокприемов(х1)". Значе\-нием входной переменной х1 этого
оператора является ссылка на концевой логичес\-кий терминал
оглавления базы приемов. Программа осуществляет просмотр списка
приемов, адресуемых из этого терминала, редактирование либо
удаление их, а также ввод новых приемов. Предусмотрен еще один
вариант обращения к оператору "блок\-приемов" \ - для просмотра
группы каким-либо образом отобранных приемов,
без\-от\-но\-си\-тельно к ссылкам на них из оглавления. В этом
случае значением х1 служит набор термов "прием($\ldots$)",
ссылающихся на отобранные приемы. Здесь ввод новых приемов
невозможен.

Обращение к оператору "блокприемов" \ из просмотра оглавления базы
приемов выполняется программой общего интерфейса логической
сис\-те\-мы - программой сим\-вола "вход". Найти ту ее ветвь, где
это происходит, можно, например, из раздела ("Общий интерфейс",
"Обращение к базе приемов") оглавле\-ния программ. Эта ветвь,
вплоть до обращения к оператору "блокприемов", уже была описана
ранее.

\section{Прорисовка текущего приема}

Начиная с этого момента, будем шаг за шагом продвигаться вдоль
текста программы оператора "блокприемов". Рекомендуется войти в
просмотр корневого фрагмента этой программы и "перелистывать" \ ее
по мере чтения данного описания.

Начинается работа оператора с прорисовки в верхней части экрана
меню, со\-от\-вет\-ствующего контексту просмотра описания приема.
Если значением переменной х1 являлась ссылка на концевой
логический терминал оглавления базы приемов, то находится
содержимое х2 этого терминала; в противном случае переменной х2
передается значение х1. В обоих случаях значением х2 теперь
является набор термов "прием($\ldots$)", быть может, пополненный
термом "замечание($\ldots$)". Переменной х3 присваивается
вхождение в набор х2 его первого разряда - далее эта переменная
будет указывать ту позицию набора х2, на которой расположена
ссылка на теку\-щий просматриваемый прием. Если оказалось, что на
позиции х3 размещается терм "замечание", то эта позиция сдвигается
на единицу вправо.

Начиная с оператора "позиция(х4 х2)" \ реализуется цикл просмотра
набора х2 для поиска терма "текприем($\ldots$)", ссылающегося на
прием, который изначально выделен в качестве текущего. Если этот
терм найден, то х3 переустанавливается на его вхождение, а
заголовок "текприем" \ заменяется на "прием". После этого все
ссылки на приемы в х2 равноправны; заголовок "текприем" \ будет
восстановлен лишь по выходе из оператора - для того приема,
который будет просматриваться на мо\-мент выхода.

По переходу "ветвь 2"  \ попадаем в фрагмент, используемый в цикле
тестирова\-ния генератора приемов на подразделе базы приемов.
Указанием на наличие такого цикла служит комментарий "подраздел" \
к посылкам исходной задачи; в этом случае создается комментарий
"автоклавиатура" \ для автоматического нажатия клавиши "П",
запускающей генератор приемов.

Переходя через "ветвь 1", оказываемся в фрагменте, который прежде
всего ак\-ти\-ви\-рует 8-й информационный блок. По умолчанию, все
дальнейшие действия опе\-ра\-то\-ра "блокприемов" \
предпринимаются в предположении, что активным является этот блок.
Если возникает необходимость обратиться к другим информационным
блокам, то переключение на них должно быть локальным - по
завершении работы с ними сразу нужно активировать 8-й блок.

Затем инициализируется структура данных х4 для работы с текущим
приемом. Она представляет собой набор информационных элементов,
характеризующих прием, его визуализацию и текущее состояние
выполняемых с ним действий. Прежде чем продолжить просмотр
программы данного фрагмента, перечислим основные типы таких
информационных элементов. Как и ранее, набор записываем в виде
за\-клю\-чен\-ной в скобки последовательности его разрядов.

\begin{enumerate}

\item (логсимвол $A$) - $A$ есть логический символ, за которым
закреплена теоре\-ма приема;

\item (число $A$) - $A$ есть номер узла статьи указанного выше
логического символа, содержащего теорему приема;

\item (адресузла $A$) - $A$ есть непосредственная ссылка на узел
теоремы приема в 8-м информационном блоке;

\item (заголовок $A$) - $A$ есть заголовок приема. Если этот
заголовок однобуквенный, то он представлен в формате логического
символа, иначе - в формате терма;

\item (команда $A$) - $A$ есть непосредственная ссылка на узел
приема в 8-м инфор\-ма\-ци\-онном блоке;

\item (прием $A$) - $A$ есть набор термов, образующих описание
приема (включая терм "условие($\ldots$)", задающий фильтры, а
также включая нормализаторы).

\item (терм $A$) - $A$ есть теорема приема;

\item (видео $A_1$ $A_2$ $A_3$ $A_4$) - приводятся структуры
данных $A_1,A_2,A_3,A_4$, используемые для выдачи на экран,
соответственно, теоремы приема; заголовка приема; списка фильтров
и списка указателей.

$A_1$ - тройка ($B_1$ $B_2$ $B_3$), где $B_1$ - скорректированная
для выдачи на экран теорема приема; $B_2$ - либо логический символ
"терм", если теорема не поддается выдаче на экран с помощью
формульного редактора, либо корень созданного формульным
редактором дерева указателей для прорисовки теоремы. $B_3$ - либо
0, либо выделенное при работе с редактором приемов вхождение в
теорему.

$A_2$ - пара ($B_1$ $B_2$), где $B_1$ - номер строки, по которой
проводится верхняя отделяющая линия второго окна; $B_2$ -
заголовок приема.

$A_3,A_4$ - наборы ($B_1$ $B_2$ $B_3$ $B_4$), где $B_1$ - номер
строки, по которой проводится верхняя разделяющая линия; $B_2$ -
набор термов (фильтров либо указателей); $B_3$ - набор той же
длины, что $B_2$, сопоставляющий каждому терму координату исходной
позиции для выдачи его на экран (пару символьных номеров столбца и
строки); $B_4$ - набор той же длины, то $B_2$, сопоставляющий
каждому терму либо 0, либо выделенное вхождение в этот терм.

\item (быстрпреобр $A$) - $A$ есть набор всех нормализаторов
приема;

\item (программа $A$) - элемент вводится в том случае, когда
существует програм\-ма приема. Тогда $A$ - логический символ, к
которому относится эта программа;

\item (просмотртерма $A$) - $A$ есть номер активного окна приема
(от 1 до 4);

\item (конец $A$) - $A$ есть номер строки для нижней граничной
линии под изображе\-ни\-ем приема;

\item (комментарии $A$) - $A$ есть ссылка на текстовый терминал,
хранящий ком\-мен\-та\-рии к приему;

\item (изменение $A_1$ $A_2$ $A_3$ $A_4$ $A_5$) - указатель
измененных при редактировании окон приема. $A_i = 0$ означает, что
$i$-е окно изменено не было; $i=1, \ldots, 5$, причем под пятым
окном понимается список нормализаторов приема;

\item (пассив $A$) - окно с номером $A$ не выводится на экран
(номер - от 1 до 4);

\item (геомредактор $A_1$ $A_2$) - $A_1$ есть описание чертежа в
формате оператора "ге\-ом\-ре\-дак\-тор"; $A_2$ - строка для
выдачи теоремы под чертежом;

\item (оглавление $A$) - $A$ есть путь в оглавлении базы приемов
от его корня к теку\-ще\-му концевому пункту;

\item (примечание $A$) - $A$ есть установка на синтез приема;

\item (слово $A_1$ $A_2$) - $A_1$ есть ссылка на текстовый
терминал, содержащий текст, выводимый на экран вместо теоремы
(используется в приемах операторов филь\-т\-ра); $A_2$ - строка
после выдачи данного текста;

\item (См $A_1$ $A_2$) - $A_1$ есть сивмольное число разделителей
",", после которых рас\-по\-ла\-гается выводимый на экран фрагмент
списка фильтров; $A_2$ - символьное число разделителей ",", после
которых располагается выводимый на экран фрагмент списка
указателей приема.

\item (указатель $A_1$ $A_2$) - $A_1$ есть список пар ($B_1$
$B_2$), определяющих рассогласова\-ния между созданными
генератором приемов и ранее имевшимися указателями приема. Либо
$B_1$ - указатель, созданный генератором приемов и
отсутст\-во\-вав\-ший ранее - тогда $B_2 = 0$, либо $B_1 = 0$ и
$B_2$ - ранее введенный указатель, не созданный генератором
приемов. Перед определением рассогласований груп\-по\-вые
указатели расформируются в серии одиночных. $A_2$ - текущая
позиция в списке $A_1$.

\end{enumerate}

Вернемся к рассмотрению программы. После присвоения переменной х4
пустого слова расположен оператор "повторение", к которому будут
происходить откаты при различных изменениях текущего приема. Сразу
за ним предпринимается коррекция набора х4 - почти все его
элементы удаляются. Остается, в частности, элемент (См $\ldots$),
так как он фиксирует выдачу на экран конкретных страниц третьего и
чет\-вертого окон.

После оператора "исходнаязадача(х5)" \ сначала проверяется, не
произошел ли вход в просмотр приемов из контейнера (переход через
"иначе 3"). Эта ветвь сейчас для нас неинтересна. Затем
проверяется наличие комментария (контрольпрограм\-мы $\dots$) к
посылкам исходной задачи. Этот комментарий вводится при различных
временных переходах из просмотра приема (например, при переходе к
просмотру его программы). Он нужен для возвращения в исходную
точку просмотра и позволяет восстановить значения переменных х2,
х3, х4. Далее (переход через "иначе 4") - проверяется наличие
комментария (регистрациятеоремы $\ldots$). Через него новому
при\-ему передается значение структуры данных х4 при копировании
старого приема.

Возвращаясь в фрагмент, содержащий оператор "равно(х4
пустоеслово)", далее переходим через "ветвь 2" \ к фрагменту,
который по комментарию (простыеделители $\ldots$) определяет
текущий путь в оглавлении базы приемов и регистрирует его в х4.
Напомним, что данный комментарий создается процедурой "оглавление"
\ при вы\-бо\-ре концевого пункта.

Далее - переход через "ветвь 1" \ к фрагменту, продолжающему
заполнение струк\-туры данных х4. Здесь определяются логический
символ х5, за которым закреплен текущий прием, находятся номер х6
узла его теоремы и заголовок х7. Определяется ссылка х8 на узел
теоремы приема. Находятся одноэлементные наборы х9 и х12,
содержащие, соответственно, ссылку на логический терминал,
хранящий теорему приема, и на логический терминал с описанием
приема. При наличии термина\-ла "примечание" \ с установкой на
синтез приема эта установка регистрируется в х4.

После перехода через "ветвь 2" \ - фрагмент, в котором считывается
содержи\-мое х13 терминала описания приема. Если в описании
имеется более одного тер\-ма "условие($\ldots$)", что
свидетельствует об ошибке, то сохраняется только пос\-лед\-ний
такой терм, и терминал корректируется. Далее - переход через
"ветвь 1", где расположен еще один пункт "самокоррекции".
Проверяется наличие идентичных указателей либо нормализаторов, и
при наличии таковых лишние отбрасываются.

Переходя затем через "ветвь 1", оказываемся в фрагменте, где
происходит счи\-ты\-вание теоремы приема - ее содержит теперь
одноэлементный набор х14. На осно\-ве накопленной к данному
моменту информации в набор х4 заносятся элементы (логсимвол
$\ldots$), (число $\ldots$), (заголовок $\ldots$), (адресузла
$\ldots$), (терм $\ldots$), (коман\-да $\ldots$), (прием
$\ldots$). В случае приема оператора фильтра (заголовок
"контекст") в х4 заносится также элемент (слово $\ldots$).
Наконец, переход через "ветвь 1" \ к термина\-лу, где в х4
заносится элемент (программа $\ldots$).

На этом цикл предварительного комплектования набора х4
завершается, и про\-ис\-хо\-дит откат к фрагменту,
инициализировавшему х4 пустым словом. Далее из него по "ветвь 1" \
- переход к фрагменту, начинающему прорисовку приема. Он имеет
мет\-ку "прием(4 6)", и выйти на него можно также из оглавления
программ - см. раздел ("Цикл прорисовки приема", "Исходная
точка").

Фрагмент начинается с оператора "повторение", к которому будут
выполняться откаты для перерисовки изображения приема.
Предпринимается расчистка экрана, и далее проверяется наличие в
наборе х4 информационного элемента (видео $\ldots$). Если такой
элемент есть, то это означает, что прорисовка приема уже
выполня\-лась, и можно воспользоваться готовыми данными для ее
восстановления. Это делает ветвь программы, переход к которой -
через оператор "ветвь 3". Предварительно анализируется наличие
особых случаев, связанных с комментарием (теквхожд $\ldots$) к
посылкам исходной задачи - здесь может произойти либо сброс
элемента (видео $\ldots$), либо вообще отказ от прорисовки приема.

Прорисовка приема по элементу (видео $\ldots$), в общем, не
содержит никаких особо интересных моментов и выполняется в
соответствии с описанной выше структурой данных. Поэтому мы не
будем ее рассматривать, а сразу перейдем через оператор "иначе 2"
\ к главному циклу, выполняющему первичную прорисовку приема.

Прежде всего, из набора х4 извлекается элемент (терм $\ldots$),
содержащий теорему приема; этот элемент присваивается переменной
х6. Рамка прорисовки уста\-нав\-ли\-вается на прямоугольник,
расположенный правее левого 16-пиксельного столбца, так как в этом
столбце размещаются номера окон. Теорема приема присваивается
переменной х7. Вводится накопитель х8 структуры данных для выдачи
теоремы на экран (он будет зарегистрирован в элементе (видео
$\ldots$)). Проверяется отсутст\-вие элемента (пассив 1),
отменяющего прорисовку первого окна. Проверяется отсутствие
элемента (слово $\ldots$), указывающего на прорисовку вместо
теоремы некоторого текста. При наличии такого элемента прорисовка
выполняется фрагментом, достижимым через "иначе 4". Далее
прорисовывается цифра "1" \ - номер первого окна. Если имеется
элемент (геомредактор $\ldots$), то переменной х9 присваивается
номер строки под чертежом, и предпринимается прорисовка этого
чертежа.

Если исходная задача имеет комментарий "терм" \ к своим посылкам,
то теоре\-ма будет прорисовываться текстовым редактором - это
сделает часть программы, достижимая через "ветвь 5". Иначе
происходит обращение к формульному редакто\-ру, который дает
дерево указателей х10, и оператор "блокредактора(3 $\ldots$)" \
осу\-щест\-вляет прорисовку теоремы. Переменной х8 присваивается
тройка (теорема - корень дерева указателей - 0). Затем происходит
"переназначение" \ переменной х7 - да\-лее она будет указывать
номер первой свободной строки. Под теоремой прорисовываются пары,
указывающие для каждой переменной, встречающейся в теореме, ее
обозначе\-ние в виде "х$n$". Далее - откат к переходу через "ветвь
2".

Перейдя через "ветвь 2", оказываемся в фрагменте программы,
содержащем мет\-ку "прием (4 9)". К нему можно перейти также из
пункта "Прорисовка заголовка приема" \ оглавления программ. Прежде
всего, проверяется, равно ли х7 (первая свободная строка) нулю, и
если не равно, то по х7 прорисовывается горизонтальная отделяющая
линия. Затем из х4 извлекается элемент (заголовок $\ldots$),
который при\-сва\-ивается переменной х9. Если заголовка приема еще
нет, то в х4 заносятся элементы (видео $\ldots$) и (конец
$\ldots$), соответствующие прорисовке одной только теоремы. Если
же заголовок есть, то переменной х9 переприсваивается новое
значение - структура данных для прорисовки заголовка, которая
впоследствии будет передана в элемент (видео $\ldots$).
Проверяется отсутствие элемента (пассив 2), отменяющего прорисовку
заголовка; прорисовывается номер "2" \ окна заголовка;
предпринимается прорисов\-ка заголовка приема в виде логического
символа либо терма скобочной записи; кор\-рек\-тируется номер х7
первой незанятой строки; по ординате х7 проводится
горизон\-таль\-ная отделяющая линия, и откат к переходу через
"ветвь 2".

Здесь возникает фрагмент с меткой "прием(5 0)". Перейти к нему
можно из пункта оглавления программ "Прорисовка фильтров приема".
Прежде всего, на\-хо\-дит\-ся элемент (прием $\ldots$) с описанием
приема. Если его еще нет (на начальном этапе создания приема), то
элементы (видео $\ldots$), (конец $\ldots$) заносятся в х4 по
теку\-щей прорисовке. Иначе вводится заготовка х11 структуры
данных для прорисовки фильтров (см. элемент (видео $\ldots$)).
Если в х4 нет блокирующего прорисовку фильт\-ров элемента (пассив
3), то в описании приема находится элемент х12 вида
"ус\-ло\-вие($\ldots$)". При отсутствии такого элемента переменная
х7 увеличивается на 3, и откат к оператору "ветвь 2", где будет
продолжаться прорисовка указателей приема. Увеличение х7 на 3
означает, что окно фильтров будет прорисовано символически - как
очень узкая трехпиксельная полоса между двумя горизонтальными
отделя\-ю\-щи\-ми линиями. Если же элемент "условие($\ldots$)" \
имеется, то прорисовывается номер "3" \ окна фильтров. Затем
находится набор х13 операндов терма "условие($\ldots$)", т.е.
фильтров приема. Вводится набор х14 той же длины, что и х13.
Изначально он заполнен нулями, но в процессе прорисовки его
разряды будут заменяться парами (столбец-строка), указывающими
начальную позицию очередного фильтра. Для по\-сле\-до\-ва\-тельной
прорисовки фильтров устанавливается начальная позиция на экра\-не.
Чтобы выдать лишь текущую страницу списка фильтров, переменной х15
присва\-и\-ва\-ет\-ся число разделителей ",", после которых
начинается эта страница, и вводит\-ся переменная х16, которая при
просмотре списка фильтров указывает на число пройденных запятых.
Затем выполняется одновременный просмотр списков х13 и х14, с
прорисовкой фильтров (на участке, где х15 и х16 совпадают) и
регистрацией в х14 их координат. По окончании просмотра
заполняются пустые позиции струк\-ту\-ры данных х11 и
корректируется номер х7 первой свободной строки. Далее - откат к
переходу через "ветвь 2".

После указанного перехода возникает фрагмент, в середине которого
размеще\-на метка "прием(5 1)". Этой метке соответствует пункт
"Прорисовка указателей приема" \ оглавления программ. Если в х4
нет элемента (пассив 3), указывающего на пропуск третьего окна, то
по текущей ординате х7 проводится горизонтальная отделяющая линия.
Затем переменной х12 присваивается список всех указателей
нормализации "быстрпреобр($\ldots$)"; если в х4 еще не было
элемента (быстрпреобр $\ldots$), перечисляющего эти указатели, то
он вводится. Создается список х13 всех указате\-лей приема,
преобразованных перед прорисовкой к формату термов. Если для
ука\-за\-те\-лей места на экране не хватает, то они не выводятся;
в набор х4 заносятся элемен\-ты (видео $\ldots$) и (конец
$\ldots$) для прорисованной части приема, и откат к обработчику
команд. Иначе реализуется цикл прорисовки указателей, аналогичный
разо\-бран\-но\-му выше циклу прорисовки фильтров. По завершении
его в набор х4 заносится полностью укомплектованный элемент (видео
$\ldots$), а также элемент (конец $\ldots$). Про\-во\-дится нижняя
отделяющая линия, цвет которой информирует о наличии про\-грам\-мы
приема и наличии изменений в нем, и далее - откат к обработчику
команд.

\section{Обработчик команд редактора прие\-мов}

Обработчик команд редактора приемов располагается начиная с
фрагмента, со\-от\-ветствующего пункту "обращение к клавиатуре" \
раздела "Редактор ГЕНОЛОГа" \ оглавления программ. После метки
"прием(2)" \ в этом фрагменте размещен опера\-тор "повторение", к
которому будут происходить откаты при запросе очередной команды.
Далее идет оператор "автоменю(х5)", осуществляющий ввод новой
ко\-ман\-ды х5. После этого следует весьма длинная цепочка
фрагментов, обрабатывающих конкретные команды. Эти команды
расположены в достаточно случайном порядке, поэтому ниже мы не
будем его придерживаться, а описание действий команд да\-дим,
сгруппировав их по функциональным признакам. Ряд второстепенных
команд опустим.

\subsection{Переходы}

\begin{enumerate}

\item Выход из просмотра приема либо отмена выделения окна приема.
Коман\-да реализуется в том же фрагменте, где происходит ввод
команды. Все команды, рассматриваемые в данном подразделе, собраны
в разделе ("Редактор ГЕ\-НО\-ЛОГа", "Переходы") оглавления
программ, и расположены в том же порядке. Выходить на начальные
точки их обработки при чтении приводимых пояснений рекомендуется
через пункты указанного раздела оглавления программ.

х5 - либо один из символов "Плюс", "циклвариантов", либо символ
"обл", в ситуации, когда х4 содержит элемент (просмотртерма
$\ldots$). Это означает, что были нажаты, соответственно, клавиши
"Esc", "курсор влево" \ либо "пробел", причем в последнем случае
одно из окон приема выделено изменением цве\-та его номера.

Обработка команды начинается с удаления комментария
(сравнениеприемов $\ldots$) к посылкам исходной задачи,
создаваемого генератором приемов для срав\-не\-ния его версии
приема с той версией, которая фактически имеется в решателе. Этот
же комментарий удаляется рядом других команд, чтобы старая
ин\-фор\-ма\-ция о тестировании генератора приемов не
накладывалась на новую.

Если в х4 имеется элемент (просмотртерма $i$), указывающий номер
$i$ выде\-лен\-но\-го окна, то восстанавливается черный цвет этого
номера, элемент (про\-смотр\-терма $i$) удаляется, и откат к
очередной команде. Если же такого элемента нет, то команда
означает выход из редактора приемов. Перед выхо\-дом ссылка
"прием($\ldots$)" \ на текущий прием в списке х2 заменяется на
"текприем($\ldots$)", и это изменение регистрируется в текущем
концевом пункте оглав\-ле\-ния базы приемов. Если исходная задача
имеет комментарий "текприем", озна\-ча\-ю\-щий наличие цикла
просмотра базы приемов с помощью процедуры "текпри\-ем", то при
нажатии Esc выход из редактора приемов осуществляется по
зна\-че\-нию "ложь". Такой выход приведет к обрыву цикла. В
остальных случа\-ях выход из редактора приемов происходит по
значению "истина". При наличии цикла просмотра это будет означать
переход к следующему приему серии.

\item Переход к другому приему данного концевого пункта
оглавления.

х5 - символ "внешсумма" \ либо "подстановка". Соответственно,
нажаты кла\-ви\-ши "курсор вверх" \ либо "курсор вниз".
Фактически, здесь обрабатываются две возможных команды.

Если в х4 имеется элемент (просмотртерма $\ldots$), означающий,
что выделе\-но некоторое окно приема, то указанные клавиши просто
увеличивают либо умень\-ша\-ют на единицу номер выделенного окна.
Эта смена выделенного окна будет иметь место только в ситуации,
когда еще не начат просмотр содержимого окна, так как иначе
команды обрабатываются другими ветвями программы.

Если же в х4 нет такого элемента, то переход через "ветвь 2".
Здесь переменной х6 присваивается вхождение в набор х2 ссылок на
приемы левого либо правого соседа текущего разряда х3. Если это
вхождение пришлось на терм "за\-ме\-ча\-ние($\ldots$)", то сдвиг
вхождения в указанном направлении повторяется. Если позиция не
была крайней в наборе х2, то переменной х3 присваивается значение
х6, и происходит откат к циклу заполнения набора х4.

\item Переход к просмотру программы приема.

х5 - символ "приведение". Нажата клавиша "Home". Выполнение
команды блокируется, если прием просматривается из контейнера
(т.е. из буфера, через который возможен обмен информацией между
разными экземплярами логи\-чес\-кой системы), либо из серийного
просмотра базы приемов с помощью проце\-ду\-ры "текприем", либо из
трассировки решения задачи. Переменной х6 при\-сва\-и\-ва\-ется
текущая ссылка "прием($\ldots$)" \ на просматриваемый прием, и по
ней определяется вид х10 оператора "контрольприема($\ldots$)",
используемого в прог\-рам\-ме для обозначения начала приема.
Переменной х16 присваивается ло\-ги\-чес\-кий символ, за которым
закреплена программа приема. Вводится коммента\-рий
(контрольпрограммы $A_1$ $A_2$ $A_3$ $A_4$ $A_5$) к посылкам
исходной задачи, содержа\-щий информацию для поиска исходного
фрагмента программы приема и для возвращения в редактор приемов
после просмотра программы. У этого ком\-мен\-та\-рия $A_1$ -
логический символ, к которому относится программа; $A_2$ -
указанный выше оператор "контрольприема($\ldots$)"; $A_3$ - ссылка
на текущий концевой ло\-ги\-чес\-кий терминал оглавления базы
приемов; $A_4$ - пара (х2 - х3); $A_5$ - набор х4. Вводится также
комментарий (прогрблок х16) к посылкам исходной зада\-чи, который
указывает обработчику команд общего интерфейса системы на
необходимость обращения к просмотру программы символа х16.
Создает\-ся ком\-ментарий (автоклавиатура $\ldots$),
обеспечивающий эмуляцию нажатия клавиши F8 для поиска редактором
программ того фрагмента, в котором встречается оператор $A_2$. Так
как при просмотре фрагментов программы название ло\-ги\-чес\-кого
символа, к которому относится программа, не перерисовывается, то
выполняется заблаговременная его прорисовка в верхней части
экрана. На тот случай, если возвращение к редактору приемов
произойдет не сразу по окончании просмотра программы, в концевом
текущем логическом терминале оглавления базы приемов
предпринимается выделение заголовком "текприем" \ текущего
просматриваемого приема. Затем происходит выход из редакто\-ра
приемов.

Все дальнейшие переключения, приводящие к просмотру программы,
обес\-пе\-чиваются внешними процедурами. Эту траекторию можно
проследить, если найти раздел ("Общий интерфейс", "Обращение к
базе приемов") оглавления программ и просмотреть операторы,
следующие за оператором "блокпримов(\\ х11)". Произойдет откат к
обработчику команд главного меню системы; от\-ту\-да (благодаря
введенным комментариям к посылкам исходной задачи) - переход к
просмотру про\-грам\-мы символа х16, и далее - поиск фрагмента
этой программы, содержащего $A_2$. На всех этих этапах
промежуточная прорисовка блокируется. Возвращение в просмотр
приема инициируется нажатием клавиши "End" \ из редактора
программ. Здесь снова будет выполнен переход с откатом к
об\-ра\-бот\-чи\-ку команд главного меню, но уже с обращением к
редактору приемов. Роль диспетчера, переключающего траекторию
отката на редактор приемов, здесь играет вводимый перед откатом
комментарий (цепьвхождений "х3").

\item Переходы к другим приемам того же самого узла теоремы.

х5 - символ "контрольунификации" \ либо "точкапривязки".
Соответственно, нажаты клавиша PageUp либо PageDn.

Проверяется отсутствие в х4 элемента (просмотртерма $\ldots$),
выделяющего окно приема. Если такой элемент есть, то переход через
"иначе 2", где реализуется переход к предыдущей либо следующей
странице выделенного окна фильтров либо окна указателей. Для смены
страницы корректируется элемент (См $\ldots$) из х4. Если же
выделения окон приема нет, то, как и указано выше, осуществляется
переход к другому приему того же самого узла теоремы. Находится
ссылка х8 на указатель-список, метки которого суть различные
заголовки приемов, использующих этот узел. Переменной х9
присваивается набор всех таких за\-го\-лов\-ков, и в нем
определяется вхождение х10 заголовка текущего
про\-смат\-ри\-ва\-е\-мо\-го приема. В зависимости от нажатой
клавиши, находится вхождение х11 предыдущего либо следующего
разряда в х9. Находится ссылка "начало(х12)" \ на узел приема,
заголовок которого расположен по вхождению х11.
Опре\-де\-ля\-ет\-ся путь х14 в оглавлении базы приемов к
концевому логическому терминалу $K$, ссылающемуся на этот прием;
текущий путь оглавления переустанавливается по х14. Находится
содержимое х17 терминала $K$. В нем идентифицируется ссылка х19 на
найденный прием, заголовок которой изменяется на "текпри\-ем".
На\-ко\-нец, значения х1, х2 и х3 модифицируются для просмотра
нового текуще\-го приема, и откат к переопределению набора х4.

\item Переходы к оглавлениям программ, задачника и базы теорем.

х5 - один из символов "элементызадачи", "стрелкапирса",
"эквивалентно". Со\-от\-вет\-ственно, нажаты клавиши "Shift-1",
"Shift-3" \ и "В" \ (кир.). В первых двух случаях будут выполнены
переходы к оглавлениям программ и задачника; в третьем, весьма
специфическом, текущий прием должен быть одним из так называемых
приемов вывода теорем. Эти приемы имеют заголовок "теорема";
нажатие клавиши инициирует переход в базу теорем и одновременный
запуск серийного тестирования применений данного приема. Подробнее
об этом будет говориться в томе, посвященном базе теорем.

Во всех трех случаях для организации перехода вводится комментарий
(нов\-по\-зи\-ция $A$) к посылкам исходной задачи. Здесь $A$ - код
той клавиши, нажа\-тие которой в главном меню системы вызывает
переход к нужному оглавлению. После ввода комментария - выход из
процедуры "блокприемов", за которым последует откат к обработчику
команд главного меню.

\item Переход в базу теорем для просмотра источника приема.

х5 - символ "путьвхождения". Нажата клавиша Ctr-F9. Источники
приемов вводятся либо при автоматическом синтезе приема по
некоторой теореме из базы теорем, либо при обработке приемов,
введенных вручную и имеющих теорему "обычного", не технического
характера. Последнее делается для соз\-да\-ния обучающего
материала, на котором развивается генератор приемов.
Ра\-зу\-ме\-ется, при регистрации в базе теорем теорема приема
преобразуется к виду логически корректного утверждения.

Переменной х10 присваивается терм "прием($\ldots$)", ссылающийся
на теку\-щий прием. Переменная х12 инициализируется нулем; если
узел приема имеет ло\-ги\-чес\-кий терминал "теорема" \ (в нем
регистрируется ссылка на теорему - источ\-ник приема), то этой
переменной переприсваивается содержимое данного тер\-ми\-на\-ла.
Вводится комментарий (теорема х10 0 х12) к посылкам исходной
за\-да\-чи, который при ненулевом х12 направит траекторию отката
на просмотр теоремы х12, и во всех случаях позволит выбрать либо
изменить выбор ис\-точ\-ни\-ка для приема х10. Собственно для
отката вводится комментарий (нов\-по\-зи\-ция заменагруппы),
определяющий переход к оглавлению базы теорем.

\item Переход к просмотру основной версии приема из буфера базы
приемов.

х5 - символ "частичныйответ". Нажата клавиша "о" \ (кир.). Прежде
все\-го, выясняется, имеется ли в наборе х2 - содержимом
логического терминала те\-ку\-ще\-го концевого пункта оглавления
базы приемов - терм "замечание(копия)", указывающий, что текущий
прием зарегистророван в буфере как новый.

Если такой терм есть, то в буфере имеется лишь дублирующая ссылка
на прием. Чтобы найти место в оглавлении базы приемов, из которого
на прием делается основная ссылка, считывается содержимое х8
логического терминала "оглавление" \ известного узла приема.
Текущий путь в оглавлении пере\-ус\-та\-нав\-ли\-ва\-ет\-ся по х8;
рассматриваемый прием выделяется в найденном конце\-вом логическом
терминале оглавления заголовком "текприем"; корректируются
пе\-ре\-мен\-ные х1, х2, х3, и выполняется откат к повторному
заполнению набора х4.

Если же терма "замечание(копия)" \ нет, то находится содержимое х8
логи\-чес\-ко\-го терминала "конец" \ хранящейся в буфере версии
приема. Из него извлека\-ет\-ся ссылка х9 на основную версию
приема; по ней находится ссылка х11 на узел приема; определяется
содержимое х13 терминала "оглавление" \ этого узла, и далее
выполняются действия, аналогичные первому случаю.

\item Переход от основной версии приема к версии, сохраненной в
буфере базы при\-е\-мов.

х5 - символ "заменагруппы". Нажата клавиша "б". Проверяется
наличие ло\-ги\-чес\-кого терминала "начало" \ узла приема. Если
этот терминал есть, то из него извлекается ссылка х9 на версию
приема, хранящуюся в буфере. Затем происходит переустановка данных
на просмотр этой версии, аналогичная пре\-ды\-ду\-щей команде.
Если же терминала "начало" \ нет, то это может означать, что мы
находимся в ветви новых приемов буфера, но данный новый прием был
изменен либо удален, так что ссылка на него одновременно имеется
из ветви измененных или удаленных приемов буфера. Для поиска этой
ссылки реализуется просмотр всего буфера, за вычетом ветви новых
приемов. Сама ссылка известна - она состоит из логического
символа, за которым закреплен прием, номера его узла и заголовка,
найти же нужно тот концевой пункт бу\-фе\-ра, где она находится. В
конце - действия по переключению на найденную точку буфера,
аналогичные первому случаю.

\item Вход в оглавление программ для выбора точки прерывания при
отладке ком\-пи\-ля\-тора.

х5 - символ "текуровень". Нажата клавиша Ctr-F5. Данная команда
часто используется при анализе работы компилятора ГЕНОЛОГа. Она
позволяет выбрать в ветви оглавления программ, относящейся к
компилятору, нужную точку, и запустить компилятор с остановкой
(выходом в отладчик ЛОСа) при ее достижении. Так как обучение
решателя регулярно требует пополения этого языка и, следовательно,
пополнения компилятора, команда является су\-щест\-вен\-ным
элементом интерфейса редактора приемов.

Прежде всего, активируется 9-й информационный блок, в котором
находится оглавление программ. Реализуется обращение к оглавлению
программ и выбор с его помощью некоторого концевого пункта; х9
становится равно паре ссылок на текстовый и логический терминалы
этого пункта. Из логического терминала извлекается терм
"программа($A_1$ $A_2$)", ссылающий на контрольную точку
"при\-ем($A_2$)" \ программы логического символа $A_1$. Символ
$A_1$ присваивается пе\-ре\-мен\-ной х12; число $A_2$ - переменной
х13. Это число преобразуется к фор\-ма\-ту последовательности цифр
х14 (включая случай одноэлементной после\-до\-ва\-тель\-нос\-ти).
Затем сбрасываются старые установки на трассировку и вводится
новая - на прерывание при выходе на указанный выше оператор
"прием($A_2$)". После этого предпринимается обращение к
компилятору ГЕНОЛОГа - оператору "но\-вый\-прием($\ldots$)". После
компиляции - откат к переформированию набора х4.

\item Переход к просмотру следующего приема серии отобранных для
просмот\-ра приемов.

х5 - символ "схемаидентификации". Нажата клавиша "ш". Команда
ис\-поль\-зу\-ется в различных процедурах просмотра серии
отобранных по какому-либо признаку приемов. Отбор состоит в
создании комментария (подборнеизвест\-ных $A_1$ $A_2$ $A_3$) к
посылкам исходной задачи. У него $A_1$ - список ссылок на
просматриваемые концевые пункты текущего оглавления (базы приемов
либо теорем). Каждая ссылка здесь - набор, определяющий путь в
оглавлении. В случае базы приемов в конце набора размещается
ссылка "прием($\ldots$)" \ на выб\-ран\-ный для просмотра прием; в
случае базы теорем - ссылка "теорема($\ldots$)". $A_2$ - некоторый
вспомогательный логический символ, играющий роль метки типа
просмотра; $A_3$ - текущая позиция в наборе $A_1$.

Фактическая смена текущей позиции $A_3$ и переход к рассмотрению
очередного приема (или теоремы) происходит при нажатии клавиши "ш"
\ в соответству\-ю\-щем оглавлении. Поэтому программа проверяет
наличие комментария (под\-бор\-неизвестных $\ldots$), создает
комментарий (автоклавиатура $\ldots$) к посылкам исходной задачи,
эмулирующий повторное нажатие клавиши "ш", и выходит из редактора
приемов для последующего обращения к оглавлению базы приемов.

Если комментария (подборнеизвестных $\ldots$) нет, но имеется
комментарий (тео\-ре\-ма\-приема $\ldots$), то это означает
завершение цикла рассмотрения списка при\-е\-мов, автоматически
сгенерированных по теореме из базы теорем. Тогда ре\-али\-зу\-ется
возвращение в базу теорем.

\item Регистрация текущего приема в буфере перехода.

х5 - символ "Неизвестные". Нажата клавиша "минус". Текущий прием
ре\-гист\-ри\-ру\-ется в буфере перехода, роль которого играет
комментарий (Неизвестные $A_1$ $A_2$ $A_3$) к посылкам исходной
задачи. Как и обычно, здесь $A_1$ - логический символ, за которым
закреплен прием; $A_2$ - номер его узла; $A_3$ - заголовок приема.

\item Переход к приему, указанному в буфере перехода.

х5 - символ "первыйключ". Нажата клавиша "равно". По комментарию
(Не\-из\-вест\-ные $\ldots$) находится ссылка на прием, к которому
нужно перейти. Вместо этого комментария создается другой -
ссылающийся на текущий прием. Далее выполняется стандартная
цепочка действий по переустановке данных на прос\-мотр приема по
известной ссылке.

\item Вход в справочное оглавление ГЕНОЛОГа.

х5 - один из символов "новыйузел", "конъюнктоперанд",
"записьзадачи", "сме\-ще\-ниепеременных", "посылки".
Соответственно, нажаты клавиши Ctr-з, Ctr - у, Ctr - х, Ctr - ы,
Ctr - c (все - кир.). Они соответствуют справочным оглавлениям:
заголовков приемов, фильтров, указателей, информационных элементов
тек\-сто\-вого анализатора (для удобства отладки тек\-сто\-вого
анализатора это ог\-лав\-ле\-ние достижимо как из редактора
программ ЛОСа, так и из редак\-то\-ра приемов ГЕНОЛОГа), типов
элементов установок на синтез приема.

Прежде всего, проверяется наличие в х4 элемента (просмотртерма 2),
ука\-зы\-ва\-ю\-щего, что выделено окно заголовка приема. Если он
есть, то в оглавле\-нии заголовков находится пункт,
соответствующий заголовку текущего приема, и его текст
прорисовывается под нижней линией приема. Иначе - происходит
обращение к просмотру нужного оглавления. По выходе из оглавления
ре\-али\-зу\-ется несложный интерфейс изменения выбранного
концевого пункта данного оглавления. Этот концевой пункт для
справочного оглавления содержит ссылку, фиксирующую связанный с
ним логический символ или терм. Например, для оглавления
заголовков приемов с каждым его концевым пунктом связан терм,
определяющий общий вид заголовков рассматриваемого типа. По
на\-жа\-тии кла\-ви\-ши Enter происходит редактирование данной
ссылки - ввод нового или из\-ме\-нение старого символа либо терма.

\item Возвращение в главное меню.

х5 - логический символ "группировки". Нажата клавиша End. Если
просмотр приема происходит из трассировки (что определяется по
комментарию "точ\-ка\-при\-вязки" \ к посылкам исходной задачи, то
вместо возвращения в главное меню осуществляется возвращение к
интерфейсу трассировки. Предварительно текущий прием выделяется в
концевом терминале оглавления символом "тек\-при\-ем". Если же
просмотр приема происходит не из трассировки, то вводится
комментарий (автоклавиатура $\ldots$), эмулирующий повторное
нажатие клавиши End при выходе в оглавление базы приемов - для
отката к главному меню.

\item Просмотр справочной информации о логическом символе.

х5 - логический символ "усмчисло". Нажата клавиша "с". Реализуется
об\-ра\-ще\-ние к процедуре "помощь", обеспечивающей стандартный
просмотр ин\-фор\-ма\-ции о логическом символе, вводимом в окне
диалога. После просмотра - откат к перерисовке.

\item Обращение к справочнику по системе.

х5 - логический символ "стандменьше". Нажата клавиша F1.
Предприни\-ма\-ет\-ся обращение к процедуре "Помощь",
обеспечивающей работу со справочником.

\item Просмотр теорем, полученных с помощью данного приема вывода.

х5 - логический символ "минимум". Нажата клавиша "л". Команда
относится только к приемам с заголовком "теорема". Она позволяет
перейти к про\-смот\-ру тех теорем заблаговременно установленного
в базе теорем текущего раздела, которые были выведены с помощью
данного приема вывода. При про\-смот\-ре теорем раздела отбираются
те, комментарии к которым имеют ссылку "при\-ем($\ldots$)" \ на
текущий прием. Сcылки на отобранные теоремы регист\-ри\-ру\-ют\-ся
в комментарии (подборнеизвестных $\ldots$); для переключения на
базу теорем вводится комментарий (новпозиция заменагруппы), и для
входа в просмотр первой из отобранных теорем вводится комментарий
(автоклавиатура $\ldots$), эму\-лирующий при входе в базу теорем
нажатие клавиши "ш".


\end{enumerate}

\subsection{Просмотр окон приема}

Начинать просмотр описываемых ниже ветвей следует с фрагмента,
соответст\-ву\-ю\-ще\-го пункту ("Редактор ГЕНОЛОГа", "Просмотр
окон приема", "Вход в цикл вы\-бо\-ра окна") оглавления программ.
Так как многие операции запускаются из просмот\-ра элементов
описания приема, то эти ветви имеют сравнительно большую глубину и
содержат ряд вспомогательных обработчиков команд.

\begin{enumerate}

\item Вход в цикл выбора окна.

х5 - символ "внешконъюнкция". Нажата клавиша "курсор вправо". В
дейст\-ви\-тель\-ности эта клавиша используется не только для
входа в цикл выбора окна - через нее при уже выбранном окне
осуществляется переход к просмотру содержимого окна, и в данной
ветви программы содержатся также обработчики команд просмотра
окон.

Вход в цикл выбора окна осуществляется при отсутствии в наборе х4
элемента (просмотртерма $\ldots$). В этом случае находится номер
х7 первого прорисованного окна, в х4 заносится элемент
(просмотртерма х7), номер этого окна пере\-кра\-ши\-ва\-ется в
малиновый цвет, и откат к вводу очередной команды.

Если окно уже выбрано, т.е. элемент (просмотртерма $\ldots$)
имеется, то переход через "иначе 2". Переменной х7 присваивается
номер выбранного окна. Из элемента (видео $\ldots$) извлекается
структура данных х9 для прорисовки этого окна; проверяется, что
она отлична от 0. Дальнейшие действия, в зависимости от номера х7,
описываются в следующих подпунктах данного раздела.

\item Вход в просмотр подтермов теоремы приемы.

Действия продолжают предыдущий пункт для случая х7 = 1. Прежде
всего, активная рамка прорисовки устанавливается на весь экран по
высоте, но с отступлением шестнадцатипиксельного столбца слева.

Если структура данных х9 для прорисовки теоремы указывает на
текстовый режим прорисовки, то определяется строка х10, начиная с
которой будет про\-ри\-со\-вы\-ваться теорема (при наличии чертежа
она сдвигается вниз). Затем теорема выдается текстовым редактором,
причем цвет фона - голубой. Если в терме имеется вхождение,
которое нужно выделить многоцветной указкой, то опера\-тор
"входвтерм($\ldots$)" \ создает комментарий (автоклавиатура
$\ldots$), эмулирующий необходимые нажатия клавиатуры. Далее
происходит обращение к опера\-то\-ру "просмотртерма($\ldots$)",
который и реализует интерфейс просмотра подтермов.

В рамках этого интерфейса предусмотрена обработка нажатия клавиши
про\-бе\-ла - тогда по выходе из оператора "просмотртерма" \ режим
выделения окон сбрасывается. Сначала в фрагменте, достижимом из
текущего по "ветвь 3", восстанавливается черно-белая текстовая
прорисовка теоремы, затем проис\-хо\-дит откат к запросу новой
команды, где комментарий (автоклавиатура $\ldots$), эмулирует
нажатие клавиши "курсор влево".

Если при работе с оператором "просмотртерма" \ применяется мышь, и
левая кнопка ее нажимается вне зоны терма, то происходит
переключение на про\-смотр выделенного мышью элемента другого окна
приема. Для этого после выхода из данного оператора и перехода к
фрагменту, достижимому по "ветвь 5", создается комментарий
(автоклавиатура $\ldots$), инициирующий при откате сначала ввод
команды "пробел", отменяющей выделение окна, а затем по\-втор\-ную
обрабтку той же самой команды "мышь".

В случае прорисовки теоремы формульным редактором - переход через
"ина\-че 2" \ после оператора "равно(левпозиция(х9 1)терм)".
Прежде всего, перемен\-ной х10 присваивается набор пар (корень
дерева указателей формульного редак\-то\-ра, соответствующего
максимальному собственному подтерма теоремы прие\-ма, который
может быть выделен формульным редактором - вхождение этого
под\-тер\-ма). Обычно такими максимальными подтермами являются
антецеденты и консеквент теоремы. Инициализируется стэк х11
просмотра подтермов теоремы приема. В него заносятся пары ($A_1$
$A_2$), соответствующие уровням просмотра подтермов. На каждом
уровне $A_2$ - набор
 пар (корень дерева указателей для одного из подтермов текущего уровня
 - вхождение этого подтерма в теорему); $A_1$ - вхождение в $A_2$,
 выделяющее текущий подтерм данного уровня. Начало набора х11
соответствует уровню текущего выделенного на экране подтерма,
конец - корневому уровню теоремы. Далее идет цикл автоматического
про\-дол\-же\-ния стэка х11 для выделения указанного в структуре
данных х9 подтерма, если таковой имеется. Затем - переход через
"ветвь 2", где располагается опе\-ра\-тор "повторение", к которому
будут предприниматься откаты после выбо\-ра очередного подтерма.
Здесь, во-первых, текущий подтерм регистрируется в структуре
данных х9 как выделенный для просмотра. Это позволит
вос\-ста\-но\-вить его, если понадобится временно переключиться с
просмотра теоремы на какой-либо другой интерфейс. Затем
предпринимается перекраска операто\-ром "блокредактора" \
выделенного подтерма в малиновый цвет.

После перехода через "ветвь 1" \ попадаем в фрагмент программы,
содержа\-щий обработчик команд, получаемых оператором
"автоменю(х18)". Здесь рас\-смат\-ри\-ва\-ются следующие команды:

а) х18 - символ "внешсумма". Нажата клавиша "курсор вверх" \ для
выхода в надтерм из текущего подтерма. По достижении корня теоремы
- выход из ее просмотра;

б) х18 - один из символов "извлечениеварианта", "обл". Нажаты
клавиши "т" \ либо "пробел". Осуществляется выход из просмотра
теоремы;

в) х18 - символ "нормпроизведениевсех". Нажата клавиша "ф".
Находится указатель "фикс($\ldots$)" \ текущего вхождения в
теорему, который регистрируется в комментарии (теквхожд $\ldots$)
к посылкам исходной задачи. Эта команда ис\-поль\-зу\-ет\-ся при
редактировании третьего либо четвертого окон приема: после нажатия
в текстовом редакторе клавиши Shift-1 создается комментарий
(тек\-вхожд $\ldots$), происходит автоматическое переключение на
просмотр теоремы приема, затем - выполняется данная команда, и
далее - автоматическое воз\-вра\-щение в текстовый редактор с
прорисовкой в нем найденного указателя "фикс($\ldots$)";

г) х18 - символ "подстановка". Нажата клавиша "курсор вниз" \ для
входа в просмотр операндов выделенного подтерма;

д) х18 - символ "тринадцать". Нажата клавиша Enter для
редактирова\-ния нормализаторов приема, связанных с текущим
выделенным вхождением в те\-о\-ре\-му.

Заметим, что нажатия клавиш "ф" \ и Enter аналогичным образом
об\-ра\-ба\-ты\-ва\-ют\-ся и при просмотре теоремы в текстовом
режиме - там это делает оператор "просмотртерма".

\item Вход в просмотр заголовка приема.

В этот фрагмент попадаем из предыдущего через "иначе 1",
расположен\-ное после оператора "равно(х7 1)".  Если заголовок
односимвольный, то никаких действий не выполняется. Иначе -
происходит перекраска его в голубой цвет, вход в оператор
"просмотртерма", а по завершении просмотра - восстановле\-ние
черного цвета заголовка.

\item Вход в просмотр третьего либо четвертого окон приема.

Попадаем в этот фрагмент из предыдущего аналогичным образом -
через "ина\-че 1" \ после оператора "равно(х7 2)". Переменным х10
и х11 присваиваются, соответственно, набор термов, которые
прорисованы в окне, и набор коорди\-нат (столбец - строка)
начальных точек их прорисовки. Переменной х12
при\-сва\-и\-ва\-ет\-ся набор, указывающий для каждого терма из
х10 выделенный подтерм, если он есть, и 0 в противном случае.
Фактически такой выделенный подтерм может быть только один. Если у
терма из х10 имеется выделенный под\-терм, то он перерисовывается
в черно-белом варианте - для устранения следов ста\-рых выделений
подтермов. Переменной х13 присваивается позиция текуще\-го
выделяемого терма окна - изначально это первый разряд в х10. При
наличии комментария (теквхожд $\ldots$), указывающего тот подтерм
окна, к которому сразу нужно перейти, создается комментарий
(автоклавиатура), эмулирующий нуж\-ное количество нажатий клавиши
"курсор вправо" \ для выбора этого терма, завершающееся нажатием
клавиши "курсор вниз". Затем - переход через "ветвь 1".

В начале нового фрагмента располагается оператор "ветвь 1",
ведущий к за\-вер\-ша\-ющему просмотр окна подфрагменту; далее
расположен оператор "по\-вто\-ре\-ние", к которому будут
происходить откаты при смене выделенного терма окна. Этот терм
прорисовывается на голубом фоне черным цветом. Далее идет еще один
оператор "повторение", и за ним - оператор "автоменю(х17)",
вводящий команды для работы с текущим выделенным термом. Дадим
краткое описание его команд:

а) х17 - один из символов "циклвариантов", "внешконъюнкция",
"внешсум\-ма", "обл". Соответственно, нажаты клавиши "курсор
влево", "курсор вправо", "курсор вверх", "пробел".
Восстанавливается черно-белая прорисовка теку\-ще\-го терма. Если
нажата клавиша "курсор вверх", то реализуется возвращение из
просмотра окна в режим выбора окна; если нажата клавиша "пробел",
то реализуется выход в общий просмотр приема; для остальных двух
случаев реализуется переход к следующему либо предыдущему терму
окна.

б) х17 - один из символов "циклвариантов", "внешконъюнкция",
"точкапри\-вяз\-ки", "контрольунификации". В первых двух случаях
снова нажаты клавиши "курсор влево-вправо", но теперь они приводят
к смене страницы окна, так как перед (соответственно, после)
текущим термом расположена запятая. В последних двух случаях для
смены страницы нажимаются клавиши PageDn, PageUp. Смена страницы
выполняется за счет коррекции имеющегося в х4 элемента (См
$\ldots$), указывающего, сколько нужно пропустить запятых для
вы\-хо\-да на текущую страницу. После такой коррекции - откат к
перерисовке всего изображения приема, с предварительным указанием
в комментарии (авто\-кла\-ви\-а\-ту\-ра $\ldots$) нажатия клавиши
номера окна для повторного входа в него.

в) х17 - символ "подстановка". Нажата клавиша "курсор вниз" \ для
входа в просмотр подтермов текущего выделенного терма. Этот
просмотр, как и для текстовой прорисовки теоремы приема,
осуществляется оператором "про\-смотр\-тер\-ма". Соответственно,
команды для различных операций с выделенными подтермами (например,
для получения справочной информации) инициируются тоже из
оператора "просмотртерма". По выходе из оператора "просмотртерма"
\ анализируются введенные им комментарии (нормализация $\ldots$) и
(теквхожд $\ldots$) к посылкам исходной задачи, хранящие
дальнейшие инструкции о выполне\-нии действий, начатых через его
интерфейс.

г) х17 - один из символов "новыйузел", "конъюнктоперанд",
"записьзадачи", "посылки". Этим символы вводятся нажатиями клавиш
Ctr-з, Ctr-у, Ctr-х, Ctr-c (все - кир.). Команда осуществляет
поиск в справочном оглавлении соответ\-ству\-ю\-ще\-го типа -
заголовков, фильтров, указателей и установок на син\-тез приема
конструкций, имеющих своим заголовком тот же символ, что и
вы\-де\-лен\-ный в окне терм. Найденная информация прорисовыается
снизу, под изобра\-же\-ни\-ем приема. Если имеются несколько
различных вариантов, то для смены их предусмотрен простейший
обработчик команд.

д) х17 - символ "внутрвывод". Нажата клавиша "у" \ для регистрации
текущего выделенного фильтра в буфере фильтров, роль которого
играет комментарий (новоеусловие $\ldots$) к посылкам исходной
задачи. Накапливаемые в этом буфере фильтры могут быть
впоследствии одним нажатием клавиши "у" \ при общем просмотре
какого-либо приема присоединены к его списку фильтров.

е) х17 - символ "мышь". Нажата одна из кнопок мыши. Если кнопка -
левая и курсор мыши находится на каком-либо подтерме того же
самого либо другого окна, то создается комментарий (автоклавиатура
$\ldots$), эмулирующий по\-сле\-до\-ва\-тель\-ность нажатий клавиш
курсора, необходимую для перехода к нужному окну и выделения в нем
терма, содержащего выбранный подтерм. Затем пред\-при\-ни\-мается
откат для реализации этой последовательности нажатий. Если подтерм
был некорневым, то после входа в просмотр выбранного терма,
осу\-щест\-вля\-емый оператором "просмотртерма", эмулируется
повторный ввод ко\-ман\-ды "мышь". В результате формируется еще
один комментарий (авто\-кла\-ви\-а\-ту\-ра $\ldots$) для
оставшихся нажатий клавиш курсора, выделяющих подтерм цветовой
указкой.

Если левой кнопкой была выделена запятая, то для смены страницы
кор\-рек\-ти\-руется элемент (См $\ldots$) набора х4, и откат к
переформированию этого набора.

Если левой кнопкой была выбрана пустая зона, то реализуется выход
в об\-щий режим просмотра.

Наконец, если была нажата правая кнопка мыши, то вводится
комментарий, эмулирующий нажатие клавиши Ctr-у в случае третьего
окна и клавиши Ctr-х в случае четвертого - для извлечения из
соответствующего справочного оглав\-ле\-ния информации о
выделенном в окне служебном символе. Это нажатие реализуется при
откате к оператору, запрашивающему очередную команду х17.

ж) х17 - символ "числитель". Нажата клавиша "р" \ для разрезания
текущей страницы окна на две новых страницы. В описании приема
находится нужная точка для вставки запятой. Для фильтров
рассматриваются операнды терма "условие($\ldots$)"; в список
указателей запятая вставляется непосредственно. Из\-ме\-нения
регистрируются в терминале "команда". Затем формируется
ком\-мен\-та\-рий, эмулирующий нажатие клавиши для повторного
входа в окно после отка\-та (т.е. клавиши номера окна), и
реализуется откат к точке комплектова\-ния набора х4.

з) х17 - символ "фиктопер". Нажата клавиша F6 для склейки текущей
страницы окна со следующей страницей. Действия аналогичны
предыдущей команде, но запятая удаляется.

\item Непосредственный переход к просмотру заданного окна.

х5 - один из символов "унисборка", "если", "то",
"комплексныечисла". Нажа\-та одна из цифровых клавиш 1,2,3,4,
определяющая номер окна. Переход к просмотру содержимого окна
происходит сразу, без использования номеров окон как пунктов меню.
Для этого в набор х4 заносится элемент (просмотртер\-ма $\ldots$),
указывающий номер окна, и вводится комментарий, эмулирующий
на\-жа\-тие клавиши "курсор вправо". После отката будут
выполняться описанные выше действия, начиная с пункта 1.

\item Присоединение содержимого буфера фильтров к списку фильтров
текущего приема.

х5 - символ "внутрвывод". Нажата клавиша "у". Находится
комментарий (но\-во\-е\-ус\-ловие $A$) к посылкам исходной задачи.
Если он имеется, то $A$ представляет собой список термов, которые
будут добавляться к фильтрам приема. Рас\-ши\-рен\-ный список
фильтров регистрируется в информационном элементе (прием $\ldots$)
набора х4, но в файлах изменения пока не осуществляются. Зато в
ин\-фор\-ма\-ци\-онном элементе (изменение $\ldots$) набора х4
делается пометка о том, что список фильтров был изменен. Такая
пометка приведет к тому, что при перерисовке цвет нижней
горизонтальной линии будет заменен на голубой. После этого для
фактического изменения приема достаточно будет нажать F3. По
завершении указанных коррекций - сброс элементов (видео $\ldots$),
(конец $\ldots$), и откат к перерисовке.

\item Сброс буфера фильтров.

х5 - символ "подборзначений". Нажата клавиша "У" \ (кир.).
Удаляется ком\-мен\-та\-рий (новоеусловие $\ldots$).

\item Удаление либо восстановление прорисовки на экране окна с
заданным номером.

х5 - один из символов "метаперевод", "провменьшеилиравно",
"попытка", "Тек\-за\-дача". Соответственно, нажаты клавиши Ctr-F1,
Ctr-F2, Ctr-F3, Ctr-F4. На\-хо\-дится номер х6 удаляемого либо
восстанавливаемого окна. Если в х4 не было элемента (пассив х6),
то он вводится (окно пропадает), иначе - удаляется (окно
восстанавливается). Затем сбрасываются элементы (видео $\ldots$),
(конец $\ldots$), и откат к перерисовке.

\item Смена режима просмотра "текст - формула".

х5 - либо символ "извлечениеварианта", либо символ
"нормпроизведе\-ние\-всех". Соответственно, нажаты клавиша "т" \
либо "ф". При входе в текстовый режим просмотра создается
комментарий "терм" \ к посылкам исходной задачи; при входе в
формульный режим просмотра этот комментарий удаляется. Перед
откатом к перерисовке сбрасываются элементы (видео $\ldots$),
(конец $\ldots$), (про\-смотр\-терма $\ldots$) набора х4.

\item Вход в цикл просмотра нормализаторов.

х5 - символ "усмотрениефильтра". Нажата клавиша "5". Переменной х7
при\-сва\-и\-ва\-ется список нормализаторов приема - термов
"быстрпреобр($A$ $B_1 \ldots B_n$)". У каждого такого терма $A$ -
либо нормализуемый подтерм, либо указатель вхождения его в
теорему; $B_1, \ldots, B_n$ - список указателей нормализации для
$A$. Переменной х8 присваивается текущее вхождение в х7
(изначально - вхождение первого элемента). После перехода через
"ветвь 2" \ попадаем в фрагмент, на\-чи\-на\-ющийся с оператора
"повторение". Откаты к этому оператору будут вы\-пол\-нять\-ся при
переходе к очередному нормализатору. Переменной х10
при\-сва\-и\-ва\-ется текущий нормализатор. Далее инициализируются
переменные х11, х12, х13. Им будут присвоены координаты вхождения
терма $A$ в описание приема: х11 - номер окна (1, 3 либо 4),
внутри которого выделяется терм с $A$; х12 - терм, содержащий $A$;
х13 - вхождение в него подтерма $A$. После выполнения этих
присвоений - переход через "ветвь 1".

Здесь проверяется, что х13 отлично от 0, т.е. что вхождение $A$
удалось найти. Если это не так, то предпринимаются предварительные
действия по удалению текущего нормализатора из описания приема. Он
удаляется из той версии опи\-са\-ния приема, которая хранится в
наборе х4; в элементе (изменение $\ldots$) этого набора
регистрируется факт изменения описания приема, и откат к
перерисовке с удаленным элементом (видео $\ldots$). После
перерисовки нижняя линия при\-ема становится голубой, что является
сигналом для регистрации изменения в файле (например, путем
нажатия F4).

Если х13 было не равно 0, то прежде всего предпринимается просмотр
всех выделенных согласно элементу (видео $\ldots$) подтермов и
перерисовка их в черно-белом варианте - для удаления предыдущих
цветовых указателей. После этого - переход через "иначе 2". Здесь
находится строка, по которой проходит ниж\-няя отделяющая линия
приема, и под ней прорисовываются последовательно ука\-за\-тели
нормализации $B_1, \ldots, B_n$. Затем - переход через "ветвь 1".
По х11, х12, х13 находится то место на экране, где прорисован терм
$A$, и выполняется цветовое выделение этого терма. После
перекраски - переход через "ветвь 1". Далее идет небольшой
фрагмент, анализирующий наличие комментария (теквхожд $\ldots$), и
после него через "ветвь 1" \ - фрагмент, с которого начинается
обработчик команд цикла просмотра нормализаторов.

Предусмотрена обработка команд х16 следующих типов:

а) х16 - один из символов "группировки", "контрольунификации",
"точкапри\-вязки". Соответственно, нажаты клавиша End для обрыва
цикла просмотра, и клавиши PageUp - PageDn для перехода к
предыдущему либо следующе\-му нормализатору.

б) х16 - символ "группировка". Нажата клавиша "н" \ для
редактирования те\-ку\-щего списка указателей нормализации.
Вносимые здесь изменения ре\-гист\-ри\-ру\-ются только во
внутренних элементах набора х4; чтобы зарегистрировать их в файле,
нужно после выхода из цикла просмотра нормализаторов нажать F3.

в) х16 - символ "модули". Нажата клавиша Ctr-Del для удаления
текуще\-го нормализатора. Фактическое удаление произойдет только
при регистрации изменений в файле по выходе из цикла просмотра.

В двух последних случаях при изменении приема нижняя линия не
меняет свой цвет на голубой - нажимать клавишу F3 или F4 здесь
нужно и без этого напоминания.

\end{enumerate}

\subsection{Редактирование приема}

\subsubsection{Создание нового приема}

\begin{enumerate}

\item Начало создания нового приема либо копирование старого.

х5 - один из символов "замещение", "арктангенс",
"переобозначение". Со\-от\-вет\-ственно, нажаты клавиши "д",
"Ctr-д", "Ctr-п". В первом случае выполняет\-ся копирование приема
и его компиляция, во втором - копирование без регистра\-ции в
файлах и компиляции, в третьем - создается бланк нового приема.

Прежде всего, блокируется выполнение команд, если текущий пункт
оглавления базы приемов - пункт его буфера, содержащий новые
приемы. Выполнение их блокируется также из трассировки либо из
просмотра базы приемов с помощью процедуры "текприем".

Далее проверяется наличие в начале набора х2, отображающего
содержимое текущего концевого логического терминала оглавления
базы приемов, терма "фикс(0)". Этот терм и играет роль бланка
приема. Если он уже есть, то команда копирования отменяется, а в
случае ввода нового приема указатель х3 текущей позиции набора х2
переустанавливается на начало набора, и откат к повторному
формированию набора х4. Так как вместо ссылки "прием($\ldots$)" \
на позиции х3 расположен терм "фикс(0)", то экран останется
пустым, и да\-лее при пустом экране будет осуществлен переход к
обработчику команд для ввода приема.

Если набор х2 не имеет своим началом терм "фикс(0)", то этот терм
заносится в начало х2, а х3 устанавливается на левый конец х2. В
случае копирования приема вводится комментарий (регистрациятеоремы
$\ldots$), сохраняющий все пе\-ре\-носимые в новый прием элементы
набора х4. Если копирование должно со\-про\-вождаться компиляцией,
то вводится также комментарий (автоклавиа\-ту\-ра $\ldots$),
эмулирующий нажатие клавиши F3 после копирования. При этом
создает\-ся комментарий (замечузел $\ldots$), в который
переносятся списки комментариев к теореме текущего приема и к
самому приему. После перечисленных дейст\-вий - откат к повторной
инициализации набора х4.

\item Регистрация ссылки на узел теоремы в буфере для создания
нового приема.

х5 - символ "префикснаярекурсия". Нажата клавиша Ctr-б. Вводится
ком\-мен\-та\-рий (утверждение $A_1$ $A_2$ $A_3$ $A_4$), где $A_1$
- логический символ, за кото\-рым закреплена теорема приема; $A_2$
- ссылка на узел теоремы приема; $A_3$ - номер узла; $A_4$ -
теорема приема. Этот комментарий играет роль буфера теоремы
приема: при создании нового приема можно воспользоваться старым
узлом теоремы, на который ссылается данный буфер.

\item Извлечение из буфера теоремы при создании нового приема.

х5 - один из символов "Обобщподст", "выражение". Соответственно,
на\-жа\-ты клавиша "Ctr-к" \ либо "Ctr-и" \ (кир.). В первом
случае по старой теореме создается копия ее узла, во втором -
используется старый узел теоремы.

Прежде всего, проверяется, что х3 указывает на терм "фикс(0)",
т.е. имеет место работа с пустым бланком приема. Затем находится
комментарий (ут\-вер\-жде\-ние $\ldots$), и из него извлекается
набор (логический символ - узел теоремы приема - номер узла -
теорема), присваиваемый переменной х8. Проверяется отсутствие в
наборе х4 элемента (логсимвол $\ldots$), означающее, что ссылки из
этого набора на какую-либо теорему приема еще нет. Затем в левом
верхнем углу экрана прорисовывается номер окна теоремы - "1". В
набор х4 заносятся элементы (логсимвол $\ldots$) и (терм
$\ldots$), а в случае "Ctr-и" \ также элемент (ад\-рес\-узла
$\ldots$). Все эти элементы формируются на основе информации,
хранящейся в х8. Далее выполняется прорисовка теоремы (формульным
либо, при наличии комментария "терм", текстовым редактором),
проводится нижняя отделяю\-щая линия, и откат к запросу очередной
команды.

\end{enumerate}

\subsubsection{Редактирование окон приема}

\begin{enumerate}

\item Вход в редактирование теоремы формульным редактором.

х5 - символ "транслвыражения" \ либо "Неизвестная".
Соответственно, нажа\-ты клавиша "Ctr-ф" \ либо "Ф". В первом
случае будет происходить либо на\-бор новой теоремы, либо набор
новой версии теоремы под старой версией (со\-хра\-ня\-е\-мой на
экране, чтобы было удобнее вносить изменения). Во втором случае
происходит восстановление режима редактирования старой версии на
за\-вер\-ша\-ю\-щем моменте ее набора - курсор формульного
редактора располагается в конце теоремы, и можно либо продолжать
набор, либо прибегнуть к Backspace для отката.

После цепочки стандартных блокировок (нет трассировки, текущий
раздел - не в буфере базы приемов, и т.п.) переменной х6
присваивается номер стро\-ки, начиная с которой будет выполняться
редактирование теоремы.

Переменной х7 сначала присваивается единица. Это значение будет
пере\-да\-но формульному редактору как цвет символов (черный).
Однако, если была нажата клавиша "Ф", то используется специальный
режим работы формуль\-но\-го редактора. В этом режиме переменной
х7 переприсваивается старая вер\-сия теоремы приема, причем
вводится комментарий "формоперанды" \ к посыл\-кам исходной
задачи. Тогда формульный редактор будет сначала создавать дерево
указателей для прорисовки старой версии х7, затем прорисует эту
вер\-сию, удалит комментарий "формоперанды" \ и перейдет в режим
ручного про\-дол\-же\-ния набора теоремы.

Собственно обращение к формульному редактору - в следующем
фраг\-мен\-те; перед обращением предпринимается расчистка экрана
вниз от строки х6. Ес\-ли произошел отказ от редактирования, то
откат к перерисовке приема.

К результату редактирования х9 сразу же применяется процедура
"кор\-рек\-ция\-обо\-зна\-чений". Она нужна для того, чтобы
уточнить внутреннее представле\-ние ряда обозначений, совпадающих
при формульной прорисовке, но различа\-ю\-щих\-ся как логические
символы. Например, одним и тем же символом "плюс" \ на экране
прорисовываются несколько различных операций - обычное
сло\-же\-ние вещественных чисел ("плюс"), сложение комплексных
чисел ("Плюс"), сло\-же\-ние функций ("плюсфунк"), сложение
векторов ("плюсвект"), и т.п. Что\-бы уточнить, какая именно
операция имеется в виду, небходимо учитывать контекст. При наборе
задачи роль этого контекста играют все утверждения списка посылок
и условий. Поэтому коррекция обозначений в задаче проис\-хо\-дит
лишь после ее полного набора - перед началом решения либо при
нажатии Home. В случае теоремы приема контекст беднее - он
сводится лишь к ней самой. Соответственно, больше возможностей
столкнуться с ситуацией, в ко\-то\-рой он не позволяет однозначно
восстановить смысл набранных обозначений - тогда уточнения в
теорему приема придется вводить вручную с помощью текстового
редактора.

Далее выполняется такое переобозначение связанных переменных
теоремы, что\-бы никакой квантор либо описатель не связывал
переменную, уже связанную внешним квантором либо описателем. После
этого - переход через "ветвь 2", где выполняется дополнительное
переобозначение связанных переменных в под\-вы\-ра\-жениях с
производными. Наконец, происходит регистрация теоремы в
эле\-мен\-те (терм $\ldots$) набора х4, учет в элементе (изменение
$\ldots$) факта из\-ме\-не\-ния теоремы, отбрасывание элементов
(видео $\ldots$), (конец $\ldots$), и откат к перерисов\-ке.

\item Вход в редактирование теоремы текстовым редактором.

х5 - символ "кортеж". Нажата клавиша Ctr-т (кир.). После цепочки
блокиро\-вок определяется номер х6 строки, начиная с которой будет
происходить ре\-дак\-ти\-рование. Затем расчищаются буфер текстов
и экран. При наличии коммента\-рия (теквхожд $\ldots$) происходит
выдача терма, указанного в нем. В против\-ном случае, если набор
х4 содержит элемент (терм $\ldots$), осуществляется
про\-ри\-сов\-ка этого терма. Далее - переход через "ветвь 2" \ к
фрагменту, начинающе\-му\-ся с оператора "повторение". Откаты к
этому оператору будут происходить при ошибочном наборе терма. При
обращении к текстовому редактору сохраняет\-ся прорисованная на
экране исходная версия терма. После редактирова\-ния применяется
оператор "кодтекста", переводящий текст в терм х8. Если он
об\-на\-ру\-живает ошибку, то информация о ней прорисовывается в
нижней части рамки редактирования, и откат к повторному
редактированию. Иначе - дейст\-вия аналогичны случаю ввода теоремы
формульным редактором, но без какой-либо коррекции обозначений.

\item Вход в редактирование 2,3 либо 4-го окна.

х5 - один из символов "учетпоказателя", "полныепосылки",
"теоремы". Соот\-вет\-ственно, нажаты клавиши Ctr-2, Ctr-3 либо
Ctr-4. После цепочки блокиро\-вок переменной х6 присваивается
номер того окна, для которого выполняется редактирование. Если
этот номер не равен 2, причем окно заголовка приема еще не
создано, то команда блокируется. Переменной х8 присваивается
структу\-ра данных для прорисовки окна, указанная в элементе
(видео $\ldots$). Переменной х10 присваивается номер строки, с
которой будет выполняться редактирова\-ние. Если отсутствует
комментарий (теквхожд $\ldots$), указывающий, что
редакти\-ро\-ва\-ние продолжается после временного выхода наружу -
в справочное оглавле\-ние либо в первое окно для
полуавтоматического ввода указателя вхожде\-ния "фикс($\ldots$)",
- то экран расчищается начиная со строки х10, причем
вос\-ста\-нав\-ли\-ва\-ет\-ся прорисовка под этой строкой номера
текущего окна. Расчища\-ет\-ся буфер текстов.

Если имеется комментарий (теквхожд $\ldots$), то осуществляется
определяемая им дорисовка текста - добавление извлеченного из
справочного оглавления тер\-ма с помощью оператора "возвращтекста"
\ (он также прорисовывает в ниж\-ней части экрана сопровождающий
текст к выбранному терму), либо добавление указателя вхождения
"фикс($\ldots$)". Если этого комментария нет, то в окне
пе\-ре\-ри\-со\-вы\-ваются все его термы - они извлекаются из
структуры данных х8. В обоих случаях далее - переход через "ветвь
2".

Здесь размещается оператор "повторение", откаты к которому будут
осу\-щест\-влять\-ся при повторном входе в текстовый редактор
после обнаружения ошибки редактирования. Вводятся комментарии
"учетпоказателя" \ и "префиксныйфи\-льтр х6" \ к посылкам исходной
задачи, позволяющие текстовому редак\-то\-ру правильно реагировать
на те нажатия клавиш, которые должны восприни\-мать\-ся в
контексте данного окна приема. Например, с их помощью будет
фор\-ми\-ро\-вать\-ся комментарий (теквхожд $\ldots$),
обеспечивающий возвращение в окно после переключения на теорему
либо на справочное оглавление. После обращения к текстовому
редактору эти комментарии удаляются.

Если имел место отказ от редактирования, то переход через "иначе
1". Если редактировалось старое окно, то откат к перерисовке; если
окно было новым (х8 = 0), причем номер его был более 2, то
происходит регистрация в элементе (видео $\ldots$) пустой
структуры данных текущего окна и проводится его нижняя линия,
отстоящая от верхней на 3 пикселя. Для третьего окна вводится
ком\-мен\-та\-рий (автоклавиатура $\ldots$), эмулирующий нажатие
клавиши входа в ре\-дак\-ти\-ро\-вание четвертого окна. Это
делается для удобства ввода нового приема - чтобы не отвлекаться
на промежуточные между редактированием окон на\-жа\-тия клавиш.

Если редактирование успешно завершено, то проверяется наличие
комментария (теквхожд $\ldots$) - оно означает необходимость
выполнения внешнего пе\-ре\-клю\-чения, и тогда происходит откат к
запросу новой команды. При отсутствии такого комментария набранный
текст переводится в логический формат х12 - терм в случае второго
окна и список термов либо символов в случае третьего и четвертого
окон. Если здесь обнаруживается ошибка, то информация о ней
прорисовывается в нижней части экрана, и откат к повторному
редактирова\-нию. При отсутствии ошибки выполняется ввод либо
коррекция элементов (заголовок $\ldots$), (условие $\ldots$),
(терм $\ldots$). Если окно было разбито на страницы, то изменение
затрагивает только текущую страницу описания фильтров либо
указателей, которая определяется по элементу (См $\ldots$). После
такой коррекции - переход через "ветвь 2".

Здесь корректируется элемент (изменение $\ldots$), указывающий
окна, в которых был изменен прием. Если редактировалось старое
окно, отличное от последнего окна, то откат к перерисовке. Иначе
предпринимается регистрация в элементе (видео $\ldots$) структуры
данных для прорисовки текущего окна, новое содержимое окна
перерисовывается со стандартными пробелами между термами,
прово\-дит\-ся нижняя отделяющая линия, а в случае, если окно не
было последним - создается комментарий (автоклавиатура $\ldots$),
эмулирующий нажатие клави\-ши перехода к следующему окну. Затем -
откат к запросу новой команды.

\item Удаление нормализаторов.

х5 - символ "конст". Нажата клавиша Ctr-End. Из набора х4
удаляется эле\-мент (быстрпреобр $\ldots$); из элемента (прием
$\ldots$) исключаются все нормализаторы "быстрпреобр($\ldots$)";
корректируется элемент (изменение $\ldots$), цвет нижней ли\-нии
приема изменяется на голубой, и откат к запросу очередной команды.

\item Редактирование чертежа.

х5 - символ "дробнаявеличина". Нажата клавиша Ctr-ч. После
стандартных блокировок создается бланк х6 структуры данных
геометрического редактора. Если в х4 уже имелся элемент
(геомредактор $\ldots$), то х6 переопределяется по этому элементу.
После редактирования чертежа определяется указатель х7,
показывающий, нужно ли набирать теорему формульным (х7=0) либо
тек\-сто\-вым (х7=1) редактором. Для этого служит символ "терм",
который заносится во второй набор пары х6 при завершении
редактирования чертежа не по Enter, а по Ctr-Enter. Определяется
нижняя из строк чертежа х8. Далее предпринима\-ет\-ся коррекция в
наборе х4 элемента (геомредактор $\ldots$). Если теорема приема
уже имеется, то откат к перерисовке, иначе - вводится комментарий
(автоклавиа\-ту\-ра $\ldots$), эмулирующий нажатие клавиши,
переводящей в редактирование тео\-ре\-мы формульным (х7=0) либо
текстовым редактором.

\item Выбор нового логического символа для закрепления за ним
теоремы приема.

х5 - символ "подфрагмент". Нажата клавиша Ctr-й. Процедура
перезакреп\-ле\-ния приема за другим логическим символом бывает
нужна достаточно редко. К ней можно обращаться, если новый прием
возник в результате переделки копии старого приема, причем теорема
его изменилась настолько, что нет смысла связывать прием с
символами старой теоремы. Другой повод для использо\-ва\-ния
данной команды - разгрузка слишком часто используемых логических
симво\-лов, во избежание переполнения одного из файлов 8-го
информацион\-но\-го бло\-ка. Несмотря на кажущуюся простоту
операции, для ее выполнения при\-хо\-дит\-ся полностью
переписывать все структуры данных приемов рассматри\-ва\-е\-мой
тео\-ре\-мы и перекомпилировать эти приемы.

Программа выполняет следующие действия. После цепочки стандартных
бло\-ки\-ро\-вок находится строка х7 под первым окном, экран ниже
этой строки рас\-чи\-ща\-ется, прорисовывается текст "логсимвол
:", расчищается буфер текс\-тов, и предпринимается обращение к
текстовому редактору для ввода того сим\-во\-ла х10, за которым
нужно закрепить прием. Если узел теоремы приема еще не был введен,
то выполнение команды сводится к коррекции на новый сим\-вол
элемента (логсимвол $\ldots$). Иначе вводится новый узел статьи
символа х10. Переменной х13 присваивается ссылка на этот узел;
переменной х14 - но\-мер узла. Просматриваются все заголовки х20
приемов, основанных на текущей теореме, и программы этих приемов
удаляются. После этого - переход через "иначе 6".

Вся ветвь узла текущей теоремы копируется из нового корня х13. Это
делает\-ся специальной процедурой "новаяветвь". Так как корень х13
может оказать\-ся относящимся к другому файлу информационного
блока, то переклю\-чить ссылку из него на старый экземпляр ветви,
вообще говоря, нельзя. После ко\-пи\-ро\-вания ветви происходит
удаление ветви старого узла теоремы. Затем про\-смат\-ри\-ваются
узлы приемов в новой ветви, и предпринимаются обращения к
процедуре "новыйприем", компилирующей эти приемы. При компиляции
оче\-ред\-но\-го приема осуществляется коррекция ссылки на него из
текущего кон\-це\-во\-го пункта оглавления базы приемов. По
завершении просмотра узлов прие\-мов аналогичная коррекция ссылок
выполняется в наборе х2.

\item Изменение теоремных переменных приема.

х5 - символ "высотаполосы". Нажата клавиша "К" \ (кир.). Команда
позволя\-ет переобозначить переменные связывающей приставки
теоремы, проводя необ\-хо\-ди\-мые коррекции во всех компонентах
описания приема.

Включается формульный редактор, с помощью которого под нижней
стро\-кой приема набираются через запятую те переменные, на
которые должны быть переобозначаены переменные связывающей
приставки. Переменной х12 присваивается набор этих переменных.
Переменной х14 присваивается тео\-ре\-ма приема; переменной х15 -
ее связывающая приставка. Находится список х20 тех переменных,
встречающихся в теореме приема, ее фильтрах, указате\-лях либо
нормализаторах, которые входят также в список х12. Для них
выбира\-ют\-ся новые обозначения х23. Далее (переход через "ветвь
2") происходит пере\-обо\-зна\-че\-ние старых переменных на новые
во всех компонентах описания прие\-ма, представленных в наборе х4
- в его теореме, фильтрах и указателях. Факт изменения этих
компонент регистрируется в элементе (изменение $\ldots$). Вводится
комментарий (автоклавиатура $\ldots$), эмулирующий нажатие клавиши
F4, и откат к запросу очередной команды.

\item Просмотр и редактирование текстов, сопровождающих
срабатывание приема.

х5 - символ "транслоперандов". Нажата клавиша "6".

Если узел приема не имеет текстового терминала "титр", то сразу же
создается комментарий (автоклавиатура $\ldots$), эмулирующий
нажатие клавиши Enter - оно будет переводить в редактирование
текста. Находится строка х8 под изо\-бра\-жением приема. Затем -
переход через "ветвь 2".

После оператора "повторение" \ (к нему будут происходить откаты
после выхода из текстового редактора) происходят расчистка экрана
начиная со строки х8 и расчистка буфера текстов. Затем - снова
оператор "повторение", и после него - оператор ввода команды
редактирования х9. Здесь возможны следующие случаи:

 а) х9 - символ "тринадцать". Нажата клавиша Enter для входа в
 текстовый редактор. Сразу же после редактирования предпринимается
 сохранение новой версии текста в терминал "титр" \ узла приема.

 б) х9 - символ "модули". Нажата клавиша Ctr-Del для удаления
 ранее введен\-но\-го терминала "титр".

 в) При нажатии любой другой клавиши экран ниже строки х8
 расчищается, и откат к запросу очередной команды редактора
 приемов.

 \item Просмотр и редактирование текстовых примечаний к приему.

 х5 - символ "старшийчлен". Нажата клавиша "э". Для редактирования
 исполь\-зу\-ет\-ся процедура "текстблок". Она позволяет
 просматривать и изменять тек\-сто\-вые терминалы, достижимые по меткам
 1,2, $\ldots$ из указателя, к которому от узла приема имеется
 переход по метке "текстблок".

\end{enumerate}

\subsubsection{Удаление приема}

х5 - символ "модули", что соответствует нажатой клавише Ctr-Del.
После цепочки стандартных блокировок проверяется наличие в х4
элемента (просмотртерма $\ldots$), указывающего на выделенное окно
приема.

Если такой элемент есть, то переход через "иначе 3". В случае
выделенно\-го третьего либо четвертого окна приема происходит,
соответственно, удаление из опи\-са\-ния приема всех фильтров либо
всех указателей. Удаление затрагивает лишь на\-бор х4, и после
него выполняется откат к перерисовке.

Если окна приема не выделены, то начинается удаление приема.
Прежде все\-го, оператор "длялюбого(х12 х13 $\ldots$)" \ удаляет
его программу.

Если узел приема имеет логический терминал "конец", то это
означает, что уда\-ля\-ет\-ся прием, находящийся в буфере базы
приемов и либо являющийся старой вер\-си\-ей измененного приема,
либо находящийся в "корзине" \ буфера после удаления его из
основной части базы приемов. В этом случае будет происходить не
перенесение приема в буфер, а фактическое его удаление.
Соответствующие действия начинают\-ся после контрольной точки
"прием(5 8)". Сначала здесь проверяется наличие у приема источника
в базе теорем; если такой источник есть, то обратная ссылка из
него на прием удаляется. Далее - переход через "ветвь 6". Здесь
анализируется содержимое терминала "конец". Если в нем имеется
ссылка на прием, то мы имеем дело со старой версией измененного
приема. Тогда удаляется встречная ссылка из основной версии
приема, хранящаяся в его терминале "начало". Затем удаляется ветвь
узла приема; если после этого теорема приема оказывается
неиспользуемой, то удаляется и ее узел. Далее - откат к переходу
через "ветвь 4" \ в исходном фрагменте команды, где выполняется
удаление ссылки на прием из концевого терминала оглавле\-ния;
предпринимается выбор в этом терминале другой текущей ссылки, и
откат к фор\-ми\-ро\-ванию набора х4. Новая текущая ссылка берется
идущей сразу после удален\-ной; если удалена последняя ссылка, то
новая текущая ссылка будет последней из оставшихся. Такой выбор
удобен при удалении нескольких приемов, располо\-жен\-ных подряд.
В заключение заметим, что удаление конкретного приема из буфе\-ра
практически не применяется. Обычно весь буфер сбрасывается целиком
с помо\-щью нажатия клавиши "о" \ из оглавления базы приемов. Эта
команда интер\-фей\-са оглавления реализована аналогично
вышеописанному.

Если узел приема не имеет терминала "конец", то переход через
"иначе 5". Здесь сначала проверяется, имеет ли узел приема
терминал "начало". Если такой терминал есть, то это означает, что
удаляется новая версия ранее измененного приема. Так как старая
версия сохранена в буфере, то можно сразу же удалить узел приема
для новой версии, что и делается. Если при этом узел теоремы
приема оказывается неиспользуемым, то он тоже удаляется. Затем -
переход через "ветвь 2", где по содержимому х13 терминала "начало"
\ определяются ссылки х15, х16 на узлы тео\-ре\-мы и приема для
старой версии. Находится терминал "конец" \ старой версии,
содержимое которого заменяется на символ "пусто". Это сразу
переводит ста\-рую версию из категории "измененные приемы"  в
категорию "удаленные приемы", од\-на\-ко с точки зрения ссылок из
оглавления она по-прежнему остается в катего\-рии "измененных
приемов". Чтобы перевести ее в раздел буфера "удаленные при\-емы",
предпринимается просмотр буфера для поиска либо создания его ветви
"удален\-ные приемы". Ссылка на корень этой ветви присваивается
переменной х25. После этого - переход через "ветвь 2", где
продолжается работа с оглавлением. Прежде все\-го, проверяется,
заполнена ли ветвь удаленных приемов целиком. Она содержит не
более 30 приемов, и в случае наличия 30-го приема (переход к нему
через символь\-ный номер "элементарно", соответствующий числу 30)
предпринимается удаление остатков этого приема. Затем - переход
через "ветвь 1", где происходит увеличение на 1 меток оставшихся
пунктов ветви буфера. Одновременно корректируются встреч\-ные
ссылки на оглавление, хранящиеся в терминалах "оглавление" \ узлов
приемов. После этого- переход через "ветвь 1" \ и определение
содержимого терминала "ог\-лав\-ле\-ние" \ старой версии приема,
согласно ее новому размещению - она будет иметь номер 1 в ветви
удаленных приемов. Наконец, предпринимается регистрация ссыл\-ки
на старую версию по метке 1 в ветви буфера и переносится ее
сопровождающий текст из ветви "измененные приемы". Далее - откат к
переходу через "ветвь 1" \ после оператора
"пунктыоглавления($\ldots$)". Здесь завершается реконструкция
оглавления: из ветви "измененные приемы" \ исключается переход к
терминалу старой вер\-сии; номера меток последующих пунктов
уменьшаются на 1, и корректируются встречные ссылки из логических
терминалов "оглавление" \ узлов приемов. Далее - откат к уже
упоминавшемуся выше завершающему фрагменту, достижимому по "ветвь
4" \ из исходного фрагмента обработки команды.

Наконец, остается случай, когда узел удаляемого приема не имеет ни
терминала "начало", ни терминала "конец", т.е. прием не был за
последнее время изменен и не находится в буфере. Обработка этого
случая начинается с фрагмента, переход к которому - через оператор
"иначе 1" \ после проверки наличия терминала "начало". Первым
оператором фрагмента служит метка "прием(5 7)", которой
соответствует пункт "Регистрация удаляемого приема в буфере базы
приемов". После провер\-ки того, что текущий концевой терминал
оглавления не имеет комментария "копия", указывающего на
расположение его в ветви буфера "Новые приемы", начина\-ет\-ся
поиск самого буфера. Если буфера не было, то он создается; в
результате ссыл\-ка на корневой указатель ветви буфера оказывается
присвоена переменной х15. Затем - переход через "ветвь 1". Здесь
предпринимается поиск ветви удаленных приемов; при осутствии такой
ветви она создается. Переменной х17 присваивается ссылка на корень
ветви, и переход через "ветвь 1".

Далее практически полностью воспроизводятся действия, имевшие
место при перенесении старой версии приема из ветви "Измененные
приемы" \ в ветвь "Уда\-лен\-ные приемы": если из указателя х17
имеется переход по метке 30, то соответст\-ву\-ю\-щий прием
удаляется; номера всех меток в х17 увеличиваются на 1; удален\-ный
из основной части решателя прием регистрируется по метке 1;
корректируется его возвратная ссылка на оглавление, и откат к
переходу через "ветвь 4" \ для заверше\-ния команды.

\subsubsection{Компиляция приема}

\begin{enumerate}

\item Регистрация приема в базе приемов.

х5 - либо символ "узелраздела", либо символ "копияблокаанализа".
Соот\-вет\-ст\-вен\-но, нажаты клавиша F3 либо F4. В первом случае
кроме регистрации прие\-ма в базе приемов происходит также его
компиляция. После предваритель\-но\-го анализа ситуации
(блокировка команды для обращений не из редактора приемов и пр.) -
переход через "ветвь 2". Здесь проверяется наличие у приема
чертежа; если чертеж есть, а теорема приема уже была ранее
зарегистриро\-ва\-на и имеет свой узел, то предпринимается
обновление терминала "геомредактор", хранящего описание чертежа.
Далее - переход через "ветвь 1".

Переменной х8 присваивается описание приема, извлеченное из
элемента (при\-ем $\ldots$) набора х4; это описание пополняется
нормализаторами из элемента (быстр\-пре\-обр $\ldots$). Если была
нажата клавиша F3, то заблаговременно вводится комментарий
(автоклавиатура $\ldots$), эмулирующий нажатие клавиши F5 -
об\-ра\-ще\-ние к компиляции после того, как прием будет
зарегистрирован. Затем - переход через "ветвь 1".

Здесь проверяется наличие в наборе х4 элемента (адресузла
$\ldots$), ссылающего\-ся на узел теоремы.

Если такого элемента нет, то переход через "иначе 1" \ к
фрагменту, созда\-ю\-ще\-му новые структуры данных приема (это
делает оператор "добавлениеприема(х4 х9)") и корректирующему
текущий терминал оглавления для ссылки на но\-вый прием. Оператор
"добавлениеприема" \ создает новый узел теоремы;
ре\-гист\-ри\-ру\-ет ссылку на прием в ветви "Новые приемы" \
буфера базы прие\-мов; регистрирует чертеж приема; создает узел
приема и регистрирует относящие\-ся к нему данные; регистрирует
ссылку на прием в текущем логическом тер\-ми\-на\-ле оглавления
базы приемов и создает возвратную ссылку из узла приема на
оглавление.

Если узел теоремы имеется, то проверяется наличие в х4 элемента
(ко\-ман\-да $\ldots$), ссылающегося на узел приема.

Если узла приема нет, то переход через "иначе 2". Здесь
проверяется, была ли изменена теорема приема. Если она была
изменена, то создается новый узел теоремы (для того же самого
логического символа), и измененная версия теоремы регистрируется в
этом узле. Затем создается узел приема, для кото\-ро\-го вводятся
терминалы "команда" \ (описание приема) и "оглавление" \
(возвратная ссылка на оглавление); ссылка на прием регистрируется
в текущем терми\-на\-ле оглавления, и откат к перерисовке. Если
теорема не изменена, то узел приема вводится для уже имеющегося
узла теоремы.

Наконец, если узел приема имелся, то происходит регистрация
измененного приема. Сначала проверяется, имеется ли в х4 элемент
(изменение $\ldots$), Если его нет, то выполнение команды
отменяется. Иначе - начинается реализация ветви, начинающейся с
метки "прием(5 9)", соответствующей пункту оглав\-ле\-ния программ
"Регистрация изменяемого приема в буфере базы приемов".

Прежде всего, проверяется наличие ссылки на прием из ветви буфера
"Новые приемы". Если такая ссылка имеется, то изменяемый прием
сохраняется в данной ветви и не переносится в ветвь "Измененные
приемы". Наличие ссылки обнаруживается операторами в конце
текущего фрагмента программы. В этом случае оператор
"сброс(десять)" \ обеспечивает откат к точке "ветвь 4",
пе\-ре\-во\-дящей в ветвь программы, изменяющей структуры данных
приема. Если же ссылка не обнаружена, то переход через "ветвь 5",
где выполняются дейст\-вия по регистрации приема в ветви
"Измененные приемы". Они начинаются со ввода узла приема,
копирующего старую версию (см. оператор "новыйузел(х14 х15 х16)").
Регистрация этой копии в ветви буфера происходит так же, как
рассмотренная выше регистрация приема в ветви удаленных приемов.

После перехода через "ветвь 4" \ проверяется, изменена ли теорема.
Если это так, то корректируется терминал "терм" \ ее узла.
Коррекция выполняется опе\-ра\-то\-ром "регистрациятеоремы",
который, кроме изменения терминала, учиты\-ва\-ет также изменение
чисел вхождений в теоремы приемов логических символов. Эти числа
используются при выборе точек привязки программ приемов и
хра\-нят\-ся в терминалах "мощность" \ корней статей логических
символов 8-го ин\-фор\-ма\-ционного блока.

Если других изменений в описании приема нет, то элемент (изменение
$\ldots$) набора х4 удаляется, и выполнение команды завершается.
Иначе - проверяется, изменен ли заголовок приема. Если он изменен,
то удаляется программа старой версии приема; удаляется старый узел
приема, и вводится новый, со\-от\-вет\-ству\-ю\-щий новому
заголовку. В нем регистрируется новое описание приема, после
че\-го - откат к перерисовке. Если же заголовок не изменен, то
происходит коррек\-ция терминала "команда" \ узла приема,
хранящего его описание, и тоже откат к перерисовке.

\item Компиляция приема.

х5 - один из символов "фиктопер", "прогрблок". Соответственно,
нажаты кла\-ви\-ши F6 либо F5. В первом случае сохраняется
информация о компиляции, позволяющая при отладке идентифицировать
програмные переменные с тео\-рем\-ны\-ми переменными; во втором
(обычном) случае такая информация не сохраняется.

После цепочки блокировок и извлечения из набора х4 необходимых для
даль\-ней\-шего элементов происходит удаление терминала
"переменные" \ узла приема, сохраняющего информацию о соответствии
программных и теоремных пе\-ре\-мен\-ных. Эта информация будет
восстановлена лишь в случае нажатия F6. Так как она нужна лишь при
отладке, то ее разумно "по умолчанию" \ удалять. Затем
предпринимается обращение к процедуре "новыйприем", которая и
реализует компилятор ГЕНОЛОГа. Это - очень большая процедура, и
изложению общей схемы ее организации будет посвящена вся следующая
глава. Сразу заметим, что размеры компилятора не позволят нам
пройти его "от начала до конца" \ столь же подробно, как это
делалось для других реализованных на ЛОСе процедур - во многих
случаях уточнение подробностей будет предоставлять\-ся читателю.
Основная задача, которую должно будет решить описание
ком\-пи\-ля\-тора - позволить быстро находить те его участки, в
которые нужно вно\-сить изменения при развитии ГЕНОЛОГа.

\item Удаление программы приема.

х5 - логический символ "простоенеравенство". Нажата клавиша F7.
Сначала проверяется наличие логических терминалов "контроль" \
узла приема, в кото\-рых содержатся ссылки на программы
справочника "контроль", созданные для приема. Эти программы не
имеют "своей" \ теоремы и являются дополнениями к программе
текущего приема, вынесенными в отдельные фрагменты. Они нужны для
проверки условий отката к ситуации, имевшей место до примене\-ния
приема, если по прошествии заданного числа шагов после применения
не выполняется заданное условие. Если такие программы есть, то все
они уда\-ля\-ют\-ся оператором "удалениеприема" \ (несмотря на
название, этот оператор уда\-ля\-ет не прием, а только программу).
Затем удаляется программа самого приема. Заметим, что во всех
случаях удаления либо изменения программы происхо\-дит обращение к
оператору "прогфайл(компонента $A$)", где $A$ - тот логичес\-кий
символ, к которому относилась программа. Такое обращение приводит
к удалению из зоны программ фрагментов старой версии программы
сим\-во\-ла $A$ и восстановлению в каталоге программ ссылки на
корень программы, хранящийся в файле и уже измененный. Без этой
коррекции система могла бы еще некоторое время пользоваться
старыми фрагментами из\-ме\-нен\-ной про\-грам\-мы, что приводило
бы к ошибкам. Чтобы данную операцию можно было реализовать,
обращение к изменяющей программу процедуре не должно
раз\-ме\-щаться внутри процесса выполнения изменяемой программы.

\item Восстановление исходной версии приема по буферу базы
приемов.

х5 - символ "редакторответа". Нажата клавиша "Б". Происходит
полное вос\-ста\-нов\-ление того вида приема, который имел место
до зарегистрированного в буфере изменения, и его перекомпиляция.

Из терминала "начало" \ узла приема извлекается ссылка
"прием($\ldots$)" \ на ис\-ход\-ную версию приема. Переменным х10
, х11 и х12 присваиваются, соответст\-вен\-но, логический символ,
номер узла этого символа и заголовок приема, опре\-де\-ля\-е\-мые
по найденной ссылке. Переменной х13 присваивается ссылка на узел
теоремы для исходной версии приема. Далее происходит перезапись
теоремы из терминала "терм" \ узла исходной версии х13 в
соответствующий терминал уз\-ла теоремы текущей версии. Сразу
после этого такая же перезапись выполняется для терминалов
"команда", хранящих описания приемов. Если прием имеет чертеж, то
из исходной версии в текущую перезаписывается также описание
чертежа. Далее - переход через "ветвь 2".

Здесь предпринимается перекомпиляция текущей версии приема и
удаля\-ет\-ся терминал "начало" \ ее узла приема. Набор
информационных элементов х4 сбрасывается. Если зарегистрированная
в буфере исходная версия была от\-ком\-пи\-лирована, то ее
программа удаляется. Удаляется узел ее приема; если после этого
узел теоремы оказывается неиспользуемым, то он тоже удаляется. Из
оглавления ветви буфера исключается концевой пункт,
соответствующий восстановленному приему. Чтобы восстановить
сплошной характер нумерации, используемый в метках оглавлений,
предпринимается вычитание единицы из меток, следующих за
удаленной. При этом корректируются возвратные ссылки на оглавление
из соответствующих узлов приемов. Далее - откат к
пе\-ре\-фор\-ми\-рованию набора х4.

\item Откат либо восстановление исходной версии программы приема,
для кото\-ро\-го буфер приема хранит старую версию.

х5 - либо символ "верхняягрань", либо символ "число".
Соответственно, на\-жа\-ты клавиши "И", "Т" \ (кир.). В первом
случае происходит компиляция про\-грам\-мы исходной версии приема
и удаление программы текущей версии, во вто\-ром - компиляция
программы текущей версии и удаление программы исход\-ной.
Структуры данных самих версий приема при этом не изменяются.

Переменной х11 присваивается набор (логический символ - номер узла
- заго\-ло\-вок приема - ссылка на узел теоремы - ссылка на узел
приема) для про\-смат\-ри\-ва\-емой версии приема. Заметим, что
эта версия может быть как текущей, так и старой, если просмотр
ведется из буфера базы приемов. Переменной х12 присваивается 0 -
эта переменная играет роль индикатора изменений. Если выполнение
команды оказывается невозможным, то она сохраняет нулевое
зна\-че\-ние, иначе становится равна 1. Далее инициируется пара
х13, первый эле\-мент которой полагается равным 0, а второй -
набору х11. После цикла коррекций, на первой позиции этой пары
оказывается набор, соответствующий исходной версии приема (она в
буфере), а на втором - набор, соответствующий текущей версии. Если
просматривается удаленный прием, сохраненный в буфере, то второй
элемент пары х13 будет равен 0.

Затем выполняется переход через "ветвь 3", где сначала удаляется
программа одной из версий (в зависимости от нажатой клавиши), а
затем (переход через "ветвь 1") компилируется другая версия. В
обоих случаях индикатору х12 присваивается единица. Далее -
сначала откат к переходу через "ветвь 2", и если х12 оказывается
равно 1, то набор х4 сбрасывается и выполняется откат к его
переформированию.

\end{enumerate}

\subsubsection{Автоматический синтез приема или его компонент}

Архитектура средств, развиваемых для автоматического синтеза
приемов по базе теорем, будет рассматриваться в третьем томе
монографии. Хотя эти средства пока недостаточны для саморазвития
системы, все же они частично используются при ручном обучении
решателя. Собственно говоря, одной из главных целей развития
решателя и является накопление необходимого фактического материала
для ис\-сле\-до\-ва\-ния принципов автоматического развития базы
приемов. Поэтому пока основная часть интерфейса, связанного с
автоматическим синтезом приемов, обслуживает не поток информации
"от теорем к приемам", а встречный поток - "от приемов к
теоремам". Последний дает возможность проследить шаг за шагом на
конкретных примерах весь процесс возникновения приема из теоремы и
отобрать для базы теорем те теоремы, которые фактически
оказываются востребованы при синтезе приемов.

Здесь мы ограничимся кратким описанием интерфейса запуска основных
про\-це\-дур генератора приемов, сообщая о них минимально
необходимые общие сведения.

\begin{enumerate}

\item Просмотр и редактирование установок на синтез приемов.

Заголовок приема ГЕНОЛОГа определяет тип выполняемых приемом
пре\-об\-ра\-зо\-ваний, но ничего не говорит о цели этих
преобразований. Такая цель лишь косвенным образом извлекается из
всей совокупности фильтров и указателей приема. Чтобы сопроводить
приемы более явными указаниями тех целей, для которых они были
созданы, а заодно предпринять классификацию фактически накопленных
в решателе приемов согласно этим целям, был создан специаль\-ный
интерфейс. Он позволяет развивать оглавление типов целей приемов и
связывать с каждым приемом соответствующий пункт такого
оглавления. Во многих случаях более точная формулировка целей
применения приема требует сопровождения типа цели некоторым
списком параметров. Создается впе\-чат\-ле\-ние, что в
действительности указание теоремы приема, типа его цели и
со\-про\-вож\-да\-ющих параметров вполне достаточно для
автоматического доопреде\-ле\-ния полного описания приема на
ГЕНОЛОГе. Такое доопределение пред\-по\-ла\-га\-ет как анализ уже
имеющихся теорем и приемов для оптимизации взаимо\-дей\-ст\-вия их
с новым приемом, так и возможные циклы коррекций приема на сериях
задач. Фактически, здесь возника\-ет язык еще более высокого
уровня, чем ГЕНОЛОГ. Описание приема на нем требует, помимо
теоремы, лишь за\-дан\-ной в некотором стандартном формате целевой
характеризации. Эта ха\-рак\-те\-ри\-зация (тип цели и ее
параметры) была названа установкой на синтез приема, а процедуры
ком\-пи\-ля\-ции, обес\-пе\-чи\-ва\-ю\-щие ее преобразова\-ние в
описание приема на ГЕНОЛОГе, названы гене\-ра\-то\-ром приемов. На
самом деле, генератор при\-е\-мов лишь за\-вер\-ша\-ет работу по
синтезу новых приемов, так как появле\-нию его вход\-ной
информа\-ции пред\-шес\-т\-ву\-ют процессы еще более высоких
уровней, происходя\-щие уже не в базе приемов, а в базе теорем. Мы
не будем касаться сейчас трудностей, возникаю\-щих при создании
генератора приемов - речь о них пойдет в третьем томе. Опишем
вкратце лишь упомянутый выше интерфейс, по\-з\-во\-ля\-ющий
вруч\-ную вводить установки на синтез уже имеющихся приемов. Эта,
безусловно, бес\-смыс\-лен\-ная при автоматическом синтезе приемов
работа пока что со\-вер\-шен\-но необходима для предварительной
классификации приемов и получе\-ния "за\-дач\-ника" \ для процедур
предыдущего уровня - тех, которые по тео\-ре\-ме определя\-ют
установку на синтез приема.

Переходим к рассмотрению программы интерфейса, реализующей данную
ко\-ман\-ду. Начальный ее фрагмент соответ\-ству\-ет пункту
(Редактирование при\-ема - Автоматический синтез приема или его
компонент - Просмотр и редактиро\-ва\-ние установок на синтез
приема).

х5 - логический символ "новыесвязки". Нажата клавиша "и".
Установка на синтез приема хранится в логическом терминале
"примечание" \ узла приема. Содержимое этого терминала
присваивается переменной х8. Из него извлека\-ет\-ся элемент
"тип($A$)", где $A$ - логический символ, кодирующий тип установки.
Будем называть его далее типом приема.

Типы приемов представляют собой логические символы, к которым
обращает\-ся справочник "заголовокприема", инициирующий создание
приема. Все приемы этого справочника зарегистрированы в оглавлении
программ, в разделе (Ге\-не\-ра\-тор приемов - Справочник
ЗАГОЛОВОКПРИЕМА). Название концево\-го пункта оглавления программ,
соответствующего заданному типу приема, используется в интерфейсе
редактора приемов вместо обозначающего тип ло\-ги\-чес\-кого
символа.

После того, как тип приема присвоен переменной х10, оператор
"названиетипа" \ присваивает переменной х11 ссылку на текстовый
терминал оглавления прог\-рамм, хранящий название типа. Происходит
расчистка экрана ниже текс\-та теоремы приема, и на этом месте
осуществляется прорисовка указанного тек\-сто\-во\-го терминала.
Затем проводится горизонтальная линия, и под ней
про\-ри\-со\-вы\-ваются остальные элементы установки на синтез.
После прорисовки сразу выполняется вход в текстовый редактор. Если
нужно изменить параметры установки (тип ее изменяется другими
средствами), то по окончании ре\-дак\-ти\-ро\-ва\-ния нажимается
Enter, иначе - нажимается Esc. В первом случае
кор\-рек\-ти\-руется содержимое терминала "примечание".

\item Автоматический синтез приема либо характеризация приема с
помощью ог\-лав\-ле\-ния типов приемов.

х5 - символ "деление" \ либо "нижняяоценка". Соответственно,
нажаты клави\-ша "а" \ либо "х". В первом случае предпринимаетя
попытка синтеза приема после ручного ввода теоремы либо создание
альтернативной версии уже имеющегося приема, со своей установкой
на синтез. Для этого обеспе\-чи\-ва\-ет\-ся вход в оглав\-ле\-ние
типов приемов и ручной выбор нужного типа. Эта команда пока
ис\-поль\-зу\-ется только с одной целью - для автоматического
формирования при\-емов спра\-воч\-ни\-ков, причем нужна она бывает
достаточно часто. Во втором случае (клави\-ша "х") предпринимается
вход в оглавление типов приемов, чтобы свя\-зать с приемом
установку на синтез приема либо изменить ранее связанную с ним
установку. После того, как с приемом связана установка на его
синтез, он превращается в обучающий материал для развития
генератора приемов: мож\-но запускать на нем генератор и
анализировать рас\-хож\-де\-ния между ручным и автоматическим
синтезом.

Обработка команды начинается с проверки того, что при нажатии
клавиши "х" \ прием уже создан. Если ранее выполнялась тестовая
генерация приема и был создан комментарий (сравнениеприемов
$\ldots$), хранящий результаты сравнения синтезированного приема с
его "ручной" \ версией, то этот комментарий уда\-ля\-ет\-ся.
Удаляется также другой относящийся к автоматическому синтезу
приемов комментарий - (смнабор $\ldots$). Переход через оператор
"иначе 2" \ относится к случаю инициализации оператора фильтра и
сейчас для нас неинтересен. Да\-лее происходит ввод комментария
"заголовокприема" \ к исходной задаче, ука\-зы\-ва\-ю\-щий, что
имеет место режим входа в оглавление программ для выбора типа
приема. Оператор "путьвоглавлении(программа набор(7 1)х7)" \
устанавли\-ва\-ет текущий путь в оглавлении программ на корень
ветви справочника "заго\-ло\-вок\-при\-ема", которая одновременно
служит оглавлением типов приемов. Далее реализуется вход в
оглавление программ. Если выход из него осуществляется по нажатии
клавиши Esc либо End, то откат к перерисовке. Иначе в выбран\-ном
концевом терминале оглавления находится терм "программа($A_1$
$A_2$)", где $A_1$ - логический символ, программа которого,
относящаяся к справочнику "за\-го\-ло\-вок\-приема",
инициализирует конвейер синтеза приема. $A_2$ - номер выбранной
для ссылок контрольной точки "прием($\ldots$)" \ в этой программе.
Символ $A_1$ присваивается переменной х13.

Дальнейшая обработка двух команд выполняется раздельно. Рассмотрим
сна\-ча\-ла случай нажатия клавиши "а" (х5 = "деление"). На экране
вос\-ста\-нав\-ли\-ва\-ется исходное изображение - то, которое
имелось перед обращением к оглав\-ле\-нию. Вводится заготовка х15
установки на синтез приема - в нее заносится терм "тип(х13)".

Если создаваемый прием не является приемом справочника, то
переменной х16 присваивается ссылка на текстовый терминал
оглавления для выбранного концевого пункта. Этот текст
прорисовывается под текстом теоремы приема, и осуществляется
обращение к текстовому редактору для ввода оставшихся элементов
установки на синтез, которые присоединяются к набору х15. Далее -
откат к переходу через "ветвь 6". Если же создается прием
справочника, то пополнение установки на синтез не требуется, и
сразу выполняется пере\-ход через "ветвь 6".

Здесь переменной х16 присваивается пара (приемы пустоеслово),
второй эле\-мент которой представляет собой накопитель четверок
(теорема приема - за\-го\-ло\-вок приема - установка на синтез
приема - описание приема) для син\-те\-зи\-ру\-емых приемов.
Инициализируется структура данных х17 генератора прие\-мов, в
которую заносится пока единственный элемент х16. Эта структура
дан\-ных называется блоком приема. Если происходит создание новой
версии уже имеющегося приема, то пред\-при\-ни\-мается попытка
найти в базе теорем ту тео\-ре\-му, которая является источником
приема. В х17 при этом дополнительно заносится элемент (теорема
$\ldots$) - ссылка на найденную теорему.

Далее - переход через "ветвь 1", где происходит обращение к
справочни\-ку "заголовокприема", выполняющему синтез приемов. В
действительности его программы обычно весьма просты - они являются
лишь началом конвейе\-ра синтеза приема. Далее, по цепочке
взаимных обращений, следуют операторы "схемапосылок",
"схемаидентификации", "схеманормализации", "фильт\-ры\-при\-ема" \
и "учетприема". Описание их будет приведено в третьем томе
моногра\-фии. После обращения к генератору приемов анализируется
список х19 четве\-рок указанного выше формата, определяющих
созданные приемы. Переменной х20 присваивается первая четверка
этого списка.

Если выполняется синтез альтернативной версии имеющегося приема,
то пе\-ре\-ход через "иначе 2", где к началу списка х2 ссылок на
приемы текущего просматриваемого пункта оглавления добавляется
элемент "фикс(0)", х3 за\-ме\-ня\-ется на вхождение этого
элемента, а х4 переустанавливается на просмотр приема, задаваемого
набором х20. Затем - откат к перерисовке. Так как этот прием не
зарегистрирован в файлах, то цвет нижней его линии будет голубым.
С другой стороны, наличие элемента "фикс(0)" \ означает, что все
готово для регистрации, и при необходимости ее можно осуществить
обычными средства\-ми. Если набор х19 был более чем
одноэлементным, то его остаток сохраня\-ет\-ся в комментарии
(смнабор $\ldots$) к посылкам исходной задачи.

Если же происходит синтез приема после ручного ввода теоремы, то
осу\-щест\-вля\-ется коррекция ука\-зан\-ной в наборе х4 теоремы
приема - она берется та\-кой, как в четверке х20. Это нужно из-за
того, что генератор приемов может ввести в теорему технические
модификации. Затем к набору х4 присоединя\-ют\-ся компоненты
описания при\-ема, извлекаемые из четверки х20, и откат к
перерисовке. Как и в предыдущем случае, остаток набора х19
сохраняется в комментарии (смнабор $\ldots$).

Вернемся теперь к точке раздельного рассмотрения команд и перейдем
к рас\-смот\-ре\-нию случая клавиши "х" (см. оператор "иначе 5").
Здесь начинает\-ся формирование набора х14 элементов установки на
синтез приема. Прежде всего, в него заносится терм "тип(х13)". В
зависимости от описания текущего приема, в х14 заносятся также:
для приемов замены - терм "направл($A$)", указываю\-щий
направление замены $A$; для приемов проверочного оператора либо
синтезатора - терм "оператор($A$)", указывающий название $A$ этого
оператора. Далее набор х14 регистрируется в элементе (примечание
$\ldots$) набора х4 и в логическом терминале "примечание" \ узла
приема. Наконец, создается комментарий (авто\-кла\-виатура
$\ldots$), эмулирующий нажатие клавиши "и" \ для входа в ручное
до\-опре\-де\-ление установки на синтез, и происходит откат к
точке ввода команд.

\item Тестовая генерация приема.

х5 - символ "область" \ либо "прообраз". Соответственно, нажаты
клавиша "Л" \ либо "П". Первая команда используется при отладке
генератора приемов: она позволяет установить нужную точку
прерывания в его работе через оглавление программ; вторая -
запускает генератор приемов без прерываний. В обоих слу\-ча\-ях
создается некоторая версия описания приема, которая выдается на
экран для сравнения со старой версией. Для удобства сравнения
предусмотрен ряд несложных вспомогательных команд. Команда
тестовой генерации приема мо\-жет запускаться в цикле серийной
обработки всех приемов выбранного раздела. В базе приемов
сохраняется информация о последнем и предпоследнем цик\-лах
тестовой генерации приемов; предусмотрен интерфейс для просмотра
этой информации по заданному разделу оглавления. При просмотре
указывают\-ся количества рассогласований различных типов между
автоматически создан\-ны\-ми приемами и приемами, хранящимися в
решателе; можно переходить к просмотру групп приемов, в которых
эти рассогласования имеются. Таким образом, имеется интерфейс для
работы над сближением "ручной" \ и ав\-то\-ма\-ти\-ческой версий
приемов. В отдельных случаях для такого сближения приходится
доучивать генератор приемов, в отдельных - изменять старые приемы.
Фак\-ти\-чес\-ки, работа над генератором приемов для решателя
оказалась одним из наиболее эффективных средств оптимизации самого
решателя. Но вернемся к рассмотрению программы, реализующей
команды.

Переменной х8 присваивается установка на синтез приема; если была
нажата клавиша "Л", то осуществляются обращение к оглавлению
программ, выбор в этом оглавлении концевого пункта для прерывания
работы генератора приемов и создание установки на прерывание при
выходе на соот\-вет\-ству\-ю\-щую кон\-т\-роль\-ную точку
"прием($\ldots$)". Для обоих команд далее - переход через "ветвь
3". Переменной х12 присваивается накопитель блока приема, в
который зано\-сит\-ся накопитель результатов (приемы пустоеслово).
Как и в случае коман\-ды "а", к блоку приема добавляется элемент
(теорема $\ldots$), ссылающийся на источник приема в базе теорем.
Далее - обращение к спра\-воч\-ни\-ку "заголовокприема",
выполняющему синтез приемов.

По окончании работы генератора приемов просматриваются четверки
х18 из накопителя новых приемов х11. Для отображения на экране
выбирается та из них, заголовок приема которой совпадает с
заголовком рассматриваемого приема решателя. Формируются тройки
х22 и х23 вида (теорема приема - заголовок - описание приема),
соответственно, для старой и новой версий при\-е\-ма. К ним
применяется оператор "сравнениеприемов", анализирующий
раз\-ли\-чия и выдающий список х24 указателей рассогласования
между прие\-ма\-ми. Типы этих указателей можно посмотреть в
справочной информации к ло\-ги\-чес\-ко\-му символу
"сравнениеприемов". В логическом терминале
"сравнение\-при\-е\-мов" \ узла приема решателя сохраняются данные
о числе различий в фильт\-рах, указателях и нормализаторах. Ранее
имевшиеся в терминале данные о последнем тестировании переносятся
в разряд предпоследнего тестирова\-ния, а те - удаляются. Затем
информация о новом приеме и найденных различи\-ях сохраняются в
комментарии (сравнениеприемов $\ldots$), вводится коммента\-рий
(автоклавиатура $\ldots$), эмулирующий нажатие клавиши "р" (кир.),
и откат к запросу очередной команды. При выполнении команды "р" \
произойдет переход к просмотру синтезированной версии приема (см.
ниже).

Если же различий между новой и старой версиями не было, то
оператор "срав\-не\-ние\-раз\-ли\-чий" \ оказывается ложным. В
этом случае нижняя линия приема перекрашивается в зеленый цвет,
информация о тестировании сохраняется в терминале
"сравнениеприемов", и переход к запросу очередной команды.

При наличии серийного тестирования, распознаваемого по комментарию
"под\-раз\-дел", происходит внутренний перезапуск системы для
перехода к очеред\-но\-му приему.

\item Переходы между основной и автоматической версиями приема.

х5 - символ "числитель". Нажата клавиша "р" \ (кир.). Команда
позволяет по\-пе\-ре\-менно переходить от просмотра основной
версии приема к его версии, воз\-ник\-шей при тестировании
генератора приемов, и обратно. При изображении на экране
автоматической версии нижняя отделяющая линия имеет голубой цвет.

Находится комментарий (сравнениеприемов $\ldots$), хранящий
информацию об ав\-то\-ма\-ти\-ческой версии приема. Указателем на
основную версию приема является наличие в наборе х4 элемента
(команда $\ldots$), ссылающегося на узел приема. В этом случае
набор х4 переформируется по комментарию "сравнениеприемов",
вводится комментарий "точкапривязки", блокирующий на период
про\-смот\-ра автоматической версии операции по изменению базы
приемов, и откат к пе\-ре\-ри\-сов\-ке. Если же просматривалась
автоматическая версия приема, то коммен\-та\-рий "точкапривязки" \
удаляется, и откат к переформированию набора х4.

\item Просмотр списка рассогласований между основной и
автоматической версиями приема.

х5 - символ ",". Нажата клавиша "Р" \ (кир.). Клавиша должна
нажиматься при просмотре основной версии приема, иначе команда
игнорируется. Под теоре\-мой приема прорисовывается текущий
указатель рассогласования (поясня\-ю\-щий текст и термы); смена
этих указателей осуществляется нажатием кла\-виш "курсор вверх" \
- "курсор вниз". Выход из просмотра - по нажатии любой другой
клавиши.

Информация о рассогласованиях извлекается из комментария
(сравне\-ние\-при\-е\-мов $\ldots$) и присваивается переменной х8.
Она представляет собой набор эле\-мен\-тов, указывающих на
появление нового либо исчезновение старого фильт\-ра; указателя;
нормализатора. Программная реализация описанного выше
ин\-тер\-фей\-са просмотра элементов несложна, и ее можно при
необходимости разобрать самостоятельно.

\item Автоматическое формирование указателей приема.

х5 - символ "группировка". Нажата клавиша "н" \ (кир.). Эта
команда (и еще команда "а" \ для автоматического формирования
приемов справочников) - един\-ст\-венная на сегодня функция
генератора приемов, реально используемая в обучении решателя. Она
позволяет доопределить указатели и нормализато\-ры приема в
полуавтоматическом режиме. Генератор приемов предлагает
по\-сле\-до\-ва\-тельно новые (созданные им, но ранее
отсутствовавшие) либо старые (которых он не создал) элементы
данных типов, и на каждом шаге доста\-точ\-но лишь нажать клавишу
Insert либо Delete для добавления либо удаления элемента.

После цепочки стандартных блокировок располагается оператор
"повторение". Затем проверяется наличие в наборе х4 элемента
(указатель $\ldots$), содержа\-ще\-го информацию о предложениях
генератора приемов по вводу либо удале\-нию указателей и
нормализаторов. Если такого элемента нет, то переход через
"ина\-че 2". После его создания - откат к указанному выше
оператору "повторе\-ние", и далее - продолжение действий по
отображению серии предложений на экра\-не.

Элемент (указатель $A_1$ $A_2$) набора х4 содержит список $A_1$
пар ($B_1$ $B_2$), где ли\-бо $B_1$ - элемент, созданный
генератором приемов и отсутствовавший ранее, а $B_2$ - 0, либо
$B_1$ - 0, а $B_2$ - ранее имевшийся элемент, не созданный
генератором. $A_2$ - текущая отображаемая на экране позиция списка
$A_1$.

Начнем с рассмотрения ветви "иначе 2", где происходит создание
коммента\-рия (указатель $\ldots$). Здесь начинается формирование
блока приема х9. В него заносится накопитель результатов (приемы
пустоеслово). Так как прием до\-оп\-ре\-де\-ля\-ется, то набор х4
должен иметь элемент (прием $\ldots$), содержащий вве\-ден\-ную
часть описания приема. Это позволяет добавить к блоку приема
эле\-мент (условие $\ldots$), перечисляющий фильтры приема, и
элемент (прием $\ldots$), перечисляющий прочие компоненты описания
приема. В х9 заносится также элемент (текприем $\ldots$),
содержащий ссылку на доопределяемый прием в базе приемов, и
элемент (примечание $\ldots$) - установку на синтез приема, если
она есть. Наконец, про\-ве\-ря\-ется, что доопределяемый прием
имеет заголовок, после чего выполняется обращение к середине
конвейера генератора приемов - про\-це\-дуре
"схе\-ма\-по\-сы\-лок". Начиная с этой точки и происходит
доопределение бло\-ка приема х9.

После обращения к генератору приемов проверяется, что прием был
доопре\-де\-лен однозначно (иначе выполнение команды отменяется).
Переменной х12 присваивается список указателей и нормализаторов
доопределенного приема, причем если указатель объединял в себе
несколько различных подуказателей, то в данном списке он
разбивается на части. Аналогичный список х13 создается для
исходной версии приема. Указатели и нормализаторы, имеющиеся в
обоих версиях, отбрасываются, а из оставшихся комплектуется список
$A_1$ коммента\-рия (указатель $\ldots$). После ввода комментария
- откат к оператору "повторе\-ние" \ для отображения на экране
результатов обращения к генератору приемов.

При обнаружении комментария (указатель $A_1$ $A_2$), содержащего
информа\-цию о попытке доопределения приема, переменной х8
присваивается текущая пара ($B_1$ $B_2$) набора $A_1$. В
зависимости от того, определяет ли эта пара элемент, созданный
генератором либо не созданный им, в верхней части экрана
ак\-ти\-ви\-зи\-ру\-ется одна из двух версий меню. В левом
верхнему углу этого меню указывается, какой случай
рассматривается. Переменной х9 присваивается ука\-за\-тель либо
нормализатор, извлеченный из текущей пары.

Если х9 - нормализатор, то определяются значения х11,х12,х13 -
соответ\-ст\-вен\-но, номер окна приема (1, 3 либо 4), в котором
нужно выделить цвето\-вой указкой нормализуемый подтерм; терм, к
которому относится подтерм, и вхождение подтерма. Чтобы убрать
цветовые элементы предыдущего состо\-я\-ния интерфейса, все термы
первого, третьего и четвертого окон перекрашива\-ют\-ся в
черно-белый цвет. Затем под нижней линией приема прорисовываются
ука\-за\-тели нормализации, извлеченные из терма х9. Наконец,
происходит перекрас\-ка того подтерма, к которому они относятся.

Если х9 - указатель, то, как и в предыдущем случае, сначала
убираются цве\-то\-вые элементы предыдущего состояния интерфейса,
а затем указатель про\-ри\-со\-вы\-вается под нижней линией
приема.

После прорисовки - откат к переходу через "ветвь 4" \ в исходном
фрагмен\-те команды "н". Здесь размещен обработчик команд,
реагирующий на три команды: Esc - сброс режима просмотра
предложений генератора приемов; Insert - введение нового либо
сохранение старого элемента; Delete - удаление старого либо отказ
от нового элемента. Все изменения затрагивают только набор х4; для
регистрации их в файле необходимо после выхода из серии
вос\-поль\-зо\-ваться стандартными средствами - клавишами F3 либо
F4. При удале\-нии либо добавлении указателей сохраняется принятая
в ГЕНОЛОГе группи\-ров\-ка однотипных указателей в один общий
указатель.

\item Извлечение установок на синтез, созданных генератором
приемов.

х5 - символ "помощь". Нажата клавиша "Ctr-ц". Команда используется
в со\-че\-та\-нии с интерфейсом базы теорем. После того, как
генератор установок на синтез приемов, запускаемый из базы теорем,
создает список возможных ус\-та\-но\-вок, и некоторая из них
выбирается через специальный интерфейс, она регистрируется в
комментарии (комментарий $\ldots$). При этом осуществляется
автоматический переход из базы теорем в базу приемов, где нажатие
Ctr-ц приводит к замене старой установки для текущего приема на
новую, из\-вле\-ка\-емую из указанного комментария.

\item Переход к рассмотрению очередного приема из серии
автоматически созданных приемов.

х5 - символ "схемаидентификации". Нажата клавиша "ш". Как и в
предыду\-щем случае, команда завершает действия, инициируемые в
базе теорем. Там выполняется просмотр серии установок на синтез
приемов, созданных для те\-ку\-щей теоремы; одна из них
выбирается, и по ней синтезируются приемы. Результаты синтеза -
набор четверок (теорема приема - заголовок приема - установка на
синтез приема - описание приема) - передаются в комментарий
(смнабор $A$). После автоматического перехода в базу приемов,
ручного вы\-бо\-ра нужного концевого пункта и входа в просмотр его
приемов нажима\-ет\-ся клавиша "ш". После этого находится
комментарий (смнабор $\ldots$) и из него из\-вле\-ка\-ется первая
четверка х9 указанного вида. К началу набора х3 добавляется, если
его там не было, терм "фикс(0)" \ - бланк ссылки на новый прием;
вы\-би\-ра\-ет\-ся символ х10, за которым будет закреплен прием;
первый элемент набора $A$ отбрасывается; переменной х4
присваивается набор для отображения син\-те\-зи\-ро\-ван\-ного
приема х9, и откат к перерисовке. Таким образом
обеспечи\-ва\-ет\-ся серийный просмотр синтезированных приемов и
ручной отбор их в базу приемов. Другие, более автономные процессы
синтеза приемов через базу тео\-рем будут рассмотрены в третьем
томе монографии.

\end{enumerate}

\subsubsection{Перенесение приема на новое место}

Перенесение приема из одного концевого пункта оглавления базы
приемов в другой происходит в два этапа. Сначала ссылка на него
заносится нажатием клавиши Insert (х5 - символ "внешдизъюнкция") в
специальный буфер, роль которого игра\-ет комментарий
(ссылканаприем $A$). Здесь $A$ - набор пар (ссылка на концевой
терми\-нал оглавления - терм "прием($B_1$ $B_2$ $B_3$)"). Затем,
уже в оглавлении базы приемов, пос\-ле выделения нужного концевого
пункта, снова нажимается Insert, что и заверша\-ет процесс
перенесения в данный пункт всех отобранных приемов. Реализацию
этой, а также ряда других осуществляемых через интерфейс
оглавлений операций ре\-дак\-то\-ра приемов мы рассмотрим ниже, в
отдельном подразделе.

Буфер переносимых приемов можно расчищать нажатием клавиши Delete
(х5 - символ "соответвхожд").

\subsubsection{Обработчик команд мыши}

При нажатии кнопки мыши из общего просмотра приема начинается
обработка ко\-ман\-ды х5 = "мышь".

Если нажата правая кнопка мыши, то осуществляется выход из
просмотра при\-е\-ма. Текущая ссылка "прием($\ldots$)" \ в наборе
х3 заменяется на "текприем($\ldots$)", чтобы при следующем
попадании в данный концевой пункт оглавления базы приемов сно\-ва
оказаться на том же приеме. Это изменение регистрируется в файле.
Далее - выход из редактора приемов. Если имел место цикл просмотра
приемов про\-це\-ду\-рой "текприем", то при выходе устанавливается
значение "ложь" \ - это приводит к возвращению в главное меню.

Если нажата левая кнопка мыши, то прежде всего определяется номер
х11 ок\-на приема, в котором находится курсор мыши. Если выделения
окна приема на момент нажатия не было, то вводится комментарий
(автоклавиатура $\ldots$), эмулирую\-щий последовательное нажатие
клавиши - номера окна (для входа в окно) и получение сигнала от
мыши (параметры этого сигнала - номер кнопки и координаты курсора
- берутся из регистров интерпретатора прежние). Если окно было
выделено, то тоже вводится комментарий (автоклавиатура $\ldots$),
но в этом случае он эмулирует по\-сле\-до\-вательное нажатие
клавиши "пробел" \ (для отмены выделения окна) и получе\-ние
сигнала от мыши - для повторения данной команды.  В обоих случаях
далее - от\-кат к запросу следующей команды.

\subsubsection{Управление трассировкой через просмотр приема}

Из просмотра приема можно вводить различные параметры процесса
решения зада\-чи либо получать дополнительную информацию при
трассировке:

\begin{enumerate}

\item Ввод установки на прерывание при применении приема либо при
начале по\-пыт\-ки его применения.

х5 - один из символов "список", "фигуры", "тринадцать".
Соответ\-ст\-вен\-но, нажаты клавиша F9, либо Ctr-Enter, либо
Enter. В первом случае должна быть введена установка на прерывание
при начале попытки при\-ме\-не\-ния приема в кадре текущей задачи;
во втором - на прерывание при начале попытки при\-ме\-не\-ния
приема в произвольном кадре (наиболее употребительный вариант); в
последнем случае - при фактическом применении приема.

Проверяется наличие комментария "блоктрассировки", указывающего на
ре\-жим просмотра приема из запуска решения задачи либо из
трассировки. Если обращение к просмотру приема произошло из
логического вывода в базе теорем (что распознается по наличию
внешней процедуры "блоктеорем"), то установ\-ка на прерывание при
попытке применения приема вводится сразу, и далее - вы\-ход из
редактора приемов. Иначе - переход через "ветвь 2". Здесь, в
зависимости от типа команды, вводится комментарий с одним из
заголовков: "начало", "левыйкрай", "трассперечисл", содержащий
координаты приема. Этот ком\-мен\-та\-рий будет использован
внешней процедурой для фактической установки пре\-ры\-ва\-ния. В
случае команды Enter на уровне интерпретатора ЛОСа вообще не
вводится каких-либо специальных установок - просто операторы,
за\-вер\-ша\-ю\-щие преобразования приема в случае его применения,
будут учиты\-вать нали\-чие комментария (трассперечисл $\ldots$).
Перед выходом из редакто\-ра прие\-мов текущая ссылка
"прием($\ldots$)" \ заменяется на "текприем($\ldots$)".

\item Ввод установки в буфере задачника на слежение за
срабатываниями приема.

х5 - либо символ "заменазнака", либо символ "достижимо".
Соот\-вет\-ст\-вен\-но, нажаты клавиша "С" \ либо "А" \ (кир.). В
первом случае буфер задачника по\-пол\-ня\-ет\-ся новым
подразделом, в котором при решении задач будут сохраняться ссылки
на те задачи, где сработал данный прием. Изначально этот раздел
пустой; его заголовок воспроизводит заголовок концевого пункта
оглавления приемов, к которому относится прием. Во втором случае
тоже вводится такой подраздел, но он сразу заполняется всеми
задачами текущего раздела задач\-ни\-ка, в которых ранее прием
срабатывал. Установка нужного раздела задачни\-ка должна быть
выполнена до обращения к данной команде.

Переменной х9 присваивается ссылка "прием($\ldots$)" \ на текущий
прием. Затем в оглавлении задачника находится ветвь буфера; если
ее нет, то она создается. Ссылка на корень этой ветви
присваивается переменной х12. Просматрива\-ют\-ся разделы буфера;
если уже есть раздел, связанный с данным приемом (его терминал
"замечание" \ содержит ссылку на прием), то откат к переходу через
"ветвь 2". Иначе такой раздел вводится, и далее - откат к тому же
пункту.

После отката проверяется, что была введена команда "А". Если это
не так, то действия завершается. Иначе - создается комментарий
(список $\ldots$) к по\-сыл\-кам исходной задачи, содержащий
ссылку на текущий прием. Он будет использоваться вспомогательной
процедурой "буферзадачника", применяе\-мой в цикле просмотра задач
текущего раздела. Для ссылки х14 на очередную задачу выполняется
обращение к процедуре "архивзадачи", определяющей в 10-м
информационном блоке ветвь с информацией о приемах,
применяв\-ших\-ся при последнем запуске ее решения. Если в этой
ветви указан текущий прием, то создается фиктивная задача х20,
содержащая ссылку х14, и осуществляется обращение к оператору
"буферзадачника(х20 1)", заносящему ссылку на нее в тот раздел
буфера, который соответствует текущему приему. Для определе\-ния
текущего приема и нужен введенный выше комментарий (список
$\ldots$).

\item Просмотр термов, идентифицированных с теоремными
переменными.

х5 - символ "анализатор". Нажата клавиша "п". Команда позволяет
про\-смот\-реть термы, идентифицированные на текущий момент с
теоремными пере\-мен\-ны\-ми приема. Она применима, если прием был
откомпилирован с помощью клавиши F6. Определяется ссылка х6 на
внешний кадр глобального стэ\-ка; находится набор х7, описывающий
этот кадр, и проверяется, что он является кадром оператора
"прерывание" \ (т.е. отладчика ЛОСа). Находится содержи\-мое х10
логического терминала "переменные" \ узла приема, возникающего при
компиляции через F6. Этот терминал содержит пары (теоремная
перемен\-ная - программное выражение для определения
идентифицированного с ней терма). Переменной х12 присваивается
ссылка на тот стэковый кадр, в котором про\-ис\-хо\-дит применение
приема. Предпринимается заполнение накопителя х13 па\-ра\-ми
(теоремная переменная - идентифицированный с ней терм). Для
определе\-ния терма по программному выражению х16 сначала
находится список х18 значений всех его переменных, а затем
применяется процедура "знач", нахо\-дя\-щая значение данного
выражения по списку его переменных х17 и списку их значений х18.
После получения списка х13 реализуется несложный интер\-фейс
поочередного просмотра его элементов с помощью PageUp - PageDown.

\item Блокировка применения приема в задаче.

х5 - символ "базисвывода". Нажата клавиша Ctr-0. Предпринимается
бло\-ки\-ров\-ка срабатываний текущего приема в задаче из
задачника, при трассировке решения которой выполняется эта
команда. Блокировка состоит в том, что ссылка "прием($A_1$ $A_2$)"
\ на теорему приема ($A_1$ - логический символ, $A_2$ - номер узла
теоремы приема) заносится в логический терминал "блок" \ узла
задачи. Тогда при следующем запуске решения этой задачи будет
отключено с по\-мо\-щью оператора "трассировка(фильтр $\ldots$)" \
срабатывание всех приемов данной теоремы. Убрать блокировку можно
из просмотра задачи до начала ее решения - для этого нужно нажать
клавишу "Б", выделить в возникающем списке за\-бло\-кированных
теорем все теоремы, блокировка приемов которых отменяет\-ся, и
нажать Esc.

\end{enumerate}

\section{Программы редактора приемов, запус\-ка\-емые из ин\-тер\-фей\-са
оглав\-ле\-ний}

Ряд операций редактора приемов инициируется из оглавления базы
приемов. В ос\-нов\-ном, пояснения о том, как они выполняются, уже
были даны в разделе, по\-свя\-щен\-ном процедуре "оглавление".
Дадим несколько более подробные описания программ, реализующих две
из таких операций - регистрацию отобранных приемов в текущем
концевом пункте оглавления и запуск цикла просмотра раздела с
обращениями к процедуре "текприем". Выход на на\-чаль\-ные точки
этих программ осуществляется через раздел ("Интерфейс оглавлений"
\ - "Обработчик команд") оглавления программ. Текущая команда
интерфейса ог\-лав\-ле\-ний присвоена переменной х10.

\begin{enumerate}

\item Регистрация приемов из буфера в текущем концевом пункте
оглавления ба\-зы приемов.

х10 - символ "внешдизъюнкция". Нажата клавиша Insert, чтобы все
отобран\-ные в буфер приемы (они отбирались нажатием той же
клавиши из просмот\-ра описаний приемов) были извлечены со своих
прежних позиций и перенесены в текущий концевой пункт.

Прежде всего, проверяется наличие комментария (вид прием), который
ука\-зы\-вает, что текущее оглавление является оглавлением базы
приемов. Та же са\-мая команда может выполняться также в базе
теорем, и переход к реализующей ее программе - через "иначе 2".
Переменной х14 присваивается комментарий (ссылканаприем $A$),
играющий роль буфера приемов. Из набора х5,
пере\-чис\-ля\-ю\-ще\-го данные о пунктах текущего меню
оглавления, извлекается пятерка х15. Проверяется, что она
соответствует концевому пункту (в этом случае х15 заканчивается
символом 1). Буфер приемов сбрасывается. Просматрива\-ют\-ся все
пары х16 из набора $A$. Первый элемент каждой такой пары является
ссыл\-кой на концевой логический терминал, в котором находится
терм "прием($\ldots$)" \ либо "текприем($\ldots$)", ссылающийся на
прием, причем этот же терм является вторым элементом пары. При
просмотре происходит исключение ссылок на приемы из старых
терминалов оглавления. Затем - переход через "иначе 3".

Переменной х16 присваивается ссылка на логический терминал,
соответ\-ству\-ю\-щий текущему концевому пункту оглавления. В этом
терминале регистри\-ру\-ют\-ся ссылки на все приемы набора $A$.
Если какой-либо из перенесенных на новое место приемов представлял
собой старую версию измененного приема, хранящуюся в буфере базы
приемов, то встречные ссылки из старой и новой версий
отбрасываются - теперь это два никак не связанных между собой
прие\-ма. Наконец, корректируются встречные ссылки на оглавление
из терми\-на\-лов "оглавление" \ узлов приемов.

\item Запуск цикла просмотра приемов процедурой "текприем".

х10 - один из символов "элементы", "простоенеравенство",
"нормвариант". Со\-от\-ветственно, нажаты клавиша F8, F7 либо
Ctr-F8. В первом случае происходит полный просмотр всех приемов
базы приемов ГЕНОЛОГа, с обращением для каждого из них к процедуре
"текприем". Иногда такой просмотр бывает нужно прервать в
некоторой точке, запомнивши ее нажатием клавиши "ю" \ на теку\-щем
приеме, а повторный просмотр начать с приемов, идущих после
выделенного. Тогда используется клавиша F7. Наконец, чтобы найти
все неоткомпи\-ли\-ро\-ван\-ные приемы, нажимается Ctr-F8. В
последнем случае обращения к проце\-ду\-ре "текприем" \ не
происходит - просто неоткомпилированные приемы один за другим
выдаются на экран. Как и при просмотре через "текприем", переход к
очередному приему вызывается здесь нажатием клавиши "курсор
влево".

Так как F8 применяется и в других оглавлениях (для теорем и
задач), то прежде всего проверяется, что текущее оглавление
является оглавлением базы приемов. Если была нажата клавиша F7, то
находится логический терминал, достижимый из корневого указателя
по меткам "прием", "начало". Он хранит ссылку "прием($\ldots$)" \
на прием, отобранный ранее при нажатии клавиши "ю". По этой ссылке
формируется тройка х11 (логический символ - номер узла приема -
заголовок приема), и переход через "ветвь 3".

Переменной х12 присваивается одноэлементный набор, состоящий из
пусто\-го набора. Этот набор является накопителем замечаний,
которые можно вводить при обращениях к оператору "текприем". Далее
переменной х13 - указате\-лю текущего просматриваемого логического
символа - присваивается символ "метка", имеющий номер 1.
Переменной х14 присваивается 0 - эта перемен\-ная будет при
просмотре приемов определять текущий номер узла логичес\-ко\-го
символа х13. Затем располагается оператор "повторение" \ - к нему
бу\-дут происходить откаты при переходе к очередному узлу.
Оператор "ветвь 1" \ завершает цикл просмотра узлов одного
логического символа. После пере\-хо\-да через него проверяется, не
достиг ли номер символа максимальной величины (пока взята
константа 9000). Если этот номер не достигнут, то х13
увели\-чи\-ва\-ет\-ся на 1, х14 - заменяется на 0, и откат для
продолжения просмотра. Ина\-че - просмотр завершается с выходом в
отладчик ЛОСа через оператор "трас\-си\-ров\-ка(стоп 0)".

Смена узлов одного и того же символа выполняется оператором
"следузел". Для текущего узла х16 просматриваются все метки
указателя, достижи\-мо\-го через "команды". Эти метки суть
заголовки всевозможных приемов, создан\-ных для данного узла
теоремы. Текущий такой заголовок - х23.

Если была нажата клавиша F7 и переменная х11 не равна 0, то
проверяется совпадение текущего приема с приемом по ссылке х11.
При различии их - сразу откат к продолжению просмотра, иначе -
перед откатом х11 заменяется на 0, и для следующего приема уже
начнутся обращения к процедуре "текприем".

После перехода через "ветвь 3" \ доопределяется информация о
приеме, кото\-рую следует передать процедуре "текприем". Затем -
переменной х27 присваивается либо результат обращения к этой
процедуре, либо, для случая Ctr-F8, 0 при наличии программы приема
и однобуквенный терм "См" \ при ее отсутствии. Наконец, при
наличии в наборе х27 элемента "См" \ предпринимается обраще\-ние к
программе редактора приемов, которой передается содержимое
конце\-во\-го логического терминала оглавления базы приемов,
ссылающегося на текущий прием. В этом терминале ссылка на текущий
прием выделена заголов\-ком "тек\-прием". Если выход из редактора
приемов произошел по Esc, то выполняется внутренний перезапуск,
иначе - просмотр продолжается.

\end{enumerate}

\chapter{Компилятор ГЕНОЛОГа}

Компилятор ГЕНОЛОГа представляет собой очень боль\-шую программу,
и мы не будем приводить слишком подробного ее описания. Однако,
при создании приемов в новых предметных областях приходится время
от времени расширять возможности ГЕНОЛОГа, и тогда оказывается
необходимым пополнять и компилятор. По мере развития логической
системы, такая работа возникает все реже и реже, но все же для
эффективного обучения решателя нужно хорошо ориенти\-ро\-вать\-ся
в архитекту\-ре компилятора и иметь навыки его модернизации.
Бесспорно, это является сущест\-вен\-ным недостатком ГЕНОЛОГа. Он
объясняется в первую очередь тем, что ГЕНОЛОГ представляет собой
копилку способов "алгоритмизации" \ теорем, пополняемую лишь в
процессе обучения системы. Одной из основных целей само\-го
процесса обуче\-ния является накопление и анализ информации о
такого рода ал\-го\-рит\-ми\-зации тео\-ре\-ти\-чес\-ких знаний.
ГЕНОЛОГ не относится к числу тех алгоритмичес\-ких языков, которые
можно изначально задать некоторым исчерпывающим перечнем
опреде\-ле\-ний. Поэтому данный недостаток представляется
неизбеж\-нос\-тью. С другой стороны, затраты усилий на пополнение
компилятора в начале освое\-ния пред\-мет\-ной области до сих пор
с лихвой окупались эффективностью последующей проработки всей этой
области - интегральная трудоемкость, по сравнению хотя бы с ЛОСом,
уменьшалась здесь во много раз. В будущем, чтобы упростить процесс
развития компилятора ГЕНОЛОГа, представляется естественным
реализовать его самого на ГЕНОЛОГе. Это хорошо согласуется с тем,
что основной блок компиля\-то\-ра ГЕНОЛОГа - про\-це\-ду\-ра
"идентификатор" \ - организован по принципу сканирова\-ния задания
на син\-тез программы с помощью некоторой базы процедур - своего
ро\-да приемов компиляции.

Обращение к компилятору имеет вид "новыйприем(х1 х2 х3 х4 х5)",
где х1 - логический символ, за которым закреплен компилируемый
прием; х2 - ссылка на узел теоремы приема; х3 - номер узла теоремы
в формате десятичного числа; х4 - заголовок приема; х5 - набор
дополнительных данных, обычно пустой. Если нужно скомпилировать
прием так, чтобы была сохранена информация о соответствии
тео\-рем\-ных и программных переменных, в набор х5 заносится
логический символ "знач". Компилятор синтезирует программу приема,
записывает ее в блок программ и соз\-да\-ет ссылку на программу из
терминала "прием" \ узла приема. В начале компиляции старая версия
программы приема удаляется, и если компиляция обрывается либо не
удается, то эта версия оказывается утеряна.

\section{Общая архитектура компилятора}

При ознакомлении с архитектурой компилятора рекомендуется войти в
подраздел "Компилятор ГЕНОЛОГа"  оглавления программ и
идентифицировать его пункты с упоминаемыми ниже процедурами.

\subsection{Входной блок компилятора}

Собственно программа оператора "новыйприем($\ldots$)" \ крайне
невелика и выполня\-ет лишь предварительные действия. Прежде
всего, она находит старую версию про\-грам\-мы компилируемого
приема (если таковая была) и удаляет ее. Заметим, что в
"аварийных" \ случаях - если в узле приема имеется ссылка на то,
что его программа была создана, но найти ее не удается (например,
если она была удалена вручную), - инициируется прерывание со
входом в отладчик ЛОСа. Это прерывание можно игнорировать, нажав
для продолжения компиляции клавишу "0" \ и затем - Enter.

Далее, программа "новыйприем" \ выполняет следующие действия:

а) Преобразует теорему приема, вставляя в нее указатели
"фикс($\ldots$)" \ для бло\-ки\-ровки нормализации тех ее
подтермов, которые в описании приема выделены указателями
"копия($\ldots$)";

б) Преобразует указатели нормализации
"быстрпреобр(фикс($\ldots$))", заменяя в них указатели вхождений
подтермов в теорему "фикс($\ldots$)" \ на сами эти подтермы.

Затем происходит обращение к справочнику "новыйприем" \ на
логическом сим\-во\-ле, с которого начинается заголовок приема;
этот справочник и выполняет все оставшиеся действия: создание
программы приема, запись ее в блок программ, и регистрацию ссылки
на программу из узла приема. Таким образом, фактически компилятор
оказывается разбит на множество независимых процедур,
соот\-вет\-ству\-ющих различным типам заголовков приемов. При
появлении нового типа заголов\-ков расширение компилятора
осуществляется путем программирования соответст\-ву\-ю\-щей
процедуры справочника "новыйприем". Разумеется, различные
проце\-ду\-ры этого справочника обращаются к многочисленным блокам
"общего пользования", которые будут подробнее описаны далее.

\subsection{Компиляция приемов, применяемых при сканировании
за\-да\-чи}

Для всех приемов, применяемых при сканировании задач, справочник
"новыйприем" \ немедленно осуществляет обращение к процедуре
"продукция($\ldots$)", которая и вы\-пол\-ня\-ет оставшиеся
действия. Эта процедура ниже будет рассмотрена специально; сейчас
укажем лишь общую последовательность ее действий:

\begin{enumerate}

\item Предпринимается необходимая для компиляции модификация
теоремы при\-ема. Здесь выделяются следующие преобразования:

 а) Для приемов геометрического цикла введен специальный оператор
 "раз\-вяз\-ка", осуществляющий обобщение теоремы, связанное с
 возможностями аль\-тер\-на\-тив\-ного обозначения элементов чертежа
 (прямых, углов и т.п.) через точки чертежа. Так, если в теореме
 упоминается прямая $AB$, причем точки $A$ и $B$ встречаются также
 вне обозначения данной прямой, то для обозначения прямой вводятся
 новые точки $C$ и $D$, вместе с указаниями на принадлежность
 точек $A$,$B$ прямой $CD$, и т.п.

 б) Для тождеств вида $f(A_1 \ldots A_n) = f(B_1 \ldots B_m)$ с
 коммутативно - ассоциа\-тив\-ной операцией $f$ вводится
 дополнительная переменная $x$ (она называется в описаниях компилятора
 "модификатором"): $f(A_1 \ldots A_n x) = f(B_1 \ldots B_m x)$,
 что позволяет идентифицировать все не участвующие в
 преобразовании операнды операции $f$ с $x$.

 в) Для приемов усмотрения истинности либо ложности
 предпринимается пре\-об\-ра\-зо\-вание теоремы "длялюбого($x_1 \ldots
 x_n$ если $A_1 \ldots A_m$ то $A_0$)" \ к виду "для\-лю\-бо\-го($x_1
 \ldots x_n$ если $A_1 \ldots A_m$ то эквивалентно($A_0$
 истина))". Если $A_0$ имело вид "не($B$)", то консеквент
 последней импликации будет иметь вид "эквивалент\-но($B$ ложь)".

 \item В теореме выбирается точка привязки приема - вхождение
 некоторого ло\-ги\-чес\-кого символа, с обнаружения которого при
 сканировании задачи будет ини\-циа\-ли\-зи\-роваться попытка применения
 приема. Для этого служит вспомогатель\-ная процедура
 "точкапривязки". Она стремится выбрать для привязки такой
 логический символ, который является наиболее "редким" \ - для
 уменьше\-ния числа неудачных попыток применения приема. Разумеется,
 выбор точки при\-вяз\-ки должен учитывать также возможность
 фактического отсутствия в зада\-че явного вхождения того или иного
 символа (что определяется указателя\-ми идентификации из описания
 приема) - такие символы не выбираются в качест\-ве символов
 привязки.

 \item Формируется исходная заготовка "программного блока" \ -
 накопителя соз\-да\-ва\-е\-мой программы и информационных элементов,
 связываемых в процессе ком\-пи\-ля\-ции с этой программой. Эти элементы
 играют роль списка утвержде\-ний, описывающего текущее состояние
 процесса компиляции. Так как они имеют дело с техническими
 структурами данных, то для их представления выбран не логический,
 а технический формат - набор, начинающийся с ло\-ги\-чес\-кого
 символа, указывающего тип элемента. Программный блок представляет
 собой четверку ($A_1$ $A_2$ $A_3$ $A_4$). Здесь $A_1$ - первая
 еще не использованная в создава\-е\-мой программе программная
 переменная; $A_2$ - набор информационных элементов; $A_3$ -
 символьное число фрагментов создаваемой программы, введенных на
 те\-ку\-щий момент; $A_4$ - набор этих фрагментов. Ссылки между
 фрагментами имеют вид "ветвь $n$", "иначе $n$", где $n$ - номер
 фрагмента в наборе $A_4$. Нумерация здесь начинается с единицы.

 Ввиду большого количества типов информационных элементов
 программного блока, справочная информация о них вынесена в
 специальное оглавление. Вход в это оглавление осуществляется нажатием
 клавиши "Ctr-п" \ из редактора про\-грамм ЛОСа.

 \item Собственно процесс создания программы приема складывается
 из трех ос\-нов\-ных этапов - формирования программы,
 идентифицирующей в задаче опре\-де\-ля\-емую теоремой ситуацию;
 формирования вставок в эту программу опера\-то\-ров, проверяющих
 истинность фильтров приема, и добавления в конце прог\-рам\-мы
 операторов, выполняющих преобразования задачи.

 Формирование идентифицирующей программы осуществляется
 специальным блоком компилятора - оператором "идентификатор".
 Этот блок работает со списком текущих установок на идентификацию
 - своего рода текущей задачей на построение идентифицирующей
 части программы. Он представляет собой базу приемов,
 компоненты которой соответствуют различным типам устано\-вок на
 идентификацию. Имеется шкала уровней срабатывания этих приемов;
 предпринимаются циклы последовательного просмотра (сканирования)
 ус\-та\-но\-вок с уровнями срабатывания 1,2,$\ldots$ - до тех пор, пока
 не сработает какой-либо прием, дописывающий к программе
 дополнительные операторы и мо\-ди\-фи\-ци\-рующий информационные
 элементы. После его срабатывания сканирование установок на
 идентификацию (их список может быть изменен приемом)
 воз\-об\-нов\-ля\-ется начиная с уровня 1. Процедура "продукция" \ перед
 обращением к оператору "идентификатор" \ создает начальный набор
 установок на иден\-ти\-фи\-ка\-цию и пополняет исходную заготовку
 программного блока информацион\-ны\-ми элементами, необходимыми для
 компиляции.

 Компиляция фильтров приема и вставка их в заготовку программы
 приема выполняется процедурой "блокпроверок". Она последовательно
 обрабатывает фильтры из описания приема, причем каждый фильтр
 компилируется ре\-кур\-сив\-ным образом, с помощью справочника
 "блокпроверок". Сначала рас\-смат\-риваются простейшие фильтры,
 которые размещаются в начале програм\-мы приема - например, фильтр
 "уровень($\ldots$)", определяющий уровни срабатыва\-ния приема.
 Затем компилируются остальные фильтры. Операторы програм\-мы,
 реализующие проверку фильтра, размещаются возможно ближе к нача\-лу
 программы, если в описании приема не оговорены специальные
 принципы размещения данного фильтра. Фильтр размещается в
 первой же точке, где оказываются идентифицированы все его
 переменные. Поэтому порядок раз\-ме\-ще\-ния фильтров в описании
 приема, как правило, не влияет на размещение операторов этих
 фильтров в программе.

 Формирование операторов, выполняющих преобразования приема -
 замену под\-тер\-ма, занесение либо удаление условий и посылок, -
 осуществляется проце\-ду\-рой "преобразователь". Она создает
 также операторы для разнообразных дополнительных действий приема,
 сопровождающих основное действие - ввода и удаления комментариев,
 изменения весов посылок и условий, и т.п. После создания
 цепочки операторов, формирующей новые термы, используемые при
 преобразовании, она размещает в конце программы обращение к
 одному из стандартных операторов, используемых для выполнения
 основного действия приема.

 \item После обращения к процедурам "идентификатор",
 "блокпроверок" \ и "пре\-об\-ра\-зо\-ва\-тель" \ возникает предварительная
 версия программы приема. Эта версия пополняется операторами,
 которые нецелесообразно было вводить на пред\-шест\-ву\-ющих этапах
 компиляции (оператор "вставкафрагментов") и проходит оп\-ти\-ми\-зацию
 (оператор "редакцияпрограммы", обращение к которому происхо\-дит из
 процедуры "вставкафрагментов"). Затем она регистрируется в блоке
 программ (оператор "записьприема").

\end{enumerate}

\subsection{Компиляция приемов пакетных операторов}

Приемы пакетных операторов создаются процедурами справочника
"новыйпри\-ем", относящимися к следующим логическим символам:

а) "замена" \ - приемы нормализаторов;

б) "спуск" \ - приемы проверочных операторов;

в) "значение" \ - приемы синтезатора;

г) "внутрвывод" \ - приемы анализаторов;

д) "контекст" \ - приемы оператора структурного уровня;

е) "продукция" \ - приемы пакета продукций;

Так как пакетные операторы имеют входные параметры, то выбор точки
привязки для них не требуется - идентификация начинается с
корневых вхождений входных термов. Компиляция пакетов типов а) -
г) начинается с обращения к оператору "развязка", который
выполняет необходимое для компиляции обобщение теоремы приема -
так же, как в случае приема сканирования задачи. До формирования
про\-грам\-много блока и обращения к процедуре "идентификатор" \
предпринимается вста\-вка операторов, проверяющих наличие
требуемых заголовков входных термов. Пос\-ле формирования
идентифицирующей части программы выполняются ком\-пи\-ля\-ция и
вставка фильтров, а также присоединение преобразующей либо
выдающей ответ части. В отличие от приемов сканирования задачи,
где эти действия были вынесены в специальные процедуры
"блокпроверок" \ и "преобразователь", для пакетного опе\-ра\-тора
они выполняются непосредственно программой справочника
"новыйприем".

\subsection{Компиляция приемов вывода теорем}

Программы приемов логического вывода теорем размещены в процедурах
спра\-воч\-ни\-ка "теорема". Они создаются справочником
"новыйприем" \ на логическом сим\-во\-ле "теорема".

\subsection{Компиляция приемов справочников}

Все программы справочников синтезируются процедурами справочника
"но\-вый\-при\-ем" \ на логических символах - заголовках (либо
заголовках заголовков) приемов этих справочников. Как правило,
такие процедуры крайне невелики; в редких слу\-ча\-ях здесь
вводится программный блок и предпринимается обращение к
про\-це\-ду\-ре "идентификатор".

\section{Схема компиляции приема сканирования за\-да\-чи}

Для компиляции приемов сканирования задачи служит процедура
"продукция(х1 х2 х3 х4 х5 х6 х7 х8)", входные данные которой
копируют входные данные справочника "новыйприем" \ : х1 -
логический символ; х2 - ссылка на узел теоремы приема; х3 - номер
этого узла; х4 - заголовок приема; х5 - дополнительная информация;
х6 - описание приема; х7 - теорема приема; х8 - ссылка на узел
приема. Под ссылками на узлы здесь понимаются стандартные ссылки
на указатели - списки 8-го информа\-ци\-он\-ного блока. Будем
прослеживать действия компилятора по программе "продук\-ция",
выйти на отправную точку которой можно, например, через пункт
("Ком\-пи\-ля\-тор ГЕНОЛОГа", "Приемы сканирования задачи",
"Начало компиляции") ог\-лав\-ле\-ния программ.

\subsection{Предварительное преобразование теоремы приема}

Первые этапы работы процедуры "продукция" \ связаны с
предварительным пре\-об\-ра\-зо\-ванием теоремы. Некоторые из этих
действий используются достаточно редко, и при первом ознакомлении
с компилятором их описания можно опустить.

Если описание приема не имеет элемента "развязка", блокирующего
необходи\-мое для компиляции геометрического приема преобразование
теоремы, то проверяется, встречаются ли геометрические термины
("прямая", "угол", "окружность" \ и т.п.) в теореме или в термах
описания приема. При обнаружении их происходит обращение к
процедуре "развязка".

\subsubsection{Процедура "Развязка" \ }

Процедура "развязка" \ выполняет обобщение теоремы геометрического
приема, ус\-тра\-ня\-ющее искусственную привязку к случайно
выбранным обозначениям объектов при наличии многих равноправных их
обозначений. Такая ситуация возникает, на\-при\-мер, при
обозначении углов, прямых, плоскостей  и т.п. через некоторые
опорные точки, выбираемые неоднозначно. Так, в условии задачи
может содержаться тре\-бо\-ва\-ние о параллельности прямых $AB$ и
$CD$, а также рассматриваться условие на расстояние точки $A$ до
некоторой другой точки $E$. Вместе с тем, в задаче прямая $AB$
может оказаться обозначенной без использования точки $A$, хотя
некоторые посылки будут указывать на принадлежность точки $A$ этой
прямой. Чтобы идентифици\-ру\-ю\-щая процедура могла усмотреть
условия теоремы, целесообразно переформулировать ее так, чтобы
прямая $AB$ в теореме обозначалась через какие-нибудь совсем
другие точки $P,Q$ (для них выбираются новые переменные), добавив
посылки, указыва\-ю\-щие, что $A$ и $B$ лежат на прямой $PQ$.
Такого рода преобразования и выполняются оператором "развязка".

Чтобы выйти в начальную точку программы "развязка", используем
пункт ("Ком\-пи\-лятор ГЕНОЛОГа", "Процедура РАЗВЯЗКА") оглавления
программ. Прежде все\-го, осуществляется просмотр всех не корневых
и не расположенных непосредствен\-но под заголовками "контекст" \
либо "число" \ указателей идентификации вида "усм($\ldots$)" \ в
описание приема. Каждый такой указатель $A$ при компиляции должен
рассмат\-ри\-вать\-ся как идентифицирующий терм; чтобы это было
возможно, он заменяется на "контекст($A$)". Затем - переход через
"ветвь 2".

Здесь определяется объединенный список х7 переменных,
встречающихся в тео\-ре\-ме приема и в термах его описания. Для
удобства, далее переменной х1 вместо теоремы $\forall_{x_1 \ldots
x_n}(A_1 \ \& \ \ldots \ \& \ A_m \rightarrow A_0)$ присваивается
терм вида "набор($A_0 A_1 \ldots A_m$)". Это позволяет, в
частности, исключить из рассмотрения вхождения переменных
связывающей приставки. Будем далее понимать под теоремой приема
указанное значение переменной х1. Переменной х9 присваивается
список фильтров приема; переменной х10 - набор указателей и
нормализаторов приема. Оператор "повторение" \ организует цикл
про\-смот\-ра вхождений в теорему и в элементы описания при\-е\-ма
для проведения развязки. В этом цикле значением переменной х12
служит текущее вхождение либо в теорему (тогда переменной х11
присваивается 0), либо в элемент (фильтр или указатель) х11
описания приема. Рассматриваются только те вхождения в фильтры и
указатели, которые расположены внутри терма "усм($\ldots$)".
Анали\-зи\-ру\-ют\-ся лишь вхожде\-ния символов "прямая",
"плоскость", "угол", "окружность", "круг", так как именно они
допускают существенную неоднозначность при вы\-бо\-ре обозначения
геометричес\-ко\-го объекта. Из рассмотрения исключаются
подтер\-мы, выделенные нормализато\-ра\-ми (кроме особых случаев),
а также подтермы, содер\-жа\-щие символы новых переменных,
вводимых при срабабывании приема. Фактически это означает
отбрасывание тех подтермов теоремы и описания приема, которые не
идентифицируются с термами задачи, а создаются для выполнения
преобразований.

Начиная с контрольной точки "прием(2)", происходит рассмотрение
различ\-ных случаев развязки. Предварительно вводятся накопители
х13 (заменяющий терм) и х14 (набор сопровождающих утверждений,
добавляемых при развязке) Выделя\-ют\-ся следующие случаи:

\begin{enumerate}

\item х12 - вхождение терма $T$ вида "прямая($AB$)" \ либо
"плоскость($ABC$)". Ес\-ли существует вхождение в теорему приема
либо в терм описания приема (в последнем случае - под заголовком
"усм") одной из переменных $A,B,C$, ко\-то\-рое не расположено
внутри экземпляра терма $T$, либо внутри терма "прямая($\ldots$)"
\ или "плоскость($\ldots$)", обрабатываемого нормализатором общей
стандарти\-за\-ции, то предпринимается решение о развязке.
Выбираются новые перемен\-ные $D,E,F$ и формируется заменяющий
терм $R$ вида "прямая($DE$)" \ либо, соответственно,
"плоскость($DEF$)". Создается также список утверждений для
регистрации в контексте замены: "принадлежит($A$ $R$)";
"принадлежит($B$ $R$)"; "принадлежит($C$ $R$)", а также (если
различие точек $A,B,C$ не усматривается из контекста)
вспомогательные утверждения "несовп($A$ $B$)", "несовп($A$ $C$)" \
и "несовп($B$ $C$)". Последние используются при компиляции для
создания ус\-ко\-ря\-ю\-щих фильтров, отсекающих случаи совпадения
обозначений соответст\-ву\-ю\-щих точек.

\item х12 - вхождение терма $T$ вида "угол($ABC$)". Если
существует вхождение в теорему приема либо в терм описания приема
(в последнем случае - располо\-жен\-ное под "усм($\ldots$)" )
одной из переменных $A,C$, которое не расположено внутри
экземпляра терма $T$ либо внутри обрабатываемого нормализатором
терма "прямая($\ldots$)", то принимается решение о развязке.
Выбираются новые переменные $D,E,F,G,P,Q$, и формируется
заменяющий терм "угол($DBE$)". Для регистрации в контексте замены
создается следующий список утвержде\-ний: "принадлежит($B$
прямая($FG$))"; "принадлежит($A$ прямая($FG$))";
"при\-над\-ле\-жит($D$ прямая($FG$))"; "принадлежит($B$
прямая($PQ$))"; "принадле\-жит($C$ прямая($PQ$))";
"принадлежит($E$ прямая($PQ$))"; "точ\-ка\-лу\-ча($B$ $D$ $A$)";
"точ\-ка\-лу\-ча($B$ $E$ $C$)". Если в описание приема был включен
указатель "нормугол(уг\-ол($ABC$))", означающий, что при
идентификации несущественна ориента\-ция лучей угла, то последние
два утверждения в контекст замены не включаются.

\item х12 - вхождение терма $T$ вида "окружность($AB$)" \ либо
"круг($AB$)". Если су\-щест\-ву\-ет вхождение в теорему приема
либо расположенное под "усм($\ldots$)" \ вхож\-дение в терм
описания приема переменной $B$, которое не расположено внутри
экземпляра терма $T$ либо внутри обрабатываемого нормализатором
терма, то принимается решение о развязке. Выбирается новая
переменная $C$, и фор\-ми\-ру\-ется заменяющий терм $R$ вида
"окружность($AC$)" \ либо, соответственно, "круг($AC$)". Для
регистрации в контексте замены вводится утверждение
"при\-над\-лежит($B$ $R$)".

\end{enumerate}

После определения заменяющего терма х13 и контекста замены х14 -
откат к переходу через "ветвь 3". Здесь проверяется, расположено
ли текущее вхождение х12 внутри подтермов "контекст($\ldots$)" \
или "число($\ldots$)" \ терма описания приема. Если расположено,
то переход через "иначе 1". В противном случае - осуществляется
замена на х13 всех вхождений в теорему, в фильтры и указатели
подтермов, рав\-ных подтерму по вхождению х12.

Если по вхождению х12 располагался терм "угол($ABC$)", то
одновременно с переобозначением самого угла переобозначаются
прямые, соответствующие его сто\-ронам. Это переобозначение
выполняется в теореме приема, фильтрах и указателях. После
переобозначения проверяется, входят ли переменные $A,C$ в теорему
и описа\-ние приема; если не входят, то из х14 исключаются все
утверждения с соответствующей переменной.

Наконец, список фильтров х9 пополняется утверждениями "усм($A$)" \
для всех утверждений $A$ из контекста замены, и откат к повторному
просмотру вхождений х12.

В случае, когда х12 было расположено внутри терма х15 вида
"контекст($\ldots$)" \ ли\-бо "число($\ldots$)", выполнялся
переход через "иначе 1" \ (см. выше). Здесь опреде\-ля\-ет\-ся
набор х16 операндов терма х15, и предпринимается замена в них
вхож\-де\-ний подтермов $T$, равных х12, на х13. Это не относится
к фрагментам "терм($T$)", выделяющим создаваемые новые копии терма
$T$. В случае углов, как и выше, пред\-при\-нимается сопутствующее
переобозначение прямых - сторон угла. После пре\-об\-разования
термов набора х16 к ним присоединяются утверждения "усм($A$)" \
для всевозможных утверждений $A$ из набора х14. Наконец,
выполняется замена старого варианта содержащего х15 фильтра либо
указателя на новый, и откат к повторному просмотру вхождений х12.

Если просмотр вхождений х12 не привел к новым переобозначениям, то
переход через "иначе 2". Здесь переменной х12 присваивается
консеквент преобразованной теоремы; х13 - список ее антецедентов.
Находятся все фильтры вида "усм($A$)", и утверждения $A$
присоединяются к концу списка антецедентов. Одновременно к
спи\-ску указателей добавляется элемент "усм($\ldots$)",
ссылающийся на новые антецеден\-ты. Переменной х16 присваивается
список оставшихся фильтров. Далее - переход через "ветвь 1".

Здесь предпринимается удаление избыточных элементов, введенных при
развязке. Сначала осуществляется просмотр всех антецедентов х19,
имеющих вид "актив($A$)" \ и выделенных указателем
"усм($\ldots$)", у которых выражение $A$ встречается в другом
антецеденте, также выделенном указателем "усм($\ldots$)". Такие
антецеденты х19 ис\-клю\-ча\-ются; соответственно корректируется
нумерация антецедентов в указате\-лях приема. Затем - переход
через "иначе 2", где выполняется просмотр фильтров при\-ема,
содержащих идентифицирующие термы "усм($\ldots$ актив($A$)
$\ldots$)", расположен\-ные внутри подтермов "контекст($\ldots$)"
\ либо "число($\ldots$)". Если терм $A$ встречается вну\-т\-ри
антецедента, выделенного указателем "усм($\ldots$)", либо
рассматриваемое вхожде\-ние идентифицирующего терма
"усм($\ldots$)" \ расположено внутри подтерма "контекст($\ldots$)"
\ или "число($\ldots$)", имеющего другой содержащий $A$
идентифицирующий терм "усм(\\ $\ldots$)", то происходит исключение
элемента "актив($A$)" \ из первого идентифи\-ци\-ру\-ю\-щего
терма. Далее - переход через "иначе 1". Здесь устраняются
избыточные обо\-зна\-че\-ния для одной и той же прямой. Если
имеются два антецедента х19, х21 ви\-да "принадлежит($A$
прямая($EF$))" \ и "принадлежит($B$ прямая($EF$))", выде\-лен\-ные
указателями "усм($\ldots$)"; имеется антецедент
"несовп($\ldots$)", указывающий на раз\-ли\-чие точек $A,B$;
имеются два других антецедента "принадлежит($A$ прямая($GH$))",
"принадлежит($A$ прямая($GH$))", причем выражение "прямая($GH$)" \
лексико\-гра\-фи\-чес\-ки предшествует выражению "прямая($EF$)",
то выполняется замена в приеме всех вхождений второго обозначения
на первое. Антецеденты х19, х21 удаляются, и корректируется
нумерация антецедентов в оставшихся указателях.

По завершении перечисленных действий - откат к оператору "ветвь 1"
\ пе\-ред меткой "прием(1 1)". Здесь переменной х17 присваивается
результат сборки кван\-тор\-ной импликации для теоремы приема (она
создается по списку антецедентов х13 и ранее выделенному
консеквенту х12); создается скорректированное описание прие\-ма
х18, и выдается результат.

\subsubsection{Прочие случаи модификации теоремы приема}

Кроме сравнительно сложной процедуры модификации теоремы приема,
выпол\-ня\-е\-мой оператором "развязка", имеется ряд более простых
случаев модификации тео\-ре\-мы. Начала их программ легко найти
через подраздел "Предварительная мо\-ди\-фи\-ка\-ция теоремы и
описания приема" \ раздела "Приемы сканирования задачи" \
оглав\-ле\-ния программ:

\begin{enumerate}

\item В некоторых случаях бывает нужно явно указатеь в теореме
приема выраже\-ние "величина($\ldots$)", обозначающее десятичную
константу перечислением ее цифр. Однако, при прорисовке таких
выражений формульный и тектовый редакторы выдают лишь цифры,
игнорируя символ "величина". Чтобы создать в теореме приема запись
"величина($\ldots$)" \ с переменной вместо конкретного набора
цифр, введен вспомогательный одноместный символ "Величина",
который про\-ри\-со\-вы\-ва\-ется явным образом. При компиляции
терм "Величина($a$)" \ заменяется на "величина($a$)". Использовать
в теореме, фильтрах и указателях приема пе\-ре\-мен\-ную $a$ вне
контекста "Величина($a$)" \ не рекомендуется, так как
са\-мо\-сто\-я\-тель\-ным образом она не идентифицируется.

\item При описании указателей, уточняющих тип основного
преобразования, был рассмотрен указатель "однозначно". Он
относится к теоремам вида $A\rightarrow P(t_1\\ \ldots t_n)$, где
отношение $P$ однозначно определяет значение $t_i$ по
зна\-че\-ниям $t_1, \ldots ,\\ t_{i-1},t_{i+1}, \ldots , t_n$, и
задает преобразование теоремы к виду $$A \rightarrow (P(t_1 \ldots
t_{i-1} \ x \  t_{i+1} \ldots t_n)\leftrightarrow x = t_i).$$
После определения нового варианта теоремы х18 предпринимается
коррекция указателей вхождений "фикс($\ldots$)" \ в старую версию
теоремы, расположенных в термах описания приема.

\item Если заголовок приема - "связка" \ либо "второйтерм", а
консеквент теоремы не является равенством либо эквивалентностью,
то предпринимается его пре\-об\-ра\-зо\-ва\-ние к виду "равно($A$
истина)" \ либо "равно($A$ ложь)". Если прием имеет указатель
"эквивалентно", то такое же преобразование выполняется и для
равенства. Как и в предыдущем случае, после изменения теоремы
кор\-рек\-ти\-ру\-ются указатели вхождений "фикс($\ldots$)".

\item Если теорема представляет собой тождество с
коммутативно-ассоциативным заголовком в заменяемой части $f(t_1
\ldots t_n)$, то обычно вводится дополнительная переменная $x$
этой части, с которой будут идентифицироваться все остаточ\-ные
операнды операции $f$. Такая же переменная вводится и в заменяющей
части. Добавленная переменная $x$ называется модификатором; ее
ввод выпол\-ня\-ет\-ся процедурой "модификатор". Чтобы модификатор
не вводился, необходимо либо наличие указателя "модификатор", либо
наличие фильтра "полный" \ (в последнем случае - при отсутствии
указателя "набор(первыйтерм)"), либо на\-ли\-чие указателя
"набор(второйтерм)".

\end{enumerate}

\subsection{Выбор точки привязки приема}

Чтобы определить ту точку теоремы приема либо его указателей, с
которой будет начинаться идентификация ситуации, требующей его
срабатывания, используется процедура "точкапривязки(х1 х2 х3 х4
х5)". Ей передаются в качестве вход\-ных данных: х1 - теорема
приема; х2 - заголовок приема; х3 - описание приема. Процеду\-ра
присваивает переменной х4 пару (вхождение корня идентифицируемого
подтерма, т.е. заменяемой части тождества либо эквивалентности,
антецедента, консеквента, указателя и т.п. - вхождение точки
привязки в идентифицируемый подтерм). Пере\-мен\-ной х5
присваивается логический символ, выбранный для привязки. Попыт\-ка
применения приема будет начинаться с его усмотрения. Основная
задача процедуры выбора точки привязки в теореме приема - найти
вхождение в непосредственно идентифицируемую часть теоремы такого
логического символа, который возможно реже встречается в задачах.
Это нужно для уменьшения трудоемкости попыток применения данного
приема. Если указатели идентификации предоставляют воз\-мож\-ность
размещения по заданному вхождению альтернативных символов, либо
вообще отсутствия символа ввиду вырождения операции, то такое
вхождение при выборе точки привязки не рассматривается.

В оглавлении программ момент обращения к процедуре "точкапривязки"
\ из про\-це\-ду\-ры "продукция" \ отдельным пунктом не выделен,
так как он непосредственно предшествует пункту "х11 - прогр. блок
для $\ldots$". Вместо этого введен подраздел "Выбор в теореме
точки привязки", пункты которого соответствуют этапам работы
оператора "точкапривязки". К рассмотрению программы этого
оператора мы и пе\-ре\-ходим.

Прежде всего, переменной х6 присваивается вхождение подлежащего
иден\-ти\-фи\-кации терма, если такой терм усматривается из
описания приема, либо вхождение первого символа теоремы приема.
Если имеются явные указания на то, что привязка выполняется по
корневому вхождению, то сразу выдается результат - вхождение х6. В
противном случае переменной х7 присваивается заполненный нулями
список, длина которого равна числу вхождений логических символов в
теорему. В за\-ви\-си\-мос\-ти от описания приема, в теореме
выделяется группа вхождений корней иден\-ти\-фи\-ци\-руемых
подтермов (для приема замены - уже определенное выше х6; для
приема вывода - вхождения непосредственно идентифицируемых
антецедентов, и т.п.). Эти вхождения регистрируются в начале
списка х7. При последующем ана\-ли\-зе вхождений в список х7 будут
заноситься (на свободные позиции, заполнен\-ные нулями)
расположенные внутри идентифицируемых подтермов другие
канди\-да\-ты на выбор точки привязки. Одновременно формируется
список х8 - длина его равна длине списка х7, причем на позициях,
соответствующих используемым элементам списка х7, т.е. вхождениям
в теорему, будут размещаться пары (логический символ по данному
вхождению - глубина вхождения этого символа в идентифицируемый
подтерм). Фактически эти позиции инициализируются, по мере
заполнения списка х7, парами, у которых первый элемент равен 0, и
лишь впоследствии этот элемент заменяется на логический символ.
Значением переменной х9 служит текущее ана\-ли\-зи\-руемое
вхождение в список х7; значением переменной х10 - первое
неиспользуемое вхождение в х7.

После оператора, заполняющего начальную часть списка х8, размещен
оператор "повторение". К нему будут выполняться откаты при
переходе к следующей позиции списка х7. Переменной х11
присваивается логический символ, расположенный на текущем
вхождении в теорему (т.е. вхождению по х9). Если х11 - символ
"значение", являющийся вхождением функциональной переменной, то ее
заголовок не определен - такая переменная может идентифицироваться
с произвольным термом. Поэтому рассмотрение текущего вхождения в
теорему отменяется путем занесения нуля на соответствующую позицию
списка х8. Затем - откат к "ветвь 1". Иначе, после пе\-ре\-хо\-да
через "ветвь 2", находится список х12 вхождений всех операндов
теку\-ще\-го вхождения в теорему. Первый элемент текущей пары
списка х8 заменяется на х11. Если указатель "альтернатива" \
предоставляет возможность какому-либо из под\-тер\-мов, вхождения
которых перечислены в списке х12, иметь неоднозначно
опре\-де\-лен\-ный заголовок, то его позиция в списке х12
заменяется на 0. Далее все ненуле\-вые элементы списка х12
регистрируются в конце списка х9 и инициализи\-ру\-ют\-ся
соответствующие им позиции списка х8. При этом корректируется
указатель пер\-вой свободной позиции х10.

После рассмотрения операндов текущего вхождения в теорему - откат
к пере\-хо\-ду через "ветвь 1". Здесь прежде всего проверяется,
равны ли х9 и х10. Если не равны, то х9 сдвигается на единицу
вправо, и откат к "повторению" \ для анализа очередного текущего
вхождения. Если х9 равно х10, то цикл заполнения списков х7 и х8
завершен. Теперь в списке х7 представлены все предварительные
кандидаты на точку привязки, а в списке х8 - соответствующие им
пары. Далее, начиная с контрольной точки "прием(7)", начинается
цикл просмотра списков х7, х8 и от\-бра\-сы\-вания тех вхождений,
которые заведомо непригодны в качестве точки привязки. Для
исключения их на соответствующую позицию списка х8 заносится 0.

Текущие вхождения в списки х7, х8 суть значения переменных х14,
х15. Про\-смат\-риваются только вхождения, на которых расположены
ненулевые значения. Теку\-щее вхождение в теорему при просмотре
присваивается переменной х16. Исключе\-ние вхождения происходит в
следующих случаях:

\begin{enumerate}

\item х16 - вхождение операции $f(A_1 \ldots A_n)$, у которой
некоторый операнд $A_i$ - пе\-ре\-мен\-ная, выделенная указателем
"единица", либо некоторый операнд - ком\-му\-та\-тивная операция
$g(x1 \ldots x_k)$, все операнды $x_1, \ldots, x_k$ которой могут
оказаться идентифицированы с ее единицей, причем эта единица
одновременно является единицей для внешней операции $f$. Если
$n=2$, то символ $f$ в указанных ситуациях может отсутствовать, и
выбирать его вхождение в качестве точки привязки нельзя;

\item х16 - вхождение операции $f(x)$, у которой переменная $x$
выделена указателем "отрицание($\ldots$)" \ - такая операция может
отсутствовать, если само $x$ иден\-ти\-фи\-ци\-руется как $f(t)$;

\item х16 - вхождение операции, выделенное указателями
"нормзнака($\ldots$)" \ либо "об\-щаястепень($\ldots$)";

\item х16 - вхождение операции с единственной переменной, для
которого спра\-воч\-ник "вид" \ предусматривает специальную
идентификацию. Фактически этот справочник используется только для
идентификации степеней с константными натуральными показателями,
которые усматриваются специальной процедурой выделения степени.
Логический символ "степень" \ здесь может вообще
от\-сут\-ство\-вать - например, при усмотрении полного квадрата в
числовой константе;

\item х16 - вхождение константного терма, для заголовка которого
справочник "пе\-ре\-се\-чениесписков" \ пред\-усматривает
специальную идентификацию. Например, для произведений, ко\-то\-рые
могут усматриваться в выражениях, не имеющих заголовка "умножение"
\ - в константных степенях и числовых константах;

\item х16 - вхождение операции, для которого возможна специальная
идентификация с изменением заголовка либо вырождением
идентифицируемого терма - для указателей "частнпроизв",
"новаргумент", "извлечениеварианта", "подста\-нов\-ка",
"знаксуммы", "заменатермов" \ и др.

\end{enumerate}

По окончании просмотра списков х7, х8 - откат к переходу через
"ветвь 2". Здесь составляется список х14 всех логических символов,
оставшихся для выбора точки привязки после проведенной расчистки.
Предпринимается попытка исключить из него все общелогические
символы - "и", "или", "не", "длялюбого", "существует",
"отображение", "класс", и т.п. Если после этого список становится
пустым, то дан\-ная попытка отменяется.

Наконец, начиная с контрольной точки "прием(9)" \ происходит
окончатель\-ный выбор точки привязки. Последовательно
просматриваются символы набора х14, и среди них отбирается тот,
который реже всего встречается в теоремах приемов. Переменная х15
играет роль накопителя, в котором окажется отобранный в
резуль\-та\-те просмотра символ, а переменная х16 - роль оценки
частоты его появления. Такая оценка берется из логического
терминала "мощность" \ узла статьи логического символа в базе
приемов. Как уже говорилось выше, в этих терминалах автоматически
создается и корректируется число вхождений символа в теоремы
приемов. Если в описании приема имелся указатель
"точкапривязки($A$)", явно определяющий ло\-ги\-чес\-кий символ
привязки $A$, то оценка этого символа полагается равной 1.
Заметим, что при порче содержимого терминалов "мощность", когда в
них попадают отри\-ца\-тель\-ные величины, компилятор будет
игнорировать указатель "точкапривязки" \ и отбирать символ с
наибольшим по модулю отрицательным содержимым термина\-ла
"мощность". В этих случаях можно либо корректировать испорченные
терминалы вручную, либо запускать цикл автоматического
переформирования их нажатием клавиши Ctr-ь из оглавления базы
приемов.

Если среди кандидатов на точку привязки имеется несколько
вхождений вы\-бран\-ного символа $A$, то выбирается вхождение с
наибольшей глубиной. Такой вы\-бор дает наибольшую длину цепочки
от точки привязки к корню идентифицируемого подтерма.
Идентификация символов этой цепочки происходит без какого-либо
вет\-вле\-ния и может дать хорошее отсечение заведомо неподходящих
ситуаций уже на первых шагах.

\subsection{Создание программного блока и системы установок на
иден\-ти\-фикацию}

При создании фрагментов программы приема используется специальная
струк\-ту\-ра данных, называемая программным блоком. Она сохраняет
возникшие на текущий момент компиляции наборы операторов этих
фрагментов, а также содержит раз\-лич\-ную информацию,
характеризующую текущий момент компиляции. В основ\-ном, это
информация о связи программных и теоремных переменных, а также
специально подготовленная для ускоренного использования
информация, извлеченная из ука\-за\-те\-лей приема. Например,
вместо косвенных ссылок на вхождения в теорему через указатели
вхождений "фикс($\ldots$)" \ здесь могут приводиться сами
вхождения в тео\-ре\-му.

Программный блок представляет собой четверку ($x$ $A$ $n$ $P$), у
которой $x$ - пер\-вая еще не использованная в текущем создаваемом
фрагменте программы программная переменная; $A$ - набор
информационных элементов, характеризующих текущий мо\-мент
компиляции; $n$ - символьное число уже введенных фрагментов
программы (включая текущий фрагмент); $P$ - список этих фрагментов
($P_1 \ldots P_n$). Текущим заполняемым фрагментом является
фрагмент $P_n$. Так как в программах ЛОСа пред\-по\-чти\-тельно
определять значения программных переменных последовательно, в
по\-ряд\-ке их нумерации, то для присвоения очередных значений
компилятор выбирает одну или несколько идущих подряд переменных,
начиная с $x$, сразу же увеличивая на соответствующую величину
номер первой не использованной переменной. Для ссылок между
фрагментами набора $P$ используются номера этих фрагментов
(ну\-ме\-ра\-ция, как показано выше, начинается с 1). Таким
образом, могут возникать опе\-ра\-то\-ры "ветвь($k$)" \ либо
"иначе($k$)", причем номер $k$, как и число $n$, представлен в
символьном формате.

Кроме программного блока, в процессе создания идентифицирующей
части про\-грам\-мы приема используется набор так называемых
установок на идентификацию. Они представляют собой задания на
создание групп операторов, выполняющих ка\-кую-то конкретную часть
общей идентификации ситуации, определяемой описа\-ни\-ем приема.
Обработка этих установок на идентификацию происходит рекурсив\-ным
образом, и после рассмотрения какой-либо одной из них вместо нее
могут быть введены несколько новых. По исчерпании списка установок
на идентификацию дол\-жна возникать такая программа, что
прохождение через нее вплоть до послед\-не\-го оператора
гарантирует наличие ситуации, заданной в описании приема, кро\-ме
истинности фильтров приема. Вставка операторов, проверяющих
истинность филь\-тров, осуществляется на следующем этапе
компиляции.

Число различных типов информационных элементов, используемых в
про\-грам\-мном блоке, весьма велико. Ниже мы посвятим описанию
этих типов специальный раздел, а здесь приведем лишь совсем
краткий список наиболее часто встреча\-ю\-щих\-ся элементов. Как
уже говорилось выше, справочное оглавление типов информацион\-ных
элементов программного блока достижимо из редактора программ ЛОСа
по нажатию клавиши Ctr-п.

\subsubsection{Информационные элементы программного блока}

Сначала перечислим элементы, несущие общую информацию о
компилируемом при\-еме. Они бывают нужны, если вспомогательная
процедура, которой передается про\-граммный блок, не имеет среди
прочих своих входных переменных полной ин\-фор\-мации о приеме.

\begin{enumerate}

\item (прием $s$ $N$ $A$) - ссылка на компилируемый прием: $s$ -
логический символ; $N$ - номер узла теоремы приема в статье
символа $s$; $A$ - заголовок приема;

\item (логсимвол $A$) - $A$ есть логический символ, в программу
которого будет вклю\-чен результат компиляции;

\item (точкапривязки $A$) - $A$ есть вхождение в теорему точки
привязки;

\item (корень $x$) - $x$ есть программная переменная, значением
которой служит вхож\-де\-ние корня идентифицируемого терма;

\item (модификатор $x$) - $x$ есть теоремная переменная, введенная
при модифика\-ции теоремы приема как дополнительный операнд
ассоциативно-коммутативной опе\-рации для идентификации с остатком
операндов (см.выше);

\item "и" \ - компилируемая программа должна состоять из
единственного фрагмен\-та. Например, такой элемент вводится при
создании группы операторов, которую нужно будет разместить под
квантором или описателем;

\item (комментарии $A$) - $A$ есть совокупность всех таких
фильтров приема, которые автоматически оказываются истинными после
выполнения уже составленной части программы. Элемент используется
на этапе завершающей расстановки операторов, реализующих фильтры
приема;

\item (уровень $A$) - $A$ есть список всех значений уровней
срабатывания приема;

\item (меткаперехода $A$) - указание на логический символ $A$, уже
использованный в качестве метки перехода. Метки перехода -
явление, отсутствующее в обычных программах ЛОСа и введенное
только на этапе их компиляции. Фиктивный опе\-ратор
"меткаперехода($B$)" \ вставляется в ту точку программы, к которой
по\-том нужно будет делать откат. Для организации отката
используется оператор "переходпометке($B$)". Метка перехода $B$
выбирается произвольным образом; чтобы каждый раз выбирать новую
метку, создаются элементы (меткапере\-хо\-да $\ldots$),
обозначающие уже использованные метки. На завершающем этапе
компиляции происходит исключение операторов "меткаперехода" \ и
"пере\-ход\-по\-метке" \ - для откатов используются операторы
"продолжение", "обрыв" \ и "сброс";

\item (команда $A$) - $A$ есть описание приема;

\item "контекст" \ - программный блок введен для реализации
фильтра "контекст($\ldots$)" \ либо одного из аналогичных ему
выражений - "число($\ldots$)", "нод($\ldots$)",
"мак\-си\-мум($\ldots$)" \ и т.д.;

\item "перечисление" \ - при компиляции не вводятся смешанные
проверочно- пере\-чис\-ля\-ющие операторы. Они преобразуются в
формат перечисляющего опера\-то\-ра, чтобы можно было точно
определить параметр оператора "сброс($\ldots$)";

\item (левыйкрай $A$) - $A$ есть вхождение корня идентифицируемой
части теоремы приема;

\item (теорема $A$) - $A$ есть теорема приема;

\item (адресузла $A$) - $A$ есть ссылка на узел приема;

\end{enumerate}

Перечислим еще ряд специальных типов информационных элементов
про\-грам\-мно\-го блока, которые встретятся нам на начальном
этапе компиляции.

\begin{enumerate}

\item (операнд $A$ $B$) - $A$ есть некоторое вхождение в теорему;
$B$ - программ\-ное выражение для того вхождения в терм задачи,
которое идентифицировано с $A$. Заметим, что не каждое вхождение в
теорему идентифицируется с вхождением в терм задачи. Например, это
невозможно, если операнд какой-либо ассоциа\-тив\-но-коммутативной
операции теоремы идентифицируется с группой операндов такой же
операции в задаче.

\item (набороперандов $A$ $B$) - $A$ есть вхождение в теорему
терма $f(\ldots)$ с ассоциа\-тив\-но-коммутативным заголовком $f$.
$B$ - программное выражение, значени\-ем которого служит набор еще
не идентифицированных операндов той операции $F$, которая
идентифицируется с $A$. Обычно этот элемент создается в тех
слу\-ча\-ях, когда какой-либо операнд терма $A$ идентифицируется с
группой опе\-ран\-дов терма $F$. После того, как элемент создан,
по ходу компиляции выраже\-ние $B$ может несколько раз
корректироваться - до полного исчерпания операн\-дов терма $F$.

\item (подтерм $A$) - $A$ есть вхождение в теорему какого-либо
подлежащего иден\-ти\-фи\-ка\-ции подтерма, расположенного вне
того идентифицируемого подтерма, к которому относится точка
привязки. Например, в приеме замены может иметься антецедент,
непосредственно идентифицируемый с посылкой или условием
за\-да\-чи, и тогда он сопровождается данным информационным
элементом.

\item (антецедент $A$ $B$) - $A$ есть вхождение в теорему приема
корня антецеден\-та, идентифицируемого с посылкой либо условием
задачи. $B$ инициализируется нулем, а в процессе компиляции
становится равно программному выражению, определяющему найденную
для $A$ посылку либо условие.

\item (блокпроверок $A$) - $A$ есть набор вхождений антецедентов
теоремы приема, для обработки которых предусмотрено обращение к
проверочному оператору;

\end{enumerate}

\subsubsection{Установки на идентификацию}

Установки на идентификацию используются только процедурой
"идентификатор", создающей идентифицирующую часть программы
приема. Однако, вводятся они различными блоками компилятора перед
обращением к процедуре "идентификатор", и поэтому полный список
таких установок мы приведем уже сейчас. Этот список имеется также
в справочной информации символа "идентификатор". Более подроб\-ная
информация о том, как обрабатываются перечисляемые установки,
составит значительную часть раздела, посвященного процедуре
"идентификатор".

\begin{enumerate}

\item (операнд $v$ $x$) - $v$ есть вхождение в теорему приема
корня подлежащего иден\-ти\-фи\-ка\-ции подтерма; $x$ -
программная переменная, значением которой служит вхождение,
идентифицированное с $v$. Это - один из наиболее часто
встреча\-ю\-щих\-ся типов установок на идентификацию.
Предполагается, что на момент ее рассмотрения логический символ по
вхождению $v$ уже идентифицирован. Компилятор анализирует корневые
операнды вхождения $v$, сопоставляя им программные выражения для
соответствующих термов задачи и иденти\-фи\-ци\-руя заголовки этих
термов. Для этих операндов, если они не являются пере\-мен\-ны\-ми
или логическими символами, вводятся рекурсивным образом новые
установки (операнд $\ldots$). Если точка привязки располагалась
внутри иденти\-фи\-ци\-руемого терма, то при обработке данной
установки на идентификацию возможно также "движение наружу" \ -
рассмотрение внешней операции для $v$.

\item (корень $v$) - $v$ есть вхождение антецедента теоремы,
подлежащего иденти\-фи\-ка\-ции с утверждениями, содержащимися в
контексте срабатывания приема.

\item (извлекается $v$) - $v$ есть вхождение антецедента, для
проверки которого ис\-поль\-зу\-ется проверочный оператор;

\item (значения $A$) - $A$ есть список вхождений антецедентов,
обрабатываемых одним пакетным синтезатором;

\item (программа $v$) - $v$ есть вхождение программно реализуемого
антецедента тео\-ре\-мы приема;

\item (идентификатор $v$) - $v$ есть вхождение первого символа
антецедента вида "рав\-но($A_1$ $A_2$)", одна из частей которого
определяется на основе значений входящих в нее ранее
идентифицированных теоремных переменных, а затем происходит
идентификация с ней другой части равенства. Возможен также случай,
когда обе части к моменту обработки установки составлены из
идентифицированных переменных - тогда происходит сравнение
построенных для них термов. В обоих случаях, при построении термов
могут применяться обращения к нор\-ма\-ли\-за\-то\-рам;

\item (усм $v$) - $v$ есть вхождение антецедента, обрабатываемого
идентифициру\-ю\-щим оператором;

\item (очевидно $v$) - $v$ есть вхождение антецедента, истинность
которого уста\-нав\-ли\-ва\-ет\-ся при помощи оператора
"очевидно";

\item (легковидеть $v$) - $v$ есть вхождение корня антецедента,
истинность которого устанавливается при помощи задачи на
доказательство, решаемой до мак\-си\-мального уровня 4 и имеющей
комментарий "извлекается";

\item (усматривается $v$) - $v$ есть вхождение антецедента
теоремы, проверка истиннос\-ти кото\-ро\-го осуществляется с
помощью вспомогательной задачи на дока\-за\-тель\-ство, решаемой
до максимального уровня 5;

\item (доказать $v$) - $v$ есть вхождение корня антецедента,
истинность которого уста\-нав\-ли\-ва\-ет\-ся при помощи задачи на
доказательство, к которой сводится теку\-щая задача на
доказательство;

\item (следствие $v$) - $v$ есть вхождение антецедента, истинность
которого уста\-на\-вли\-ва\-ется при помощи задачи на
доказательство, уровень обращения к которой берется равным
максимальному уровню текущей задачи;

\item (транзитпереход $v$) - $v$ есть вхождение антецедента,
выделенного указателем "транзитпереход";

\item (типзначения $v$) - $v$ есть вхождение антецедента,
выделенного указателем "тип\-зна\-че\-ния($\ldots$)";

\item (чертеж $v$) - $v$ есть вхождение антецедента, выделенного
указателем "чер\-теж(\\ $\ldots$)";

\item (числоценка $v$) - $v$ есть вхождение антецедента,
выделенного указателем "числ\-оценка($\ldots$)";

\item (выч $v$) - $v$ есть вхождение антецедента, выделенного
указателем "выч($\ldots$)";

\item (рекурсия $A$) - $A$ есть набор вхождений антецедентов,
выделенных указа\-те\-лем "рекурсия($\ldots$)";

\item (контекст $A$) - $A$ есть терм "идентификатор($A_1 \ldots
A_n$)", перечисляющий на\-бор идентифицирующих и проверочных
термов $A_1, \ldots, A_n$, извлеченных из ука\-за\-те\-ля
"контекст($A_1 \ldots A_n$)", определяющего дополнительную
идентификацию;

\item (новаргумент $A$ $B$) - $A$ есть программное выражение для
терма, иден\-ти\-фи\-ци\-рованного с теоремным термом
"значение($x$ $C$)", выделенным указателем "новаргумент($x
\ldots$)" \ либо "функаргумент($x \ldots$)". $B$ есть вхождение
данного терма в теорему приема;

\item (развертка $v$ $A_1$ $A_2$) - $v$ есть вхождение в теорему
терма $t$, идентифици\-ру\-е\-мо\-го в соответствии с указателем
"развертка($\ldots$)". $A_1$ - программное выраже\-ние, значением
которого служит либо вхождение (при $A_2 = 0$) терма $T$,
иден\-ти\-фи\-ци\-руемого с $t$, либо (при $A_2 = 1$) сам терм
$T$. Возможен также случай, когда $A_1$ - информационный элемент
программного блока (набороперандов $B_1$ $B_2$), где $B_2$ - набор
операндов коммутативно-ассоциативной операции, из которых
комплектуется $T$. Тогда $A_2 = 2$.

\item (вычисл $A_1$ $A_2$) - $A_1$ есть набор вхождений
антецедентов, представляющих собой равенства, выделенные
указателем "вычисл". Эти равенства реализуются с помощью
вспомогательной задачи на описание, решаемой для выражения ее
неизвестных через заданные параметры.

\item (группировка $v$ $x$) - $v$ есть вхождение корня заменяемого
терма в приеме, имеющем указатель "набор(второйтерм)"; $x$ -
программная переменная для вхождения, идентифицируемого с $v$.
Установка аналогична установке (опе\-ранд $\ldots$), однако
требует специальной обработки для режима группировки всех
опе\-ран\-дов рассматриваемой ассоциативно-коммутативной операции;

\item "свертка" \ - установка на идентификацию остаточных посылок
задачи в приеме с заголовком "свертка";

\item (теквхожд $v$) - $v$ есть вхождение корня заменяемой части
тождества либо эк\-ви\-ва\-лент\-ности. Эта установка вводится при
наличии указателя "теквхожд($\ldots$)" \ и нужна для компиляции
первых шагов идентификации согласно данному ука\-за\-те\-лю;

\item (унификация $A$) - $A$ есть набор вхождений антецедентов с
заголовком "равно", обрабатываемых с помощью процедуры унификации.
Эта установка нужна для компиляции приемов вывода в базе теорем;

\item (тип $x$ $A$) - переменная $x$ идентифицируется с логическим
символом, явля\-ю\-щим\-ся типом значения выражения $A$;

\item (вход $A_1$ $A_2$) - $A_1$ есть теоремный терм; $A_2$ -
программное выражение для объекта, идентифицируемого со значением
терма $A_1$. Установка используется при компиляции приемов пакетов
продукций.

\end{enumerate}

\subsubsection{Инициализация программного блока и системы
установок на иден\-ти\-фи\-кацию}

Возвращаемся к программе "продукция" \ для продолжения
рассмотрения дейст\-вий компилятора после выбора точки привязки.
Для этого используем пункт "х11 - прогр.блок $\ldots$" \
оглавления программ, который переводит к контрольной точ\-ке
"при\-ем(9)".

Сразу после этой контрольной точки располагается оператор
"равно(х11 $\ldots$)", присваивающий переменной х11 заготовку
программного блока. На первой позиции набора х11 находится
переменная "х6", которая является первой не определен\-ной
переменной при сканировании задачи. В число информационных
элементов про\-грам\-м\-но\-го блока включены наборы
(точкапривязки $\ldots$), (операнд $\ldots$), (логсимвол
$\ldots$), (прием $\ldots$), (адресузла $\ldots$), (теорема
$\ldots$), (команда $\ldots$). Здесь элемент (операнд $\ldots$)
констатирует, что значением программной переменной х2 при
сканировании зада\-чи является вхождение точки привязки приема.
Если точка привязки совпала с корнем идентифицируемого подтерма,
то добавляется элемент (корень $\ldots$). В заготовке
про\-граммного блока имеется единственный фрагмент программы,
состоящий из един\-ственного оператора "решить".

Непосредственно после контрольной точки "прием(10)" располагается
группа опе\-ра\-торов, обеспечивающая пополнение программного
блока элементом (модифика\-тор х15). Этот элемент вводится для
приема тождественной либо эквивалентной замены, если заменяемый и
заменяющий термы имеют одинаковый ассоциативно-коммутативный
заголовок х13 и среди их операндов усматривается одна и та же
переменная х15, не связанная с прочими операндами. После анализа
необходи\-мос\-ти создания данного элемента - переход через "ветвь
1".

Здесь инициализируется набор х12 установок на идентификацию. В
зависимос\-ти от типа приема, в него заносится либо элемент
(операнд $v$ х2), где $v$ - точка привяз\-ки, либо элемент
(группировка $v$ х2). В особых случаях (при наличии указателя
"теквхожд($\ldots$)") набор х12 остается пустым.

Дальнейшие действия по доопределению программного блока и набора
установок на идентификацию разбиваются на несколько ветвей.
Основная линия компиляции будет продолжена после отката к переходу
через "ветвь 1", а сначала размещаются несколько подветвей,
соответствующих различным заголовкам приема.

Прежде всего, располагается ветвь, к которой относятся приемы с
заголовками "выводусловия", "вывод", "заменатермов", "замечание"
 \ (только для теорем, име\-ющих консеквент "пусто"), "выразимо",
"подборзначений", "заменаусловия", "пара\-мет\-ри\-зация",
"существует", "связка". Здесь переменной х13 присваивается список
вхождений в теорему всех ее антецедентов. Если имеются указатели
"конец($\ldots$)", перечисляющие номера тех антецедентов,
обработка которых отодвигается на конец компиляции, то создаются
соответствующие информационные элементы (конец $\ldots$)
программного блока, ссылающиеся на эти антецеденты непосредственно
через их вхождения. Далее - переход через "ветвь 3".

Здесь располагается оператор "длялюбого(х14 х15 $\ldots$)",
просматривающий ука\-за\-тели при\-ема, определяющие способы
обработки антецедентов. Для текущего указа\-те\-ля в набор х12
заносится одноименная установка на идентификацию, причем
соответ\-ст\-ву\-ю\-щая антецеденту позиция набора х13 заменяется
на 0. После него - аналогич\-ным образом просматриваются сначала
указатели "рекурсия($\ldots$)", "значения($\ldots$)", а затем -
указатели "вычисл($\ldots$)". Создаются одноименные установки на
иден\-ти\-фи\-кацию, и в наборе х13 обнуливаются уже не единичные
позиции, а сразу группы таких позиций, определяемых указателем.

После перехода через "ветвь 1" \ попадаем в фрагмент, где список
х12 пополня\-ет\-ся установками на идентификацию (корень $v$) для
всех оставшихся в наборе х13 вхождений антецедентов $v$. В приемах
некоторых типов происходит идентифика\-ция с утверждениями из
контекста срабатывания приема не только антецедентов, но и
специальных подтермов консеквента. Для этих подтермов создаются
дополнительные установки на идентификацию (корень $\ldots$).

На основе занесенных в х12 установок (корень $\ldots$) происходит
регистрация в программном блоке элементов (антецедент $\ldots$). В
случае приемов вывода такой же элемент регистрируется для того
антецедента, в котором находится точка привязки приема. Далее -
переход через "ветвь 1", где создается информационный эле\-мент
программного блока (блокпроверок $\ldots$), ссылающийся на все
антецеденты, обраба\-ты\-ва\-емые проверочными операторами. После
следующего перехода через "ветвь 1" \ - попытка усмотрения того,
что точка привязки приема должна являться корневым вхождением
соответствующего терма задачи. Если это так, то к накапливаемой в
программном блоке программе добавляется оператор "корень(х2)".

Наконец, в случае приемов с заголовками "существует", "связка" \
создаются ин\-фор\-ма\-ционные элементы (неизвестная $\ldots$),
перечисляющие переменные, кото\-рые должны быть идентифицированы с
неизвестными текущей задачи на описание. Пос\-ле этого - откат к
оператору "ветвь 1" \ для продолжения основной линии компиляции.

\par\medskip

Следующая ветвь соответствует приемам с заголовками "первыйтерм",
"вто\-рой\-терм", "замечание" \ (для теорем, консеквент которых
отличен от символа "пусто"). Как и в предыдущей ветви, переменной
х13 присваивается набор вхождений в тео\-ре\-му приема ее
антецедентов. Если прием замены имеет указатель
"теквхожд($\ldots$)", то точка привязки его располагается в
антецеденте, выделенном таким указателем. Тогда вхождение
заменяемого терма находится независимо от точки привязки, и для
идентификации его в накопитель х12 заносится установка (теквхожд
$v$). За\-тем - откат к переходу через "ветвь 3".

Здесь выполняются действия, аналогичные рассмотрению антецедентов
в пре\-ды\-дущей ветви: создаются информационные элементы (конец
$\ldots$) для антецедентов, рассмотрение которых отодвинуто на
конец идентификации; создаются установки на идентификацию,
соответствующие различным указателям обработки антецедентов. При
вводе каждой новой установки соответствующие ее антецедентам
разряды на\-бо\-ра х13 обнуливаются. Для оставшихся в х13
антецедентов вводятся установки (ко\-рень $\ldots$). Далее
создаются информационные элементы (антецедент $\ldots$),
(блокпрове\-рок $\ldots$), а также аналогичные последним элементы
(мнимаячасть $A$), выделяю\-щие список $A$ вхождений тех
антецедентов, которые обрабатываются усиленными проверочными
операторами. Заметим, что здесь на некотором этапе развития
сис\-те\-мы произошло переименование на "мнимаячасть" \
логического символа, который ранее использовался в качестве
заголовка данного информационного элемента (бо\-лее этот символ ни
для чего не был использован). Поэтому и возникло такое
не\-со\-от\-вет\-ствие названия функциональной нагрузке элемента.

\par\medskip

Наконец, последняя из трех ветвей - она целиком относится к
приемам с заго\-лов\-ком "свертка". Напомним, что эти приемы
используются в задачах на доказательство. Консеквент их теоремы
представляет собой кванторную импликацию $K$, консек\-вент которой
идентифицируется с условием задачи, а антецеденты - с посылками
задачи. В решателе заголовок "свертка" \ имеют приемы
доказательства по индукции.

В список х12 установок на идентификацию заносится символ "свертка"
\ и все\-воз\-мож\-ные пары (корень $v$), где $v$ - вхождение
антецедента либо консеквента указанной выше кванторной импликации
$K$, не содержащих точку привязки. Переменной х14 присваивается
список вхождений антецедентов в теорему приема. Далее
выполняют\-ся действия, аналогичные имевшим место в первых двух
ветвях: вводятся элемен\-ты (конец $\ldots$)и создаются установки
на идентификацию антецедентов списка х14, со\-от\-вет\-ствующие
указателям приема. Для всех оставшихся антецедентов вводятся
установки (корень $\ldots$); создаются информационные элементы
(антецедент $\ldots$), (бло\-кпроверок $\ldots$). После всех этих
действий - откат к переходу через "ветвь 1", где продолжается
рассмотрение приемов с заголовком "свертка". Здесь
корректиру\-ет\-ся список фильтров приема: если точка привязки
была выбрана в антецеденте имп\-ли\-ка\-ции $K$, то добавляется
фильтр "посылка"; если она была выбрана в консек\-вен\-те -
добавляется "условие". Кроме того, для всех переменных $x$
связывающей при\-став\-ки импликации $K$, не выделенных указателем
"кортежпеременных", добавляется фильтр "переменная($x$)". Наконец,
если точка привязки соответствовала корне\-во\-му вхождению, в
накопитель программы программного блока х11 заносится опера\-тор
"корень(х2)".

\par\medskip

Возвращаемся к рассмотрению основной линии компиляции, откаты к
кото\-рой происходят после обработки каждой из приведенных выше
трех ветвей, соответ\-ст\-ву\-ю\-щих приемам с различными
заголовками.

Эта линия начинается с пункта оглавления программ "Ввод
дополнитель\-ных инф.элементов прогр.блока при просмотре элементов
описания приема и обраще\-нии к справочнику ПРОГРБЛОК". Как видно
из названия пункта, здесь просматри\-ва\-ют\-ся элементы х13
описания приема (фактически - указатели), и для каждого из них
предпринимается обращение к справочнику "прогрблок" \ на
логическом символе - заголовке указателя. Так как число различных
типов указателей, порождающих те или иные специфические
информационные элементы программного блока, весь\-ма велико, то
процедуры ввода таких элементов разнесены по соответствующим
сравнительно маленьким программам данного справочника. Такая
организация об\-лег\-чает развитие компилятора при появлении новых
типов указателей. Прием спра\-воч\-ника "прогрблок" \ получает
следующие входные данные: х1 - текущий указа\-тель; х2 - заголовок
приема; х3 - описание приема; х4 - программный блок; х5 - корень
идентифицируемого подтерма; х6 - набор установок на идентификацию;
х7 - теорема приема. Значение, возвращаемое справочником,
несущественно, так как все необходимые изменения программного
блока он выполняет сам.

Для примера, рассмотрим здесь одну типичную программу справочника
"прог\-р\-блок" \ - она обрабатывает указатель "единица($a x_1
\ldots x_n$)". Напомним, что этот ука\-за\-тель разрешает
пе\-ре\-менным $x_1, \ldots, x_n$ принимать вырожденное
"единичное" \ зна\-че\-ние $a$. Входим в просмотр программы
символа "единица" \ и, перемещаясь по "глав\-но\-му ство\-лу" \
обращений, находим оператор "обращение(прогрблок)", с которо\-го
начина\-ет\-ся работа рассматриваемого справочника. Напомним, что
значением пе\-ре\-мен\-ной х1 здесь является указатель
"единица($\ldots$)". Переменной х8 присваива\-ет\-ся символ
единицы $a$; далее начинается просмотр переменных указателя,
причем текущая переменная есть х10. Для заданного х10 переменная
х12 перечисляет под\-тер\-мы теоремы приема, которые должны быть
идентифицированы. В каждом из таких подтермов х12 просматриваются
вхождения х13 переменной х10. Если х13 расположено внутри
функциональной переменной, то значением х14 становится вхож\-дение
этой функциональной переменной; иначе х14 равно х13.
Рассматривается вхож\-дение операции х15, операндом которой служит
х14. Проверяется, что эта опера\-ция по операнду х14 имеет
единичное значение х8. Если это так, то создается новый
информационный элемент программного блока - (единица х15 х14 х8),
указыва\-ю\-щий на вхождение операции х15 и на ее операнд х14,
который может принимать вырожденное единичное значение х8. Если
х15 имеет лишь два операнда, то одно\-вре\-мен\-но с этим вводится
также информационный элемент (заголовок х15), означающий, что
заголовок подтерма, идентифицируемого с х15, может быть
произвольным. Да\-лее, анализируется особый случай - когда по х15
расположена коммутативная опе\-ра\-ция $f(x y)$; обе переменные
$x,y$ выделены рассматриваемым указателем "едини\-ца($\ldots$)",
причем х15 само является операндом внешней некоммутативной
опера\-ции х18, имеющей для х15 ту же единицу х8. Тогда вводятся
еще два элемента - (едини\-ца х18 х15 х8) и (заголовок х18).

После цикла обработки указателей приема с помощью справочника
"прогр\-блок" \ - переход через "ветвь 1".

Здесь рассматривается случай указателя "входвтерм($u A$)". Такой
указатель, при обработке его справочником "прогрблок", создает
информационный элемент про\-грам\-м\-ного блока (извлечение $v$),
где $v$ - вхождение в теорему приема корня иден\-ти\-фи\-цируемого
подтерма $B$, соответствующее указателю вхождения $u$. Применение
приема начинается с того, что некоторый терм задачи $t$
идентифицируется с $A$. Этот терм $t$ должен содержаться внутри
терма $T$, который будет идентифицирован с $B$, однако где именно
он располагается - несущественно. Первоначальная идентифи\-ка\-ция
$A$ с $t$ нужна лишь для определения переменных, имеющихся в $A$,
а далее она "забывается", и $B$ идентифицируется с термом $T$
независимым образом. Во всяком случае, известно, что $B$ будет
идентифицроваться с текущим термом задачи, расположенным по
вхождению х3. Поэтому в х12 находится установка (корень $\ldots$)
на идентификацию $B$, в программу приема вводится оператор,
присваивающий вхож\-де\-ние первого символа текущего терма задачи
переменной х15, и найденная уста\-нов\-ка заменяется на (операнд
$v$ х15).

После перехода через "ветвь 1" \ попадаем в фрагмент программы,
содержащий контрольную точку "прием(19)". В нем рассматривается
случай приема замены, у которого заменяемый терм - дизъюнкция либо
конъюнкция. Если эта дизъюнкция либо конъюнкция имеет своим
операндом переменную-модификатор, то нужно пред\-ус\-мот\-реть
ситуацию, когда она (либо ее отрицание) будет идентифицироваться с
подмножеством антецедентов кванторной импликации. Для этого
вводится ин\-фор\-ма\-ци\-онный элемент (длялюбого $v$),
ссылающийся на вхождение $v$ в теорему приема заменяемого терма.

В следующем фрагменте программы (после очередного перехода через
"ветвь 1") вводится информационный элемент (уровень $A$),
перечисляющий в наборе $A$ все упоминаемые в фильтрах приема
возможные уровни его срабатывания.

Опять переход через "ветвь 1" \ - теперь к контрольной точке
"прием(23)", в которой рассматривается указатель приема
"контекст($A$)". Он определяет до\-пол\-ни\-тельную по отношению к
теореме приема ветвь идентификации той ситуации, которая
описыва\-ет\-ся списком $A$ идентифицирующих термов, фильтров и
указателей. Для программирования ее вводится установка на
идентификацию (контекст иден\-ти\-фи\-катор($A$)). Заметим, что
обычно сначала реализуется именно дополнитель\-ная идентификация,
и лишь после этого - идентификация, определяемая теоремой
прие\-ма.

Следующий фрагмент рассматриваемой цепочки обрабатывает указатель
приема "вводтерма($\ldots$)". Этот указатель связан со вводом
вспомогательного обозначения $x$, определяемого антецедентом вида
$t=x$. Фрагмент пополняет описание прие\-ма указателем
"новаяпеременная($x$)", чтобы в нужный момент компилятор смог
выбрать для $x$ первую неиспользуемую в задаче переменную.

Следующий фрагмент, содержащий контрольную точку "прием(26)",
вводит ин\-фор\-мационные элементы (контроль $x$ $A$) для тех
теоремных переменных $x$, кото\-рые встречаются только в подтермах
$T$ идентифицируемых термов приема, выделен\-ных указателями
"подстановка($\ldots$)". При идентификации прообразы таких
подтермов $T$ могут отсутствовать - это приведет к приписыванию
некоторым переменным теоремы вырожденных "нулевых" \ значений.
Например, при идентификации многочлена ка\-кой-либо его член
$ax^n$ может отсутствовать, и тогда переменной $a$ будет
сопоставле\-но значение 0. Здесь нужно контролировать
идентификацию переменной $x$ - она должна появиться хотя бы в
одном явно присутствующем члене многочлена. Что\-бы следить за
идентификацией таких переменных $x$, которые встречаются только в
"необязательно имеющихся" \ подтермах $T$, и вводится
информационный элемент (контроль $x$ $A$). У него $A$ - список
вхождений всех $T$. По окончании рассмотрения всех этих вхождений
компилятор будет проверять, что переменная $x$
идентифициро\-ва\-на с каким-либо термом.

Далее - фрагмент с контрольной точкой "прием(27)". Он пополняет
программ\-ный блок элементами (заголовок $v$), указывающими те
вхождения $v$ в идентифицируе\-мые термы, на которых
ассоциативно-коммутативная операция может выродиться из-за того,
что все ее операнды, кроме одного, будут идентифицированы с
единич\-ны\-ми либо нулевыми значениями. Эти элементы отменят
вставку компилято\-ром операторов, фиксирующих заголовок терма,
идентифицированного с данным вхож\-де\-нием в теорему. В фрагменте
рассматриваются только случаи вырожденной иден\-ти\-фикации,
определяемые указателями "единица($\ldots$)" \ и
"подстановка($\ldots$)".

Следующий фрагмент цепочки - анализ указателя
"внутрпосылка($\ldots$)", для ко\-то\-рого создается
информационный элемент (внутрпосылка $\ldots$) аналогичного
формата, но с явным указанием вхождений в теорему.

Наконец, цепочка действий по созданию исходного комплекта
информационных элементов программного блока и списка х12 установок
на идентификацию заверша\-ет\-ся (контрольная точка "прием(28)").
Следует заметить, что рассмотренный фраг\-мент компилятора
заполнялся вставками, обрабатывающими указатели приема,
до\-ста\-точно бессистемно. Это происходило постепенно, по мере
проработки различ\-ных разделов. Многие из таких вставок
обслуживают крайне редко встречающи\-е\-ся ситуации, а некоторые -
попросту единичные случаи. Вероятно, при последую\-щем развитии
компилятора большинство из них будет перенесено в справочник
"прогр\-блок".

Теперь имеются программный блок х11 и список установок на
идентифи\-ка\-цию х12. Для реализации этого списка установок
применяется процедура "идентифика\-тор(начало(х9) х12 х11 х4 х6
пустоеслово)". Это - одна из самых больших проце\-дур компилятора,
и ее описанию будет посвящен отдельный раздел. Процедура созда\-ет
ту часть программы приема, которая обеспечивает усмотрение
ситуации для его применения - во всем, кроме учета фильтров
приема.

Чтобы учесть фильтры, далее располагается обращение к процедуре
"блок\-про\-ве\-рок(х7 х4 х6 х11 х2)". Она рассматривает фильтры,
создает для каждого из них один или группу операторов,
обеспечивающих его проверку, и вставляет эти фильтры в уже
имеющуюся заготовку программы приема. Обычно операторы фильтра
рас\-по\-ла\-гаются как можно ближе к началу программы - сразу же,
как только оказыва\-ют\-ся определены все их входные переменные.
Это обеспечивает ускоренное отсече\-ние ветвей программы при
сканировании. Впрочем, здесь имеется множество исключе\-ний, и
подробнее о них будет рассказано в разделе, посвященном компиляции
филь\-т\-ров приема.

Если при обращении к компиляции была задана установка на
сохранение ин\-фор\-ма\-ции о соответствии теоремных и программных
переменных (логический сим\-вол "знач" \ во входном набор х5), то
после контрольной точки "прием(8)" \ реализуется процедура,
вставляющая в конец программы приема фиктивные операторы "знач($i$
$A$)", где $i$ - символьный номер теоремной переменной $x_i$; $A$
- программное выраже\-ние для терма, идентифицированного с $x_i$.
Эти фиктивные операторы сохраняются на период дальнейших
преобразований программы. Если будет сдвигаться нумерация
программных переменных (что обычно и происходит при оптимизации
программы), то соответствующий сдвиг затронет и операторы "знач".
Номер $i$ теоремной пере\-мен\-ной сохранится, а переменные в
программном выражении $A$ окажутся скор\-рек\-ти\-рованы. По
завершении создания программы операторы "знач($\ldots$)" \ будут
из нее удалены, а информация о соответствии теоремных переменных
программным - за\-ре\-гис\-трирована в терминале "переменные" \
узла приема.

Далее - переход через оператор "ветвь 1" \ к фрагменту с
контрольной точкой "прием(6)". Здесь проверяется наличие указателя
"оценка($\ldots$)"; если такой указа\-тель имеется, то вводится
обращение к оператору "оценка($\ldots$)", обеспечиваю\-ще\-му
работу приема в двухуровневом режиме (сначала определяется
наименьшая из предлагаемых различными приемами оценок, затем
применяется прием с наимень\-шей оценкой). После этого - переход
через "ветвь 1".

Здесь происходит обращение к процедуре "преобразователь(х7 х4 х6
х11 х2)". Эта процедура обеспечивает компиляцию тех операторов
программы приема, ко\-то\-рые собственно реализуют преобразования
задачи. Подробнее она будет описана в отдельном разделе.

Далее реализуется процедура "вставкафрагментов(х11)". Она
осуществляет вста\-вку в накопитель программы приема тех
дополнительных фрагментов программы $F$, которые в процессе
компиляции, по различным причинам, не были сразу встав\-ле\-ны в
основной список фрагментов, а оказались занесены в информационные
элементы (блокпрограммы $i$ $F$). Здесь $i$ - номер ссылки на
дополнительный фрагмент из основных фрагментов программного блока.
Такая ссылка организуется в виде псев\-до\-опе\-ратора вида "1($A$
$i$)" \ либо "2($i$)". Первый из них преобразуется при вставке в
оператор "$A$ иначе $j$"; второй - в "ветвь $j$", где $j$ - номер
дополнительного фраг\-мен\-та $F$ после вставки его в общий список
фрагментов.

Для завершающего редактирования программы приема вводится
специаль\-ная структура данных х13, называемая программным
модулем. Она представляет собой пару ($K$,$P$), где $P$ -
извлеченный из программного блока набор фрагментов про\-грам\-мы;
$K$ - набор наборов комментариев по редактированию этих
фрагментов. Изначально списки комментариев берутся пустыми.
Собственно редактирование про\-грам\-мы выполняется процедурой
"завершениепрограммы(х13 х1 х3 х4 х6)". Это - достаточно большая
процедура, существенным образом сжимающая исходную сы\-рую версию
программы. Она будет рассмотрена в отдельном разделе.

По завершении редактирования программы из нее удаляются
псевдоопе\-ра\-то\-ры "знач($i$ $A$)". Напомним, что у такого
псевдооператора $i$ есть номер теоремной пе\-ре\-мен\-ной; $A$ -
программное выражение для терма, идентифицированного с этой
переменной. Удаленные псевдооператоры преобразуются в термы
"знач(х$i$ $A$)" \ и регистрируются в терминале "переменные" \
узла приема.

После перехода через "ветвь 1" реализуется завершающая компиляцию
вста\-в\-ка фрагментов программы в блок программ. Ее осуществляет
оператор "записьприема(\\ $\ldots$)". Он выбирает в уже имеющейся
ветви программы логического символа при\-вяз\-ки ту точку, где
новая программа ответвляется от ранее созданных, и
осущест\-вля\-ет регистрацию подветви приема. Описанию устройства
этого оператора будет посвящен отдельный раздел.

\section{Схема компиляции приема пакетного нор\-ма\-ли\-за\-тора}

Приемы пакетного нормализатора компилируются программой
логического символа "замена" \ при обращении к ней от справочника
"новыйприем". Приведем краткое описание последовательности
действий, выполняемых программой. Рекомендует\-ся прослеживать эти
действия, войдя в программу, например, через пункт
("Компи\-ля\-тор ГЕНОЛОГа", "Приемы нормализаторов") оглавления
программ.

В отличие от приемов сканирования задачи, которые могли быть
активизирова\-ны при сканировании произвольной задачи, приемы
нормализатора активизируют\-ся лишь при обращении к конкретной
программе ЛОСа - данному нормализа\-то\-ру. Архитектура программы
нормализатора может варьироваться в зависимости от формата
нормализатора. Однако, общие приципы здесь одни и те же.
Преобразуемый терм является значением переменной х1; список
посылок, относительно кото\-рых осуществляются преобразования,
является значением переменной х2; список ком\-мен\-та\-риев к
нормализатору - значение переменной х3. Приемы нормализатора
ини\-ци\-и\-ру\-ются в одном цикле, начало которого обозначено
оператором "повторение". До этого оператора определяется текущий
уровень сканирования: некоторой про\-грам\-м\-ной переменной,
используемой в качестве указателя уровня, присваивается единица.
После оператора "повторение" \ располагается оператор "ветвь
$\ldots$", при откатах к которому либо происходит увеличение
уровня сканирования на единицу, либо, по достижении максимального
уровня, выдается результат - текущий вид изменяемого в цикле
преобразований терма х1. После оператора "ветвь $\ldots$" \ -
дерево, образован\-ное программами приемов нормализатора. Главный
ствол дерева - операторы, фик\-си\-ру\-ю\-щие значение текущего
уровня. В рамках одного уровня сканирования компиля\-тор вклеивает
новые программы приемов, находя точки, где их начальные отрезки
начинают отличаться от ранее зарегистрированных программ. После
каждого сра\-ба\-ты\-вания приема происходит изменение значения
х1, уменьшение текущего уров\-ня сканирования до единицы, и откат
к оператору "повторение" \ для перехода к очередному циклу.

\subsection{Предварительное преобразование теоремы приема}

Прежде всего, проверяется наличие в теореме приема геометрических
понятий, и если они есть, то применяется процедура "развязка". Эти
действия совершенно ана\-ло\-гич\-ны действиям при компиляции
приема сканирования задачи, уже рассмот\-рен\-ным выше. Далее -
переход через "ветвь 2".

Здесь рассматривается случай указателя "связка($x$)". Напомним,
что этот ука\-за\-тель относится к теореме, у которой некоторый
квантор по единственной перемен\-ной $x$ может идентифицироваться
с квантором того же типа, имеющим несколь\-ко переменных. Одна из
них идентифицируется с $x$, а остальные переносятся без изменений
в формируемые кванторы с единственной переменной $x$.

Переменной х11 присваивается список всех вхождений в теорему
приема кван\-то\-ров по переменной $x$. Выбирается новая (не
входящая в теорему и в описание при\-е\-ма) теоремная переменная
$y$, присваиваемая программной переменной х13. Определя\-ет\-ся
набор х14 результатов вставки в связывающие приставки кванторов
списка х11 переменной $y$ после переменной $x$. Переменная $y$
будет идентифицироваться с остатком переменных связывающей
приставки, возникающим после идентификации $x$. Просматриваются
термы описания приема, и входящие в них кванторы с $x$
пре\-об\-ра\-зуются таким же образом. Ввод новой переменной
связывающей приставки в теорему мог привести к необходимости
коррекции указателей выделенных в описа\-нии приема вхождений.
Реализуется цикл таких коррекций. Затем в теореме прие\-ма
вхождения списка х11 заменяются на термы списка х14. Наконец,
вводятся два но\-вых элемента описания приема:
"кортежпеременных($y$)", означающий, что перемен\-ная $y$ может
идентифицироваться со списком переменных произвольной длины, а
так\-же "Входит($y$)", означающий, что не должна предприниматься
проверка невхождения переменных, идентифицированных с $y$, в термы
кванторов по $y$. Так как в этих термах не были предусмотрены
функциональные переменные, разрешающие за\-ви\-си\-мость от $y$,
то без данного указателя компилятор вставил бы операторы проверки
невхождений. Затем - откат к оператору "ветвь 1" \ для перехода к
следующему эта\-пу преобразований теоремы приема.

После метки "прием(2)" \ располагается ветвь, обеспечивающая
преобразование теоремы приема, консеквент $A$ которой отличен от
равенства либо эквивалентности, к виду "равно($A$ истина)". Если
$A$ имеет вид "не($B$)", то вместо этого вво\-дит\-ся "равно($B$
ложь)". В случае приема, осуществляющего лишь изменение
коммента\-ри\-ев нормализатора, консеквент теоремы может иметь вид
"контекст($A$)". Тогда применение приема начинается с усмотрения
терма $A$; для удобства компиля\-ции консеквент здесь
преобразуется к виду "равно($A$ пусто)". Разумеется, никакой
за\-ме\-ны подтерма $A$ на символ пустого множества в этом приеме
не произойдет.

После отката через "ветвь 2" \ - замена символов "Величина" \ в
теореме приема (если они есть) на "величина". В этой же ветви
вводится, если она нужна, перемен\-ная - модификатор. Все это
делается так же, как для приемов сканирования за\-да\-чи. Затем -
откат к переходу через "ветвь 1".

\subsection{Создание начального отрезка программы}

Перед вводом программного блока, в рамках которого будет
происходить основ\-ная часть процесса компиляции приема, создается
начальный отрезок его программы. Эти действия начинаются с
контрольной точки "прием(4)"; перейти к ней можно из пункта
"Формирование в х13 $\ldots$" \ раздела "Приемы нормализаторов" \
оглавле\-ния программ.

Переменной х10 присваивается вхождение корня заменяемого подтерма;
пере\-мен\-ной х11 - заголовок нормализатора. Переменной х12
присваивается набор, опре\-де\-ля\-ющий формат нормализатора.
Затем инициализируется набор х13 операто\-ров начального отрезка
программы. В него заносятся операторы "обращение(0)" \ и
"мет\-ка(икс($N$))", где $N$ - номер первой не определенной при
обращении к нормализа\-то\-ру переменной. Если х12 содержит
элемент "контрольтитра", указывающий, что может понадобиться
пошаговая трассировка его действий, причем в х12 отсутст\-ву\-ет
элемент "контрольнормализации", определяющий возможность такой
трасси\-ров\-ки средствами оператора "контрольнормализации", то в
накопитель х13 заносит\-ся оператор "контрольтитра(х1 х2 х3 х11)".
Далее х14 становится равно первой не определенной в программе
переменной. Если в х12 входит элемент "группировка", то в х13
вводится оператор инициализации накопителя вариантов
преобразований (см. справочную информацию для логического символа
"замены"). Если в х12 име\-ет\-ся элемент "контрольнормализации",
то вводятся операторы "контрольнормализа\-ции(х1 х2 х3 х11 $x$
$y$)", "не(равно($y$ 0))", "замена(1 $x$)". Они обеспечивают
проверку отсутствия в буфере готового результата нормализации и
замену обрабатыва\-е\-мо\-го терма на извлекаемый из буфера
частичный результат. Как правило, его в буфере нет, и тогда терм
просто повторяется без изменений. При наличии в х12 элемента
"уровень($\ldots$)" \ добавляется опера\-тор "равно(х14 1)",
инициализирующий указатель текущего уровня сканирования. Этот
оператор не вводится, если нормализатор имеет лишь один уровень
сканирования.

Далее вводится оператор "повторение" \ для откатов в цикле
преобразований. Если нормализатор предназначен для единственного
преобразования, что распознается по наличию символа "1" \ в х12, и
имеет лишь один уровень срабатывания, то точка отката не
создается. Сразу заметим, что данный случай практически нигде не
встре\-ча\-ется. Непосредственно после оператора "повторение" \
размещается оператор "мет\-ка\-перехода(1 $y$)". Здесь "1" \ -
ссылка на точку отката; $y$ - первая не определенная в точке
отката программная переменная. Этот оператор - временный; он будет
иск\-лю\-чен по завершении компиляции и нужен лишь для вычисления
параметров опе\-ра\-то\-ров, обеспечивающих откат после очередного
преобразования к оператору "по\-вто\-ре\-ние". Откат должен быть
абсолютно точным, так как иначе возможно отключение от
преобразований различных групп приемов и выдача промежуточного
результата в качестве ответа.

Далее из описания приема х6 извлекается указатель "уровень($n_1
\ldots n_k$)", пере\-чис\-ля\-ющий уровни срабатывания приема, и
вводится оператор "или(равно($u$ $n_1$) $\ldots$ равно($u$
$n_k$))", проверяющий совпадение текущего уровня $u$ с одним из
этих уровней. Если в описании приема уровень вообще указан, то он
берется равным 1.

После перехода через "ветвь 1" \ - начало формирования операторов,
иден\-ти\-фи\-ци\-рующих вхождение корня заменяемого подтерма и
его заголовок. Эти действия выполняются после контрольной точки
"прием(5)", выйти на которую можно через подраздел ("Учет
заголовка заменяемого подтерма", "Исходная точка").

Во всех рассматриваемых после контрольной точки "прием(5)" \
подслучаях вхож\-де\-ние корня заменяемого подтерма присваивается
переменной $y$, номер которой на 1 больше переменной - значения
х14. Значением х14 пока является программная переменная,
используемая в качестве указателя текущего уровня сканирования.
За\-го\-ло\-вок корня заменяемого подтерма присвоен переменной
х15.

Прежде всего, рассматривается подслучай, в котором заменяемый
подтерм име\-ет вид функциональной переменной $f(\ldots)$, где $f$
выделено указателем "отображение(\\ $f$)". В этом подслучае
требуется также наличие указателя "корень", означающе\-го, что
преобразуется корневое вхождение. Тогда вводится оператор
"равно($y$ левый\-край(х1))". Если этот подслучай не имеет места,
то переход через "ветвь 2", иначе - откат к переходу через "ветвь
1" \ для анализа заголовка приема.

Прежде всего, далее рассматривается случай наличия указателя
"корень" \ в на\-бо\-ре х12, описывающем формат нормализатора.
Этот указатель означает, что все преобразования нормализатора -
только корневые. После контрольной точки "при\-ем(7)" \
разбирается подслучай, когда преобразуемый терм имеет вид $f(x \
t)$; $f$ - ас\-со\-ци\-а\-тивная и коммутативная операция; $x$ -
переменная, выделенная указателем "единица". Как и в случае
функциональной переменной, заголовок терма здесь оп\-ре\-де\-лен
неоднозначно. Поэтому ограничиваемся вводом оператора "равно($y$
левый\-край(х1))" \ и откатываемся к началу анализа заголовка
приема. Аналогичные дей\-ст\-вия имеют место в случае
идентификации матрицы. В прочих подслучаях заголовок заменяемого
подтерма есть х15, так что можно ввести сначала оператор
"заголо\-вок(х1 х15)", фиксирующий этот заголовок, а затем
добавить оператор "равно($y$ ле\-вый\-край(х1))". Специально
рассматорен подслучай указателя "комплексное", в котором вводится
дизъюнкция условий на заголовок х1, учитывающих как
вещест\-вен\-но\-значную, так и комплексную версию символа х15.

При отсутствии в х12 логического символа "корень" \ - переход
через "иначе 1" \ к фрагменту, начинающемуся с контрольной точки
"прием(9)". Здесь корень за\-ме\-ня\-е\-мо\-го подтерма может
находиться в произвольной точке преобразуемого терма. Для
некоторых нормализаторов предусмотрен специальный вспомогательный
оператор, перечисляющий в качестве точек привязки лишь
подмножество вхождений. Его за\-го\-ло\-вок $P$ определяется
справочником "новпозиция" \ по заголовку нормализатора х11. Если
вспомогательный оператор есть, то в программу приема добавляются
опера\-то\-ры "$P$(левыйкрай(х1)$y$)", "символ($y$ х15)". Второй
из них вводится лишь тогда, ког\-да заголовок заменяемого подтерма
определен однозначно. Если прием имеет указатель "корень", то
после указанных операторов добавляется оператор "корень($y$)",
от\-се\-ка\-ющий некорневые точки привязки. При отсутствии
специального оператора $P$ перечисление вхождений предпринимается
оператором "позиция($y$ х1)"; остальные действия здесь - те же,
что и выше.

\subsection{Анализ заголовка приема}

После контрольной точки "прием(11)" \ процесс компиляции
разветвляется в за\-ви\-си\-мости от первого символа заголовка
приема (будем называть его для краткости далее подзаголовком).
Выйти на точку разветвления можно через пункт ("Классификация
приемов по заголовкам", "Исходная точка") оглавления программ.

Прежде всего рассматриваются случаи подзаголовков "первыйтерм",
"вто\-рой\-терм", "замечание".

Это - общий случай компиляции. Первые два подзаголовка
соответствуют обыч\-ным преобразованиям замены; последний -
указывает на действия с комментариями нор\-ма\-ли\-затора.

Инициализация программного блока начинается с ввода накопителя х16
его ин\-фор\-ма\-ционных элементов. Если формат нормализатора
предусматривает наличие списка посылок, то в х16 заносится элемент
(списокпосылок х2), указывающий, что этот список является
значением программной переменной х2. Для случая, когда заголовок
заменяемой части теоремы приема есть переменная $x$, в х16
заносятся элементы (корень $y$) и (вхождение $x$ ($y$)). Здесь $y$
- все та же увеличенная на единицу переменная х14, что и в
предыдущем подразделе. Элемент (вхождение $\ldots$) опреде\-ля\-ет
программное выражение для вхождения терма, идентифицированного с
пере\-мен\-ной $x$. Если в накопителе программы х13 имелся
оператор "меткаперехода($\ldots$)", то в х16 заносится элемент
(меткаперехода 1), указывающий, что символ 1 уже использован для
обозначения метки перехода.

Вводится накопитель х17 набора установок на идентификацию. Если
заменяе\-мая часть теоремы представляла собой переменную, то х17
инициализируется пустым словом. Иначе - в него заносится установка
(операнд х10 $y$) для идентификации заменяемой части теоремы х10 с
подтермом, вхождение которого задается про\-грам\-м\-ной
переменной $y$. Установки на идентификацию антецедентов вводятся
специ\-аль\-ной процедурой "смантецеденты". Ее действия аналогичны
разобранному выше случаю создания установок на идентификацию
антецедентов в приемах сканирования задачи. После пополнения
набора х17 такими установками - переход через "ветвь 2"

Здесь, после контрольной точки "прием(15)", рассматривается особый
случай, когда заменяемая часть представляет собой функциональную
переменную $f(x)$ ли\-бо $f(x_1 \ldots x_n)$, причем замена -
корневая. В этом случае сразу вводится информаци\-он\-ный элемент
программного блока (функция $f$ $\ldots$), определяющий
иденти\-фи\-ци\-ро\-ван\-ную функциональную переменную $f$, и
исключается установка на идентификацию заменяемого подтерма
(операнд $\ldots$).

Наконец, после перехода через "ветвь 1", вводится заготовка х18
программно\-го блока. В ней набор информационных элементов х16
пополнен стандартными эле\-мен\-тами, характеризующими
компилируемый прием в целом. Сразу после ввода программного блока
добавляется его информационный элемент (операнд \ х10 \  $t$),
оп\-ре\-деляющий программное выражение $t$ для вхождения,
идентифицированного с корнем х10 заменяемой части.

После контрольной точки "прием(17)" \ происходит ввод
информационных эле\-мен\-тов: (конец $A$), (блокпроверок $A$),
(мнимаячасть $A$), аналогичных рассмтренным для сканирования
задачи. Здесь $A$ - списки вхождений корней антецедентов, к
которым относится информа\-ция.

После контрольной точки "прием (18)" \ - попытка усмотреть в
теореме при\-е\-ма переменную - модификатор, и ввод
соответствующего ей информационного элемен\-та.

После контрольной точки "прием(19)" \ - цикл обращений к
справочнику "прогр\-блок" \ для ввода информационных элементов,
соответствующих различным ука\-за\-те\-лям приема. После перехода
через "ветвь 1" \ - ввод информационных элементов (контроль
$\ldots$), сопровождающих ранее введенные элементы (подстановка
$\ldots$). Все эти действия совершенно аналогичны ранее
рассмотренным для приемов сканиро\-ва\-ния задачи.

После контрольной точки "прием(20)" \ предпринимается обработка
указателей приема "вход($f$ $x_1 \ldots x_n$)": из списка
комментариев извлекается элемент $(f a_1 \ldots a_n)$, и
переменные $x_1, \ldots x_n$ идентифицируются с термами $a_1,
\ldots, a_n$. Результаты иденти\-фи\-ка\-ции регистрируются в
информационных элементах (терм $x_i$ $A_i$), где $A_i$ -
про\-грам\-мное выражение для $a_i$.

Далее компиляция снова разветвляется: если прием имеет указатель
"набор(пер\-выйтерм)", определяющий режим одношаговой
"разгруппировки" \ всего набора опе\-ран\-дов рассматриваемой в
приеме двуместной ассоциативно-коммутативной опе\-ра\-ции, то
применяется одна ветвь программы, иначе - другая.

\subsubsection{Компиляция в случае режима разгруппировки}

Это - очень редкий случай, когда теорема приема может быть
представлена в виде $P(f(a,b)) = g(P(a),P(b))$; $f,g$ -
ассоциативно-коммутативные операции; $a,b$ - пере\-мен\-ные, не
имеющие других вхождений в терм $P(\ldots)$, кроме указанных;
заменяемой частью является $P(f(a,b))$. Такая теорема, при наличии
указателя "набор(пер\-вый\-терм)", определяет преобразование
термов вида $P(f(a_1 \ldots a_n))$ в термы $g(P(a_1), \ldots ,
\\ P(a_n))$.

Прежде всего, в заменяемой части находится вхождение х19 операции
$f(a,b)$; теоремные переменные $a,b$ присваиваются программным
переменным х21 и х22. Вво\-дит\-ся пара х23 термов $P(a),P(b)$, и
проверяется, что заменяющая часть представима как $g(P(a),P(b))$.
Создается копия х26 программного блока х18, к информацион\-ным
элементам которой добавляется набор (параметры ($a,b$)). Он
указывает, что переменные $a,b$ в действительности
идентифицироваться не должны: ведь число операндов у $f$ может
оказаться произвольным. Идентифицироваться будет лишь вхождение
$f(a,b)$. Далее из списка установок на идентификацию удаляются все
элементы (корень $\ldots$), ссылающиеся на антецеденты, содержащие
$a$ либо $b$; од\-но\-вре\-менно из информационных элементов
программного блока х26 удаляются со\-от\-вет\-ствующие наборы
(антецедент $\ldots$). После этого (контрольная точка "прием(22)")
происходит обращение к процедуре "идентификатор" \ для создания
той части про\-грам\-мы приема, которая идентифицирует заменяемый
терм (без конкретизации опе\-рандов у $f(\ldots)$), а также все
антецеденты теоремы приема, не содержащие пере\-мен\-ных $a,b$.

После перехода через "ветвь 3" \ начинается рассмотрение тех
антецедентов тео\-ре\-мы приема, которые содержали $a$ либо $b$.
Прежде всего, проверяется, что сущест\-ву\-ют такие антецеденты и
что нет антецедента, содержащего $a$ и $b$ одновременно. Затем
создается вспомогательный программный блок х29, в который
переносятся из х26 все информационные элементы, кроме элементов
(выводимо $A$), определявших про\-грам\-мные переменные либо
выражения $A$ для списков использованных при обосновании
корректности утверждений. Этот блок сопровождается элементом
(вхождение $a$ $y$), указывающим программную переменную $y$,
которая будет пробегать вхождения опе\-ран\-дов операции
$f(\ldots)$, последовательно идентифицируя их с $a$. Создается
список х30 заготовок установок на идентификацию антецедентов,
содержащих $a$, и для идентификации их предпринимается обращение к
процедуре "идентификатор". По завершении идентификации
определяется конъюнкция х30 всех операторов про\-грам\-мы
вспомогательного блока. Она нужна для проверки условий, которым
должен удовлетворять каждый операнд операции $f(\ldots)$. В конце
х30 добавляются опе\-ра\-то\-ры, пересылающие в накопитель
утверждения, использованные при проверках. Да\-лее с помощью х30
формируется кванторный оператор х31, реализующий просмотр
опе\-ран\-дов операции $f(\ldots)$ и выполнение соответствующих
проверок. После вставки этого оператора в программу блока х26 -
откат к переходу через "ветвь 1".

Здесь водится оператор "учетобоснований($\ldots$)", регистрирующий
в коммента\-рии нормализатора (выводимо $\ldots$) информацию о
посылках, использованных для обоснования корректности замены.

После перехода через "ветвь 1" \ создается еще один
вспомогательный про\-грам\-мный блок х28. Он нужен для
формирования списка операндов заменяющего тер\-ма $P(a_1), \ldots
, P(a_n)$. В х28 заносится информационный элемент (вхождение $a$
$y$), указывающий ту программную переменную $y$, которая будет
последовательно про\-бе\-гать вхождения операндов операции
$f(\ldots)$, идентифицируемые с $a$. Программа это\-го блока
инициализируется единственным оператором "операнд($t$ $y$)", где
$t$ - про\-грам\-мное выражение для вхождения операции
$f(\ldots)$. Затем переменной х29 присваива\-ет\-ся теоремный терм
$P(a)$, и операторное выражение "метаперевод(х29 х28)" \ дает в
качестве своего значения х30 программное выражение, значением
которого служит операнд $P(\ldots)$ заменяющего терма,
соответствующий текущему операнду операции $f(\ldots)$. Далее
переменной х31 присваивается набор всех новых программных
пе\-ре\-мен\-ных $z_1, \ldots z_k$, введенных в блоке х28 по
сравнению с блоком х26. Переменной х32, после перехода через
"ветвь 3", присваивается операторное выражение "выписка($z_1 \\
\ldots z_k$ $R$ х30)", где $R$ - конъюнкция всех операторов
программы блока х28. Значе\-ни\-ем этого выражения и служит список
термов $P(a_1), \ldots , P(a_n)$. Переменной х33 присваивается
теперь программное выражение для заменяющего терма $g(P(a_1),
\ldots \\ , P(a_n))$.

Далее проверяется наличие информационного элемента (быстрпреобр
$\ldots$), опре\-де\-ля\-ю\-ще\-го обработку заменяющего терма
нормализаторами. Учет нормализаторов для его подтермов $P(a_i)$
уже произошел при использовании процедуры "метапере\-вод". В цикле
просмотра нормализаторов, связанных с заменяющим термом,
кор\-рек\-тируется выражение х33, определяющее этот терм. По
завершении этих действий - переход через "ветвь 1".

Для удобства дальнейших ссылок на заменяющий подтерм вводится
оператор "равно(х34 х33)", присваивающий его вспомогательной
переменной х34. Перемен\-ной х35 присваивается программное
выражение для результата преобразования. В случае корневого
вхождения заменяемого подтерма оно совпадает с х34, иначе -
являет\-ся результатом замены в текущем терме х1 заменяемого
подтерма на заменяющий. Далее просматриваются фильтры приема, для
них создаются группы опера\-то\-ров программы, выполняющих
проверку фильтра, и эти группы добавляются в конце созданной части
программы приема. Затем - переход через "ветвь 1".

Если формат нормализатора содержит символ "1", означающим, что
ответ вы\-да\-ет\-ся после первого же преобразования, то программа
приема завершается опера\-то\-ром, выдающим ответ х35. Иначе -
вводится оператор "контрользамены($\ldots$)", про\-ве\-ря\-ющий
целесообразность выполнения замены в контексте каких-либо
внеш\-них общих установок (например, при блокировке применения
данного приема) и поз\-во\-ля\-ю\-щий войти в отладчик ЛОСа
непосредственно перед заменой при трассировке. Ес\-ли
предусмотрено сопровождение срабатывания приема специальными
пояснениями, то добавляется обеспечивающий работу с ними оператор
"титр($\ldots$)" \ (переменной х36 присваивается до его вставки в
программу либо "пустоеслово", либо одноэлемент\-ный набор из
данного оператора). В случае приема, срабатывающего на уровне,
большем единицы, добавляется оператор, уменьшающий текущий уровень
до единицы. На\-ко\-нец, программу приема завершают операторы
"замена(1 х35)", изменяющий теку\-щий терм х1 на х35, и
"переходпометке(1)" \ - для отката к оператору "повторение",
начинающему очередной цикл сканирования.

По завершении программы приема - откат к переходу через "ветвь 2".
Здесь предпринимаются завершающая обработка программы и запись ее
в блоке прог\-рамм. Используются те же макрооператоры, что и в
случае приемов сканирования зада\-чи.

\subsubsection{Компиляция в общем случае}

Если прием не имел указателя "набор(первыйтерм)", то его
компиляция продолжа\-ет\-ся с контрольной точки "прием(25)". Выйти
на эту контрольную точку мож\-но через пункт ("Приемы
нормализаторов","Классификация приемов по заголовкам", "Приемы
ПЕРВЫЙТЕРМ, ВТОРОЙТЕРМ, ЗАМЕЧАНИЕ", "Формирование
иден\-тифицирующей части приема") оглавления программ. Сразу после
контроль\-ной точ\-ки - обращение к процедуре "идентификатор",
создающей идентифицирующую часть программы приема. Здесь х17 -
набор установок на идентификацию; х18 - про\-грам\-мный блок.

Если прием не имеет указателя "вывод($\ldots$)" \ и либо
нормализатор является кор\-не\-вым, либо его формат не содержит
элемента "коррекцияпосылок", то пред\-при\-ни\-мается добавление
оператора "учетобоснований($\ldots$)", регистрирующего в
ком\-мен\-та\-рии (выводимо $\ldots$) использованные при замене
посылки. В остальных случаях такой оператор будет добавляться
позднее, так как оставшаяся часть программы в этих случаях может
пополнять список использованных посылок. Затем - переход через
"ветвь 1".

Здесь, после контрольной точки "прием(26)", осуществляется учет
фильтров при\-ема. Прежде всего, если в фильтрах встречается терм
вида "контекст($\ldots$ буфер($A$ $t$) $\ldots$)", то для
логического символа $A$, указывающего заголовок используемого в
качестве буфера комментария нормализатора, вводится оператор
"равно($x$ пустое\-сло\-во)". Здесь $x$ - программная переменная,
используемая в качестве накопителя заносимых в буфер термов.
Одновременно добавляется информационный элемент программного блока
(буфер $A$ $x$), с помощью которого будет происходить компиля\-ция
операторов, заполняющих данный накопитель.

Далее - переход через "ветвь 2", где переменной х20 присваивается
список фильт\-ров приема. Из него тут же исключаются фильтры, уже
обработанные ранее - их список сохраняется в информационном
элементе (комментарии $\ldots$). Фильтры х21 списка х20
просматриваются, и по каждому из них процедурой "фильтр($\ldots$)"
\ соз\-дается оператор, реализующий х21. Конъюнктивные члены этого
оператора вста\-вля\-ются процедурой "вставкафильтра" \ в уже
созданную часть программы приема. По мере возможности, они
размещаются ближе к началу программы - для наискорей\-ше\-го
отсечения. После обработки фильтров - откат к переходу через
"ветвь 1".

Здесь начинается создание операторного выражения для заменяющего
подтер\-ма. Переменной х19 присваивается заменяющий терм теоремы.
Если формат нор\-ма\-ли\-за\-то\-ра имел элемент "группировка", то
в х19 отбрасывается, если она есть, переменная - модификатор.
Затем происходит обращение к процедуре "метапере\-вод",
определяющей программное выражение х20 для заменяющего подтерма.
Если уже имелся информационный элемент (результат $\ldots$),
содержащий ранее найден\-ное программное выражение для заменяющего
подтерма, то х20 переопределяется согласно этому элементу. Затем -
переход через "ветвь 2".

После контрольной точки "прием(28)" \ - учет указателя приема
"дробь". Такой указатель означает, что при идентификации
двуместной корневой операции заме\-ня\-е\-мо\-го терма могут быть
переставлены ее операнды; тогда аналогичная перестанов\-ка
выполняется и для заменяющего терма. Прежде всего, переменной х21
присваива\-ет\-ся вхождение заменяемого терма, а переменной х22 -
его корневая двуместная операция. Если выражение х20 для
заменяющего терма имеет вид "запись(х22 $t_1$ $t_2$)", то х20
преобразуется в условное выражение "вариант($P$ х20 запись(х22
$t_2$ $t_1$))". Здесь оператор $P$ проверяет наличие перестановки
при идентификации корне\-вых операндов $B_1,B_2$ заменяемого терма
теоремы. Отсутствие перестановки распознается по совпадению
первого операнда заменяемого подтерма и того вхождения, которое
было идентифицировано с $B_1$. Если заменяющий терм не имел того
же заголовка $f$, что и заменяемый, то предусмотрена попытка
искусственного представления его в этом виде, с использованием
единицы операции $f$. После учета указателя "дробь" \ откат к
переходу через "ветвь 1".

Здесь происходит учет другого указателя - "знаксуммы($\ldots$)",
определяю\-ще\-го возможность одновременного изменения знаков у
всех операндов некоторой опера\-ции. Роль знака играет некоторая
одноместная операция $s$. Находится ранее соз\-дан\-ный по этому
указателю информационный элемент (знаксуммы $\ldots$) и
проверяется, что идентификация с возможной заменой знаков
предпринималась для корне\-вой операции заменяемого подтерма.
Тогда программное выражение х20 для заменя\-ю\-ще\-го терма
модифицируется так, чтобы его знак $s$ изменялся одновременно с
измене\-ни\-ем знаков идентифицируемых операндов. При этом
используется вспомогатель\-ная процедура "измзнака".

После перехода через "ветвь 1" \ х20 преобразуется к формату
терма; в х16 со\-хра\-няется программная переменная, значением
которой служит вхождение корня заменяемого подтерма; вводится
информационный элемент (результат х20), ука\-зы\-ва\-ющий
программное выражение для заменяющего терма. Далее (контрольная
точ\-ка "прием(29)"\ )обрабатываются указатели приема,
определяющие добавление или удаление комментариев. х21 - текущий
такой указатель. Если его первый операнд не имеет вида
"условие($\ldots$)", то процедура "транскоммент" \ определяет
набор про\-грам\-мных выражений для разрядов комментария. Затем
вводится оператор, выпол\-ня\-ю\-щий добавление либо удаление
этого комментария. Напомним, что в случае указателя
"замечусловие($\ldots$)" \ копии уже имевшихся комментариев не
регист\-ри\-ру\-ют\-ся; в случае указателя "замечание($\ldots$)" \
- регистрируются. Если первый операнд указателя имеет вид
"условие($P$)", то действие выполняется лишь при истинности
фильтра $P$. Процедура "фильтр" \ находит оператор х24 проверки
истинности $P$. Затем, как и в безусловном случае, вводится
оператор для добавления или исклю\-че\-ния, но уже не комментария,
а определяемого условным выражением набора ком\-мен\-та\-риев.
Если х24 истинно, то этот набор одноэлементный, иначе - пустой.

При переходе через "иначе 3" \ рассматривается случай ввода нового
комментария к текущей задаче. При переходе через "иначе 2" \ -
учет указателей "нормализация($\ldots$\\ )",
"учетнормализации($\ldots$)", которые позволяют передавать
комментарии внешнему нормализатору с заданным заголовком. В первом
случае берутся все такие нор\-ма\-ли\-за\-торы, во втором - лишь
первый из них. С помощью оператора "смисточник" \ организуется
просмотр источников текущего стэкового кадра интерпретатора ЛОСа.
Обычным образом создаются программное выражение для комментария и
оператор, проверяющий условие его ввода. Все это объединяется в
одну кванторную имп\-ли\-ка\-цию, которая и присоединяется к
программе.

После обработки указателей, определяющих действия с комментариями,
- откат к переходу через "ветвь 1". Если прием имел заголовок
"замечание", то на этом его программа и завершается: в ее конце
размещается оператор "продолжение". После этого происходит откат к
ветви, выполняющей редактирование программы и ее запись в блок
программ. Иначе - следующий переход через "ветвь 1". Здесь
происходит учет фильтров "длина($P$)", сравнивающих заменяющий и
заменяемый подтермы в смысле оценки, определяемой процедурой
сравнения $P$. После такого учета - переход к фрагменту с
контрольной точкой "прием(31)".

Если не имеет места случай преобразования особого типа, причем
заменяе\-мый подтерм не совпадает со всем преобразуемым термом, то
переменной х20 пере\-при\-сва\-и\-ва\-ется программное выражение
для результата замены вхождения х16 в прео\-бра\-зу\-е\-мый терм
х1 на заменяющий терм х20.

Далее сначала рассматривается подслучай, когда заменяющая часть
теоре\-мы имеет вид "разборслучаев($\ldots$)". Здесь вводится
оператор "равно($x$ х20)", при\-сва\-и\-ва\-ющий новой программной
переменной $x$ фиктивный заменяющий терм
"раз\-бор\-слу\-ча\-ев($\ldots$)". Вводится оператор
"контрольслучаев($x \ldots$)", блокирующий повтор\-ное
рассмотрение альтернатив. Вводятся операторы "входит(подчинено
х3)иначе $n$ ответ($x$)", которые выдают в качестве ответа терм
"раз\-бор\-слу\-чаев($\ldots$)", если имеет\-ся комментарий
"подчинено", свидетельствующий, что разбор случаев адресован
внешнему нормализатору; в противном случае они организуют переход
к новому, пока еще не зарегистрированному $n$-му фрагменту
программы. Наконец, вводится этот фрагмент программы, содержащий
операторы: "замена(6 0)" \ (обнуление теку\-ще\-го уровня
сканирования для отката к процедуре, организующей выбор
рас\-смат\-ри\-ва\-емого подслучая); "подслучаи($\ldots$)" \
(регистрация установки на разбор подслучаев согласно терму
"разборслучаев($\ldots$)"); "переходпометке(1)" \ (откат к началу
цикла сканирования).

Если прием не был связан с разбором случаев, то переход через
"иначе 1". Если нормализатор выполняет лишь однократное
преобразование, то добавляется опера\-тор для выдачи ответа. Иначе
- переход через "иначе 1".

Если нормализатор не является нормализатором группировки, то
сначала про\-ве\-ря\-ется, является ли программное выражение х20
переменной; если не является, то вводится оператор "равно($x$
х20)", где $x$ - новая программная переменная. Затем х20
переприсваивается эта переменная $x$. Это делается, чтобы избежать
переписывания неоднобуквенного выражения х20, которое может
оказаться входным данным не\-сколь\-ких вспомогательных процедур.
Далее - переход через "ветвь 2".

Если прием имеет фильтр "контрольодз", то вставляется оператор
"контрольодз(\\ $\ldots$)", проверяющий, что все подтермы нового
терма имеют о.д.з., включающую об\-ласть истинности посылок. Затем
- переход через "ветвь 1", где после контрольной точки "прием(36)"
\ предпринимается вставка оператора "контрользамены($\ldots$)",
уже встречавшегося ранее при компиляции приема "разгруппировки".
Он бывает ну\-жен при блокировке срабатывания приема из
соображений внешнего характера, а также для трассировки.

После контрольной точки "прием(44)" \ обрабатываются указатели
"вывод($\ldots$)", определяющие добавление новых посылок. Для них
вводятся операторы "учет\-вы\-во\-да($\ldots$)", реализующие такое
добавление. Если указатель сопровождается фильтром, ограничивающим
область его действия, то х23 присваивается оператор проверки
фильтра и вводится, вместо указанного выше, оператор "или(не(х23)
учетвывода($\ldots$\\ ))". По окончании просмотра указателей
"вывод" \ аналогичным образом об\-ра\-ба\-ты\-ваются указатели
"удалениеусловия($\ldots$)". Затем - откат к переходу через "ветвь
1".

Если прием имеет указатель "вывод($\ldots$)", либо нормализатор не
является кор\-не\-вым, но имеет комментарий (коррекцияпосылок
$\ldots$), то переменной х21 при\-сва\-и\-ва\-ется набор наборов
использованных посылок. Вводится оператор "учетобоснований(\\
$\ldots$)", регистрирующий эти посылки в комментарии нормализатора
(выводимо $\ldots$). Далее - переход через "ветвь 1".

Если имеется информационный элемент (буфер $A$ $x$), то вводится
оператор, про\-ве\-ря\-ющий непустоту набора $x$ и переносящий все
его элементы в накопитель $N$ комментария к нормализатору ($A$
$N$). Затем - переход через "ветвь 1". Здесь про\-ис\-хо\-дит
разветвление процесса компиляции.

Сначала рассматривается случай, когда нормализатор не является
нормализа\-то\-ром группировок. Если прием имеет ука\-за\-тель
"стоп", то в его программу вставля\-ет\-ся оператор прерывания
"трассировка(стоп 0)", который будет вызывать выход в отладчик
ЛОСа непосредственно пе\-ред ре\-али\-за\-цией замены. Далее -
переход че\-рез "ветвь 2".

Переменной х22 присваивается программное выражение для
скорректирован\-но\-го после преобразования списка посылок
нормализатора, и переход через "ветвь 1".

Здесь рассматривается случай приемов, имеющих указатель
"дизъюнктчлен($\ldots$)". Этот указатель выделяет антецеденты вида
$A=B$, снабженные также указате\-лем "идентификатор($\ldots$)". У
них сначала формируется терм $A$, а затем происходят
последовательные попытки идентификации $B$ с дизъюнктивными
членами терма $A$. Для каждого такого дизъюнктивного члена
находится соответствующий вариант заменяющего терма, после чего
фактический заменяющий терм строится как дизъ\-юнкция этих
вариантов. Информационный элемент (дизъюнктчлен $A_1$ $A_2$ $A_3$
$A_4$) хранит: список $A_1$ вхождений антецедентов, выделенных
указателями "дизъюнкт\-член"; программную переменную $A_2$ для
накопителя вариантов заменяющего тер\-ма; метку перехода $A_3$,
выводящую на точку формирования накопителя $A_2$; набор $A_4$
меток перехода для откатов к продолжению рассмотрения
дизъюнктивных членов. Переменной х26 присваивается программное
выражение для дизъюнкции тер\-мов накопителя; к фрагменту,
завершающему перечисление дизъюнктивных членов, до\-бав\-ляются
операторы, реализующие замену и откат к началу цикла сканирования,
а к текущему фрагменту - операторы пополнения накопителя термом
х20 и отката к продолжению перечисления дизъюнктивных членов.
Далее - откат к редактирова\-нию и регистрации программы. При
отсутствии у приема указателя "дизъюнкт\-член" \ - переход через
"ветвь 1".

При наличии указателя "титр($\ldots$)" \ в список х23 заносится
оператор "титр($\ldots$)", обеспечивающий выдачу поясняющего
текста при срабатывании приема. Далее - переход через "ветвь 1",
где формируется набор х24 операторов, заносимых в ко\-нец
программы. Прежде всего, это оператор, корректирующий значение
текущего уровня сканирования. Если прием имеет указатель "выход",
определяющий об\-рыв преобразований, то текущий уровень заменяется
на символьный номер "станд\-мень\-ше\-илиравно", заведомо
превосходящий число уровней срабатывания нормализато\-ра; иначе он
заменяется на 1. Далее размещаются: список х23 (пустой либо
содержащий оператор "титр($\ldots$)"; оператор, реализующий
замену; оператор, корректирующий список посылок согласно х22.
Список х24 присоединяется к концу программы, и добавляется
оператор отката к началу сканирования. На этом формирование
про\-грам\-мы завершается, и далее - откат к ветви редактирования
программы и ее ре\-ги\-ст\-ра\-ции.

Компиляцию редко встречающихся приемов нормализатора группировок,
а так\-же компиляцию простейших приемов "спускоперандов" \ и
"лексупорядочение" \ рас\-смат\-ри\-вать здесь не будем, так как
эти случаи легко разобрать самостоятельно по тексту программы.

Для полного представления о компиляции нормализаторов полезно
также само\-сто\-я\-тельно разобрать случай приемов "окончание",
обеспечивающих переключение текущего уровня сканирования.
Начальная часть программы приема "окончание" \ воспроизводит общий
начальный отрезок всех приемов данного нормализатора. Сра\-зу
после оператора "повторение", организующего цикл сканирования,
происхо\-дит ответвление к продолжению этой программы. Кроме
увеличения текущего уровня, проверки превышения им максимального
значения и выдачи результата, она может выполнять также ряд других
действий, определяемых форматом нормализатора. Заметим, что
инициализация программы нормализатора должна начинаться только с
приема "окончание". Если при работе с нормализатором на какой-то
момент все его другие приемы удаляются, то необходимо удалить
также и программу приема "окончание", снова ее после этого
восстановив. Иначе добавление новых приемов будет происходить
неправильно.

\section{Схема компиляции приема проверочного опе\-ра\-то\-ра}

Приемы проверочного оператора компилируются программой логического
симво\-ла "спуск" \ при обращении к ней от справочника
"новыйприем". Войти в начальную точку компиляции можно через пункт
("Компилятор ГЕНОЛОГа", "Приемы про\-ве\-рочных операторов",
"Исходная точка") оглавления программ.

\subsection{Предварительное преобразование теоремы приема}.

Обычно теорема приема проверочного оператора имеет вид кванторной
импли\-ка\-ции $\forall_{x_1 \ldots x_n}(A_1 \ldots A_m
\rightarrow A_0)$, консеквент $A_0$ которой представляет собой
резуль\-тат подстановки некоторых термов в шаблон утверждений,
проверяемых оператором. При применении приема эти термы
идентифицируются с входными данными про\-ве\-ряемого отношения.

Компиляция начинается с проверки наличия указателя "не". Этот
указатель означает, что прием нужен не для установления истинности
рассматриваемого ут\-вер\-ждения, а для обрыва действий оператора
при установлении его ложности. Со\-от\-вет\-ственно, консеквент
$A_0$ теоремы приема будет иметь вид отрицания $\neg B_0$
утвержде\-ния $B_0$, полученного некоторой подстановкой в шаблон.
Однако, идентификацию проверяемого утверждения здесь нужно будет
проводить не с консеквентом $A_0$, а с его отрицанием $B_0$.
Поэтому после контрольной точки "прием(21)" \ и происходит замена
консеквента на $B_0$.

Далее, после перехода через "ветвь 2", для геометрических приемов
пред\-при\-ни\-мается обращение к оператору "развязка". На этом
предварительные преобразова\-ния теоремы приема и завершаются.

\subsection{Создание начального отрезка программы}

После модификации теоремы приема переменной х9 присваивается
вхождение ее консеквента. Вводятся накопители: х10 - первая
неиспользуемая программная пе\-ре\-мен\-ная; х11 - набор пар
(входная переменная оператора - соответствующее ей вхождение в
консеквент теоремы приема); х12 - число уров\-ней срабатывания
опе\-ра\-то\-ра. Накопители х11, х12 сначала инициализируются
ну\-ля\-ми, а затем доопре\-де\-ля\-ют\-ся с помощью справочников
"легковидеть" \ и "проверка", соответству\-ю\-щих обычным и
усиленным проверочным операторам. Чтобы вос\-поль\-зо\-ваться
таким спра\-воч\-ни\-ком, фиксируется корневое вхождение х9
проверяемого утверждения, а затем просматриваются расположенные
внутри х9 вхождения х13 различных логических символов х14. Как
только результат обращения к спра\-воч\-ни\-ку на символе х14 для
вхождений х9,х13 дает тройку, начинающуюся с названия проверочного
оператора, указанного в заголовке приема, из этой тройки
извлекается информация, необходимая для определения значений х11,
х12. Далее - переход че\-рез "ветвь 1".

После контрольной точки "прием(2)" \ начинается формирование
начального от\-рез\-ка х14 программы приема. Предварительно
переменной х13 присваивается копия исходной версии набора х11, так
как сам этот набор будет впоследствии изменяться. В набор х14
сначала заносятся лишь два оператора - "программа" \ и
"метка(икс($N$))", где номер $N$ первой не определенной
программной переменной получается уве\-ли\-че\-нием х10 на 4. Это
вызвано тем, что кроме набора входных переменных проверяе\-мо\-го
отношения, оператор получает еще 3 входных данных - список
посылок, список комментариев и номер той выходной переменной,
которой будет присвоен набор использованных при проверке посылок.

После ввода накопителя х14 начального отрезка программы создается
набор х15, составленный из всех входных переменных оператора (без
единственной его выход\-ной переменной). С помощью х15 формируется
обращение к оператору "контроль\-бу\-фе\-ра($\ldots x \ y$)",
используемому для поиска в буфере готового результата по
дан\-но\-му входному набору. В х14 заносятся это обращение и
оператор $x=0$, проверяющий, что поиск в буфере ничего не дал.
Лишь тогда имеет смысл переходить к попыт\-ке реализации приема.
Заметим, что для использования результата, найденного в буфере,
имеется специальный прием пакета, заголовок которого -
"контрольбуфера". Его программа ответвляется от программ обычных
приемов при проверке усло\-вия $x=0$.

Так как обычно прием "контрольбуфера" \ компилируется перед
"основными" \ при\-е\-ма\-ми пакета, имеющими заголовок "спуск",
то фактически в программе находит\-ся оператор "не($x=0$)", после
которого идут операторы приема "контрольбуфера", выдающие
найденный результат. Ответвление по "иначе" \ после "не($x=0$)" \
ведет к ветви программ основных приемов. У всех этих программ
оператор $x=0$ оказывает\-ся автоматически отброшен при их вклейке
в общую программу пакета. Далее - переход через "ветвь 1" \ и
коррекция номера первой не использованной в х14 про\-грам\-м\-ной
переменной х10. Если число х12 уровней срабатывания пакета более
одного, то на этот момент х10 - переменная, которая будет
использоваться в пакете как номер текущего уровня срабатывания. К
х14 добавляется оператор "или(равно(х10 1)$\ldots$ равно(х10
$N$))", последовательно перечисляющий уровни срабатывания от 1 до
максимального уровня $N$. Затем находится фактический уровень
срабатывания приема х16, определяемый его фильтрами, и вставляется
оператор "равно(х10 х16)", фиксирующий этот уровень. Заметим, что
в отличие от нормализаторов, для про\-ве\-рочных операторов не
нужно будет обеспечивать откаты к точке перечисления уровней после
срабатывания приемов, так как каждое срабатывание означает
по\-лу\-че\-ние окончательного результата.

После перехода через "ветвь 1" \ - контрольная точка "прием(3)",
связанная с учетом симметричности ("коммутативности") проверяемого
отношения. Если от\-но\-ше\-ние симметрично и прием не имеет
указателя "коммутативно", блокирующего попытку перестановки
операндов при идентификации, то проверяется сим\-мет\-рич\-ность
консеквента. Если он не симметричен относительно входных
выражений, то к х14 добавляется оператор "или(и(равно($x$
х1)равно($y$ х2))и(равно($x$ х2)равно($y$ х1)))", реализующий
попытку перестановки входных данных х1,х2 при иден\-ти\-фи\-кации.
Далее в качестве входных данных будут выступать уже переменные
$x,y$, и в наборах х11, х13 предпринимается замена х1,х2 на эти
переменные. После анализа симметричности - переход через "ветвь
2". Здесь к концу набора х14 добавляются операторы, присваивающие
очередным программным переменным корневые вхож\-де\-ния входных
термов. В наборе х11 ссылки на программные переменные для входных
термов заменяются ссылками на переменные для корневых вхождений.
Далее - от\-кат к переходу через "ветвь 1".

Здесь вводится накопитель х15 информационных элементов
программного блока. Последовательно просматриваются вхождения х16
в набор х11. В этом просмотре элементы набора х11 играют роль
предварительных установок на идентификацию входных подтермов
консеквента: часть из них будет идентифицирована сразу же (их
позиции в наборе х11 заменятся на 0), а на основе остальных
впоследствии будут введены обычные установки на идентификацию. Для
текущего вхож\-де\-ния х16 в накопитель х15 заносится элемент
(выражение $\ldots$), указывающий программную пе\-ре\-мен\-ную для
соответствующего входного подтерма. Затем - переход через "ветвь
2". Переменной х17 присваивается текущая пара набора х11. Конец
пары х17 - вхож\-де\-ние х18 в консеквент теоремы приема подтерма,
соответствующего текущему входному данному. Начало пары х17 -
программная переменная $x$ для корневого вхождения, с которого
нужно начинать идентификацию данного подтерма. Для х18
рассматриваются следующие случаи:

\begin{enumerate}

\item По вхождению х18 расположена переменная х19. Проверяется
наличие в х15 для этой переменной элемента, указывающего, что она
уже иденти\-фи\-ци\-ро\-вана с некоторым вхождением. Если такой
элемент есть, то к х14 присоеди\-ня\-ет\-ся оператор, проверяющий
равенство подтермов по обоим вхождениям. Иначе - в х15 заносится
элемент (вхождение х19 $x$), указывающий, что х19 идентифицирована
с подтермом по вхождению $x$. При этом в набор х11 по вхождению
х16 заносится ноль, указывающий, что для данного входного терма
идентификация уже проведена.

\item По вхождению х18 расположена функциональная переменная
"значение($f$ $y$)", где $f$ выделено указателем приема
"отображение($\ldots$)". В х15 заносится ин\-фор\-ма\-ционный
элемент (функция $f$ ($y$) 0 (вхождение $x$)), определяющий
иден\-ти\-фи\-кацию данной функциональной переменной. По вхождению
х16 регистри\-ру\-ет\-ся ноль.

\item По вхождению х18 расположен терм "префикс($A$ $B$)". Он
определяет выделе\-ние некоторого элемента $A$ в рассматриваемом
наборе. Здесь анализируются следующие подслучаи:

 а) Данный терм выделен указателем приема "список($\ldots$)",
 означающим, что определяемый термом набор идентифицируется без учета
 порядка своих эле\-мен\-тов. В свою очередь, здесь анализируются
 подслучаи:

 а1) $B$ - переменная; $A$ само имеет вид "префикс($C$ $D$)" \ и
 выделено указателем "список($\ldots$)". Тогда к х14 добавляются
 операторы "символ($x$ набор) операнд($x$ $y$) символ($y$ набор)",
 а к х15 - элемент (терм $B$ остатокнабора($x$ ($y$))),
 иден\-ти\-фи\-ци\-рующий $B$ как остаток набора $x$ после выделения в нем
 элемента - набора $y$. По вхождению х16 размещается пара ($y$ $v$),
 где $v$ - вхождение подтер\-ма "префикс($C$ $D$)". Эта пара позволит
 продолжить идентификацию под\-тер\-ма $A$.

 а2) $B$ - переменная, причем $A$ не имеет вида, указанного в
 предыдущем под\-слу\-чае. К х14 добавляются операторы "символ($x$
 набор) операнд($x$ $y$) символ($y$ $f$)", где $f$ - логический
 символ, являющийся заголовком терма $A$. К х15 при\-со\-е\-ди\-ня\-ется
 элемент (терм $B$ остатокнабора($x$ ($y$))). По вхождению х16
 размеща\-ет\-ся та же пара, что и в предыдущем подслучае.

 а3) $A$ и $B$ - переменные. Тогда к х14 добавляются операторы
 "символ($x$ набор) операнд($x$ $y$)". Если в х15 уже имелся
 элемент (терм $A$ $\ldots$), то добавляется оператор, проверяющий
 равенство термов, идентифицированных с $A$ по ста\-ро\-му и новому
 вхождениям. В любом случае, к х15 присоединяются элементы (терм $A$
 подтерм($y$)) и (терм $B$ остатокнабора($x$ ($y$))), а по
 вхождению х16 регистрируется 0.

 б) Имеется указатель приема (префикс $\ldots$), ссылающийся на
вхождение х18. Это означает, что подтерм "префикс($\ldots$)" \
должен идентифицироваться бук\-валь\-но, т.е. с термом вида
"префикс($\ldots$)".

 в) $A,B$ - переменные, причем набор идентифицируется с учетом
 порядка эле\-мен\-тов. К х14 добавляется оператор "символ($x$
 набор)", а к х15 присоединя\-ют\-ся элементы (терм $A$
 первыйтерм($x$)), (терм $B$ остатокнабора($x$
 (первыйоперанд($x$)\\ ))). По вхождению х16 регистрируется 0.

 \item По вхождению х18 расположен терм "отображение($\ldots$)",
 выделенный указа\-те\-лем "развертка($\ldots$)". К х14 присоединяется
 оператор "символ($x$ набор)".

 \item По вхождению х18 расположен терм "набор($\ldots$)". К х14
 добавляется опера\-тор, фиксирующий число элементов этого набора.

 \item Остаточный случай, реализуемый, если предыдущие случаи не
 имели места. В этом случае к х14 добавляется оператор "символ($x$
 $f$)", где $f$ - заголо\-вок подтерма по вхождению х18. Если этот
 подтерм представляет собой логический символ, то по вхождению х16
 регистрируется 0.

\end{enumerate}

По окончании просмотра вхождений х16 в набор х11 - переход через
"иначе 1". Здесь, после контрольной точки "прием(5)", происходит
регистрация в х15 информа\-ци\-он\-ных элементов (замечание
$\ldots$) и (списокпосылок $\ldots$), сохраняющих для
даль\-ней\-ше\-го использования ссылки на программные переменные,
значениями которых служат список комментариев и список посылок
проверочного оператора.

Далее - переход через "ветвь 1", и после контрольной точки
"прием(6)" \ вводит\-ся накопитель х16 установок на идентификацию.
Он формируется из элементов (опе\-ранд $v$ $x$) для всех пар ($x$
$v$), имеющихся в наборе х11. Если какое-либо вхождение $v$
выделено указателем приема "развертка($\ldots$)", то
соответствующая установка за\-ме\-ня\-ет\-ся на (развертка $v$ $x$
0).

После перехода через "ветвь 1" \ - контрольная точка "прием(7)".
Если прием не имеет указателя "дистрибразвертка($\ldots$)",
требующего специального режима ком\-пи\-ля\-ции, то
предпринимается обращение к процедуре "смантецеденты" \ для
пополне\-ния списка х16 установками на идентификацию антецедентов.
Попутно в список х15 информационных элементов программного блока
заносится набор (конец $\ldots$), перечисляющий вхождения всех
антецедентов, обработка которых отнесена на ко\-нец программы
приема. Затем - переход через "ветвь 1", где из набора х11
исключаются все разряды, равные нулю.

\subsection{Ввод программного блока}

Вводится заготовка х17 программного блока. Кроме перечисленных в
наборе х15, информационными эле\-мен\-та\-ми этого блока
становятся стандартные общие элементы (теорема $\ldots$),
(точкапри\-вяз\-ки $\ldots$), (логсимвол $\ldots$) и т.п.
Добавляются элементы (подтерм $\ldots$), определяю\-щие корневые
вхождения идентифицируемых подтермов консеквента приема,
отлич\-ных от подтерма, содержащего точку привязки. Наконец,
добавляются элементы (антецедент $\ldots$), перечисляющие корневые
вхождения не\-по\-сред\-ст\-венно иден\-ти\-фи\-ци\-руемых
антецедентов. В программном блоке регистрируется уже созданный
на\-чаль\-ный фрагмент х14 программы приемы. Если набор х11
непуст, то первая его пара определяет точку привязки приема, и
тогда добавляется ин\-фор\-ма\-ци\-онный элемент (операнд
$\ldots$), указывающий для точки привязки программную переменную,
имею\-щую своим значением вхождение этой точки привязки.

После контрольной точки "прием(9)" \ предпринимается регистрация
информа\-ци\-он\-но\-го элемента (параметры $\ldots$),
перечисляющего те переменные теоремы, для которых по различным
причинам идентификация не проводится. Например, она отменяется для
переменных консеквента при наличии указателя "дистрибразвертка". В
этом случае консеквент имеет двуместную ассоциативно-коммутативную
операцию $f(x,y)$, которая фактически будет идентифицироваться с
операцией $f(\ldots)$ от про\-из\-воль\-но\-го числа операндов,
т.е. указывать конкретные значения для $x,y$ бессмыс\-лен\-но.
Далее - переход через "ветвь 1".

После контрольной точки "прием(10)" \ расположен цикл обращений к
справоч\-ни\-ку "прогрблок" \ на указателях приема х19. Этот
справочник, как уже говорилось выше, осуществляет пополнение
списка информационных элементов программного блока, необходимых
для компиляции. После контрольной точки "прием(11)" \ -
ре\-гис\-тра\-ция в информационных элементах программного блока
списков антецедентов, обрабатываемых проверочными либо усиленными
проверочными операторами. Да\-лее - переход через "ветвь 1".

Если имеется информационный элемент (заголовок $v$), указывающий,
что при идентификации подтерма теоремы по вхождению $v$ возможно
различие заголовков, а некоторый оператор уже введенной части
программы проверяет совпадение данных заголовков, то этот оператор
удаляется.

\subsection{Компиляция идентифицирующей части приема и его
фильтров}

После контрольной точки "прием(13)" \ выполняется обращение к
процедуре "иден\-ти\-фи\-катор($\ldots$)", создаю\-щей
идентифицирующую часть программы приема. Здесь же, после
контрольной точки "прием(14)" \ происходит создание операторов для
проверки фильт\-ров приема и вставка их в программу. Затем -
переход через "ветвь 1".

После контрольной точки "прием(15)" \ рассматривается случай
прие\-мов, имею\-щих указатель "дистрибразвертка($K$)". Теорема
таких приемов представи\-ма в ви\-де $\forall_{y_1 \ldots
y_n}(P(\ldots a \ldots) \ \& \ P(\ldots b \ldots) \rightarrow
P(\ldots h(a \ b) \ldots))$, где $h$ -
ассоциатив\-но-ком\-му\-та\-тив\-ная операция. $K$ - указатель
вхождения в теорему подтерма $h(a \ b)$. Ука\-за\-тель
"дистрибразвертка" \ определяет режим реализации приема с
обобщением на произвольное число операндов у операции $h$.

Прежде всего, проверяется наличие у приема указателя "спуск". Он
означает, что при неудачной попытке применения приема (после
идентификации его входных данных) должен происходить выход из
проверочного оператора по истинностному значению "ложь".
Соответственно, после контрольной точки "прием(19)" \ вводится
фрагмент программы х19, обеспечивающий такой выход при откате.
Фрагмент х19 будет включен в программу приема перед обращением к
ее редактированию, а пока он регистрируется в информационном
элементе (блокпрограммы 1 х19). Точка пе\-ре\-хо\-да к нему
обозначается в программе псевдооператором "2(1)", который
впо\-след\-ст\-вии окажется преобразован в оператор "ветвь". Далее
- переход через "ветвь 2".

Здесь определяется вхождение х19 выделенной указателем
"дистрибразверт\-ка" \ операции $h(\ldots)$. Находится тот входной
терм $t$ проверочного оператора, внутри ко\-то\-ро\-го расположено
х19. Выбирается новая переменная $x$, и определяется результат х22
замены в терме $t$ вхождения х19 на переменную $x$. Терм х22 будет
служить шаб\-ло\-ном для антецедентов теоремы приема, возникающих
при переходе от многоместной операции $h(a_1 \ldots a_n)$
консеквента к ее операндам $a_1, \ldots, a_n$. В программный блок
х17 заносится информационный элемент (вхождение $x$ $y$),
определяющий программную переменную $y$, которая будет пробегать
вхождения операндов операции $h$. После этого находится
программное выражение х23 для терма х22 - оно будет служить одним
из входных данных рекурсивного обращения к тому же самому
проверочному оператору. Другие входные данные этого обращения
берутся из набора х13; на\-ко\-пи\-те\-лем входных термов
обращения служит набор х24. По окончании его заполне\-ния
переменная х25 становится равна той входной переменной
проверочного оператора, значением которой служит список посылок, а
х26 - переменной, значением которой служит список комментариев.
Если прием имел указатель "комментарий($\ldots$)",
оп\-ре\-де\-ля\-ющий ввод некоторого комментария при рекурсивном
обращении, то зна\-че\-ние х26 заменяется на программное
выражение, дающее пополненный список ком\-мен\-та\-ри\-ев. После
этого - переход через "ветвь 1", где переменной х27 присваивается
программное выражение для рекурсивного обращения к проверочному
оператору. Наконец, переменной х29 присваивается список
операторов, содержащий оператор "длялюбого($\ldots$)", реализующий
цикл просмотра операндов операции $h$ и обращений к оператору х27.
Этот список присоединяется к программе приема. Программная
переменная "начало(х17)", играющая в операторах из х29 роль
накопителя ссылок на использованные при проверках посылки,
регистрируется в информационном эле\-мен\-те (выводимо $\ldots$).
Далее - откат к оператору "ветвь 1" \ перед \ ветвью,
от\-но\-ся\-щей\-ся к указателю "дистрибразвертка". Переход через
этот оператор продолжает ос\-нов\-ное русло компиляции программы
приема.

При наличии указателя приема "стоп" \ в программу вставляется
контроль\-ная точка "трассировка(стоп 0)", вызывающая выход в
отладчик ЛОСа после выпол\-не\-ния всех необходимых для
срабатывания приема проверок.

После контрольной точки "прием(16)" \ находится программное
выражение х21 для списка всех использованных приемом посылок. Если
прием не имел указателя "не", то его программа завершается
операторами "блок($\ldots$)", "учетвбуфере($\ldots$)",
"результат($\ldots$)", "выход". Первый из этих операторов
выполняет блокировку при\-ме\-не\-ния приема, если она задана
специальным комментарием, а также регистрирует в комментариях к
посылкам исходной задачи факт срабатывания приема, если
ус\-та\-нов\-лен режим работы решателя с регистрацией
срабатываний. Второй оператор регистрирует результат обращения к
проверочному оператору в буфере - для не\-по\-сред\-ственного
извлечения его оттуда при повторном обращении. При наличии
текст-формульного сопровождения вставляется реализующий его
оператор "титр($\ldots$)". Если прием имел указатель "не", то
программа завершается операторами "блок($\ldots$)",
"учетвбуфере($\ldots$)", "внешобрыв($\ldots$)", "стоп". В обоих
случаях далее пред\-при\-ни\-ма\-ет\-ся завершающее редактирование
программы и регистрация ее в блоке программ.

\section{Схема компиляции приема синтезатора}

Приемы синтезатора компилируются программой логического симво\-ла
"зна\-че\-ние" \ при обращении к ней от справочника "новыйприем".
Войти в начальную точ\-ку компиляции можно через пункт
("Компилятор ГЕНОЛОГа", "Приемы синтезато\-ров", "Исходная точка")
оглавления программ. Схема компиляции представляет со\-бой
некоторое усложнение схемы компиляции проверочных операторов.

\subsection{Предварительный анализ приема}

В случае синтезаторов единственное предварительное преобразование
теоремы прие\-ма - обращение к оператору "развязка" \ в случае
геометрических приемов. Далее переменной х9 присваивается
вхождение консеквента теоремы, переменной х11 - название
синтезатора, переменной х12 - набор ($T$ вход($x_1 \ldots x_n$)
выход($y_1 \ldots y_k$) $A_1 \\ \ldots A_m$). Здесь $T$ -
реализуемое синтезатором утверждение; $x_1, \ldots , x_n$ - список
вход\-ных переменных синтезатора, $y_1, \ldots , y_k$ - список
выходных переменных, $A_1, \ldots , A_m$ - список термов, задающих
формат синтезатора. Утверждение $T$ присваивается пе\-ре\-мен\-ной
х13. Значениями переменных х14 и х15 становятся списки
перемен\-ных $x_1, \ldots x_n$ и $y_1, \ldots , y_k$
соответственно. Проверяется, что консеквент теоремы приема
представим как результат некоторой подстановки в терм $T$.
Переменной х19 при\-сва\-и\-ва\-ется набор пар (входная
программная переменная синтезатора - вхождение в консеквент
теоремы приема, идентифицируемое со значением этой переменной).
После этого значением х18 становится программная переменная для
списка по\-сы\-лок синтезатора. Значение х18 сохраняется для
последующего использования в пе\-ре\-мен\-ной х20. Затем оно
увеличивается на 2 и становится равно первой выходной переменной
синтезатора. Создается набор х21 пар (выходная программная
пе\-ре\-мен\-ная синтезатора - вхождение в консеквент теоремы того
терма, который определя\-ет ее значение). После этого значением
х18 становится выходная программная пе\-ре\-мен\-ная для списка
использованных синтезатором посылок. Данное значение
сохраня\-ет\-ся в переменной х22. Наконец, х18 увеличивается на
единицу и становится первой не определенной переменной на
начальный момент выполнения программы синтеза\-то\-ра.

\subsection{Создание начального отрезка программы}

После контрольной точки "прием(3)" \ переменной х23 присваивается
набор операто\-ров начального отрезка программы синтезатора:
"программа", "метка(икс($\ldots$))", "синтезатор(0)". Оператор
"синтезатор(0)" \ нужен для трассировки на уровне
сра\-ба\-ты\-ваний приемов.

Переменной х24 присваивается список входных программных переменных
син\-те\-за\-тора. После контрольной точки "прием(20)" \
осуществляется пополнение спи\-ска х23 оператором $Q$, проверяющим
наличие комментария (вход $f A_1 \ldots A_n$), где $f$ - название
синтезатора, $A_1, \ldots A_n$ - его входные данные. Наличие
такого комментария означает появление цикла при рекурсивных
обращениях; в этом случае оператор $Q$ ложен, и цикл разрывается.
Если комментария нет, то оператор $Q$ вводит его, блокируя таким
образом зацикливание при последующих рекурсивных обращениях.

Если в формате синтезатора имеется символ "перечисление",
определяющий ре\-жим перечисления его выходных значений, то
добавляется также оператор, ис\-клю\-ча\-ю\-щий ранее введенные
комментарии (перечисление $\ldots$) и вводящий новый такой
комментарий (перечисление пустоеслово). В этом комментарии будут
сохранять\-ся наборы значений выходных переменных - для
предотвращения повторений в по\-сле\-до\-ва\-тель\-ности выходных
наборов.

Далее - откат к переходу через "ветвь 2", где реализуется
добавление оператора "контрольбуфера($\ldots$)", предпринимающего
попытку усмотреть готовый результат обращения в буфере. После него
размещается оператор "равно(х18 0)", определя\-ю\-щий отсутствие в
буфере нужного результата - лишь тогда нужен компилируемый прием.
Если же результат в буфере найден, то для выдачи его, как и в
случае проверочных операторов, имеется отдельный прием с
заголовком "контрольбуфера". Значение х18 снова устанавливается на
первую неиспользуемую программную пе\-ре\-менную, и откат к
переходу через "ветвь 1".

Здесь вводится накопитель х24 информационных элементов
программного блока. Для каждой входной программной переменной $x$
синтезатора добавляется опера\-тор "равно($y$ левыйкрай($x$))",
присваивающий новой переменной $y$ корневое вхождение входного
терма; в парах набора х19 вместо переменных $x$ помещаются
соответ\-ст\-ву\-ю\-щие переменные $y$. После этого х18
по-прежнему указывает первую неиспользо\-ван\-ную программную
переменную.

После контрольной точки "прием(5)" \ расположен цикл
предварительной иден\-ти\-фи\-ка\-ции корневых точек входных
термов. Просматриваются вхождения х25 в набор х19 пар (программная
переменная для корневого вхождения во входной терм - вхождение $v$
в консеквент теоремы приема подтерма, идентифицируемого с данным
входным термом). Переменной х26 присваивается вхождение $v$;
переменной х27 - символ по этому вхождению.

Если этот символ предствляет собой переменную $x$, то проверяется
наличие в накопителе х24 информационного элемента (вхождение $x$
$\ldots$), указывающего ра\-нее идентифицированное ее вхождение.
Если такого элемента нет, то он вводится, иначе - добавляется
оператор, проверяющий совпадение термов по старому и ново\-му
вхождениям, идентифицированным с $x$. В обоих случаях разряд х25
набора х19 заменяется на ноль, означающий, что дальнейшая
идентификация для данного вход\-ного терма не требуется.

Если по вхождению х27 расположена не переменная, то переход через
"ина\-че 2". Здесь сначала анализируются особые случаи,
аналогичные описанным ранее для проверочных операторов:
идентификация х27, имеющего вид "префикс($x$ $y$)", а также случай
вхождения $v$, выделенного указателем "развертка($\ldots$)". При
отсут\-ст\-вии особых случаев - вводится оператор
"символ($\ldots$)", фиксирующий совпаде\-ние заголовка входного
терма с заголовком соответствующего теоремного подтерма. Ес\-ли по
вхождению $v$ был расположен однобуквенный терм, то дальнейшая
иденти\-фи\-ка\-ция здесь не нужна, и разряд х25 заменяется на 0.

После просмотра всех пар набора х19 - откат к переходу через
"ветвь 1". Здесь, после контрольной точки "прием(6)", происходит
регистрация в накопителе х24 ин\-фор\-ма\-ционных элементов
(замечание $\ldots$) и (списокпосылок $\ldots$), указывающих
про\-грам\-мные переменные для списка комментариев и списка
посылок. По оставшимся ненулевыми элементам набора х19 формируется
накопитель х25 списка установок на идентификацию. При наличии
указателей приема "развертка($\ldots$)", выделяющих корневые
вхождения входных термов, установки (операнд $\ldots$) на
идентификацию этих вхождений преобразуются в установки (развертка
$\ldots$).

Далее - переход через "ветвь 1", где после контрольной точки
"прием(7)" \ пред\-при\-нимается пополнение списка х25 установками
на идентификацию антецедентов. Как и в случае других пакетных
операторов, для этого используется проце\-ду\-ра "смантецеденты".
Затем в накопителе х24 регистрируются информационные эле\-мен\-ты,
ссылающиеся на антецеденты, для обработки которых применяются
про\-ве\-роч\-ные либо усиленные проверочные операторы. После
отката к переходу через "ветвь 1" \ из х19 исключаются все нулевые
разряды; в нем остаются только пары, определяю\-щие входные термы,
для которых требуется продолжение идентификации в соответст\-вии с
установками набора х25.

\subsection{Ввод программного блока}

После контрольной точки "прием(9)" \ вводится программный блок
х26. Кроме эле\-мен\-тов набора х24, в него заносятся стандартные
информационные элементы, ха\-рак\-те\-ри\-зующие контекст
компиляции. Далее создаются информационные элементы (операнд
$\ldots$), связывающие корневые вхождения подлежащих дальнейшей
иден\-ти\-фи\-ка\-ции входных термов с программными переменными
для этих вхождений. После контрольной точки "прием(10)" \ - цикл
обращений к справочнику "прогрблок" \ для указателей приема,
пополняющих список информационных элементов программно\-го блока.
После контрольной точки "прием(13)" \ - создание информационного
элемен\-та (параметры $\ldots$), перечисляющего теоремные
переменные, для которых идентифи\-ка\-ция не нужна. Затем - откат
к переходу через "ветвь 1". Здесь просматривают\-ся информационные
элементы (заголовок $\ldots$), указывающие корневые вхождения
входных термов, для которых заголовок определен неоднозначно. Если
уже были введены операторы программы, фиксирующие эти заголовки,
то они отбрасывают\-ся.

\subsection{Компиляция основной части программы приема}

После контрольной точки "прием(15)" \ - обращение к процедуре
"идентифика\-тор", создающей идентифицирующую часть программы
приема. Далее заполняются на\-ко\-пи\-тель х27 программных
выражений для операндов завершающего прием опера\-то\-ра
"результат($\ldots$)", а также накопитель х28 программных
выражений для выход\-ных термов синтезатора. Здесь используются
пары набора х21, связывающие выходные программные переменные с
вхождениями в теорему приема выходных термов. Про\-грам\-мные
выражения для этих термов даются процедурой "метаперевод". Пос\-ле
заполнения накопителей х27, х28 - переход через "ветвь 1".

Начиная с контрольной точки "прием(16)" \ - создание операторов,
реализую\-щих фильтры приема, и вставка их в программу.

Если синтезатор перечисляющий, то добавляется оператор,
проверяющий отсут\-ст\-вие в комментарии (перечисление $\ldots$)
текущего набора х28 значений выходных переменных и регистрирующий
этот набор в данном комментарии. Таким образом предотвращается
повторная выдача одного и того же набора.

При наличии указателя приема "стоп" \ вставляется контрольная
точка "трасси\-ров\-ка(стоп 0)", обеспечивающая выход в отладчик
ЛОСа перед выдачей результата.

После контрольной точки "прием(17)" \ предпринимается вставка
завершаю\-щих операторов программы. Прежде всего, формируется
программное выражение х32 для списка использованных приемом
посылок. Затем добавляются операторы "блок(\\ $\ldots$)" \ и
"учетвбуфере($\ldots$)", играющие ту же роль, что и в программах
провероч\-ных операторов. При необходимости добавляется оператор
"титр($\ldots$)". Наконец, добавляются операторы
"результат($\ldots$)" \ и "выход" \ (у перечисляющих
синтезато\-ров последний отсутствует). Далее выполняются:
редактирование программы; вставка в ее начальной части оператора,
фиксирующего уровни срабатывания приема, ука\-зан\-ные в его
фильтрах; регистрация программы в блоке программ.

\section{Схема компиляции приема анализатора}

Приемы анализатора компилируются программой логического симво\-ла
"внутрвы\-вод" \ при обращении к ней от справочника "новыйприем".
Войти в начальную точ\-ку компиляции можно через пункт
("Компилятор ГЕНОЛОГа", "Приемы анализато\-ров", "Исходная точка")
оглавления программ.

Обращения к основным пакетным операторам - нормализаторам,
проверочным операторам, синтезаторам и анализаторам - можно
рассматривать как упрощенные версии задач, соответственно, на
преобразование, доказательство, описание и ис\-сле\-до\-ва\-ние.
Функционирование анализатора, по аналогии с решением задачи на
ис\-сле\-до\-вание, состоит в выводе следствий из заданного списка
посылок в соответствии с заданной целевой установкой. Наиболее
ценные из них отбираются и передаются внешней задаче. При
обращении к анализатору задаются значения трех программных
переменных: х1 - текущая задача $Z$, х2 - максимальный уровень
применяемых приемов анализатора, х3 - целевая установка
вспомогательной задачи анализатора $Z'$. В последнюю автоматически
передается из задачи $Z$ цель, перечисляющая неизвестные, и эту
цель в списке х3 указывать не нужно.

Вспомогательная задача $Z'$ создается помещаемым в начале
программы анализатора оператором "анализатор(х1 х2 х3 х4 х5)".
Значения переменных х1,х2,х3 - те же, что в обращении к
анализатору. Переменной х4 присваивается вспомогательная задача
$Z'$, а переменной х5 - лимит трудоемкости, отведенный для работы
анализатора. Для организации сканирования анализатора, в
зависимости от его типа, используется одна из процедур "теквхожд",
"корнвхожд", "Корнвхожд". Обращения к ним имеют вид "теквхожд(х1
х2 х3 х4)", "корнвхожд(х1 х2 х3 х4)", "Корнвхожд(х1 х2 х3)".
Входные данные суть: х3 - вспомогательная (внутренняя) задача
анализатора и х4 - текущий уровень сканирования. х1 перечисляет
вхождения логических символов в посылки задачи х3, а х2 -
вхождения этих посылок в список посылок. В первом случае
рассматриваются только посылки, вес которых не превосходит х4. Во
втором случае - посылки, имеющие вес х4, причем в качестве х1
берутся только корневые вхождения. В третьем случае тоже берутся
только корневые вхождения, но вес посылки игнорируется. Тип
используемого анализатором сканирования определяется по его
названию справочником "анализатор". Если справочник выдает 1,
используется оператор "корнвхожд", если он выдает 2, используется
"теквхожд", и если выдает 3, то используется "Корнвхожд".

Приемы анализатора осуществляют пополнение списка посылок
внутренней задачи на исследование. Те следствия, ко\-то\-рые по
завершении работы анализатора должны быть перенесены в список
посылок внешней задачи, снабжаются комментарием "внешвывод". Вывод
следствий пре\-кра\-ща\-ет\-ся либо при исчерпании возможностей
применения приемов, либо при ис\-чер\-па\-нии лимита на число
шагов работы интерпретатора, либо при реализации приема,
усматривающего получение необходимого результата и реализующего
выход из ана\-лизатора.

В дополнение к приемам вывода следствий, введены также приемы
анализато\-ра, осуществляющие эквивалентные либо тождественные
преобразования термов внутренней задачи. Эти приемы имеют
указатель "внутрпреобр".

\subsection{Создание начального отрезка программы}

Как и в случае других пакетных операторов, компиляция приема
анализатора на\-чи\-на\-ет\-ся с предварительного преобразования
теоремы приема. Для геометрического приема используется обращение
к процедуре "развязка"; других преобразований теоремы пока не
предусмотрено.

После перехода через "ветвь 2" \ переменной х9 присваивается
вхождение кон\-сек\-вен\-та теоремы; переменной х10 - название
анализатора; переменной х11 - указатель типа используемого
анализатором сканирования. После контрольной точки "прием(37)" \
расположено обращение к процедуре "точкапривязки", выбирающей
точку привязки в теореме приема. Затем  ини\-ци\-али\-зи\-руется
накопитель х14 начального отрезка программы. В него заносятся
операторы "программа", "метка(икс(4))", "анализатор(х1 х2 х3 х4
х5)", "лимит(х5)", "равно(х6 0)", повторе\-ние", "меткаперехода(1
х7)", "теквхожд($\ldots$)" \ либо "корнвхожд($\ldots$)" \ либо
"Корнвхожд($\ldots$)", "символ(х7 $A$)". Здесь $A$ - символ
привязки, выбранный процедурой "точкапривязки". Оператор
"ана\-ли\-затор($\ldots$)" \ нужен для создания внутренней задачи
и организации трассировки по шагам работы анализатора. Он же
определяет по входным данным лимит х5 трудоемкости обращения к
анализатору. После того, как этот лимит будет превышен, произойдет
откат к ветви программы анализатора, которая позднее будет
вставлена между операторами "анализатор($\ldots$)" \ и
"лимит(х5)". Эта ветвь представляет собой отдельный прием,
завершающий работу анализатора. Заголовком завершающего приема
служит символ "внешвывод", фиктивной его теоремой - терм
"анализатор($S$)", где $S$ - название анализатора. Переменная х6
имеет своим значением текущий уровень сканирования. Опера\-тор
"повторение" \ представляет собой точку отката после реализации
очередного прие\-ма. Чтобы адресовать переход к этой точке, на
период компиляции после нее размеща\-ет\-ся фиктивный оператор
"меткаперехода($\ldots$)".

Находится указатель приема "уровень($\ldots$)", перечисляющий
допустимые уровни его срабатывания, и к набору х14 добавляется
оператор, проверяющий совпадение х6 с одним из этих уровней. Затем
- переход через "ветвь 1".

После контрольной точки "прием(2)" \ вводится накопитель х15
информацион\-ных элементов программного блока, в который заносится
ряд стандартных общих характеристик компилируемого приема. Здесь
же вводится накопитель х16 установок на идентификацию. Переменной
х17 присваивается набор корневых вхождений ан\-те\-це\-ден\-тов
теоремы приема. Просматриваются указатели приема, определяющие
спе\-ци\-аль\-ную обработку антецедентов, и по ним предпринимается
заполнение набора х16 установками на идентификацию.
Соответствующие разряды набора х17 обнулива\-ют\-ся. Если прием
имеет указатель "внутрпреобр", а также указатель
"теквхожд($\ldots$)", определяющий точку привязки не в заменяемом
терме, а в одном из антецедентов теоремы, то в х16 заносится
установка на идентификацию (теквхожд $\ldots$). После перехода
через "ветвь 1" \ переменной х18 присваивается список всех
ненулевых элементов набора х17, т.е. всех еще не учтенных в
установках на идентифи\-ка\-цию корневых вхождений антецедентов.
Если прием не имеет указателя "теквхожд($\ldots$)", адресованного
антецеденту, выделенному указателем "усм", то в х16 заносится
установка на идентификацию (операнд $\ldots$) для точки привязки.
В накопитель х15 заносятся информационные элементы,
характеризующие точку привязки. По элементам набора х18 создаются
установки на идентификацию (корень $\ldots$).

\subsection{Ввод программного блока}

После контрольной точки "прием(7)" \ вводится программный блок
х19.

Если прием имеет указатели "конец($\ldots$)", откладывающие
обработку некото\-рых антецедентов на конец программы приема, то
создается информационный элемент программного блока (конец
$\ldots$), перечисляющий корневые вхождения таких
анте\-це\-ден\-тов. Предпринимается регистрация в информационных
элементах ссылок на те антецеденты, для обработки которых
используются проверочные либо усиленные проверочные операторы.
Затем - откат к переходу через "ветвь 1".

Здесь реализуется цикл обращений к справочнику "прогрблок" \ для
указателей приема, в процессе которого создаются необходимые
дополнительные информа\-ци\-он\-ные элементы. Далее - снова
переход через "ветвь 1".

Если прием имеет указатель "вход($A \ x_1 \ldots x_n$)",
определяющий идентифи\-ка\-цию теоремных переменных $x_1, \ldots ,
x_n$ из комментария $(A \ t_1 \ldots t_n)$, то добавляются
опера\-тор, извлекающий данный комментарий, а также информационные
элементы (терм $x_i$ $T_i$), идентифицирующие переменные $x_i$ с
термами $t_i$.

Если прием имеет указатель "внутрпреобр", то добавляется оператор,
про\-ве\-ря\-ю\-щий, что текущее утверждение относится к буферу
анализатора, а не к посылкам внешней задачи.

\subsection{Компиляция основной части программы приема}

После контрольной точки "прием(11)" \ - обращение к процедуре
"идентифика\-тор", создающей идентифицирующую часть программы
приема. Как и для пакетов рас\-сматривавшихся выше типов, далее
создаются и вставляются в программу опе\-ра\-то\-ры проверки
фильтров прие\-ма; при наличии указателя "стоп" \ - добавляется
конт\-роль\-ная точка "трассировка(стоп 0)". После этого
переменной х20 присваивается под\-терм теоремы приема,
определяющий выводимое утверждение (при наличии указа\-те\-ля
"внутрпреобр" \ - заменяющее утверждение). Оператор "метаперевод"
\ нахо\-дит программное выражение х21 для этого подтерма. Если х21
отлично от переменной, то добавляется оператор, присваивающий
формируемый приемом новый терм вспо\-мо\-га\-тель\-ной переменной,
и х21 заменяется на эту переменную. Затем - переход че\-рез "ветвь
3".

После контрольной точки "прием(14)" \ происходит учет указателей
"за\-меч\-ус\-ло\-вие($\ldots$)", "замечание($\ldots$)". По этим
указателям к программе добавляется оператор, вводящий новый
комментарий анализатора. В первом случае ("замечусловие")
дуб\-лирующий комментарий не регистрируется; во втором случае
дублирование до\-пус\-ка\-ется.

После контрольной точки "прием(27)" \ проверяется наличие
указателей приема "новаяпосылка($\ldots$)", определяющих
уменьшение весов посылок при срабатывании приема. По этим
указателям создаются соответствующие операторы.

Далее компиляция разветвляется. Отдельно рассматриваются случаи
приема вывода, распознаваемого по отсутствию указателя
"внутрпреобр", и приема замены, обладающего таким указателем. В
качестве операторов, реализующих преобразования вспомогательной
задачи, используются те же операторы "вывод" \ и
"заменавхождения", что и для приемов сканирования задач.
Формирование их входных данных происходит аналогично тому, как это
делалось ранее.

\section{Схема компиляции приема оператора филь\-тра}

Приемы оператора фильтра компилируются программой логического
символа "кон\-текст" \ при обращении к ней от справочника
"новыйприем". Войти в начальную точ\-ку компиляции можно через
пункт ("Компилятор ГЕНОЛОГа", "Приемы опера\-то\-ра фильтра",
"Исходная точка") оглавления программ.

Обращение к оператору фильтра имеет вид $P(x_1 \ldots x_n \ y_1
\ldots y_m)$, где $x_1, \ldots , x_n$ - входные переменные; $y_1,
\ldots , y_m$ - выходные переменные. Обычно $m=0$. Однако, число
входных переменных у программы оператора $P$ может быть больше
$n$, так как дополнительно ей сообщается информация о контексте
срабатывания приема, использующего оператор фильтра. Например, для
приема, срабатывающего при ска\-ни\-ро\-вании задачи,
дополнительно передаются значения первых 5 переменных
кон\-тек\-ста сканирования; для приема нормализатора - значения
первых 3 перемен\-ных, определяющих обращение к нормализатору.
Дополнительные программные пе\-ре\-мен\-ные размещаются перед
основными переменными $x_1, \ldots , x_n, y_1, \ldots , y_m$, так
что нумерация последних сдвигается. Тип внешнего контекста
считается для оператора фильтра фиксированным, он определяется в
формате оператора.

Теорема приема оператора фильтра вырожденная (логический символ
"блок") и на экран не вы\-во\-дится. Компиляция происходит таким
образом, что в качестве этой теоремы можно брать терм $P(x_1
\ldots x_n \ y_1 \ldots y_m)$.

Прием оператора фильтра, не имеющего выходных переменных,
проверяет ис\-тин\-ность условия на текущий контекст,
определяемого фильтрами этого приема. Если условие истинно, то
происходит вы\-ход из оператора фильтра по значению "истина". Если
ни один прием не сработал, то оператор фильтра оказывается ложным.
Фак\-ти\-чес\-ки, оператор фильтра реализует дизъюнкцию условий,
задаваемых его приема\-ми.

\subsection{Предварительный анализ приема}

Переменной х9 присваивается заголовок оператора фильтра;
переменной х10 - терм "условие($A$)", у которого $A$ - конъюнкция
фильтров приема. Переменной х11 при\-сва\-и\-ва\-ет\-ся набор всех
указателей приема. Затем вводится вспомогательный терм
"идентификатор($B$)", у которого $B$ представляет собой набор всех
фильтров и ука\-за\-те\-лей приема. Этот терм будет впоследствии
рассматриваться как фильтр "контек\-ст($B$)" \ и обрабатываться
программой справочника "блокпроверок" \ на символе "кон\-текст".
Отличие от обработки обычного фильтра "контекст($\ldots$)" \ будет
иметь место лишь на завершающем этапе компиляции. Во
вспомогательном программном блоке, создаваемом при компиляции
фильтра "контекст($\ldots$)", возникнет группа операто\-ров,
реализующих проверку условий $B$. Вместо ввода внешнего квантора
су\-щест\-во\-вания по новым переменным для этой группы
операторов, она будет перенесена без каких-либо изменений в
основной программный блок приема.

Переменной х13 присваивается набор указателей формата оператора
фильтра. Значением переменной х15 далее становится набор
однобуквенных термов - ти\-пов входных данных. Возможны следующие
типы: "терм", "вхождение", "логсимвол", "переменная". Переменной
х16 присваивается набор идущих по возрастанию но\-ме\-ров
переменных, число которых равно общему числу $m+n$ входных и
выходных переменных оператора фильтра. На первом месте в этом
наборе стоит переменная с номером 1. Далее - переход через "ветвь
2".

Переменной х18 присваивается число дополнительных входных
переменных, оп\-ределяющих внешний контекст. Логический символ
"решить" \ в формате оператора указывает на режим сканирования
задачи; символ "замена" \ - на наличие внеш\-не\-го нормализатора.

Далее вводится заготовка х19 набора информационных элементов
программ\-но\-го блока. С учетом константы сдвига х18, в нее
заносятся элементы, определяю\-щие идентификацию теоремных
переменных $x_1, \ldots x_n$ (т.е. входных переменных
опера\-то\-ра).

\subsection{Ввод программного блока и завершение компиляции}

Вводится программный блок х20; в его накопителе программы имеются
всего два оператора - "программа" \ и "метка(икс($\ldots$))". Если
оператор фильтра используется приемом нормализатора, то вводится
информационный элемент (списокпосылок $\ldots$), указывающий на
список посылок этого нормализатора как на логический контекст
приема оператора фильтра. Затем предпринимается обращение к
процедуре "учет\-нор\-мализаторов($\ldots$)", создающей
информационные элементы (быстрпреобр $\ldots$) для имеющихся у
приема указателей нормализации. Эти элементы будут
использовать\-ся процедурой "метаперевод" \ при определении
программных выражений для но\-вых термов (такие термы могут
встречаться в фильтрах приема).

Наконец, происходит обращение к справочнику "блокпроверок" \ на
логичес\-ком символе "контекст" \ для обработки введенного ранее
терма "идентификатор($B$)". Этот терм был присвоен переменной х12.
Фактически, это основная часть процесса компиляции приема. По
завершении ее в накопитель программы программного бло\-ка х20
будут занесены операторы, проверяющие истинность фильтров приема.

Если оператор фильтра не имеет выходных переменных, то его
программа за\-вер\-ша\-ется оператором "выход". Иначе - переход
через "иначе 2". Здесь вводят\-ся набор х23 выходных "теоремных" \
переменных приема и набор х25 типов их значе\-ний. Определение
значений выходных переменных оператора фильтра осуществля\-ет\-ся
теми фильтрами приема, которые представляют собой идентифицирующие
тер\-мы. После обращения к справочнику "блокпроверок" \ эти
значения уже должны быть определены, быть может, в формате,
отличающемся от указанного в наборе х25. С помощью процедуры
"прогрвыражение" \ находятся программные выражения для данных
значений в нужном формате, регистрируемые в наборе х26 поочередно
с выходными программными переменными оператора. По набору х26
создаются за\-вер\-ша\-ющие программу операторы
"результат($\ldots$)" \ и "выход".

По завершении программы приема - откат к переходу через "ветвь 1"
\ для ре\-дак\-ти\-рования и записи ее в блок программ.

\section{Компиляция приемов вычислительных па\-ке\-тов}

Компиляция вычислительных пакетов находится в стадии развития.
Приемы пакета продукций компилируются справочником "новыйприем" \
на логическом символе "про\-дукция"; приемы технического
анализатора - справочником "новыйприем" \ на ло\-ги\-ческом
символе "знач".

\section{Информационные элементы программно\-го бло\-ка}

После того, как выше были приведены общие схемы компиляции приемов
различных типов, перейдем к более подробному описанию основных
блоков компилятора, ис\-поль\-зованных в этих схемах. На различных
этапах компиляции интенсивно будут использоваться информационные
элементы программного блока, так что прежде всего приведем
достаточно представительный перечень типов таких элементов.
Опус\-каем здесь уже приводившиеся выше информационные элементы,
несущие общую информацию о приеме. Так как список типов
информационных эле\-мен\-тов постоянно пополняется, а некоторые
редко использу\-е\-мые уже имеющиеся элементы ниже не приведены,
то для получения более пол\-ной информации рекомендуется
использовать справочное оглавление, достижимое из редактора
программ по Ctr-п.

Приводимый в этом разделе материал имеет чисто справочный
характер. Пере\-чис\-ляемые здесь информационные элементы оторваны
от того контекста, в котором они появляются и используются. Этот
контекст будет восстанавливаться по мере описания блоков
компилятора, работающих с данными элементами.


\subsection{Идентификация теоремных переменных}

В процессе компиляции программы приема находятся программные
выражения, оп\-ределяющие, прямо либо косвенно, значения теоремных
переменных. Чтобы этими программными выражениями можно было
воспользоваться на последующих этапах компиляции, они
регистрируются в информационных элементах про\-грам\-много блока.
Перечислим основные такие информационные элементы, а также
элементы, за\-да\-ющие различные ограничения и пожелания,
учитываемые при идентификации тео\-рем\-ных переменных. Каждый
пункт начинается с указания вида элемента, после чего идут
пояснения.

\begin{enumerate}

\item (вхождение $x$ $A$). $x$ - теоремная переменная; $A$ -
программное выражение для вхождения терма, идентифицированного с
$x$.

\item (терм $x$ $A$). $x$ - теоремная переменная; $A$ -
программное выражение для терма, идентифицированного с $x$. Обычно
теоремные переменные идентифицируются с вхождениями подтермов, так
как при этом не требуется переписывать подтерм. Идентификация с
термом означает, что подтерм переписывается. Иногда это приходится
делать из-за того, что он представлен в неявном виде (например,
как подмножество операндов ассоциативно-коммутативной операции);
иногда - в процессе формирования заменяющего терма выписывается
подтерм, заданный до этого своим вхождением, и тогда элемент
(вхождение $x$ $\ldots$) дополняется элементом (терм $x$
$\ldots$). При наличии такой избыточности компилятор выбирает в
каждом конкретном случае элемент, для которого получаются более
простые операторы программы.

\item (унисборка $x$ $A$ $B$). $x$ - теоремная переменная; $A$ -
логический символ; $B$ - программное выражение для набора термов.
Переменная $x$ идентифицируется с термом, определяемым программным
выражением "унисборка($A$ $B$)". Эле\-мент используется в тех
случаях, когда удобнее работать со списком корневых операндов
терма, идентифицированного с $x$.

\item (наборчленов $A$ $x$ $B$). $x$ - теоремная переменная; $A$ -
логический символ; $B$ - программное выражение для набора $A$ -
членов терма, идентифицирован\-но\-го с $x$. Незначительная
модификация предыдущего информационного элемента, у которого $B$
могло быть одноэлементным набором из терма, имеющего заголо\-вок
$A$.

\item (переменная $x$ $A$). Теоремная переменная $x$
идентифицирована с переменной либо логическим символом,
являющимися значением программного выражения $A$.

\item (значение $x$ $A$). $A$ есть программное выражение для
значения теоремной пере\-мен\-ной $x$, введенной некоторым
идентифицирующим термом фильтра приема. Элемент используется в тех
случаях, когда тип объекта, идентифицирован\-но\-го с $x$, неясен
(например, при идентификации разряда комментария).

\item (наборпеременных $x$ $A$). $x$ есть теоремная переменная;
$A$ - программное вы\-ра\-же\-ние, определяющее набор
идентифицированных с $x$ переменных. Исполь\-зу\-ет\-ся, например,
при идентификации связывающих приставок кванторов и описателей,
обозначенных одной переменной.

\item (выч $x$ $A$). $x$ есть теоремная переменная; $A$ -
программное выражение для идентифицированного с $x$ числа,
представленного в формате "с плавающей запятой".

\item (пустоеслово $x$). Элемент указывает, что теоремная
переменная $x$ может опре\-де\-лять\-ся пустым набором операндов
той ассоциативно-коммутативной опера\-ции с единицей, под которой
она расположена в идентифицируемой части теоремы.

\item (неизвестная $x$). Элемент указывает, что теоремная
переменная $x$ должна иден\-ти\-фи\-ци\-роваться с неизвестной
текущей задачи.

\item (известно $x$). Теоремная переменная $x$ должна
идентифицироваться с вы\-ра\-же\-нием, не содержащим неизвестных
текущей задачи.

\item (неизвестные $x$). Теоремная переменная $x$ должна
идентифицироваться с вы\-ра\-же\-нием, содержащим хотя бы одну
неизвестную текущей задачи.

\item (параметры $A$). $A$ есть список теоремных переменных, для
которых иденти\-фи\-ка\-ция не осуществляется. Такая ситуация
может складываться для перемен\-ных, не используемых в создаваемых
приемом новых термах, либо при об\-об\-ще\-нии компилятором
теоремы приема, после которого исходные перемен\-ные пропадают.
Например, вместо двух переменных под исходной
ассоциатив\-но-коммутативной операцией после обобщения возникает
набор из произволь\-но\-го числа переменных.

\item (пересечение $x$ $A$). Теоремная переменная $x$
идентифицируется только из рас\-смот\-рения под\-тер\-мов теоремы,
вхождения которых образуют набор $A$.

\item (содержится $x$ $A$). $A$ есть список таких переменных,
идентифицируемых под квантором либо описателем по теоремной
переменной $x$, для которых компиля\-тор не создает операторы,
проверяющие их независимость от $x$.

\item (результподст $x$ $A$). Теоремная переменная $x$
идентифицирована как на\-бор термов, используемых в функциональных
конструкциях в качестве набора опе\-ран\-дов. $A$ - программное
выражение для этого набора термов.

\item (свобоперанд $x$ $y$). Терм, идентифицированный с теоремной
переменной $x$, не содержит свободных вхождений переменной,
идентифицированной с теоремной переменной $y$.

\item (связка $A$). $A$ - программное выражение, определяющее одну
из переменных связывающей приставки идентифицируемого квантора
либо описателя.

\end{enumerate}

\subsection{Идентификация вхождений}

Перечислим основные типы элементов, определяющих идентификацию
вхождений в теорему приема либо несущих информацию, используемую
при идентификации вхождений.

\begin{enumerate}

\item (операнд $A$ $B$). $A$ - вхождение в теорему; $B$ -
программное выражение для вхождения, идентифицированного с $A$.
Заметим, что, вообще говоря, такой элемент может быть введен не
для всех вхождений в теорему. Это происходит из-за того, что
иногда вхождение идентифицируется с подтермом, полученным
некоторыми простыми преобразованиями (например, группировкой)
рас\-смат\-ри\-ва\-емого терма задачи.

\item (набороперандов $A$ $B$). $A$ - вхождение в теорему терма
$f(\ldots)$, где $f$ - ассоциа\-тив\-ный и коммутативный
логический символ. $B$ - программное выражение, значением которого
является набор термов, перечисляющий еще не
иден\-ти\-фи\-цированные операнды той операции, которая
идентифицируется с $A$.

\item (базавхождения $A$ $B$). $A$ - вхождение в теорему; $B$ -
программное выражение для подтерма, идентифицированного с $A$. В
отличие от элемента (операнд $\ldots$), этот элемент используется
крайне редко.

\item (ассоциативно $A$ $B$). $A$ - вхождение в теорему терма
$f(\ldots)$, где $f$ - ассоциатив\-ный, но не коммутативный
символ. $B$ - программное выражение, значением которого является
вхождение последнего идентифицированного операнда опе\-ра\-ции,
идентифицируемой c $A$.

\item (Выч $v$ $A$). $v$ - вхождение операнда, для которого
найдено программное выра\-же\-ние $A$, определяющее его численное
значение в формате с плавающей запятой.

\item (длялюбого $A$). Разрешается идентифицировать конъюнкцию
либо дизъюнк\-цию, корневое вхождение которой в теорему есть $A$,
с подмножеством анте\-це\-ден\-тов кванторной импликации.

\item (подтерм $A$). $A$ - корневое вхождение в теорему одной из
подлежащих иден\-ти\-фи\-кации частей, отличной от той части, в
которой находится точка привязки.

\item (обрыв $x$). $x$ - программная переменная, имеющая своим
значением корне\-вое вхождение вспомогательного подтерма,
введенного в процессе идентифика\-ции.

\item (количествооперандов $A$). $A$ - вхождение в теорему.
Элемент указывает на то, что в программу уже введен оператор,
проверяющий совпадение чисел операндов операции $A$ и операции,
идентифицированной с $A$.

\item (смравно $A$). $A$ - набор вхождений в теорему, выделенных
указателем "смрав\-но($\ldots$)". Эти вхождения идентифицируются
либо непосредственно, либо с пе\-ре\-хо\-дом через имеющиеся в
контексте идентификации тождества для иден\-ти\-фи\-цирующего
подтерма.

\end{enumerate}

\subsection{Учет посылок, используемых приемом}

Обычно процедуры, выполняющие преобразование приема, получают в
числе своих входных данных список использованных приемом посылок.
Он составля\-ет\-ся как объединение подсписков, определяемых по
мере продвижения от начала про\-грам\-мы приема к концу. Для
сохранения в процессе компиляции ссылок на программные выражения,
значениями которых служат эти подсписки, вводятся информационные
элементы различных типов. Перечислим основные типы таких
элементов, а также некоторых других элементов, связанных со
списком утверждений, образующих кон\-текст применения приема (эти
утверждения называем посылками приема).

\begin{enumerate}

\item (выводимо $x$). $x$ - программная переменная либо
программное выражение, зна\-че\-нием которого становится подсписок
использованных посылок. Подсписки, определяемые такими
программными выражениями, могут пересекаться.

\item (посылка $x$). $x$ - программная переменная, значением
которой служит либо 0, либо некоторая использованная приемом
посылка.

\item (проверка $x$). $x$ - программная переменная, значением
которой служит па\-ра (выводимо $A$), где $A$ - подсписок
использованных посылок.

\item (списокпосылок $x$). $x$ - программная переменная либо
программное выражение для всего списка посылок, определяющего
контекст применения приема.

\item (коррекцияпосылок $x$). $x$ - программная переменная для
комментария (кор\-рек\-ци\-я\-посылок $A$) к использованному
приемом нормализатору. Такие коммента\-рии указывают выведенные из
посылок нормализатора утверждения, которые могут понадобиться для
пополнения контекста срабатывания приема (напри\-мер, для
сопровождения по о.д.з. новых выражений, возникших после
при\-ме\-нения нормализатора). Набор $A$ состоит из троек ($B_1$
$B_2$ $B_3$), где $B_3$ - посылки, из которых вытекает утверждение
$B_1$; $B_2$ - либо 0, либо некоторое подмно\-жест\-во списка
$B_3$, являющееся следствием утверждения $B_1$ и остатка
утвержде\-ний списка $B_3$.

\item (посылки $A$ $B$). $B$ есть набор дополнительных посылок,
используемых при обработке нормализаторами теоремного терма $A$.

\item (чисткапосылок $A$ $x$ $B$). $B$ есть фильтр, отбирающий
утверждения, исключае\-мые из списка посылок при обработке
нормализаторами теоремного терма $A$. $x$ - переменная,
обозначающая в фильтре $B$ исключаемое утверждение.

\item (занесениепосылки $v$ $A$). $v$ - вхождение антецедента
теоремы приема, при обра\-бот\-ке которого вводится дополнительная
посылка, определяемая теоремным термом $A$.

\item (удалениепосылок $v$ $x$ $A$). $v$ - вхождение антецедента,
при обработке кото\-ро\-го происходит удаление посылок, отбираемых
фильтром $A$. В этом фильтре удаляемая посылка обозначается
переменной $x$.

\end{enumerate}

\subsection{Списки переменных}

Перечислим информационные элементы, указывающие различные
используемые в процессе компиляции списки переменных.

\begin{enumerate}

\item (новаяпеременная $A$). $A$ - программное выражение,
значением которого служит набор переменных, использованных на
текущий момент в контексте сраба\-ты\-ва\-ния приема. Это
выражение используется при выборе новых переменных создаваемых
приемом термов.

\item (переменные $A$ $B$). $A$ - вхождение в теорему квантора
либо описателя; $B$ - программное выражение для связывающей
приставки этого квантора либо опи\-са\-теля.

\item (квантор $A$). $A$ - программное выражение для набора
переменных, иден\-ти\-фи\-ци\-рованного с некоторой переменной из
связывающей приставки идентифи\-ци\-ру\-емого квантора либо
описателя.

\item (списокпеременных $A$). $A$ есть список теоремных
переменных, используемых на текущий момент компиляции; в этот
список включаются также переменные фильтров и указателей приема.
Элемент нужен для выбора новых переменных во вспомогательных
логических конструкциях, вводимых при компиляции. В основном, это
имеет место при обработке сложных программно реализуемых
антецедентов.

\item (свобвхождение $x$ $A$). Теоремная переменная $x$
идентифицируется с термом, не имеющим свободных вхождений
переменных из набора переменных, опре\-де\-ля\-е\-мо\-го
программным выражением $A$.

\end{enumerate}

\subsection{Антецеденты и указатели дополнительной
иден\-ти\-фи\-ка\-ции}

Перечисляются информационные элементы, связанны с обработкой
антецедентов и указателей дополнительной идентификации. Многие из
них дублируют соответст\-ву\-ю\-щие указатели приема - это
делается для того, чтобы вместо косвенной ссылки на антецедент
через указатель его вхождения получить непосредственную ссылку на
само вхождение.

\begin{enumerate}

\item (антецедент $A$ $B$). $A$ - вхождение в теорему
непосредственно идентифициру\-е\-мо\-го антецедента. $B$ - сначала
0, а затем программное выражение для утвержде\-ния из контекста
срабатывания приема, идентифицированного с этим
ан\-те\-це\-ден\-том.

\item (блокпроверок $A$). $A$ - набор вхождений антецедентов
теоремы, для которых предусмотрено обращение к проверочному
оператору.

\item (мнимаячасть $A$). $A$ - набор вхождений антецедентов
теоремы, для которых предусмотрено обращение к усиленному
проверочному оператору. Название элемента ранее было другим,
однако изменилось из-за переименования ло\-ги\-чес\-кого символа,
который в некоторый момент развития системы оказался
не\-ис\-поль\-зуемым по своему прямому назначению.

\item (вхождениевзадачу $A$ $B$ $C$). $A$ - вхождение в теорему;
$C$ - программная пе\-ре\-мен\-ная либо программное выражение,
указывающие на идентификацию $A$ с подтермом посылки текущей
задачи (значение $C$ равно 0) либо с подтермом условия (это
значение равно 1). $B$ - программное выражение либо программная
переменная, указывающие вхождение рассматриваемой посылки либо
усло\-вия в список посылок (условий).

\item (позиция $x$ $A$ $B$ $C$). $A$ - программное выражение,
определяющее задачу. $C$ - программное выражение, определяющее
вхождение идентифицированной с теоремной переменной $x$ посылки
при $B=0$ либо идентифицированного с $x$ условия при $B=1$ в
соответствующий список задачи $A$.

\item (идентификатор $A$). $A$ есть вхождение антецедента теоремы,
выделенного ука\-за\-те\-лем "идентификатор($\ldots$)".

\item (начало $A$ $B$). $A$ есть корневое вхождение антецедента,
обработка которого начинается сразу же, как только определяются
значения теоремных перемен\-ных списка $B$.

\item (конец $A$). $A$ есть список вхождений антецедентов,
компилируемых после об\-ра\-бот\-ки идентифицирующих антецедентов.

\item (копия $A$). $A$ есть список термов, используемых внутри
указателя дополни\-тель\-ной идентификации "контекст($\ldots$)" \
в конструкциях "вид($\ldots$ $A$)", "подтерм($A$)".

\item (примечпосылки $v$). $v$ есть вхождение антецедента,
идентифицируемого с по\-сыл\-кой задачи.

\item (замечусловие $v$). $v$ есть вхождение антецедента,
идентифицируемого с усло\-ви\-ем задачи.

\item (спуск $A$). При компиляции приема проверочного оператора
после обработки антецедентов, корневые вхождения которых
перечислены в списке $A$, вводит\-ся дополнительный фрагмент
программы, обрывающий при откате процесс применения этого
оператора.

\item (откат $v$). $v$ есть вхождение антецедента, после обработки
которого прове\-роч\-ным оператором располагается ветвь программы,
инициирующая обрыв внеш\-не\-го перечисления при откате.

\item (сброс $A$). $A$ есть вхождение антецедента теоремы приема
пакетного оператора, такое, что при неустановлении его истинности
происходит выход из опера\-то\-ра по значению "ложь".

\item (входвтерм $v$). $v$ есть вхождение антецедента, выделенного
указателем приема "теквхожд($\ldots$)".

\item (повтор $v$ $A$). Непосредственно идентифицируемый
антецедент теоремы приема проверочного оператора, вхождение
которого есть $v$, идентифицируется без учета комментариев
(исключение $\ldots$), блокирующих повторное использование
антецедентов в цепочках рекурсивных обращений. $A$ - сначала 0, а
затем про\-грам\-мная переменная для утверждения,
идентифицированного с $v$.

\item (смпосылка $A_1$ $A_2$). $A_1$ есть вхождение антецедента,
непосредственная иденти\-фи\-ка\-ция которого не начинается до тех
пор, пока не идентифицированы пе\-ре\-мен\-ные списка $A_2$.

\item (транзитоперанд $A$). $A$ - вхождение антецедента, имеющего
вид $E(a \ b)$, где $E$ - отношение эквивалентности, для
идентификации операндов которого ис\-поль\-зу\-ет\-ся оператор
"транзитоперанд".

\item (дизъюнктчлен $A_1$ $A_2$ $A_3$ $A_4$). $A_1$ - набор
вхождений антецедентов, выделен\-ных указателем
"дизъюнктчлен($\ldots$)". $A_2$ - сначала 0, а затем программная
переменная для накопителя дизъюнктивных членов заменяющего терма
(сле\-ду\-ющая после нее программная переменная используется в
качестве накопите\-ля информационных элементов оператора
"заменавхождения"). $A_3$ - сначала 0, а затем метка отката при
обрыве идентификации. $A_4$ - сначала 0, а затем набор меток
отката для продолжения перечислений идентифицируемых
дизъюнк\-тив\-ных членов; длина его равна длине набора $A_1$.

\end{enumerate}

\subsection{Идентификация функциональных переменных}

Функциональные переменные $f(x_1 \ldots x_n)$, встречающиеся в
теореме приема, обыч\-но выделяются указателями "отображение($f$)"
\ и используются для идентифика\-ции некоторого терма $A$,
содержащего переменные $y_1, \ldots , y_n$, идентифицирован\-ные с
$x_1, \ldots , x_n$. Далее $A$ начинает играть роль шаблона, по
которому определяются выражения $f(t_1 \ldots t_n)$ с новыми
термами $t_1, \ldots t_n$. Допускаются также некото\-рые другие
типы функциональных переменных (например, при идентификации
много\-чле\-нов). Перечислим основные типы информационных
элементов программного бло\-ка, связанные с функциональными
переменными.

\begin{enumerate}

\item (отображение $A$ $B$). $B$ есть вхождение в теорему приема
выражения "значение($A$ $x$)", выделенного указателем
"отображение($\ldots$)".

\item (функция $f$ $A$ $B$ $C$). $f$ есть теоремная переменная для
функции; $A$ - набор теоремных переменных - аргументов функции,
либо программная переменная, значением которой служит этот набор;
$B$ - либо 0, либо программное выражение для утверждения,
задающего область определения $f$. Для $C$ имеется одна из
следующих возможностей:

а) $C=0$;

б) $C$ - пара (вхождение $D$), где $D$ - программное выражение,
определяющее вхождение выражения для значения функции $f$;

в) $C$ - пара (терм $D$), где $D$ - программное выражение,
определяющее выраже\-ние для значения функции $f$;

г) $C$ - тройка (функподст $D_1$ $D_2$), где $D_1$ - программное
выражение для на\-бо\-ра переменных либо нулей, $D_2$ -
программное выражение для терма, при\-чем выражение для значения
функции $f$ определяется операторным выраже\-ни\-ем
"функподст($D_2$ $A$ $D_1$ $T$)". Этот случай встречается крайне
редко.

\par\medskip

Заметим, что практически всегда $B$ равно 0, так как при
идентификации функ\-ци\-ональной переменной $f(x)$ область
определения функции $f$ не фиксиру\-ет\-ся. Однако, есть одно
исключение - определение функциональной переменной $f$ из
равенства $f = \mbox{отображение}(\ldots)$. Здесь область
определения может быть найдена, и для нее вводится программное
выражение $B$.

\item (заменатермов $f$ $A_1$ $A_2$ $A_3$). Элемент вводится при
наличии указателя прие\-ма "заменатермов($\ldots$)", выделяющего
подтерм "значение($f$ $A$)". $A_1$ - вхождение в теорему приема
данного подтерма. $A_2,A_3$ - сначала нули; затем $A_2$ -
програм\-м\-ное выражение для терма, идентифицированного с $A_1$,
$A_3$ - программ\-ное выражение для набора вхождений в него терма,
идентифицированного с $A$.

\item (сммногочлен $x$ $A$). Теоремная переменная $x$
идентифицируется с многочленом. $A$ - сначала 0, а затем
программное выражение для набора коэффициен\-тов многочлена,
представленных в формате термов и расположенных по возраста\-нию
степеней. В этот набор включены нулевые коэффициенты.

\item (видмногочлена $v$). Выражение "суммавсех($\ldots$)" \ по
вхождению $v$ иденти\-фи\-ци\-руется как многочлен.

\item (вхождениетерма $f$ $A$). $f$ - функциональная переменная,
выделенная указате\-лем приема "вхождение($f$)". $A$ - программное
выражение для вхождения под\-тер\-ма, идентифицированного с
теоремным выражением "значение($f$ $B$)".

\item (новоперанд $f$ $A$). $A$ есть набор программных выражений
для вхождений опе\-ран\-дов терма, идентифицированного с теоремным
выражением $f(A_1, \ldots, A_n)$, выделенного указателем
"симметрично". Элемент используется для упорядо\-че\-ния операндов
новых термов вида $f(B_1 \ldots B_n)$, создаваемых приемом. Это
упорядочение согласуется с исходным упорядочением для $A_1, \ldots
A_n$.

\item (функподст $f$ $A_1$ $A_2$). Переменная $f$, выделенная
указателем "функподст($f$ $g$)", идентифицирована с термом,
определяемым программным выраже\-ни\-ем $A_1$, причем программное
выражение $A_2$ определяет набор вхождений в дан\-ный терм термов
"значение($g$ $\ldots$)".

\item (Набор $f$). Функциональная переменная $f$ идентифицируется
с набором функ\-ций.

\end{enumerate}

\subsection{Идентификация наборов}

Перечисляем основные информационные элементы программного блока,
исполь\-зуе\-мые при идентификации конечных наборов термов.

\begin{enumerate}

\item (набор $A$ $B$). $A$ есть вхождение в заменяемый терм
теоремы приема ассоциа\-тив\-но-коммутативной операции,
расформируемой в набор термов согласно ука\-за\-те\-лю приема
"набор(первыйтерм)". $B$ - сначала 0, а затем программное
вы\-ра\-же\-ние для вхождения $A$.

\item (перечень $A$ $B$ $C$ $D$). $A$ есть вхождение в заменяющий
терм ассоциатив\-но-коммутативной операции, являющейся результатом
группировки при выпол\-не\-нии приема с указателем
"набор(второйтерм)". $B$ - вхождение подтерма за\-ме\-ня\-емого
терма, используемого в качестве шаблона при идентификации
груп\-пи\-ру\-емых термов; $C$ - переменная из $B$, варьируемая
при группировке; $D$ - сначала 0, а затем программное выражение
для терма, идентифицирован\-но\-го с $A$.

\item (список $A$). $A$ - список вхождений в теорему, определяющих
наборы, элемен\-ты которых идентифицируются без учета порядка.

\item (развертка $A$). $A$ - набор подтермов теоремы приема,
выделенных указате\-ля\-ми приема "развертка($\ldots$)". Эти
подтермы идентифицируются либо создаются с переходом от
функциональных конструкций к конечным наборам (например, вместо
"сигмы" \ рассматривается обычная сумма).

\item (пусто $A$). $A$ - выделенное указателем
"развертка($\ldots$)" \ вхождение в тео\-ре\-му приема подтерма,
который может идентифицироваться с пустым спис\-ком операндов.

\item (элементыматрицы $f$ $A$ $m$ $n$). $f$ - функциональная
переменная, идентифи\-ци\-ру\-е\-мая по указателю приема
"матрица($\ldots$)". $A$,$m$,$n$ - программные выраже\-ния,
соответственно, для набора наборов (строк) элементов матрицы,
задан\-ных термами; для числа строк и числа столбцов матрицы,
также заданных тер\-ма\-ми.

\item (матрица $A$). $A$ - вхождение в теорему приема выражения
"отображение($\ldots$)", идентифицируемого либо формируемого как
прямоугольная матрица.

\item (модифсборка $v$ $w$). $v$ - вхождение в теорему терма
"набор($\ldots$)", при фор\-ми\-ро\-вании которого предпринимается
такая же перестановка операндов, как при идентификации задающего
набор терма по вхождению $v$.

\item (вектор $x$ $A$). $x$ - функциональная теоремная переменная,
идентифицируемая с помощью кванторной импликации в антецеденте как
набор термов. $A$ - про\-грам\-мная переменная для накопителя этих
термов.

\item (длинанабора $x$ $A$). $x$ - функциональная теоремная
переменная, иденти\-фи\-ци\-руемая как набор термов. $A$ -
программное выражение для длины этого набора, представленной в
формате терма.

\item (функции $x$ $A$). $x$ - функциональная теоремная
переменная, идентифициру\-е\-мая с помощью кванторной импликации в
антецеденте как набор функциональных переменных. $A$ - программная
переменная для набора пар (набор аргументов функциональной
переменной - выражение для значения функциональной
пе\-ре\-менной).

\end{enumerate}

\subsection{Вычисления}

При идентификации теоремных переменных им могут сопоставляться в
качест\-ве значений не логические структуры данных (термы), а
используемые в реализуемых приемом вычислениях технические
структуры данных. Для такой идентификации, ориентированной на
вычисления, предусмотрены специальные информационные эле\-мен\-ты
программного блока. Ограничимся здесь указанием основного типа
таких элементов. Это элемент (транслвыражения $x$ $A$ $t$).
Значение теоремной переменной $x$ в формате $t$
вы\-чис\-ли\-тельных данных ГЕНОЛОГа определяется программным
вы\-ра\-же\-нием $A$. Типы используемых для вычислений форматов
перечислены в справочной информации логического символа "тип".

\subsection{Особенности идентификации}

Для указателей приема, определяющих особенности идентификации,
обычно вво\-дят\-ся двойники в информационных элементах
программного блока. Они имеют не\-по\-сред\-ственные ссылки на
вхождения в теорему приема (вместо указателей вхождений
"фикс($\ldots$)") и сохраняют программные выражения, определяющие
идентификацию.

\begin{enumerate}

\item (единица $A$ $B$ $C$). Элемент вводится по указателю приема
"единица($\ldots$)". $A$ - вхождение в теорему некоторой операции
$f$; $B$ - вхождение операнда этой операции. При идентификации
учитывается возможность равенства данного операнда логическому
символу $C$, являющемуся единицей операции $f$.

\item (отрицание $A$). Элемент вводится по указателю
"отрицание($\ldots$)". $A$ есть вхож\-де\-ние в теорему выражения
$f(x)$, такого, что для одноместной операции $f$ в ее области
определения выполняется тождественно $f(f(x))=x$. При
иден\-ти\-фи\-кации $f(x)$ с термом $B$ в качестве $x$ может быть
взято $f(B)$.

\item (заголовок $A$). Элемент указывает на то, что при
идентификации подтер\-ма, расположенного по вхождению $A$ в
теорему приема, заголовок иденти\-фи\-ци\-ру\-ющего терма не
обязан совпадать с заголовком идентифицируемого. Этот элемент
вводится в самых различных ситуациях - при наличии операнда
дву\-мест\-ной операции, который может обратиться в единицу; при
идентифика\-ции с указателем "отрицание", и т.д. При компиляции он
блокирует ввод опера\-то\-ра, проверяющего совпадение заголовков
идентифицируемого и иденти\-фи\-ци\-ру\-ющего термов.

\item (заменазнака $A$ $B$ $x$ $D$ $C$). Элемент вводится по
указателю приема "заменазна\-ка($\ldots$)". $A$ есть вхождение в
теорему терма $f(\ldots x \ldots)$. Если он идентифици\-ру\-ет\-ся
с термом вида $B(f(\ldots t \ldots ))$, то последний
представляется как $f(\ldots D(t)\ldots)$. $C$ - сначала 0, а
затем программное выражение для вхождения
иденти\-фи\-ци\-ру\-ющего терма - $B(f(\ldots t \ldots))$ либо
$f(\ldots t \ldots)$.

\item (пересечениесписков $A$). $A$ есть вхождение в теорему
подтерма, при иденти\-фи\-кации с которым будет использоваться
справочник "пересечениесписков". При этом заголовки
идентифицирующего и идентифицируемого термов мо\-гут оказаться
различными.

\item (знаксуммы $A_1$ $A_2$ $A_3$). Элемент вводится по указателю
приема "знаксуммы($A_1$ $B$)". $A_2$ - вхождение в теорему приема,
определяемое по указателю вхожде\-ния $B$. $A_3$ - сначала 0, а
затем программная переменная, являющаяся индикатором замены знака
$A_1$ у группы операндов по данному вхождению. Этот индикатор
принимает значение 0, если знак не изменен, и значение 1, если
изменен.

\item (нормзнака $A$ $B$). $A$ есть вхождение в теорему операнда
$C(x)$ ассоциа\-тив\-но-коммутативной операции $D$,
идентифицируемого как набор $D$ - операндов тер\-ма,
идентифицированного с $x$, у которых "знак" \ $C$ изменен на
противо\-по\-лож\-ный. $B$ - сначала 0, а затем программное
выражение для указанного на\-бо\-ра операндов с измененным знаком.

\item (логарифмы $A$ $B$). Элемент вводится по указателю приема
"группировка($x$)". $A$ - вхождение в идентифицируемую часть
теоремы приема терма $f(x \ C)$. $B$ - указатель этапов обработки
указателя в процессе компиляции, принимаю\-щий последовательно
значения 0,1 и 2. Заголовок элемента ранее был другим, но
впоследствии изменился из-за переименования логического символа.

\item (группировки $A$ $x$ $B$). Элемент вводится по указателю
приема "группировки($x$ $C$)". $A$ есть вхождение в заменяемый
терм выражения $f(x \ y)$, опре\-де\-ля\-е\-мое указателем. $B$ -
сначала 0, а затем программное выражение для набора
участ\-во\-вав\-ших в идентификации $f(x \ y)$ термов.

\item (подстановка $A$ $x$ $B$). Элемент вводится по указателю
прием "подстановка($\ldots$)". $A$ есть вхождение в заменяемый
терм операнда ассоциативно-коммутативной операции, содержащего
переменную $x$. При идентификации допускается от\-сут\-ствие
такого операнда, и тогда $x$ идентифицируется с однобуквенным
термом, состоящим из логического символа $B$.

\item (свертка $x$ $A$ $B$ $C$). Элемент вводится по указателю
приема "свертка($\ldots$)". Теоремная переменная $x$
идентифицируется с термом, определяемым про\-грам\-мным выражением
$A$, определяемым в процессе компиляции (вначале $A$ равно 0), и
порождает вспомогательное обозначение согласно указателю. Это
обо\-зна\-чение представляет собой переменную, являющуюся
значением програм\-м\-ной переменной $C$ (вначале $C$ равно 0).
$B$ - утверждение, определяющее до\-пол\-ни\-тель\-ные посылки при
вводе вспомогательного обозначения.

\item (контроль $x$ $A$). Вхождения переменной $x$ в
идентифицируемую часть тео\-ре\-мы приема расположены только
внутри подтермов, выделенных указателями приема
"подстановка($\ldots$)". $A = (A_1, \ldots , A_n)$ - набор
вхождений первых сим\-во\-лов этих подтермов. При идентификации
очередного $A_i$ учитывается воз\-мож\-ность того, что $x$ еще не
определена, т.е. соответствующая программ\-ная переменная для
терма, идентифицируемого с $x$ в цикле просмотра вхожде\-ний
$A_i$, равна 0. По окончании этого цикла проверяется, что $x$
идентифициро\-ва\-на с некоторым термом.

\item (общаястепень $A_1$ $A_2$ $A_3$ $A_4$ $A_5$). Элемент
вводится по указателю "общаясте\-пень($\ldots$)". $A_1$ есть
заголовок вспомогательного оператора, используемого для выделения
общего подтерма из заданного набора термов; $A_2$ - теоремная
пере\-мен\-ная, идентифицируемая с выделенным общим подтермом;
$A_3$ - набор пе\-ре\-мен\-ных, идентифицируемых с остатками
термов исходного набора; $A_4$ - на\-бор вхождений в теорему,
соответствующих термам исходного набора. $A_5$ - сначала набор из
нулей, имеющий ту же длину, что $A_4$, затем - набор программных
выражений для термов исходного набора.

\item (учетзнака $A$). $A$ есть заменяющий терм для приемов,
имеющих указа\-тель "знаксуммы($\ldots$)".

\item (второйоперанд $A$ $x$). $A$ есть вхождение в теорему такой
ассоциативно-ком\-му\-та\-тивной операции, что теоремная
переменная $x$ либо функциональная перемен\-ная "значение($x$
$B$)" \ идентифицируется как ее непосредственный операнд.

\item (альтернатива $A$ $B$). По вхождениям в теорему,
перечисленным в списке $A$, могут находиться (обязательно сразу по
всем этим вхождениям) альтернатив\-ные логические символы,
перечисленные в наборе $B$.

\item (дробь $A_1$ $A_2$ $A_3$ $A_4$). Элемент вводится по
уазателю "дробь($\ldots$)". $A_1$ - на\-бор вхождений двуместных
некоммутативных операций либо отношений, при идентификации либо
формировании которых допустима (одновременная для всех вхождений)
перестановка операндов. $A_2$, $A_3$ - сначала нули, а затем
про\-грам\-мные выражения для вхождения, идентифицированного с
одной из этих операций и вхождения, идентифицированного с ее
первым операндом. $A_4$ - набор теоремных термов, при формировании
которых предпринимается син\-хрон\-ная с $A_1$ перестановка
операндов их корневой двуместной операции.

\item (схемаоперандов $v$ $A_1$ $A_2$). $v$ - вхождение в теорему
символа операции, до\-пус\-ка\-ющей частичные перестановки своих
операндов. $A_1$ - древовидная структура, определенная операторным
выражением "схемаоперандов($\ldots$)" \ для возмож\-ных
перестановок операндов данной операции. $A_2$ - набор троек (1
$B_1$ $B_2$), у кото\-рых $B_1$ - набор из дерева $A_1$ либо
вхождение операнда операции $v$; $B_2$ - программ\-ное выражение
для $B_1$. $A_2$ указывает на уже проведенную идентифика\-цию
операндов операции $v$.

\item (вычеркивание $A$). При идентификации термов, перечисленных
в списке $A$, не используется справочник "пересечениесписков".

\item (первыйтерм $A$). $A$ есть подтерм, идентифицируемый, как
первый операнд внеш\-ней ассоциативно-коммутативной операции.

\item (внешнийквантор $v$). $v$ - вхождение квантора общности либо
существова\-ния, идентифицируемого без учета возможного перехода к
отрицанию.

\item (обобщподст $v$). $v$ - вхождение квантора, для которого при
идентификации не предпринимается проверка невхождения переменных
связывающей при\-став\-ки в термы, идентифицированные с
переменными, не входящими в эту пристав\-ку.

\item (коммутативно $v$). $v$ - вхождение коммутативной
неассоциативной операции, которая при идентификации
рассматривается как некоммутативная.

\item (циклупорядочение $v$ $A$). При идентификации операции по
вхождению $v$ до\-пус\-ка\-ются перестановки операндов. Если $A =
0$, то такие перестановки - произ\-воль\-ные циклические; если $A
= 1$, то допускается лишь одна цикличес\-кая перестановка, при
которой перечисление начинается со второго операндов; если $A =
2$, то допускается не циклическая перестановка операндов, а
изменение их порядка на противоположный. Если $A = 3$, то
допускаются произвольные перестановки операндов. Если $A = 4$, то
допускаются произвольные цикли\-чес\-кие перестановки и изменение
порядка операндов на противоположный.

\item (подобны $v$ $x$). Сопровождает элемент (циклупорядочение
$v$ 4), указывая про\-граммную переменную $x$ - индикатор прямого
($x = 0$) либо обратного ($x = 1$) направления перечисления
операндов.

\item (вид $v$). При идентификации подтерма по вхождению $v$
блокируется примене\-ние справочника "вид".

\item (делители $v$). При идентификации операции по вхождению $v$
используется спра\-вочник "делители".

\item (замены $v$ $A$). Подтерм по вхождению $v$ может иметь при
идентификации любой из альтернативных заголовков списка $A$.

\item (коэффициент $v$ $x$ $t$). Слагаемое по вхождению $v$
идентифицируется как сум\-ма всех членов, представимых в виде
произведения на выражение, определяемое теоремным термом $t$ (без
перемножения степеней с одинаковым основанием). Теоремная
переменная $x$ при этом идентифицируется как сумма
соответст\-ву\-ю\-щих коэффициентов при $t$.

\item (сдвиг $v$ $A$ $t$ $X$). При идентификации подтерма по
вхождению $v$ допускается циклическая перестановка его корневых
операндов, символьные номера кото\-рых образуют список $A$. $t$ -
терм, при формировании которого осуществляется синхронная
перестановка операндов. $X$ - сначала 0, а затем программная
пе\-ре\-мен\-ная, значением которой является величина циклического
сдвига.

\item (перегруппировка $A$). $A$ - набор вхождений в теорему
двуместных отношений, идентификация которых происходит с
группировкой всех "ненулевых" \ чле\-нов в одной части.

\item (Отрицание $v$). $v$ есть вхождение эквивалентности, которая
должна иденти\-фи\-ци\-ро\-ваться с возможным переходом к
отрицаниям своих частей.

\end{enumerate}

\subsection{Нормализаторы приема}

Нормализаторы приема, определяемые термами "быстрпреобр($\ldots$)"
\ из описания при\-ема, в процессе компиляции порождают
информационные элементы программ\-но\-го блока (быстрпреобр $A_1$
$A_2$ $A_3$ $A_4$ $A_5$). Здесь $A_1$ - терм, подлежащий обработке
нормализаторами (т.е. пакетными операторами либо вспомогательными
задачами). Заголовки применяемых к $A_1$ операторов либо термы
"задача($\ldots$)", определяющие вспомогательные задачи, собраны в
набор $A_2$. Они расположены в нем с сохранением порядка
обработки. $A_3$ - набор той же длины, что и $A_2$. Его элементы
суть наборы программных выражений, определяющих остальные входные
данные пакетных нор\-ма\-лизаторов, следующие за обрабатываемым
термом (т.е. список посылок и список комментариев, либо только
список комментариев, либо пустой набор - в зависимос\-ти от
формата оператора). $A_4$ - набор той же длины, что и два
предыдущих. Его элементы - сопровождающие обращение к
нормализатору термы "условие($\ldots$)", "ва\-риант($\ldots$)",
"лимит($\ldots$)". $A_5$ сначала равно 0, в процессе компиляции
становится равно 1, а затем заменяется на программное выражение
для результата нормализа\-ции.

Информационный элемент (быстрпреобр $\ldots$) создается лишь после
того, как ком\-пи\-ляция определяет всю необходимую для получения
его программных выраже\-ний информацию. Создание этих элементов
осуществляется процедурой
"учет\-нор\-ма\-ли\-за\-торов($\ldots$)", обращения к которой
расставлены в различных точках компилятора. При очередном
обращении дополнительно вводятся те элементы (быстрпреобр
$\ldots$) для которых информация уже есть.

\subsection{Комментарии, изменяемые приемом}

Для работы с комментариями компилятор использует следующие
информационные элементы:

\begin{enumerate}

\item (коммент $A$). Уже учтен указатель приема $A$, связанный с
обработкой ком\-мен\-та\-ри\-ев.

\item (примечание $A$). $x$ есть программная переменная для
накопителя коммента\-ри\-ев к формируемому либо изменяемому
утверждению. Этот накопитель представ\-ля\-ет собой одноэлементный
набор, состоящий из комментариев.

\item (комментарий $A$ $B$ $x$). $A$ есть идентифицирующий терм
"комментарий($\ldots$)" \ либо "комментарийпосылки($\ldots$)"; $x$
- программная переменная, идентифи\-ци\-ру\-е\-мая с
соответствующим комментарием. $B$ - в случае комментария к
посыл\-ке либо условию есть пара (программное выражение для
вхождения данной посылки либо условия  - программное выражение для
указателя на посылку (0) либо на условие (1)). В случае
комментария либо комментария посылок $B$ представляет собой
указатель, равный 0 для комментария к посылкам, 1 - для
комментария к задаче, и 2, если тип комментария определяется типом
задачи: для задачи на исследование - комментарий к посылкам, иначе
- комментарий к задаче.

\item (замечание $x$). $x$ есть программная переменная,
определяющая список ком\-мен\-та\-ри\-ев пакетного оператора, к
которому относится компилируемый прием.

\item (буфер $A$ $x$). $x$ есть программная переменная,
используемая в качестве на\-ко\-пи\-те\-ля элементов, заносимых
приемом нормализатора перед выполнением за\-ме\-ны в набор $B$
комментария ($A$ $\ldots$ $B$).

\item (внутрвывод $x$). $x$ есть программная переменная для
вспомогательного списка комментариев, используемого при обращении
к нормализаторам из приема па\-кет\-но\-го анализатора.

\end{enumerate}

\subsection{Дополнительные преобразования}

Для учета действий с посылками и условиями задачи, дополняющих
основное пре\-об\-ра\-зо\-вание приема, используются следующие
информационные элементы:

\begin{enumerate}

\item (удалениеусловия $x$). $x$ есть программная переменная,
значением которой слу\-жит набор - накопитель удаляемых условий
задачи на описание.

\item (удалениепосылки $x$). $x$ есть программная переменная,
значением которой яв\-ля\-ется набор - накопитель удаляемых
посылок задачи.

\item (учетвывода $x$). $x$ есть программная переменная, значением
которой являет\-ся набор пар ($A_1 \ A_2$) входных данных
оператора "вывод" \ либо "выводусловия", используемого при
сопровождении преобразований: $A_1$ - добавляемое утверж\-де\-ние;
$A_2$ - набор сопутствующих данных.

\item (ключвывода $x$). $x$ есть программная переменная, значением
которой слу\-жит набор (вывод $A_1$ $A_2$ $A_3$), заносимый в
список сопутствующих данных при\-ме\-ня\-е\-мо\-го преобразователя
для вывода дополнительного утверждения $A_1$.

\end{enumerate}

\subsection{Информация о задачах}

Для сохранения информации о рассматриваемых в контексте применения
прие\-ма задачах используются следующие информационные элементы:

\begin{enumerate}

\item (текущаязадача $A$). $A$ есть программное выражение для
текущей задачи.

\item (текущийуровень $A$). $A$ есть программное выражение для
текущего уровня текущей задачи.

\item (исходнаязадача $A$). $A$ есть программное выражение для
исходной задачи.

\item (надзадача $A_1$ $A_2$ $A_3$ $A_4$). $A_1,A_2,A_3,A_4$ суть
программные выражения, опре\-де\-ля\-ю\-щие внешнюю задачу $A_1$ и
координату ($A_2,A_3,A_4$) вхождения в нее пре\-об\-ра\-зуемого
терма. При этом $A_2$ - однобуквенное выражение, состоящее из
переменной.

\item (вход $A$). Текущая задача - на исследование. $A$ есть
программное выражение для внешней задачи на описание.

\end{enumerate}

\subsection{Разное}

В заключение приведем еще ряд информационных элементов, не
попавших в пре\-ды\-ду\-щие разделы.

\begin{enumerate}

\item (определено $A$ $x$). Идентификация подтерма $A$ не должна
начинаться до тех пор, пока не идентифицирована переменная $x$.
Элемент определяется ука\-за\-те\-лями приема, уточняющими
последовательность идентификации. Такое уточ\-нение может быть
необходимо для ускорения отсечения при попытке при\-ме\-нения
приема.

\item (видпеременной $x$). Обработка выделенных указателем
"идентификатор($\ldots$)" \ антецедентов - равенств с переменной
$x$ в одной из своих частей - не начина\-ет\-ся до тех пор, пока
не идентифицировано значение переменной $x$.

\item (прогртерм $A$ $B$). $B$ есть программное выражение для
создаваемого приемом теоремного терма $A$. Элемент бывает полезен,
если терм $A$ имеет несколько вхождений в теорему приема.

\item (блокпрограммы $n$ $A$). $n$ - символьный номер ссылки на
фрагмент про\-грам\-мы $A$, который пока не зарегистрирован в
основном списке фрагмен\-тов програм\-мы программного блока.
Регистрация этого фрагмента происходит не\-по\-сред\-ст\-вен\-но
перед обращением к редактированием программы. Она
вы\-пол\-ня\-ет\-ся проце\-ду\-рой "вставкафрагментов". Ссылка на
дополнительный фраг\-мент, сохраненный в информационном элементе
(блокпрограммы $n$ $A$), имеет вид размещенного в другом фрагменте
псевдооператора "1($P$ $n$)" \ либо "2($n$)". Пер\-вый из них
заменяется процедурой "вставкафрагментов" \ на оператор "$P$ иначе
$N$"; второй - на "ветвь $N$".

\end{enumerate}

\section{Создание идентифицирующей части про\-грам\-мы}

Основную часть работы по созданию программы приема выполняет
процедура "иден\-тификатор", реализующая идентифицирующую часть
программы. В этой части оп\-ре\-деляются объекты текущего
контекста срабатывания приема, соответствующие теоремным
переменным. Исключение составляют новые переменные, выбираемые
приемом при срабатывании. Здесь же происходит и обработка
антецедентов теоре\-мы приема. Обращения к процедуре
"идентификатор" \ имеются не только из рас\-смот\-рен\-ных выше
процедур, реализующих общие схемы компиляции приемов различ\-ных
типов, но и из многих вспомогательных процедур, и даже из самой
процедуры "идентификатор". Последнее объясняется необходимостью
обработки внутренних логических контекстов, возникающих, например,
в циклах просмотра различных списков термов.

Процедура "идентификатор" \ по своему объему значительно
превосходит все ос\-таль\-ные процедуры компилятора ГЕНОЛОГа.
Обращение к ней имеет вид "иден\-ти\-фикатор(х1 х2 х3 х4 х5 х6)".
Здесь х1 - корневое вхождение в теорему иден\-ти\-фи\-ци\-руемого
подтерма (если таких подтермов несколько, то берется подтерм,
содержа\-щий точку привязки); х2 - набор установок на
идентификацию; х3 - программный блок; х4 - заголовок приема; х5 -
описание приема; х6 - дополнительная информа\-ция (обычно список
х6 пуст). В описание приема входят: терм "условие(и($A_1 \ldots
A_n$))", перечисляющий его фильтры $A_1, \ldots, A_n$, указатели
приема, а также норма\-ли\-за\-то\-ры при\-ема - термы
"быстрпреобр($t \ldots$)", где $t$ - явно заданный нормализуемый
подтерм. Если идентифицирующая часть программы успешно
синтезирована, то выход из оператора происходит по значению
"истина", иначе оператор ложен.

При описании преобразований, выполняемых процедурой
"идентификатор", мы часто будем использовать термины
"идентифицируемый терм" \ и "идентифи\-ци\-ру\-ю\-щий терм".
Первый представляет собой некоторый подтерм теоремы приема;
вто\-рой - сопоставляемый ему программой приема терм,
встречающийся в условии либо посылке задачи, в преобразуемом терме
нормализатора, в посылке пакетного опе\-ра\-то\-ра, и т.п.

\subsection{Предварительные преобразования}

Переходим к рассмотрению программы оператора "идентификатор".
Началь\-ная точ\-ка этой программы может быть найдена либо
переходом из главного меню к кор\-не\-вому фрагменту программы
символа "идентификатор", либо из пункта оглав\-ле\-ния программ
("Формирование идентифицирующей процедуры", "Начало
иден\-ти\-фи\-кации $\ldots$").

При работе с программным блоком часто будут использоваться
операторы "нов\-опе\-ра\-тор(х1 х2)", "прогинф(х1 х2)" \ и
"прогинфы(х1 х2)". Первый добавляет к концу последнего фрагмента
программы, зарегистрированному в программном блоке х1, новый
оператор либо набор операторов х2. Второй - добавляет новый
инфор\-ма\-ци\-он\-ный элемент х2, последний - набор х2 таких
элементов.

Прежде всего, вводится, если его еще не было, новый информационный
эле\-мент (левыйкрай $v$), сохраняющий ссылку на корневое
вхождение идентифицируе\-мо\-го подтерма. Он нужен для того, чтобы
можно было отличить первое, основное обращение к процедуре
"идентификатор" \ от вспомогательных обращений к ней, реализуемых
внутри основного обращения. Заметим, что иногда при
вспомогатель\-ных обращениях переменная х1 может принимать
значение 0.

Если имеется ровно одна установка на идентификацию, причем она
имеет вид (операнд $v$ $x$), где $v$ - вхождение логического
символа, не имеющее операндов и совпадающее с х1, то идентификация
не нужна (проверка того, что по вхождению $v$ расположен данный
символ, уже проведена перед обращением к процедуре). Поэ\-то\-му
здесь сразу происходит выход по "истина". Если указанный случай не
имеет места, то переход через "ветвь 2".

После контрольной точки "прием(3)" \ выполняется просмотр
установок на иден\-ти\-фи\-ка\-цию (корень $v$), которые указывают
на корневые вхождения $v$ непосредствен\-но идентифицируемых
антецедентов теоремы. Обычно к числу таких антецедентов при
обращении к процедуре "идентификатор" \ добавлены также
антецеденты, обраба\-ты\-ва\-е\-мые проверочными операторами. Для
них установки (корень $v$) заменя\-ют\-ся на (извлекается $v$)
либо, если используется усиленный проверочный оператор, на
(мнимаячасть $v$). Соответственно, исключаются информационные
элементы (анте\-це\-дент $v$).

После контрольной точки "прием(4)" \ происходит сохранение в
списке инфор\-ма\-ци\-он\-ных элементов программного блока копий
установок на идентификацию (иден\-ти\-фи\-катор $\ldots$).
Обработка соответствующих этим установкам антецедентов
за\-клю\-ча\-ет\-ся в построении некоторых вспомогательных термов,
преобразуемых пакетны\-ми операторами и вспомогательными задачами,
и либо в сравнении полученных термов между собой, либо в
идентификации их с заданными подтермами теоремы.

После оператора "входит(корень х5)" \ рассматривается крайне
редкий случай приемов замены подтермов задачи на преобразование,
имеющих указатель "корень". Заменяемая часть таких приемов
представляет собой переменную (обычную либо функциональную),
идентифицируемую с условием задачи. Предпринимается кор\-рек\-ция
элемента (корень $\ldots$), который теперь будет указывать на
корневое вхожде\-ние условия задачи; в случае функциональной
переменной вводится либо доопределя\-ет\-ся информационный элемент
(функция $\ldots$), в который также заносится ссылка на условие
задачи. Далее - переход через "ветвь 1".

Здесь инициализируется нулем переменная х7. Значение этой
переменной явля\-ет\-ся текущим уровнем, регулирующим срабатывание
приемов компилятора при ска\-ни\-ро\-вании списка установок на
идентификацию. Максимально допустимое значе\-ние текущего уровня
равно 9; при превышении его происходит выход из про\-це\-ду\-ры
"идентификатор" \ по значению "ложь". После каждого срабатывания
прие\-ма значение переменной х7 изменяется на 0, и далее повторно
просматривается все дерево приемов. Каких-либо весов, определяющих
"теневые" \ зоны сканирования, в компиляторе не предусмотрено.

После контрольной точки "прием(6)" \ инициализируется список х8.
Он будет со\-сто\-ять из тех вхождений в теорему приема, для
которых идентификация уже про\-ве\-де\-на. Изначально в список
включаются все вхождения $v$, упомянутые в установ\-ках на
идентификацию (операнд $v$ $t$). Они являются отправными точками,
иден\-ти\-фи\-ци\-ро\-ванными до обращения к процедуре
"идентификатор". При инициализации х8 учитывается, что в редких
случаях установки на идентификацию (операнд $v$ $t$) могут
определять вхождения не в теорему приема, а во вспомогательные
термы "теквхожд($A$)"; "внешсимвол($s$ $A$)". Тогда к списку х8
присоединяются не тре\-бу\-ю\-щие специального рассмотрения
вхождения корневых операндов $s$,$A$.

После контрольной точки "прием(7)" \ выполняется учет указателей
приема "за\-ме\-на\-знака($\ldots$)", относящихся к отправным
точкам идентификации. Просматри\-ва\-ют\-ся информационные
элементы (заменазнака $A$ $B$ $x$ $D$ $C$), у которых выделенное
вхождение $A$ имеется в определяющей отправную точку идентификации
уста\-нов\-ке (операнд $A$ $t$). Напомним, что $t$ - программная
переменная для вхождения $v$, идентифицированного с $A$. Для
каждого такого элемента в программу приема до\-бав\-ля\-ется
оператор "альтернатива($\ldots$)", анализирующий ту операцию $w$,
операн\-дом которой служит $v$. Если $w$ имеет заголовок $B$, то
добавленный оператор присваива\-ет первой свободной программной
переменной $X$, определяемой как первый раз\-ряд набора х3,
вхождение $w$, иначе - вхождение $v$. После этого переменная $t$
заменяется в установке (операнд $A$ $t$) на $X$. Такая же замена
делается в информационном элементе (операнд $A$ $t$). Смысл этих
замен заключается в том, чтобы сопоставить теоремному вхождению
$A$ то вхождение в задачу, с которым оно фактически будет
идентифицироваться, согласно указателю "заменазнака($\ldots$)".
После данного цикла коррекций - переход через "ветвь 1".

Здесь, после контрольной точки "прием(8)", происходит учет
указателей приема "начало($\ldots$)", выделяющих антецеденты,
обработка которых должна происходить сразу же по идентификации
заданных в указателе переменных. Создаются дубли\-ру\-ю\-щие
информационные элементы (начало $\ldots$), в которых косвенные
ссылки на антецеденты заменены явным указанием их вхождений. Далее
- переход через "ветвь 1".

\subsection{Начало основного цикла идентификации}

После контрольной точки "прием(9)" \ располагается оператор
"повторение", кото\-рый является началом основного цикла процедуры
"идентификатор". Откаты к это\-му оператору будут происходить
после каждого срабатывания приема, обрабатывающе\-го ту или иную
установку на идентификацию. Цикл просмотра установок на
иден\-ти\-фи\-кацию размещен несколько дальше; до перехода к нему
после каждого отка\-та будет выполняться текущий анализ
сложившейся ситуации. Он необходим из-за того, что указатели
приема могут предопределять вставку в программу приема некоторых
дополнительных операторов сразу же, как только в процессе
компиляции окажутся выполнены определенные условия.

Прежде всего, отметим здесь указатели "ключ($\ldots$)",
"первыйключ($\ldots$)", "по\-пыт\-ка($\ldots$)",
"Попытка($\ldots$)", по которым должны вводиться операторы,
играющие роль "защелки" \ - они проверяют отсутствие заданного
комментария и после этого вводят его. Указатель "ключ" \
определяет ввод комментария к задаче сразу после проверки его
отсутствия; указатель "первыйключ" \ - аналогичным образом
посту\-па\-ет с комментарием к текущему терму задачи; указатели
"попытка", "По\-пыт\-ка" \ суть модификации первых двух
указателей, вводящие комментарии лишь при от\-ка\-те после
неудачной попытки применения приема.

После контрольной точки "прием(10)" \ начинается просмотр тех
указателей х9 одного из выделенных выше типов, для которых
отсутствует информационный эле\-мент (коммент х9), означающий, что
данный указатель уже был реализован в опе\-ра\-то\-рах программы.
Определяется набор х10 корневых операндов указателя, задающих
разряды комментария, следующие за его заголовком. Если набор х10
непуст и за\-вер\-ша\-ется термом $t$ вида "посылки($\ldots$)", то
этот терм не отно\-сит\-ся собственно к комментарию, а лишь вводит
ограничение на момент учета указа\-те\-ля: реализую\-щие его
операторы размещаются в программе после того, как обработаны
антецеденты, номера которых перечислены в терме $t$. Терм $t$
исключается из набо\-ра х10 (последний будет использован при
формировании комментария), и проверяется наличие устано\-вок на
идентификацию, относящихся к антецедентам, перечислен\-ным в $t$.
Если хотя бы одна такая установка имеется, то обработка указателя
прежде\-вре\-мен\-на и об\-ры\-ва\-ет\-ся. Иначе - откат к
переходу через "ветвь 3" \ для продолжения обработки указателя.

Здесь инициализируется пустым словом накопитель х11 программных
выра\-же\-ний, определяющих разряды комментария, следующие после
его заголовка. Для заполнения этого накопителя последовательно
просматриваются термы х12 набо\-ра х10, соответствующие разрядам
комментария. Здесь рассматриваются два случая:

а) Терм х12 имеет вид "теквхожд" \ либо "вхождение(теквхожд)",
т.е. ссылается на заменяемый подтерм либо на его вхождение. Тогда
проверяется, что все вхожде\-ния в заменяемую часть теоремы приема
уже зарегистрированы в наборе обработанных вхождений х8, а все ее
переменные идентифицированы. После этого находится
ин\-фор\-ма\-ционный элемент (корень $X$), у которого $X$ -
программная переменная для вхождения корня заменяемого подтерма, и
по нему определяется регистрируемое в накопителе х11 программное
выражение.

б) Терм х12 не имеет указанного выше вида. Тогда проверяется, что
все его переменные уже идентифицрованы. После этого, в зависимости
от того, имел ли х12 заголовок "вхождение" \ или нет, создается
программное выражение для очеред\-но\-го разряда комментария,
задающее вхождение терма либо сам терм. Если х12 имел заголовок
"фикс", то он был введен только для задания списка переменных,
которые должны быть идентифицированы к моменту обработки
указателя. В этом случае новый разряд комментария по х12 не
определяется.

Если при рассмотрении какого - либо терма х12 выявляется
преждевремен\-ность обработки указателя, то продолжение обработки
отменяется. Иначе, по заверше\-нии просмотра всех элементов набора
х10, переход через "иначе 1".

В этом фрагменте просматриваются все программные выражения набора
х11. Если какое-либо из них не является переменной, то для него
вводится вспомога\-тель\-ная переменная, которой присваивается
значение данного выражения. Она заменя\-ет рассматриваемое
выражение в списке х11. По окончании просмотра списка х11 -
переход к следующему фрагменту.

Вводится информационный элемент (коммент х9), означающий, что
указатель х9 обработан. После этого реализуется вставка в
программу операторов, соответст\-ву\-ю\-щих определяемым
указателем действиям. Сначала рассматривается случай прие\-ма,
выполняемого при сканировании задачи. Для указателей "первыйключ"
\ либо "ключ" \ вставляются два оператора: первый проверяет
отсутствие данного комментария, вто\-рой - вводит этот
комментарий. Указатель "первыйключ" \ определяет рассмотре\-ние
комментариев к текущему терму задачи, указатель "ключ" \ - к самой
задаче (в случае задачи на исследование - к ее списку посылок).
Для указателей "проверка", "Проверка" \ в программе приема
используются операторы "проверка($\ldots$)",
"Про\-вер\-ка($\ldots$)", которые являются фиктивными
перечисляющими операторами. При пер\-вом прохождении такой
оператор проверяет отстутствие комментария, при откате - вводит
этот комментарий. Аналогичным образом рассматривается случай
прие\-ма пакетного оператора, хотя здесь остаются лишь две
возможности - указатели "ключ" \ и "проверка".

\par\medskip

После обработки указателей "ключ", "первыйключ", "попытка",
"Попытка" \ - откат к переходу через оператор "ветвь 2",
расположенный перед контрольной точ\-кой "прием(10)". Здесь, после
контрольной точки "прием(12)", проверяется, что уже обработаны
основные установки на идентификацию - т.е. установки типов
"кон\-текст", "операнд", "идентификатор", а также (в случае
приемов групповой заме\-ны) установки "корень". Если это имеет
место, то выполняется обращение к проце\-ду\-ре
"учетнормализаторов". Она подготавливает информационные элементы,
необхо\-ди\-мые для создания программных выражений, определяющих
обрабатываемые нор\-ма\-ли\-за\-торами новые термы приема. Далее -
переход через "ветвь 1".

Здесь, после контрольной точки "прием(153)", предпринимается
анализ ука\-за\-те\-ля приема "лимит($N$ $A_1 \ldots A_n$)". Если
все переменные термов $A_1, \ldots , A_n$ уже
иден\-ти\-фи\-цированы, то находится программное выражение х11 для
ограничителя $N$ чис\-ла шагов, отводимых на попытку применения
приема начиная с данного момента, и в программу приема вставляется
оператор "лимит(х11)".

Наконец, последний фрагмент рассматриваемой цепочки связан только
с прие\-ма\-ми вывода следствий в посылках задачи. Если применение
такого приема пред\-по\-ла\-га\-ет обращения к нормализаторам,
причем уже определились переменные, при которых становится
возможно хотя бы одно из этих обращений, то вводятся
вспо\-мо\-га\-тель\-ные накопители (выводимо пустоеслово) и
(коррекцияпосылок пустоеслово), которые будут передаваться
нормализаторам в списках комментариев. По заверше\-нии
преобразования из этих накопителей будут извлекаться списки
использован\-ных нормализаторами посылок и списки дополнительно
вводимых приемом посы\-лок, необходимых для сопровождения по
о.д.з.

Далее - откат к переходу через "ветвь 1", расположенному
непосредственно пос\-ле оператора "повторение".

\subsection{Цикл просмотра установок на идентификацию}

После контрольной точки "прием(13)" \ - цикл просмотра установок
на идентифи\-ка\-цию х9. Это - основной цикл работы процедуры
"идентификатор", а вместе с тем и всего компилятора. В нем
происходит анализ текущей установки х9, завершаю\-щий\-ся
применением одного из многочисленных приемов обработки этих
устано\-вок. Фактически, здесь расположен корень очень большой
древовидной программы, рас\-па\-да\-ющейся на независимые приемы.
После применения каждого из них происхо\-дит откат к упомянутому
выше оператору "повторение", и далее - снова выход в цикл
просмотра установок. Описание приемов обработки установок разобьем
на подразделы, связанные с различными типами установок.
Соответствующие началь\-ные точки программы компилятора находятся
через пункт ("Компилятор ГЕНО\-ЛО\-Га", "Формирование
идентифицирующей процедуры", "Типы установок на
иден\-ти\-фи\-кацию") оглавления программ.

\subsection{Установка на идентификацию "операнд"\ }

Это - наиболее часто встречающийся тип установок, и для него
возникло наи\-боль\-шее число приемов. Началом обработки установки
служит контроль\-ная точ\-ка "при\-ем(14)". Напомним, что
установка имеет вид (операнд $v$ $X$), где $v$ -
идентифици\-ру\-е\-мое вхождение в теорему; $X$ - программная
переменная для вхождения терма зада\-чи (пакетного оператора, и
т.п.), сопоставляемого вхождению $v$. Будем называть такое
вхождение идентифицирующим.

Прежде всего, переменной х10 присваивается вхождение $v$.
Логический символ по этому вхождению к данному моменту уже был
идентифицирован, и речь идет лишь об идентификации, во-первых,
операндов этого вхождения, и, во-вторых, о переходе к надтерму,
операндом которого служит х10, если таковой расположен в
идентифицируемой части теоремы. При рассмотрении каждого из этих
новых вхождений (несколько "внутренних" \ и одно "наружное") будет
происходить и фик\-са\-ция расположенных на них логических
символов.

Далее проверяется наличие информационного элемента (делители х10),
ука\-зы\-ва\-ющего, что текущее вхождение х10 является вхождением
двуместной операции $f(a \ b)$, операнды $a,b$ которой
идентифицируются с помощью специальной процеду\-ры, определяемой
по символу $f$ справочником "делители". Это крайне редкий случай,
возникавший лишь однажды - для перечисления делителей одночленов в
элемен\-тар\-ной алгебре. Соответственно, справочник "делители" \
имеет лишь один фрагмент программы, выдающий по символу
"умножение" \ название "Делители" \ процеду\-ры перечисления.
Компиляция в данном случае весьма проста, и описание ее мы
опус\-ка\-ем.

За оператором "равно(х7 0)" \ следует ветвь приемов, срабатывающих
на нуле\-вом уровне сканирования. После оператора "стандарт(х10)"
\ располагаются прие\-мы, анализирующие операнды вхождения х10;
если ни один из них не срабаты\-ва\-ет, то выполняется переход
через "ветвь 5" \ к рассмотрению приемов, анализи\-ру\-ю\-щих
непосредственный надтерм вхождения х10. Рассмотрим сначала первую
груп\-пу приемов. Здесь переменной х11 присваивается логический
символ, расположенный в теореме приема по вхождению х10.

\subsubsection{Предварительный учет указателей "заменазнака"\ }

Если указатель приема "заменазнака($\ldots$)" \ допускает
возможность появления по иден\-ти\-фи\-ци\-рующему вхождению
некоторого логического символа $f$ одноместной опе\-ра\-ции,
который должен быть отнесен к внутренней переменной подтерма х10,
то необходимо скорректировать идентифицирующее вхождение: если на
нем распо\-ло\-же\-на операция $f$, то она пропускается, и $v$
идентифицируется с ее операндом. Более подробно, выполняются
следующие действия. Находится информационный элемент (заменазнака
х10 $f$ $x$ $g$ $p$). Здесь $x$ - переменная, на расположенное
внутри х10 вхождение которой будет переноситься внешний знак $f$;
$g$ - символ одноместной операции, на который будет изменен при
перемещении символ $f$; $p$ - изначально равно 0, а должно стать
программным выражением для вхождения, идентифицируе\-мо\-го с х10.
Найденный информационный элемент присваивается переменной х12,
причем проверяется, что у него $p$ равно 0. Затем выделяются два
подслучая: если в процессе идентификации компилятор пришел к
вхождению х10 "снизу", двига\-ясь от его надтерма и не
рассматривая ранее операндов вхождения х10, то действия
продолжаются после контрольной точки "прием(16)". Если выход на
х10 имел мес\-то при движении "наружу", от некоторого операнда
х10, то - переход через "иначе 7".

Рассмотри сначала первый подслучай. Здесь рассматривается
вхождение х10. Если на нем уже расположен символ $f$, то
переменной х13 присваивается вхожде\-ние первого операнда операции
х10, иначе х13 равно х10. Таким образом, предпринима\-ет\-ся
пропуск операции $f$ со стороны идентифицируемого терма. В конце
рассматри\-ва\-е\-мой ветви программы установка на идентификацию
х9 будет изменена, так что х13 станет новым идентифицируемым
вхождением. Переменной х14 присваива\-ет\-ся оператор, проверяющий
наличие символа $f$ по идентифицирующему вхождению. Указатель
приема "комплексное" \ модифицирует этот оператор для учета
ком\-плек\-сно\-знач\-ного аналога символа $f$. После перехода
через "ветвь 8" \ создается опе\-ра\-тор х15, проверяющий наличие
по новому идентифицирующему вхождению того же символа, который
имеется на новом идентифицируемом вхождении х13. Новое
идентифицирующее вхождение будет присвоено (см. ниже) первой
свободной про\-грам\-м\-ной переменной, т.е. переменной
"начало(х3)". Как и выше, предпринимается коррекция х15 на
комплекснозначный случай.

После перехода через "ветвь 1" \ вводится оператор, определяющий
новое иден\-ти\-фи\-ци\-ру\-ющее вхождение (пропускается операция
$f$ по старому идентифицирую\-ще\-му вхождению, если она была).
Здесь используется ранее созданный подтерм х14. Кро\-ме того,
добавляется оператор х15, сравнивающий заголовки новых
идентифицируе\-мо\-го и идентифицирующего подтермов. Так как в
особых случаях, определя\-е\-мых прочими указателями приема
(наличие "единичных" \ операндов и т.п.), эти за\-го\-лов\-ки
совпадать не обязаны, то оператор х15 вставляется лишь после
проверки отсутствия таких случаев. Далее происходит замена $p$ на
однобуквенный терм, образованный программной переменной
"нача\-ло(х3)" \ для нового идентифицирующего вхожде\-ния; в
установке на идентификацию корректируются $v$ и $X$.
Соответственно изменяются х10 и х11. Если на новом
идентифицируемом вхождении расположен неоднобук\-вен\-ный терм, то
откат к переходу через "ветвь 6", где будет продолжена обработка
установки х9. Иначе - идентификация подтерма завершается с помощью
опера\-то\-ра "учетоперанда". Затем установка х9 исключается из
списка х2, и откат к нача\-лу основного цикла идентификации.

Возвращаемся к рассмотрению подслучая, когда выход на х10
произошел при движении "наружу". После перехода через "иначе 7" \
попадаем на контроль\-ную точку "прием(17)". Здесь добавляется
оператор, рассматривающий внешнюю опе\-ра\-цию для
идентифицирующего вхождения; если эта операция есть $f$, то первой
не\-ис\-поль\-зу\-емой программной переменной "начало(х3)" \
присваивается ее вхождение, иначе значением данной переменной
оказывается само идентифицирующее вхож\-де\-ние. В результате
значением переменной "начало(х3)" \ оказывается вхожде\-ние,
которое фактически будет идентифицироваться с $v$, согласно
указателю "замена\-зна\-ка($\ldots$)". Оно регистрируется вместо
старой версии идентифицированного с $v$ вхождения в информационном
элементе (операнд $v$ $\ldots$), а также в информацион\-ном
элементе (заменазнака $\ldots$), где в качестве $p$ берется
однобуквенный терм, об\-ра\-зо\-ван\-ный переменной "начало(х3)".
Установка на идентификацию здесь ника\-ких изменений не
претерпевает, так как при отброшенной внешней операции $f$
вхождение $v$ должно сравниваться именно со "старой" \ версией
идентифицирующего терма. Далее - откат к переходу через "ветвь 6".

\subsubsection{Учет указателя "общаястепень" \ }

После контрольной точки "прием(18)" \ рассматривается особый
случай, когда вхож\-дение $v$ выделено указателем
"общаясте\-пень($p$ $x$ $A$)". Этот указатель относится к группе
вхождений в теорему приема вы\-ра\-же\-ний $f(x \ y_1), \ldots ,
f(x \ y_n)$. Идентификация данных выражений происходит с помощью
специального оператора $p$, пред\-при\-ни\-мающего попытку
выделить из идентифи\-ци\-ру\-ю\-щих термов $A_1, \ldots , A_n$
возмож\-но большую "общую часть" \ и сопоставить ее
пе\-ре\-мен\-ной $x$. Например, такая общая часть может
предствлять собой наибольший общий делитель одночленов,
находя\-щих\-ся в показателях степени термов $A_1, \ldots, A_n$.
Тогда в качестве $p$ берется опера\-тор "общаястепень",
определивший выбор названия для данного указателя. После
идентификации $x$ переменные (обычные либо функциональные) $y_1,
\ldots , y_n$ иденти\-фи\-ци\-ру\-ются с "остатками" \ выражений
$A_1, \ldots, A_n$; эти остатки находятся оператором $p$
одновременно с выделением общей части.

Сразу заметим, что указатель "общаястепень" \ используется крайне
редко, и при предварительном ознакомлении с компилятором данный
подраздел можно опустить.

По указателю "общаястепень($p$ $x$ $A$)" \ при формировании
программного блока был создан информационный элемент (общаястепень
$p$ $x$ $y$ $B$ $C$). Здесь $y$ - набор переменных $y_1, \ldots,
y_n$; $B$ - набор вхождений в теорему термов $f(x \ y_1), \ldots ,
f(x \ y_n)$; $C$ - сначала набор из нулей, а затем набор
программных выражений для термов, идентифицируемых с элементами
$B$. Этот элемент присваивается переменной х12. Проверяется, что
$v$ содержится в списке $B$. Затем просматриваются вхождения из
списка $B$, и все они регистрируются в наборе х8
идентифицированных вхождений. Позиция списка $C$, соответствующая
вхождению $v$ из текущей установки (опе\-ранд $v$ $X$), заменяется
на программное выражение "подтерм($X$)". Если в наборе $C$ после
этого остаются нули, то переход через "ветвь 2", где
предпринимается исключение текущей установки из списка х2 и откат
к началу цикла идентификации.

Если же в наборе $C$ нулей не остается, то появляется возможность
иден\-ти\-фи\-ци\-ровать пере\-мен\-ные $x, y_1, \ldots, y_n$ с
помощью оператора $p$. Этот оператор имеет две входные переменные
- набор выражений, из которых будет выделяться "общая часть", и
контекст замены. В случае приема, применяемого при сканировании
задачи, такой контекст представляет собой четверку (задача -
координаты вхождения в нее сим\-во\-ла привязки приема); в случае
пакетного оператора он имеет вид одноэлемент\-но\-го на\-бо\-ра,
состоящего из списка посылок. Оператор имеет две выходные
перемен\-ные: первая - для набора значений переменных $y_1,
\ldots, y_n$, вторая - для переменной $x$. Компилятор присваивает
переменной х15 программное выражение для контекста замены,
формирует обращение х16 к оператору $p$ и регистрирует его в
программе. Далее вводятся информационные элементы, в которых
регистрируются термы, иден\-ти\-фи\-цированные с переменными $x$,
$y_1, \ldots, y_n$. После регистрации - откат к пере\-хо\-ду через
"ветвь 2", где текущая установка на идентификацию исключается из
спис\-ка х2 и выполняется возвращение к началу цикла
идентификации.

\subsubsection{Начало идентификации не коммутативного и не
ассоциативного сим\-во\-ла операции}

Расположенный перед контрольной точкой "прием(18)" \ оператор
"ветвь 1" \ пере\-во\-дит к подразделу программы компилятора, в
котором рассматривается случай идентификации операции, не
обладающей специальной симметрией - не ком\-му\-та\-тив\-ной, не
ассоциативной и не допускающей перестановок операндов согласно
спра\-воч\-ни\-ку "схемаоперандов" \ либо согласно указателям
приема. Проверки отсутст\-вия такого рода симметрии размещены
вплоть до контрольной точки "прием(19)". Далее компиляция
разветвляется. Через "иначе 1" \ - переход к случаю идентификации
описателей "класс", "отображение", "выписка", "перечисление",
"суммавсех" \ (от\-се\-ка\-ется случай, когда "суммавсех" \
представляет собой не описатель, а символ обыч\-ной одноместной
операции, применяемой к функции). Через "иначе 2" \ - переход к
идентификации кванторов. Через "ветвь 3" \ - переход к общему
случаю иден\-ти\-фи\-кации. Наконец, после "ветвь 3" \ начинается
идентификация функцио\-наль\-ных переменных. Описание
перечисленных случаев выносим в нижеследующие под\-раз\-делы.

\subsubsection{Общий случай идентификации не ассоциативного и не
коммута\-тив\-но\-го символа}

После контрольной точки "прием(220)" \ рассматривается еще один
особый под\-слу\-чай - наличие указателя
"перегруппировка($\ldots$)". Этот указатель определяет
иден\-ти\-фи\-ка\-цию некоторого двуместного отношения с
перенесением всех его "ненуле\-вых" \ членов в одну часть, по
аналогии с идентификацией неравенств и уравнений. Проверяется, что
текущее вхождение $v$ в теорему приема упоминается в наборе $A$
информационного элемента (перегруппировка $A$), т.е. должно
идентифици\-ро\-вать\-ся указанным образом. Предпринимается
обращение к справочнику "перегруппиров\-ка", определяющему по
текущему символу двуместного отношения $f$ тройку (назва\-ние
двуместной ассоциативно-коммутативной операции $g$, члены которой
будут пе\-ре\-но\-ситься из одной части в другую - знак,
изменяемый при перенесении члена - еди\-ни\-ца $a$ операции $g$).
Далее проверяется, что по вхождению $v$ расположено утвержде\-ние
вида $f(t \ a)$. Оба корневых операнда операции $v$ регистрируются
в списке х8 идентифицированных вхождений, и в программу заносится
оператор "перегруп\-пи\-ров\-ка($\ldots$)", выполняющий требуемую
перегруппировку членов идентифици\-ру\-ю\-ще\-го отношения. После
этой перегруппировки последнее примет вид $f(T \ a)$, причем
вхождение операнда $T$ будет присвоено новой программной
переменной "начало(х3)". Вводится информационный элемент (операнд
$\ldots$), сопоставляющий вхождению опе\-ран\-да $t$ в
идентифицируемый терм программное выражение "начало(х3)" для
со\-от\-вет\-ст\-ву\-ю\-ще\-го вхождения $T$.

Реализуется обращение к процедуре "учетоперанда", осуществляющей
теку\-щую обработку найденного соответствия вхождений $t$ и $T$.
Эта программа добавляет в программу приема операторы, фиксирующие
заголовок подтерма $T$; если $t$ являет\-ся переменной, то вводит
информационные элементы, идентифицирущие эту пере\-мен\-ную;
определяет список новых установок на идентификацию (например, для
операндов операции $t$); в особых случаях она может также
предложить список до\-пол\-ни\-тель\-но идентифицированных
вхождений для регистрации их в списке х8. Обра\-ще\-ние к такой
процедуре обычно завершает действия приема, обрабатывающего
установку на идентификацию. Наконец, текущая установка на
идентификацию х9 исключается из списка х2, и выполняется откат к
началу цикла идентификации.

\par\medskip

Если с вхождением $v$ не был связан указатель "перегруппировка",
то пере\-ход через "ветвь 1" \ к контрольной точке "прием(22)".
Здесь переменной х12 при\-сва\-и\-ва\-ет\-ся набор вхождений
корневых операндов операции $f$, расположенной по вхожде\-нию $v$.
Если операция $f$ может иметь переменное число операндов, то в
про\-грам\-му вставляется оператор, проверяющий совпадение этого
числа в идентифицируемом и идентифицирующем термах; вводится
информационный элемент (количествоопе\-ран\-дов $v$), указывающий
на наличие такого оператора. Далее - переход через опе\-ра\-тор
"ветвь 1".

Если число операндов операции $v$ более 4, то переход через "иначе
1" \ - в этом случае для идентификации операндов придется
использовать специальную их ад\-ре\-са\-цию с помощью операторного
выражения "операндномер($\ldots$)". Этот случай рас\-смот\-рим
ниже. В противном случае операнды можно адресовать, используя
стан\-дарт\-ные ЛОСовские термины "первыйоперанд",
"второйоперанд", "предпо\-след\-опе\-ранд", "последнийоперанд".
Переход к основной части программы будет выпол\-нять\-ся далее
через "ветвь 2". Однако, до этого перехода рассматриваются
нес\-коль\-ко специальных случаев.

Прежде всего, после контрольной точки рассматривается подслучай
иден\-ти\-фи\-ка\-ции выражения "вариант($\ldots$)" \ при наличии
указателя приема "извлечениева\-ри\-ан\-та". Здесь теорема приема
представляет собой тождество вида "вариант($A$ $t_1$ $t_2$) $=$
$t$", причем все переменные выражений $t_1$, $t_2$ встречаются в
утверждении $A$. Прием применяется для преобразования условного
выражения "вариант($B$ $s_1$ $s_2$)", которое идентифицируется не
с теоремным термом "вариант($A$ $t_1$ $t_2$)", а с выражением
"ва\-ри\-ант($A$ $F(t_1)$ $F(t_2)$)". Это означает, что после
идентификации $A$ с $B$ и определения всех переменных теоремного
условного выражения предпринимается попытка пред\-ста\-вить
$s_1$,$s_2$ как результаты подстановки $t_1$,$t_2$ в одно и то же
выражение $F(x)$. После этого заменяющий терм строится как $F(t)$.
Для определения $F$ программа приема использует специальный
оператор "извлечениеварианта($\ldots$)", которому сообщаются в
качестве входных данных термы $s_1$,$s_2$, а также (после
подстановки в них иденти\-фи\-ци\-ро\-ван\-ных значений
переменных) термы $t_1$,$t_2$,$t$.

Следующий особый подслучай - идентификация выражения
"суммавсех(ото\-бра\-же\-ние($\ldots$))", выделенного указателем
"видмногочлена($\ldots$)". В этом подслучае по вхождению $v$
расположен терм вида $$\sum_{i=1}^n f(i)A^{i-1},$$
идентифицируемый с многочленом от заданного выражения $A$. При
идентифика\-ции значением переменной $f$ становится терм
"набор($c_1 \ldots c_n$)", где $c_1, \ldots, c_n$ -
ко\-эф\-фи\-ци\-ен\-ты многочлена, упорядоченные по возрастанию
степеней, а значением $n$ - выражение, равное увеличенной на
единицу степени многочлена. Компилятор про\-ве\-ря\-ет, что
идентифицируемый терм имеет указанный вид, и организует обращение
к оператору "сммногочлен" \ (при наличии указателя "комплексное" \
- "Сммногочлен"), который и выполняет идентификацию многочлена.
После регистрации значений $f,n$ в информационных элементах
программного блока и удаления обработанной ус\-та\-нов\-ки на
идентификацию - откат к началу цикла идентификации.

Наконец, последний из особых подслучаев, рассматриваемых в данной
цепочке подфрагментов, - наличие указателя "частнпроизв". Такой
указатель вводится, если теорема приема содержит выражение
"частнпроизв($f$ $n$ $a$)" для производной $n$ - го порядка
функции одного переменного $f$ в точке $a$. Он обеспечивает
автоматическое приведение к виду "частнпроизв($f$ $1$ $a$)" \
идентифицирующих выражений "про\-из\-вод\-ная($f$ $a$)".
Компилятор последовательно просматривает вхождения $f$, $n$, $a$,
адресу\-е\-мые с помощью операторных выражений "первыйоперанд",
"второйоперанд", "по\-след\-нийоперанд". $f$ и $a$
идентифицируются одинаковым образом как для терма
"про\-из\-водная($f$ $a$)", так и для терма "частнпроизв($f$ $n$
$a$)". Для идентификации $n$ вво\-дит\-ся оператор "альтернатива",
который в случае символа "производная" \ сопостав\-ля\-ет этой
переменной терм "1", а в случае символа "частнпроизв" \ - второй
опе\-ранд идентифицирующего терма.

\par\medskip

Возвращаемся к рассмотрению "главного ствола" \ процедуры,
обрабатывающего идентифицируемые операции с не более чем 4
операндами. Он начинается с опера\-то\-ра "ветвь 2",
расположенного после оператора "длинаменее(х12 5)".

Прежде всего, проверяется наличие указателя "единица", выделяющего
опе\-ран\-ды $w$ текущей операции $v$, которые могут обращаться в
единицу $e$. Это делается путем выделения соответствующего
информационного элемента (единица $v$ $w$ $e$), присваиваемого
переменной х13.

Если такой указатель имеется, то далее сначала рассматривается
подслучай, в котором вхождение $v$ выделено еще и указателем
"дробь", допускающим переста\-нов\-ку операндов. Началом
рассмотрения служит контрольная точка "прием(144)". После нее
переменной х14 присваивается информационный элемент (дробь $A_1$
$A_2$ $A_3$ $A_4$), где $A_1$ - набор вхождений двуместных
операций, при идентификации либо создании которых допустима
(одновременная для всех) перестановка операндов. $A_2$, $A_3$ - на
момент начала идентификации нули, а затем программные выражения
для вхождения одной из этих операций и вхождения,
идентифицированного с ее пер\-вым операндом. Эти выражения нужны
для определения того, имела ли место пере\-ста\-нов\-ка операндов.

Компилятор просматривает еще не идентифицированные вхождения х15
опера\-ции $v$. Если $A_2$ и $A_3$ уже определились из ранее
выполненной идентификации другой операции набора $A_1$, то переход
через "иначе 6". В противном случае создает\-ся оператор х16,
выбирающий некоторый операнд $u$ идентифицирующей операции $C$,
отличный от ее операндов, уже сопоставленных операндам $v$. Этот
операнд при\-сва\-и\-ва\-ет\-ся первой неиспользуемой программной
переменной "начало(х3)". Напомним, что вхождение идентифицирующей
операции $C$ является значением программ\-ной переменной
"конец(х9)". Далее х16 включается в оператор х17, определяющий для
х15 идентифицирующий терм с учетом элемента (единица $v$ $w$ $e$).
Если иден\-ти\-фи\-ци\-ру\-ю\-щая операция $C$ невырождена и имеет
тот же заголовок, что и $v$, то для х15 берется подтерм по
вхождению $u$. Иначе рассматриваются два подслучая: х15 равно $w$,
и тогда для него строится новый терм $e$, либо х15 не равно $w$, и
тогда для него берется весь подтерм по вхождению $C$. Оператор х17
включается в програм\-му приема. После этого создается
информационный элемент (операнд х15 $\ldots$), ссы\-ла\-ю\-щий\-ся
на сопоставленное х15 идентифицирующее вхождение, а программ\-ное
выражение, имеющее своим значением сопоставленный х15
идентифицирующий терм, присваивается переменной х18. Если $A_2$
равно 0, то оно заменяется на программ\-ное выражение, дающее
вхождение идентифицирующей операции $C$, либо, в вы\-рож\-ден\-ном
случае, вхождение некоторого фиктивного терма. Если х15 является
вхождением первого операнда, то после перехода через "ветвь 1" \
доопределяется также $A_3$. Наконец, найденный для х15
идентифицирующий терм х18 регистри\-ру\-ет\-ся с помощью оператора
"учетоперанда", и откат к выбору очередного вхож\-де\-ния х15. По
окончании просмотра всех х15 - откат к началу цикла идентификации.

Если в процессе просмотра $A_2$ и $A_3$ уже определились, то они
позволяют одно\-знач\-но определить вхождение $u$ операнда
идентифицирующей операции $C$, соот\-вет\-ству\-ющее х15. Это
делается оператором х16. Как и в предыдущем случае, х16
вклю\-ча\-ет\-ся далее в оператор х17, учитывающий указатель
"единица".

\par\medskip

Если информационный элемент "единица" \ не дополняется элементом
"дробь", то после обнаружения его выполняется переход через "ветвь
4", к контрольной точке "прием(40)". Здесь рассматривается лишь
случай, когда число операндов операции $v$ равно 2 - других не
ассоциативных и не коммутативных операций с единицей прос\-то не
возникало. Последовательно просматриваются не идентифицированные
операн\-ды операции $v$; вхождение текущего такого операнда
присваивается переменной х14. Вводится оператор х15, проверяющий
совпадение заголовков идентифицирующей и идентифицируемой
операций. При наличии указателя "комплексное" \ он заменяется на
дизъюнкцию с оператором, учитывающим возможную комплекснозначную
вер\-сию заголовка. Если вхождение х14 выделено указателем
"единица", то к про\-грам\-ме присоединяется оператор,
определяющий идентифицирующий терм для опе\-ран\-да х14 в
зависимости от того, истинно ли х15 или ложно; во втором случае
этот терм является указанной в информационном элементе (единица
$\ldots$) константой. Если же х14 не выделено указателем
"единица", то ему сопоставляется не иден\-ти\-фи\-ци\-ру\-ю\-щий
терм, а идентифицирующее вхождение - это экономнее, так как не
требует специального переписывания подтерма. В обоих случаях
значением х16 ста\-но\-вит\-ся программное выражение для
идентифицирующего терма либо вхождения; значе\-ни\-ем х17 -
индикатор терма, равный 1 в первом случае и 0 во втором. Для
второго слу\-чая вводится информационный элемент (операнд х14
х16). Далее предпринима\-ет\-ся завершающее рассмотрение текущего
операнда х14 обращение к процедуре "учет\-опе\-ран\-да". По
окончании просмотра операндов х14 - откат к началу цикла
иден\-ти\-фи\-ка\-ции.

\par\medskip

Если вхождение $v$ не выделено указателем "единица", то переход
через "ина\-че 3", где проверяется, имеется ли информационный
элемент (отрицание $v$). Та\-кой элемент означает, что по
вхождению $v$ расположена одноместная операция $f(x)$, для которой
выполнено тождество $f(f(x))=x$. Если он есть, то после
контрольной точки "прием(41)" \ предпринимается вставка в
программу оператора, определя\-ю\-ще\-го идентифицирующий терм $t$
для $x$. Если на идентифицирующем вхождении $C$, соответствующем
теоремному вхождению $v$, расположена операция $f$, то $t$
пола\-га\-ет\-ся равным ее операнду. Иначе $t$ получается вводом
внешней операции $f$ для подтерма по вхождению $C$. После
определения $t$ происходит обращение к опера\-то\-ру
"учетоперанда" \ и откат к началу цикла идентификации.

\par\medskip

Наконец, после контрольной точки "прием(42)" \ рассматриваются
указатели с заголовком "дробь".

Сначала рассматривается случай однобуквенного указателя "дробь".
Он озна\-ча\-ет, что в приеме замены заменяющий и заменяемый термы
имеют корневые дву\-мест\-ные операции, причем допустима
одновременная перестановка операндов обеих операций. Проверяется,
что $v$ есть корневое вхождение заменяемого терма. Затем
просматриваются еще не идентифицированные операнды х13 операции
$v$. Пусть $C$ обозначает идентифицирующее вхождение для $v$. В
программу заносится оператор, определяющий идентифицирующее
вхождение для х13 как произвольное еще не использованное при
идентификации вхождение операнда операции $C$. По этому
вхож\-де\-нию создается информационный элемент (операнд х13
$\ldots$) и предпринима\-ет\-ся обращение к оператору
"учетоперанда". После просмотра операндов х13 - откат к началу
цикла идентификации.

Затем (после перехода через "ветвь 1") рассматривается случай
неоднобук\-вен\-но\-го указателя "дробь", явно задающего вхождения
с переставляемыми операндами. Этот указатель порождает
упоминавшийся выше информационный элемент (дробь $A_1$ $A_2$ $A_3$
$A_4$). Проверяется, что $v$ имеется в списке $A_1$ вхождений,
выделенных указателем. Дальнейшие действия в этом подслучае - те
же, что при одновременном выделении вхождения $v$ указателями
"единица" \ и "дробь", с пропуском тех шагов, кото\-рые относились
к учету указателя "единица".

\par\medskip

На этом цепочка фрагментов, связанных с анализом выделяющих
вхождение $v$ информационных элементов, завершается. После нее -
откат к оператору "ветвь 2", приводящему к контрольной точке
"прием(43)". Это - общий случай иденти\-фи\-ка\-ции операндов
операции $v$, наиболее простой из перечисленных. Пере\-мен\-ной
х13 присваивается набор логических символов, адресующих операнды
операции $v$. Если число этих операндов равно 3 либо 4, то
используются все элементы на\-бо\-ра х13; иначе - только первые
один либо два. Затем синхронно просматриваются не
идентифицированные операнды операции $v$ и соответствующие им
символы набора х13. Создается программное выражении х16 для
идентифицирующего вхожде\-ния текущего операнда, и выполняется
обращение к оператору "учетоперанда". По окон\-ча\-нии просмотра -
откат к переходу через "ветвь 1". Здесь, после контрольной точ\-ки
"прием(44)", проверяется отсутствие внешнего для $v$ (т.е. такого,
чьим опе\-ран\-дом служит $v$), еще не идентифицированного, но
подлежащего идентифи\-ка\-ции вхождения. Если его нет, то
установка х9 исключается из списка установок, и откат к началу
цикла идентификации. В противном случае - откат переходу через
"ветвь 5" \ в фрагменте, начинающемся с контрольной точки
"прием(13)". Этот переход при\-во\-дит к попытке идентификации
внешней операции вхождения $v$.

\par\medskip

В заключение данного подраздела рассмотрим ранее отложенный
случай, когда операция по вхождению $v$ имеет более 4 операндов.
Он начинается с перехода че\-рез "иначе 1" \ после оператора
"длинаменее(х12 5)", приводящего к контрольной точ\-ке
"прием(218)". Переменной х13 присваивается 0 - эта переменная
будет хра\-нить символьный номер текущего идентифицируемого
операнда операции $v$ - после рассмотрения очередного операнда х14
она увеличивается на 1. Переменной х16 присваивается операторное
выражение "операндномер($\ldots$)", определяющее
иден\-ти\-фи\-ци\-рующее вхождение для текущего операнда. Оно
используется в информа\-ци\-он\-ном элементе (операнд $\ldots$),
вводимом для текущего операнда, а также при обраще\-нии к
процедуре "учетоперанда". По окончании просмотра операндов -
про\-вер\-ка того, что внешнее вхождение для $v$ уже
идентифицировано, и удаление в этом слу\-чае текущей установки х9
из списка установок х2.

\subsubsection{Идентификация описателей}

Точка выхода на ветвь программы, в которой происходит компиляция
процеду\-ры идентификации описателя, уже была указана выше. Эта
ветвь начинается с конт\-роль\-ной точки "прием(46)"; перейти к
ней можно также из пункта ("Типы уста\-но\-вок на идентификацию",
"Установка на идентификацию (операнд $\ldots$)", "Не
ком\-му\-та\-тив\-ный и не ассоциативный символ", "Идентификация
описателей $\ldots$").

Прежде всего, проверяется наличие информационного элемента
(матрица $v$). Этот элемент означает, что по вхождению $v$
расположено выражение "отображение($i$ $j$ и(принадлежит($i$
номера($1$ $m$)) принадлежит($j$ номера($1$ $n$))) значение($A$
набор($i$ $j$)))", идентифицируемое с прямоугольной матрицей $A$
размера $m \times n$. Для регист\-ра\-ции результатов
идентификации будет использован информационный элемент
(эле\-мен\-тыматрицы $A$ $T$ $M$ $N$), где $T,M,N$ -
соответственно, программные вы\-ра\-же\-ния для набора наборов
(строк) элементов матрицы, заданных термами; для чис\-ла строк и
числа столбцов (также заданных термами). Компилятор вводит в
про\-грам\-му приема оператор "элементыматрицы($\ldots$)". Этот
оператор по заданному вхож\-де\-нию идентифицирующего терма
проверяет, что он имеет вид "строки($\ldots$)" \ либо
"столбцы($\ldots$)" \ и определяет прямоугольную матрицу. Трем
выходным пе\-ре\-мен\-ным оператора присваиваются указанные выше
значения для $T,M,N$. Если ин\-фор\-ма\-ци\-он\-ный элемент
(элементыматрицы $A$ $\ldots$) уже имелся, то вводятся
опе\-ра\-то\-ры, проверяющие, что вновь найденные значения $T,M,N$
совпадают со старыми. Ина\-че создается новый информационный
элемент (элементыматрицы $\ldots$). Установка на идентификацию х9
исключается из списка х2. Далее находятся теоремные пере\-мен\-ные
$m,n$ для размерности матрицы. Если значение какой-либо из них уже
было идентифицировано, то вводится оператор, проверяющий
совпадение вновь най\-ден\-но\-го значения со старым. Иначе -
вводятся информационные элементы (терм $\ldots$) и
(транслвыражения $\ldots$), определяющие идентифицированное
значение пере\-мен\-ной. Первый из них представляет это значение в
формате терма, второй - в фор\-ма\-те десятичного числа. После
перечисленных действий - откат к началу цик\-ла идентификации.

При отсутствии информационного элемента (матрица $v$) - переход
через "ветвь 1". Здесь проверяется наличие не идентифицированных
вхождений связывающей приставки описателя. Если их нет, то переход
через "ветвь 1". Иначе - пере\-мен\-ной х12 присваивается набор
переменных связывающей приставки.

Сначала рассматривается подслучай, когда имеется указатель
"кортеж\-пере\-мен\-ных($\ldots$)", разрешающий идентификацию
единственной переменной $x$ связывающей приставки описателя не с
одной переменной, а с набором переменных. Тогда вво\-дят\-ся
информационные элементы (наборпеременных $x$ $\ldots$),
(переменные $v$ $\ldots$), (терм $x$ $\ldots$). Первый из них
определяет список переменных $y_1, \ldots , y_n$, с которым
иденти\-фи\-ци\-ру\-ет\-ся $x$; второй - указывает на тот же самый
список переменных как на свя\-зы\-ва\-ю\-щую приставку описателя
по вхождению $v$; третий - определяет терм для $x$, т.е. выражение
"набор($y_1 \ldots y_n$)" \ при $n>1$ и однобуквенный терм $y_1$
при $n=1$.

Если указанный подслучай не имеет места, то переход через "иначе
2". Пере\-мен\-ной х13 присваивается символьное число переменных
связывающей приставки. Ес\-ли оно равно 1, то переход через "иначе
1". Иначе - вводятся два оператора, первый из которых присваивает
связывающую приставку первой неиспользуемой про\-грам\-м\-ной
переменной, а второй - проверяет, что ее длина равна х13. Если
имеются указа\-те\-ли "элемент($\ldots$)", определяющие
идентификацию переменных связывающей при\-став\-ки без учета их
порядка, то эти переменные $x$ последовательно просматриваются, и
для каждого вводится оператор, извлекающий значение $x$ из остатка
связыва\-ю\-щей приставки. Найденные значения регистрируются в
информационных эле\-мен\-тах (переменная $x$ $\ldots$). При
отсутствии указателей "элемент($\ldots$)" \ либо по их исчерпании
- переход через "ветвь 2", где оставшиеся переменных связывающей
приставки иден\-ти\-фи\-ци\-ру\-ют\-ся согласно своим номерам. По
окончании все вхождения связывающей приставки заносятся в х8.

Наконец, если связывающая приставка состояла из одной переменной
(см. вы\-ше), то после перехода через "иначе 1" \ вводится
оператор, проверяющий, что число операндов описателя равно 2
(описатель "класс") либо 3 (прочие описатели). Если связанная
переменная уже была идентифицирована, то проверяется ее
совпа\-де\-ние с новым значением, иначе - вводится информационный
элемент (переменная $\ldots$) с результатом ее идентификации.

\par\medskip

После идентификации связывающей приставки - откат к переходу через
"ветвь 1". Здесь просматриваются операнды х12 вхождения $v$, не
относящиеся к связыва\-ю\-щей приставке. В случае описателя
"класс" \ это один лишь последний операнд; в прочих случаях -
последний и предпоследний. Вводятся программные выра\-же\-ния
"последнийоперанд($\ldots$)", "предпоследоперанд($\ldots$)" \ для
соответствующих иден\-ти\-фи\-ци\-ру\-ющих вхождений. Эти
выражения регистрируются в информацион\-ных эле\-мен\-тах (операнд
х12 $\ldots$), затем выполняется обращение к процедуре
"учетопе\-ран\-да". По окончании просмотра операндов х12 -
проверяется, идентифицированы ли все операнды вхождения х10 и его
внешнее вхождение. Если это так, то уста\-нов\-ка на идентификацию
х9 исключается, и откат к началу цикла идентификации.

\subsubsection{Идентификация кванторов}

Точка выхода на ветвь программы, в которой происходит компиляция
проце\-ду\-ры идентификации квантора, была указана выше. Эта ветвь
начинается с конт\-роль\-ной точки "прием(45)"; перейти к ней
можно также из пункта ("Типы уста\-но\-вок на идентификацию",
"Установка на идентификацию (операнд $\ldots$)", "Не
ком\-му\-та\-тив\-ный и не ассоциативный символ", "Идентификация
кванторов", "Исходная точка").

После кон\-т\-роль\-ной точки "прием(322)" \ предпринимается
попытка иден\-ти\-фициро\-вать пе\-ре\-мен\-ные сязывающей
приставки для тех случаев, когда это можно сделать одно\-знач\-но
или почти однозначно. Здесь - лишь предварительное рассмотрение
свя\-зывающей приставки; основное ее рассмотрение будет
происходить после иден\-ти\-фи\-кации под\-кван\-тор\-ных
утверждений. Выделены следующие случаи:

а) Связывающая приставка х12 состоит из единственной переменной,
для ко\-то\-рой имеется указатель "кортежпеременных($\ldots$)".
Тогда она идентифицируется со списком всех переменных связывающей
приставки. Вводятся определяющие иден\-ти\-фи\-ка\-цию
информационные элементы (наборпеременных $\ldots$), (переменные
$\ldots$), (терм $\ldots$). Если $v$ есть корень заменяемого
подтерма, то вводится также элемент (кван\-тор $\ldots$).

б) Связывающая приставка состоит из не более чем двух переменных,
каждая из которых должна быть идентифицирована с единственной
переменной. Если пере\-мен\-ная одна, то она идентифицируется
однозначно; если их две, то в программу прие\-ма вводятся
перечисляющие операторы, организующие рассмотрение обеих
альтер\-на\-тив идентификации.

Далее (вне зависимости от того, удалось ли идентифицировать
переменные свя\-зы\-ва\-ю\-щей приставки) - откат к переходу через
"ветвь 1". Здесь, после конт\-роль\-ной точки "прием(323)",
продолжается предварительное рассмотрение простей\-ших случаев
идентификации. Проверяется отсутствие информационного элемента
(ко\-ли\-чест\-во\-опе\-рандов $v$), означающего, что уже введен
оператор, фиксирующий требуе\-мое количество подкванторных
утверждений. Отбрасывается особый случай иден\-ти\-фи\-кации
квантора общности $\forall_x F(x)$, выделенного указателем
"импликация", у которого $F(x)$ - функциональная переменная. Такая
идентификация встречается в прие\-мах вывода теорем. Наконец,
отбрасывается случай идентифи\-ка\-ции заменяемого кван\-то\-ра в
приеме с указателем "кванторнаясвертка" \ - для него упрощенная
схема иден\-ти\-фи\-кации не подходит. Для простейшей
идентификации кванторов выделя\-ют\-ся два подслучая - квантор
существования $\exists_{x_1 \ldots x_n}A$, у которого заголовок
утвержде\-ния $A$ отличен от конъюнкции, а также (переход через
"иначе 3") квантор общности $\forall_{x_1 \ldots x_n}(A
\rightarrow B)$, выделенный указателем "внешнийквантор" \ и
имеющий единст\-вен\-ный антецедент. Напомним, что указатель
"внешнийквантор" \ запрещает учет при идентификации кванторной
импликации возможной контрапозиции консеквента с одним из
антецедентов, а без такого указателя, по умолчанию, компилятор
учиты\-ва\-ет эту возможность. В первом слу\-чае происходит
идентификация $A$ как последнего операнда
идентифици\-ру\-ю\-ще\-го квантора существования; во втором -
идентифика\-ция $A$ как конъюнкции всех ан\-те\-це\-ден\-тов
идентифицирующей кванторной импликации. В каждом из случаев
да\-лее реализуется откат к началу цикла идентификации. Если ни
один из случаев не имел места, то после перехода через "ветвь 2" \
выполняется попытка создания опе\-ра\-то\-ра, фиксирующего число
подкванторных утверждений. Проверяется, что среди
под\-кван\-тор\-ных утверждений теоремы приема нет пере\-мен\-ных
либо функцио\-наль\-ных переменных - тогда число подкванторных
утверждений иден\-ти\-фи\-цирующего кван\-то\-ра было бы заранее
не определенным. Затем находится число х12 подкван\-тор\-ных
утверждений идентифицируемого квантора. Для квантора
существо\-ва\-ния оно равно числу конъюнктивных членов
подкванторного утвержде\-ния; для кван\-то\-ра общности - числу
антецедентов. Наконец, в программу приема вставляется
опе\-ра\-тор, сравнивающий понимаемое указанным образом число
под\-кван\-тор\-ных утверждений идентифицирующего квантора с х12;
факт наличия та\-ко\-го оператора отмеча\-ет\-ся вводом
информационного элемента (количествооперандов $v$).

Если действия, выполнявшиеся после контрольной точки "прием(323)",
не выз\-ва\-ли отката к началу цикла идентификации,  то
реализуется переход через оператор "ветвь 1" \ в начале фрагмента,
содержащего данную точку. Здесь, после опера\-то\-ра "равно(х11
существует)", предпринимается рассмотрение еще одного особого
случая - выделенный указателем "внешнийквантор" \ квантор
существования $\exists_{x_1 \ldots x_n} A$ име\-ет выделенный
указателем "развертка" \ конъюнктивный член утверждения $A$. Тогда
делается один промежуточный шаг идентификации - находится
последний опе\-ранд идентифицирующего квантора, его вхождение
присваивается первой неисполь\-зу\-е\-мой программной переменной
$y$, и вводится информационный элемент (операнд $w$ $y$),
идентифицирующий корневое вхождение $w$ утверждения $A$.

Наконец, после отката к оператору "ветвь 2", расположенному перед
опера\-то\-ром "равно(х11 существует), начинается идентификация
подкванторных утверждений в общем случае. Она отмечена контрольной
точкой "прием(324)". Просматрива\-ют\-ся вхождения х12 атомарных
подкванторных утверждений идентифицируемого кван\-тор\-но\-го
утверждения. В случае кванторной импликации $\forall_{x_1 \ldots
x_n}(A_1 \ \& \ \ldots \ \& \ A_n \rightarrow A_0)$ это
антецеденты $A_1, \ldots, A_n$ и консеквент $A_0$; в случае
квантора существования $\exists_{x_1 \ldots x_n}\\ (A_1 \ \& \
\ldots \ \& \ A_n)$ - конъюнктивные члены $A_1, \ldots A_n$.
Текущее утверждение х12 со\-про\-вож\-дается индикатором х13,
равным 0 в случае антецедента и 1 в случае консек\-вен\-та. Для
квантора существования х13 равно 0, так как после преобразования
его отрицания к виду кванторной импликации утверждения $A_i$
попадают в анте\-це\-ден\-ты.

После определения значений х12 и х13 в компиляторе размещена еще
одна встав\-ка, обрабатывающая особый случай. Она начинается после
оператора "равно(х11 длялюбого)" \ и относится к ситуации, когда
идентифицируемый квантор имеет вид $\forall_x F(t)$; $F$ -
функциональная переменная, выделенная указателем приема
"имп\-ли\-ка\-ция($F$)". Такая ситуация встречается при компиляции
приемов с заголовком "лог\-вы\-вод". Выражение $F(t)$
идентифицируется со вспомогательным термом "то($A_0 \ A_1 \ldots
\\ A_n$)", где $A_0$ - консеквент идентифицирующей кванторной
импликации; $A_1, \ldots, A_n$ - ее антецеденты. Соответственно,
компилятор вводит оператор, присваива\-ю\-щий первой
неиспользуемой программной переменной указанный вспомогательный
терм, и регистрирует ее значение как идентифицирующее для $F(t)$.

Если указанный особый случай не имеет места, то переход через
"ветвь 1". Здесь переменной х14 присваивается вхождение в теорему,
полученное из х12 отбра\-сы\-ва\-ни\-ем отрицания, если таковое
имеется. При отбрасывании отрицания значение х13 меняется на
противоположное. Если идентифицируемый квантор выделен
указа\-те\-лем "внеш\-ний\-кван\-тор", то при идентификации не
будут предприниматься попытки контрапозиций - перестановок местами
консеквента и одного из антецедентов, с пе\-ре\-хо\-дом к их
отрицаниям. Они не будут выполняться так\-же и для приема с
заголов\-ком "тео\-рема", не имеющего указателя "обобщконсеквент",
вы\-де\-ля\-ю\-ще\-го кван\-тор. В обоих этих случаях - переход
через "иначе 1". Иначе - ре\-али\-зу\-ет\-ся компиля\-ция
процедуры, предпринимающей данные попытки.

После оператора "символ(х14 значение)" \ анализируется подслучай,
когда по вхо\-ж\-де\-нию х14 расположена еще не идентифицированная
функциональная пере\-мен\-ная $F(t)$, причем все остальные
атомарные подкванторные утверждения рассматри\-ва\-емо\-го
квантора уже идентифицированы. Сначала рассматривается подслучай,
в котором вхождение $v$ выделено указателем "обобщконсеквент",
означающим, что при идентификации квантора допускаются
произвольные контрапозиции антецедентов с его консеквентом. Если
консеквент уже идентифицирован, то для идентификации $F(t)$
применяется оператор "обобщантецеденты", определяющий конъюнкцию
тех антецедентов, которые возникли после использованной
контрапозиции. Заметим, что фактически указатель "обобщконсеквент"
\ использовался лишь в единственном при\-е\-ме, причем относящемся
к логическому выводу в базе теорем. Поэтом основ\-ной случай здесь
- это переход через "ветвь 3". Переменной х16 присваивается набор
вхождений уже идентифицированных атомарных подкванторных
утверждений с от\-бро\-шен\-ны\-ми отрицаниями. На основе этого
набора создается вставляемый в про\-грам\-му приема оператор
"импликанты($\ldots$)", определяющий набор вхождений еще не
идентифицированных подкванторных утверждений, а также конъюнкцию
этих утверждений, преобразованных контрапозициями в антецеденты
либо в консеквент - согласно индикатору антецедента х13. Данная
конъюнкция и идентифицируется с функциональной переменной $F(t)$.

Если подслучай идентификации функциональной переменной $F(t)$ "по
ос\-та\-точ\-но\-му принципу" \ не имел места, то переход через
"ветвь 2". Здесь снова проверяется наличие указателя
"обобщконсеквент", выделяющего вхождение $v$. Если он есть, то
переход через "иначе 1", где идентификация предпринимается с
помощью операто\-ра "обобщконсеквент". В противном случае в
программу приема вставляется оператор "импликант($\ldots$)",
перечисляющий все вхождения атомарных подкванторных
ут\-вер\-жде\-ний с отброшенными отрицаниями, которые можно
преобразовать кон\-тра\-по\-зи\-ци\-ями в антецеденты либо в
консеквент, согласно индикатору х13. После него размещаются
операторы, отбрасывающие уже идентифицированные ранее
вхож\-де\-ния. Текущее утверждение х14 идентифицируется с таким
вхождением.

\par\medskip

Вернемся к рассмотрению указанной выше ветви, в которой
идентификация кван\-то\-ра происходит без попыток контрапозиций.
Она начинается с контрольной точки "прием(230)". Переменной х15
присваивается заголовок рассматриваемого ато\-мар\-но\-го
подкванторного утверждения х14 с отброшенным отрицанием (если оно
бы\-ло). Если х15 - переменная, то переход через "иначе 1".

Если х15 - логический символ, то сначала рассматривается особый
случай - на\-ли\-чие указателя "консеквент($\ldots$)", выделяющего
идентифицируемую кванторную импликацию. Этот указатель означает,
что кванторная импликация теоремы иден\-ти\-фи\-цируется, вообще
говоря, не с единственной кванторной импликацией, а с груп\-пой
всех имеющихся в текущем контексте кванторных импликаций,
отлича\-ю\-щих\-ся друг от друга только консеквентами. Такие
группы импликаций могут возни\-кать в условиях и посылках задач
как результат преобразования к виду конъюнкции импликаций
какой-либо исходной импликации с конъюнкцией в консеквенте. Если
есть указатель "консеквент($\ldots$)", то в качестве
идентифицирующего утвержде\-ния для консеквента теоремной
импликации берется конъюнкция всех консеквентов имп\-ли\-ка\-ций
указанной группы. Сразу заметим, что данный указатель используется
пока в единственном приеме - доказательстве индукцией по длине
набора. Обработ\-ка указателя компилятором начинается с проверки
того, что все антецеденты импли\-ка\-ции уже идентифицированы. Это
означает, что ранее была выбрана какая-то одна из импликаций
идентифицирующей группы, причем программное выражение для нее было
зарегистрировано в информационном элементе (антецедент $v$
$\ldots$). Теперь добавляются два новых оператора программы
приема, первый из которых опреде\-ля\-ет список всех импликаций с
такими же антецедентами (кроме выбранной ранее), а второй -
формирует конъюнкцию всех консеквентов импликаций
идентифициру\-ю\-щей группы.

При отсутствии указателя "консеквент" \ - переход через "ветвь 2".
Здесь про\-ве\-ря\-ется, что х14 не является функциональной
переменной. Если это не так, то пе\-ре\-ход через "иначе 1". В
противном случае в программу приема вводятся опе\-ра\-то\-ры,
перечисляющие в качестве идентифицирующих для х12 вхождения
подкван\-тор\-ных утверждений (т.е. антецедентов, консеквента,
конъюнктивных членов утверждения, связанного квантором
существования), еще не использованные ранее для
иден\-ти\-фи\-ка\-ции. При этом консеквент идентифицируется с
консеквентом, а антецедент - с одним из антецедентов.

Если х14 является функциональной переменной, то попадаем на
кон\-троль\-ную точку "прием(231)", соответствующую пункту
("Идентификация кванторов", "Иден\-ти\-фи\-кация функциональной
переменной в антецеденте либо консеквенте", "Ис\-ход\-ная точка").
Прежде всего, проверяется, не является ли данная функциональ\-ная
переменная $f$ уже идентифицированной. Это распознается по наличию
инфор\-ма\-ци\-он\-но\-го элемента (функция $f$ $A$ $B$ $C$), у
которого $C$ не равно 0. Здесь $A$ - набор теоремных переменных -
аргументов $f$. Рассматриваемый элемент возник при
иден\-ти\-фи\-ка\-ции вхождения в теорему терма $f(A)$, в то время
как теперь идентифици\-ру\-ет\-ся некоторый терм $f(A')$. Если
какие - либо аргументы $U$ в наборе $A'$ отличаются от
соответствующих аргументов $u$ набора $A$, то для создания
операторов, проверяющих представимость текущего идентифицирующего
терма в виде $f(A')$, необходимо иметь уже идентифицированными
переменную $u$ и все переменные из $U$. Поэтому
вы\-пол\-ня\-ет\-ся проверка того, что все указанные переменные
идентифицированы. Если это не так, то обработка текущего х12 и
остальных подкванторных утвержде\-ний откладывается; в противном
случае - откат к переходу через "ветвь 1".

Если х12 - вхождение консеквента кванторной импликации, либо
кор\-не\-вое вхож\-де\-ние утверждения под квантором
существования, то идентификация х12 происхо\-дит однозначным
образом - с последним операндом идентифицирующих квантор\-ной
импликации либо квантора существования. В противном случае -
переход че\-рез "иначе 1".

Здесь сначала рассматривается подслучай кванторной импликации.
Если не\-иден\-ти\-фицированным остался лишь один ее антецедент
х12, то он идентифициру\-ет\-ся с конъюнкцией остатка антецедентов
идентифицирующей импликации. Если таких антецедентов более одного,
то переход через "иначе 2". Далее рассматриваются сле\-ду\-ю\-щие
подслучаи:

\begin{enumerate}

\item Функциональная переменная х14 выделена указателем
"антецедент", опре\-де\-ля\-ю\-щим ее идентификацию с единственным
антецедентом идентифицирую\-щей импликации $K$. Эта ситуация
распознается по наличию информацион\-но\-го элемента (предоперанд
$\ldots$). Тогда в программу приема вводятся операторы, выбирающие
произвольный еще не использованный антецедент импликации $K$, и
х12 идентифицируется с ним.

\item Все переменные, встречающиеся в подтерме х14, уже
идентифицированы. Тогда определяется операторное выражение х17 для
данного подтерма. В програм\-му приема вводятся операторы,
выбирающие еще не использованный антецедент импликации $K$ и
проверяющие совпадение его с х17.

\item Функциональная переменная х14, т.е. терм вида $f(t)$,
выделена указате\-лем "перечень($f$ $A$)". Тогда она
идентифицируется с конъюнкцией всех еще не использованных
антецедентов идентифицирующей импликации, удовлетворя\-ю\-щих
сформулированному на языке фильтров ГЕНОЛОГа условию $A$. В этом
условии текущий антецедент обозначается переменной $f$. Компилятор
опре\-де\-ля\-ет операторное выражение х19 для списка еще не
использованных анте\-це\-ден\-тов, затем создает вспомогательный
программный блок х21 для обработки цикла просмотра элементов
набора х19. Сначала в программе блока х21 ре\-гист\-ри\-ру\-ет\-ся
единственный оператор, перечисляющий элементы набора х19. Затем в
нее добавляется результат компиляции фильтра $A$. После этого из
х21 извлекается цепочка операторов, порождающая операторное
выраже\-ние "выписка($\ldots$)" \ для искомого списка
антецедентов. Наконец, формируется опе\-ра\-тор\-ное выражение х24
для конъюнкции элементов данного списка, которое и дает
идентификацию антецедента х12.

\end{enumerate}

Далее рассматривается подслучай идентификации функциональной
пере\-мен\-ной х14 под квантором существования. Если х14 была
выделена указателем "операнд($\ldots$\\)", означающим, что она
идентифицируется с единственным операндом ассоциатив\-но -
коммутативной операции (в данном случае конъюнкции), то имеется
информацион\-ный элемент (второйоперанд $\ldots$). Тогда, если
никакие другие конъюнктивные чле\-ны утверждения под квантором еще
не идентифицированы, в программу приема вводится оператор,
выбирающий произвольный конъюнктивный член соответ\-ству\-ю\-щей
идентифицирующей конъюнкции. Другой рассматриваемый подслучай -
если х12 есть последний еще не идентифицированный конъюнктивный
член. Тогда он идентифицируется по остаточному принципу.

\par\medskip

Наконец, переходим к рассмотрению подслучая, когда х14 есть
вхождение обыч\-ной переменной. Этот подслучай начинается с
контрольной точки "прием(326)", достижимой из пункта
("Идентификация кванторов", "Иден\-ти\-фи\-кация обычной
пе\-ре\-менной в антецеденте либо консеквенте") оглавления
программ. Если х12 - вхож\-де\-ние консеквента кванторной
импликации, то ему сопоставляется вхождение кон\-сек\-вен\-та
идентифицирующей импликации. В противном случае компилятор
проверя\-ет, что все отличные от х12 атомарные подкванторные
утверждения рассматривае\-мо\-го квантора уже идентифицированы, и
сопоставляет х12 конъюнкцию остав\-ших\-ся неиспользованными
атомарных подкванторных утверждений идентифицирую\-ще\-го
квантора.

\par\medskip

По окончании цикла просмотра корневых вхождений х12 атомарных
под\-кван\-тор\-ных утверждений - откат к переходу через "ветвь
1", где проверяется, что все эти вхождения уже идентифицированы.
Если это так, то переход через "ветвь 1". Здесь располагается
контрольная точка "прием(327)", начиная с которой
предпринима\-ет\-ся идентификация связывающей приставки квантора.
Прежде всего, проверя\-ет\-ся наличие не зарегистированных в
списке х8 вхождений переменных этой при\-став\-ки. Если таковых
нет, то приставка уже обработана. В этом подслучае
проверя\-ет\-ся, идентифицирована ли непосредственная надоперация
квантора. Если иден\-ти\-фи\-ци\-ро\-ва\-на, то текущая установка
на идентификацию х9 удаляется, и откат к нача\-лу цикла
идентификации. Если не идентифицирована, то - откат к рассмотрению
этой надоперации.

Если же имеется еще не идентифицированное вхождение переменной
связы\-ва\-ю\-щей приставки, то х12 присваивается список всех
переменных связывающей при\-став\-ки квантора.

Сначала рассматривается случай, когда х12 состоит из единственной
перемен\-ной $x$. Вообще говоря, это не означает, что
идентифицирующий квантор $K$ тоже будет иметь единственную
связывающую переменную: при наличии указателя
"кван\-тор\-ная\-сверт\-ка" \ допускается группировка части
подкванторных утверждений под вспомогательный квантор, который и
будет иметь одну переменную, идентифи\-ци\-ру\-е\-мую с $x$; если
переменная $x$ выделена указателем "кортежпеременных", то она
мо\-жет идентифицироваться с произвольным набором связывающих
переменных. Одна\-ко, при отбрасывании указанных подслучаев, $x$
однозначно идентифицируется с единст\-вен\-ной связывающей
переменной квантора $K$. Здесь разбираются два подслучая: $x$ уже
была идентифицирована ранее, либо (переход через "ветвь 3") еще не
иден\-ти\-фи\-ци\-ро\-ва\-на. В обоих случаях в программу приема
вставляются операторы, про\-ве\-ря\-ю\-щие, что $K$ имеет
единственную связывающую переменную $y$. В первом слу\-чае
проверяется, что эта переменная совпадает с той, которая ранее
была сопостав\-ле\-на $x$, во втором - вводится информационный
элемент (переменная $x$ $\ldots$), сохраня\-ю\-щий программное
выражение для $y$. Если непосредственная надоперация квантора уже
идентифицирована, то далее происходит удаление текущей установки
на иден\-ти\-фи\-ка\-цию х9. В любом случае после этого - откат к
началу цикла идентификации.

\par\medskip

Если случай однозначной идентификации единственной переменной $x$
набора х12 не имел места, то переход через "ветвь 2". Здесь
рассматривается случай, в кото\-ром все переменные связывающей
приставки х12 уже идентифицированы; части из них сопоставлены
наборы переменных, части - единичные переменные. Определя\-ет\-ся
программное выражение х15 для объединенного списка переменных,
сопостав\-лен\-ных переменным списка х12. Если имеется указатель
"кванторнаясвертка", при\-чем идентифицируемый квантор имеет
корневое вхождение в заменяемой части тео\-ре\-мы, то проверяется
лишь включение списка х15 в связывающую приставку $P$
идентифицирующего квантора и различие его элементов; иначе
проверяется, что списки х15 и $P$ одинаковы с точностью до
перестановки. Далее, как и выше, про\-вер\-ка возможности удаления
установки х9 и откат к началу цикла идентификации.

\subsubsection{Идентификация функциональных переменных}

Под функциональной переменной понимается терм вида "значение($f$
$t$)" \ либо "зна\-че\-ниемн($f$ $t$)", где $f$ - переменная, $t$
- переменная либо набор различных переменных, если имеются
указатели приема, определяющие идентификацию такого терма с
тер\-ма\-ми достаточно общего вида (например, указатель
"отображение($f$)"). Иденти\-фи\-кация функциональной переменной
заключается в том, что для $f$ вводится информа\-ци\-он\-ный
элемент, играющий роль шаблона при идентификации либо создании
лю\-бых термов вида "значение($f$ $T$)", "значиениемн($f$ $T$).
Тип этого элемента соответ\-ст\-ву\-ет типу функциональной
переменной. Компилятор обрабатывает идентификацию функциональных
переменных в различных точках - главным образом в рамках
про\-це\-ду\-ры "учетоперанда", однако некоторые специальные
случаи вынесены в ветвь процедуры "идентификатор", начинающуюся с
контроль\-ной точки "прием(328)". Выйти на эту контрольную точку
можно через пункт ("Ус\-та\-нов\-ка на идентифика\-цию (операнд
$\ldots$)", "Не ком\-му\-тативный и не ассоциатив\-ный символ",
"Идентификация функциональных пе\-ре\-мен\-ных", "Исходная точка")
оглавления программ.

Оператор "равно(х11 значение)" \ начинает рассмотрение наиболее
часто встре\-ча\-ю\-ще\-го\-ся случая функциональных переменных
вида "значение($f$ $t$)".

После контрольной точки "прием(134)" \ идет подслучай переменной,
выде\-лен\-ной указателем "заменатермов". Здесь используется
информационный элемент (за\-ме\-на\-тер\-мов $f$ $v$ $P$ $M$), у
которого $v$ - вхождение в теорему функциональной перемен\-ной;
$P,M$ - сначала нули, а затем операторные выражения,
соответственно, для идентифицирующего терма, сопоставляемого
функциональной переменной, и для набора вхождений в него терма
$t'$, построенного по теоремному терму $t$. Этот эле\-мент
позволяет идентифицировать либо строить терм вида "значение($f$
$T$)" \ как результат замены в идентифицирующем терме $P$ всех
вхождений списка $M$ на терм, $T'$, построенный по теоремному
терму $T$. После обнаружения данного элемента ком\-пи\-ля\-тор
проверяет, что все переменные в $t$ уже идентифицированы и
опреде\-ля\-ет операторное выражение х14 для $t'$. Далее, в
зависимости от того, определились ли уже ненулевые $P$ и $M$,
компилятор либо вводит в программу приема операторы, присваивающие
их значения новым программным переменным и доопределяет
ин\-фор\-ма\-ци\-он\-ный элемент (заменатермов $\ldots$), либо
сравнивает идентифициру\-ю\-щий терм с термом, определяемым по $P$
и $M$ указанной выше заменой вхождений. В обоих случаях установка
х9 исключается, и откат к началу цикла идентификации. Заметим, что
после оператора программы приема, определяющего список $M$,
размещается оператор, проверяющий непустоту данного списка, т.е.
представимыми в виде "зна\-че\-ние($f$ $t$)" \ считаются лишь
термы, имеющие хотя бы одно вхождение $t'$.

При отсутствии указателя "заменатермов", выделяющего
рассматриваемую функ\-ци\-о\-наль\-ную переменную, переход через
"иначе 5", где х12 присваивается символ $f$. \

После контрольной точки "прием(135)" \ рассматривается
идентификация функ\-ци\-о\-наль\-ной переменной "значение($f$
$t$)", выделенной указателем "сммногочлен($f$ $a$)". Этот
указатель означает, что идентифицирующий терм будет представляться
как многочлен от выражения $t'$, причем способ определения $t'$
задается выражением $a$. Если $a$ - логический символ
"неизвестные", то степени $t'$ группируются из всех содержащих
неизвестные текущей задачи множителей одночленов; если $a$ -
пере\-мен\-ная, то степени $t'$ группируются из всех содержащих
идентифицированную с $a$ переменную множителей одночленов; если
$a$ имеет вид "терм($B$)", то $t'$ явно опре\-де\-ля\-ет\-ся
операторным выражением $B$. Наконец, в указателе может
отсутствовать $a$, и тогда степени $t'$ группируется из всех
неконстантных множителей одночленов. В начале компиляции по
указателю "сммногочлен" \ вводится информационный эле\-мент
(сммногочлен $f$ $K$). До идентификации функциональной переменной
элемент $K$ равен 0, а затем он становится программным выражением
для набора коэффициен\-тов многочлена, расположенных по
возрастанию степеней. В этот набор встав\-ле\-ны нулевые
коэффициенты; элементы набора представлены в формате термов.
Ком\-пи\-ля\-тор вводит в программу приема обращение к оператору
"сммногочлен" \ либо (при наличии указателя "комплексное")
"смМногочлен"; этот оператор по вхожде\-нию корня
идентифицирующего подтерма и по значению $a$ предпринимает
по\-пыт\-ку распознать многочлен требуемого вида и выдает на
выходе выражение $t'$ вместе с набором коэффициентов.

Следующий случай идентификации рассматривается после контрольной
точки "прием(240)". Здесь функциональная переменная "значение($f$
набор(значение($g$ $t$)\\ $r$))" \ выделена указателем
"функподст($f$ $g$)". Это - крайне редко встречающийся случай
идентификации, используемый в приемах с заголовком "теорема".
Иденти\-фи\-ци\-ру\-ю\-щий терм содержит переменную $g$ только в
виде "значение($g$ $\ldots$)", причем символ "значение" \
встречается явно. Компилируемый прием вывода теорем будет заменять
все функциональные конструкции "значение($g$ $\ldots$)" \ на
некоторый кон\-стант\-ный терм $C$, выбирая в качестве функции $g$
константу. Компилятор вводит в программу прие\-ма оператор,
проверяющий, что $g$ встречается только как первый операнд термов
"значение($\ldots$)" \ и создает информационный элемент (функподст
$f$ $A$ $B$), у которого $A$ - программное выражение для
идентифицирующего терма, со\-по\-став\-ля\-е\-мо\-го
функ\-ци\-о\-наль\-ной переменной, $B$ - набор вхождений в него
подтермов вида "значение($g$ $\ldots$)". Этот элемент будет
использован как шаблон при построении результата перехода от $g$ к
константе.

Далее, после контрольной точки "прием(241)", рассматривается
случай функ\-ци\-о\-наль\-ной переменной "значение($f$ набор($t_1$
$t_2$))", выделенной указателем "Бинар\-ная\-опе\-рация($f$)".
Этот указатель тоже используется лишь в приемах вывода теорем.
Идентифицирующий терм должен иметь вид $g(A \ B)$ либо $h(g(A \
B))$, где $g,h$ - ло\-ги\-чес\-кие символы, причем $t_1,t_2$
идентифицируются с операндами $A,B$ при воз\-мож\-ной их
перестановке. Переменная $f$ считается идентифицированной с
логическим символом $g$ (даже при наличии внешней операции $h$).
Компилятор вставляет в про\-грам\-му приема обращение к процедуре
"Бинарнаяоперация", распознающей термы указанного вида и выдающей
символы $g,h$, индикатор перестановки операндов $A,B$ и вхождения
операндов. Эти значения регистрируются в информационном
эле\-мен\-те (Бинарнаяоперация $\ldots$) и используются при
построении новых термов вида "значе\-ние($f$ набор($T_1$ $T_2$))".

После контрольной точки "прием(159)" \ рассматривается случай
функциональ\-ной переменной "значение($f$ $t$)", выделенной
указателем "симметрично" \ либо "символ". Здесь $t$ - либо
единственная переменная $x$, либо набор различных переменных $x_1,
\ldots ,\\ x_n$. Идентифицирующий терм должен иметь вид
$g(\ldots)$, где число операндов у $g$ равно числу переменных у
$t$. При этом переменная $f$ идентифицируется с логичес\-ким
символом $g$. Указатель "симметрично" \ отличается от указателя
"символ" \ лишь тем, что допускает произвольные перестановки
операндов при идентификации. Поч\-ти все случаи использования
данных указателей приходятся на вывод теорем и на текстовый
анализ. Они нужны для идентификации операции заданной ар\-нос\-ти,
когда заголовок ее заранее неизвестен. Компиляция пока
предусмотрена только для числа переменных в наборе $t$, не
превосходящего 4.

Завершает перечень специальных подслучаев идентификации
функ\-ци\-о\-наль\-ных переменных вида "значение($f$ $t$)" \
рассмотрение указателя "внешфункция($f$ $x$)", на\-чи\-на\-ющееся
после контрольной точки "прием(253)". Идентифицирующий терм здесь
должен иметь вид $g(\ldots \ t' \ldots)$, где $t'$ - единственный
его корневой операнд, в кото\-рый входит переменная $x'$,
идентифицированная с $x$. Компилятор вставляет в программу приема
оператор "внешфункция($\ldots$)", выполняющий данную идентификацию
по за\-дан\-ным корневому вхождению идентифицирующего терма и
переменной $x'$. Роль шаблона для построения новых термов вида
"значение($f$ $T$)" \ играет стандартный информационный элемент
(функция $f$ $x$ $\ldots$), которому передается
модифици\-ро\-ван\-ный идентифицирующий терм: вместо $t'$  у него
размещена переменная $x'$.

\par\medskip

Обработка функциональной переменной "значениемн($f$ $t$)" \
начинается после кон\-троль\-ной точки "прием(269)". Эта
переменная выделяется указателем "значениемн". Идентифицирующий
терм представляет собой сумму (быть может, вырожден\-ную), которая
рассматривается как значение многочлена $f$ в точке $t$ (либо на
наборе $t$). По мере возможности, многочлен вводится над кольцом
целых чисел, иначе - над по\-лем вещественных. Напомним, что
многочлены представляются в решателе при по\-мо\-щи выражений
"многочлен($X$ $R$ $K$)", где $X$ - набор переменных многочлена,
$R$ - коль\-цо, над которым рассматривается многочлен, $K$ -
функция, сопоставляющая набо\-рам степеней (или степеням)
коэффициенты многочлена. Эта функция определена на некотором
конечном множестве. Компилятор проверяет, что все переменные из
$t$ уже идентифицированы, строит программное выражение для $t$ и
вставляет в про\-грам\-му приема обращение к процедуре
"форммногочлен". Последняя и осущест\-вля\-ет необходимую
идентификацию, определяя для многочлена выражение указан\-но\-го
выше вида.

\subsubsection{Идентификация в направлении к корню терма}

При обработке установки на идентификацию (операнд $v$ $x$) имеются
две возмож\-нос\-ти - либо перейти к идентификации операндов
операции по этому вхождению, либо перейти к идентификации той
надоперации $w$, чьим операндом является $v$. Первый случай был
частично рассмотрен выше - для тех подслучаев, когда
идентифика\-ция операндов происходит однозначно или почти
однозначно. Чтобы ускорить отсече\-ние программой приема побочных
ситуаций, идентификация с разбором случаев относится компилятором
в конец программы, а в начале размещаются однозначно выполняемые
шаги. К числу таких шагов, кроме уже перечисленных выше,
отно\-сит\-ся также идентификация в направлении от текущего
вхождения к корню иденти\-фи\-ци\-ру\-е\-мо\-го терма: переход от
вхождения $v$ к надоперации $w$ делается однозначно и позволяет
сразу же проанализировать заголовок по вхождению $w$.

Начальная точка ветви компилятора, обрабатывающей переход к
надоперации $w$, относится к нулевому уровню срабатывания (х7 =
0). Из фрагмента, содержа\-ще\-го начало цикла сканирования
установок на идентификацию, переход к ней выполня\-ет\-ся через
оператор "ветвь 5". Здесь размещается контрольная точка
"прием(47)", выйти на которую можно также из пункта ("Установка на
идентификацию (опе\-ранд $\ldots$)", "Идентификация в направлении
к корню терма", "Исходная точка") оглавления программ. Напомним,
что х10 - текущее идентифицируемое вхождение $v$, и оператор
"операнд(х11 х10)" \ присваивает переменной х11 вхождение
надопе\-ра\-ции $w$. Далее проверяется, что $w$ относится к
идентифицируемой части теоремы. Если это не так, причем $v$ -
корневое вхождение идентифицируемой части, а прием имеет указатель
"теквхожд($\ldots$)", то в программу добавляется оператор,
проверяющий, что соответствующее идентифицирующее вхождение - тоже
корневое. При отсутст\-вии указателя "теквхожд($\ldots$)" \ данный
оператор вводится другими фрагмен\-та\-ми компилятора.

Пусть $w$ относится к идентифицируемой части теоремы приема.
Проверяется, что оно еще не зарегистрировано в списке х8
идентифицированных вхождений, после чего заносится в данный
список. Далее идентификация в направлении к корню тер\-ма
распадается на ряд перечисляемых ниже подслучаев.

\subsubsection{Переход через внешнюю операцию, выделенную
указателем "разверт\-ка" \ }

После контрольной точки "прием(274)" \ рассматривается подслучай,
когда $w$ име\-ет вид "отображение($i$ и(целое($i$)
меньшеилиравно(1 $i$) меньшеилиравно($i$ $n$))$P(i)$)" \ либо вид
"длялюбого($i$ если принадлежит($i$ номера(1 $\ldots$ $n$))то
$P(i)$)", причем в пер\-вом случае непосредственный надтерм $w$, а
во втором - сам терм $w$ выделен указа\-те\-лем "развертка". В
этом случае $v$ есть корневое вхождение выражения либо
ут\-вер\-жде\-ния $P(i)$ (согласно процедуре, выбирающей точку
привязки). Переменной х13 присваивается: в первом случае -
вхождение одноместной надоперации для $w$, во втором случае - само
вхождение $w$. Если еще не все свободные переменные терма х13
идентифицированы, то обработка установки х9 откладывается. Иначе -
переход че\-рез "ветвь 3". Переменной х15 здесь присваивается
символ по вхождению х13. Указа\-тель "развертка" \ означает, что
теоремный терм х13 должен идентифицироваться с тер\-мом вида $P(1)
\ast \ldots \ast P(n)$, где ассоциативно-коммутативная операция
$\ast$ определяется по символу х15 с помощью справочника
"развертка", а в случае х15 = "длялю\-бо\-го" \ представляет собой
логическую связку "и". Эта операция присваивается переменной х16.
Чтобы перейти к корню указанного идентифицирующего терма от
вхож\-де\-ния $v$, в программу приема заносится оператор
"операнд(начало(х3)конец(х9))", и да\-лее - оператор
"символ(начало(х3)х16)", фиксирующий наличие требуемого
за\-го\-лов\-ка данного терма. В х17 запоминается программная
переменная, значе\-нием которой служит корневое вхождение
идентифицирующего терма для идентифи\-ка\-ции с "разверткой".
Однако, предпринятая до этого момента идентификация из\-нут\-ри
$P(i)$ в направлении к корневому вхождению х17 являлась
пред\-ва\-ри\-тель\-ной - она позволила идентифицировать лишь
свободные переменные терма х13 пу\-тем рассмотрения какого-то
одного операнда из списка $P(1), \ldots, P(n)$ и найти точку х17.
Чтобы иден\-ти\-фи\-ци\-ро\-вать весь список операндов, будет
выполняться незави\-си\-мая идентифи\-ка\-ция по специально
создаваемой установке (развертка х13 набор(х17) 0). При этом все
результаты предварительной идентификации внутри $P(i)$
сбра\-сы\-ва\-ют\-ся - относящиеся к ней вхождения исключаются из
списка х8 и из информаци\-он\-ных элементов (операнд $\ldots$);
удаляются информационные элементы, в кото\-рых упоминаются
связанные переменные терма х13, и т.п. Затем - откат к началу
цик\-ла идентификации.

\subsubsection{Переход через внешнюю функциональную переменную,
выделенную ука\-за\-те\-лем "символ" \ }

После контрольной точки "прием(276)" \ рассматривается подслучай,
в котором те\-ку\-щее вхождение $v$ является корневым вхождением
некоторого $t_i$ из функ\-ци\-о\-наль\-ной переменной
"значение($f$ набор($t_1$ $\ldots$ $t_n$))", выделенной указателем
"сим\-вол". Здесь рассматривается только случай $n > 1$. Тогда $w$
- вхождение символа "на\-бор". Корневое вхождение самой
функциональной переменной присваивается х12. Идентифицирующий терм
в этом случае должен иметь вид $F(T_1 \ \ldots \ T_n)$.
Ком\-пи\-ля\-тор вводит в программу приема оператор, определяющий
корневое вхож\-де\-ние идентифицирующего терма как внешней
операции для $T_i$; оператор, определя\-ю\-щий символ $F$,
расположенный по данному вхождению, а также оператор,
проверяю\-щий, что $T_i$ есть $i$-й операнд. Вводится
информационный элемент (переменная $f$ $\ldots$), сопоставляющий
теоремной переменной $f$ программное выражение, значе\-ни\-ем
которого служит $F$. Затем для каждого $j = 1, \ldots, n$,
отличного от $i$, предпринима\-ет\-ся обращение к процедуре
"учетоперанда", регистрирующей сопоставление
иден\-ти\-фи\-ци\-ру\-е\-мо\-му вхождению $t_j$ идентифицирующего
вхождения $T_j$. По окончании этих действий - вводится
дополнительная установка на идентификацию (операнд $u$ $\ldots$),
у которой $u$ - корневое вхождение рассматриваемой функциональной
переменной, и откат к началу цикла идентификации.

\subsubsection{Переход через внешний квантор}

При переходе через внешний квантор иногда бывает нужно учитывать
возмож\-ность специальных преобразований этого квантора,
допускаемых указателями приема.

После метки "прием(53)" \ рассматривается случай кванторной
импликации; $v$ есть вхождение ее антецедента либо консеквента с
отброшенным отрицанием. Переменной х12 здесь присваивается
корневое вхождение кванторной импликации, а переменной х13 -
индикатор антецедента (0) либо консеквента (1), к которому
относится $v$ пос\-ле устранения возможного внешнего отрицания
путем контрапозиции. Если имплика\-ция не выделена указателем
"внешнийквантор", то при идентификации нужно учи\-ты\-вать
возможность контрапозиций. Поэтому для перехода от
идентифици\-ру\-ю\-ще\-го для $v$ вхождения $V$ к корневому
вхождению импликации и проверки того, что индикатор антецедента -
консеквента вхождения $V$ равен х13, применяется спе\-ци\-аль\-ная
процедура "внешдлялюбого". Если прием имеет указатель
"кванторнаясверт\-ка" \ и рассматриваемая кванторная импликация -
корневая, то вместо процеду\-ры "внешдлялюбого" \ используется
процедура "внешнийквантор", которая учитывает не только
контрапозиции, но также возможность перехода от квантора
сущест\-во\-ва\-ния к отрицанию квантора общности.

После метки "прием(54)" \ аналогичным образом рассматривается
случай перехода через внешний квантор существования, причем только
для приемов с указателем "кванторнаясвертка", где необходимо
учитывать возможность перехода от кванто\-ра общности к отрицанию
квантора существования.

Наконец, после метки "прием(55)" \ рассматривается еще одна
особенность пе\-ре\-хо\-да через внешнюю кванторную импликацию -
идентификация конъюнкции либо дизъюнкции при таком приеобразовании
антецедентов и консеквента иденти\-фи\-ци\-ру\-ю\-щей импликации,
которые давали бы эту конъюнкцию или дизъюнкцию в явном виде.
Допустимыми преобразованиями здесь считаются контрапозиция,
группиров\-ка части антецедентов под общую конъюнкцию и спуск
отрицаний. $v$ является вхож\-де\-ни\-ем конъюнктивного либо
дизъюнктивного члена идентифицируемой конъюнк\-ции либо дизъюнкции
$u$, возможно, с отброшенным внешним отрицанием. Чтобы найти
корневое вхождение идентифицирующего терма - внешней конъюнкции,
либо дизъюнкции, либо кванторной импликации, - компилятор
вставляет в программу оператор "внешконъюнкция($\ldots$)" \ либо
"внешдизъюнкция($\ldots$)". Создается до\-пол\-ни\-тель\-ная
установка на идентификацию (операнд $u$ $\ldots$).

Во всех перечисленных выше случаях перехода через внешний квантор
да\-лее происходит откат к началу цикла идентификации, с
предварительным отбрасыва\-ни\-ем текущей установки х9, если все
операнды вхождения $v$ уже идентифицированы.

\subsubsection{Учет указателя "заменазнака" \ при переходе к
внешней операции}

После контрольной точки "прием(56)" \ рассматривается случай,
когда иденти\-фи\-ци\-ру\-е\-мое вхождение $v$ выделено указателем
"заменазнака". Тогда для него ранее был создан информационный
элемент (заменазнака $v$ $f$ $x$ $g$ $A$), означающий, что если
соответствующее $v$ идентифицирующее вхождение $V$ является
операндом внешней одноместной операции $f$, то эта внешняя
операция переносится на терм, иденти\-фи\-ци\-руемый с переменной
$x$, заменяясь при этом на одноместную операцию $g$. $A$ - сначала
0, а затем программное выражение для вхождения $U$, полученного
переходом от $V$ к внешней операции $f$, если таковая имеется.
Если $A$ равно 0, то компилятор вставляет в программу приема
оператор, присваивающий первой неиспользуемой програм\-мной
переменной вхождение $U$. При этом $A$ заменяется на данную
программную пе\-ре\-мен\-ную $y$; она же в информационном элементе
(операнд $v$ $\ldots$) становится ссылкой на идентифицирующее
вхождение для $v$.

Заметим, что несколько ранее переменной х12 была присвоена пара
програм\-мных переменных, первая из которых еще не определена, а
вторая - имеет своим значе\-ни\-ем идентифицирующее вхождение для
$v$. Если $A$ было только что определено указан\-ным выше образом,
то второй элемент пары х12 заменяется на $A$. Это же происхо\-дит,
если ненулевое значение $A$ уже было зарегистрировано в
информационном элемен\-те (заменазнака $\ldots$). Далее -
продолжение процесса обработки надоперации $w$, с переходом через
"ветвь 1" \ к контрольной точке "прием(57)".

После контрольной точки "прием(56)" \ рассматривается еще один
особый под\-слу\-чай; переход к его обработке происходит через
"иначе 2". Здесь указатель "за\-ме\-на\-зна\-ка" \ выделяет не
вхождение $v$, а вхождение его надоперации $w$, имеющее вид
$f(\ldots)$. Это означает, что при наличии надоперации $f$
вхождения $v$ символ $g$ не будет навешиваться на терм,
идентифицируемый с $x$, а при ее отсутствии - бу\-дет. Фактически
в данной точке компилятор лишь вставляет в программу при\-е\-ма
оператор, присваивающий первой неиспользуемой программной
переменной $y$ уже упоминавшееся выше вхождение $U$, регистрируя
эту переменную в информаци\-он\-ных элементах (операнд $w$ $y$) и
(заменазнака $w$ $f$ $x$ $g$ $y$). Кроме того, он вводит новую
установку на идентификацию (операнд $w$ $y$) - для последующей
обработки процедуры перенесения "знака" \ $f$. В данном подслучае
происходит откат к началу цикла идентификации, с предварительным
отбрасыва\-ни\-ем текущей установки х9, если все операнды
вхождения $v$ уже идентифицированы.

\subsubsection{Общий случай перехода через внешнюю операцию}

Рассмотрение общего случая для перехода через внешнюю операцию
начина\-ет\-ся с контрольной точки "прием(57)". Как и выше, будем
обозначать посредством $v$ текущее идентифицируемое вхождение; $V$
- соответствующее идентифици\-ру\-ю\-щее вхождение; $w$ -
вхождение операции, операндом которой служит $v$. Прежде все\-го,
компилятор вводит набор х13, образованный одним либо двумя
операторами, определяющими идентифицирующее вхождение $W$,
соответствующее $w$. Если опе\-ра\-ция $w$ может оказаться
вырожденной из-за наличия операндов, обращающихся в единицу, то в
х13 вводится контроль наличия вырожденной ситуации - если она
име\-ет место, то $W$ совпадает с $V$, иначе $V$ является
операндом у $W$. Операторы набора х13 выполняют также проверку
того, что на вхождении $W$ располагается нуж\-ный символ. Чтобы
обеспечить ее, компилятор обращается к процедуре
"символвхож\-де\-ния", учитывающей различные указатели приема,
определяющие допустимые мо\-ди\-фи\-кации заголовков подтермов.

Если прием имеет указатель "знаксуммы($\ldots$)", выделяющий
операцию $w$, то пос\-ле контрольной точки "прием(58)" \
выполняется коррекция х13. Здесь рассмат\-ри\-ва\-ет\-ся
информационный элемент (знаксуммы $s$ $u$ $A$), созданный ранее по
ука\-за\-те\-лю "знаксуммы($\ldots$)". $u$ есть вхождение
некоторой операции, у которой при иден\-ти\-фи\-ка\-ции
допускается одновременное изменение знака $s$ всех ее операндов.
Под изменением знака понимается отбрасывание одноместной операции
$s$ там, где она была, и ввод этой операции там, где ее не было.
$A$ - сначала 0, а впослед\-ст\-вии становится программной
переменной, играющей роль индикатора изменения зна\-ка. Если знак
был изменен, то значение индикатора равно 1, иначе - 0.
Компиля\-тор проверяет, что $u$ имеет своим операндом $v$ либо
$s(v)$. В первом случае это означает, что $u$ совпадает с $w$, во
втором случае - что $w$ является операндом операции $u$. Затем
вводится набор операторов х17, на который заменяется в
рассмат\-ри\-ва\-е\-мом подслучае набор х13. В качестве $W$
берется идентифицирующее вхождение для $u$. Информационный элемент
(операнд $v$ $\ldots$) корректируется с учетом возможного
из\-ме\-не\-ния знака. Далее - откат к переходу через "ветвь 1" \
для продолжения рас\-смот\-ре\-ния общего случая.

Если $w$ должно идентифицироваться с корневым вхож\-де\-ни\-ем
терма, рас\-смат\-ри\-ва\-емого в контексте применения приема, то
к списку операторов х13 добавля\-ет\-ся оператор
"корень($\ldots$)", проверяющий это условие. Затем х13
регистрируется в программе приема и вводится информационный
элемент (операнд $w$ $\ldots$), опре\-де\-ля\-ю\-щий идентификацию
вхождения $w$. К списку установок на идентифи\-ка\-цию добавляется
установка (операнд $w$ $\ldots$).

Далее компилятор вводит операторы, уточняющие номер операнда $V$
опера\-ции $W$. Если идентифицируемое выражение $w$ - описатель
"класс" \ либо "отображе\-ние", то $v$ должно быть вхождением
последнего либо предпоследнего его операнда. В этом случае
компилятор вводит оператор, проверяющий соответствующее
распо\-ло\-же\-ние для $V$,$W$. Если имеется информационный
элемент (дробь $A$ $\ldots$), указы\-ва\-ю\-щий, что операнды
двуместной некоммутативной операции $w$ могут быть
перестав\-ле\-ны синхронно с операциями, перечисленными в списке
$A$, то предпринимается учет данной перестановки. Если $w$ -
первая из операций списка $A$, причем $v$ - пер\-вый операнд для
$w$, то в информационном элементе (дробь $\ldots$)
регистри\-ру\-ют\-ся программные выражения для $V$,$W$. Они
используются далее как индикатор пе\-ре\-ста\-нов\-ки: если
перестановки не было, то $V$ есть первый операнд для $W$, иначе -
второй. Если до $w$ были рассмотрены другие операции списка $A$ и
индикатор переста\-нов\-ки уже имелся, то в программу приема
вводятся операторы, проверяющие размеще\-ние $V$ относительно $W$
в соответствии с этим индикатором. Наконец, при отсутст\-вии
указателя "дробь", выделяющего некоммутативную операцию $w$,
вводится опе\-ра\-тор, проверяющий, что номер операнда $V$ для $W$
совпадает с номером операнда $v$ для $w$.

По окоанчании перечисленных действий - откат к началу цикла
идентифи\-ка\-ции, быть может, с предварительным исключением
текущей установки на идентифи\-ка\-цию х9.

\subsubsection{Идентификация ассоциативного и коммутативного
символа}

Перечисленные выше случаи исчерпывают приемы обработки установок
на иден\-ти\-фи\-ка\-цию, срабатывающие при нулевом значении
текущего уровня х7. Пере\-хо\-дя к рассмотрению приемов более
высоких уровней, выделим прежде всего наибо\-лее сложную ветвь
процедуры "идентификатор", связанную с идентификацией
опе\-ран\-дов ассоциативного и коммутативного символа. Эта ветвь
начинается с конт\-роль\-ной точки "прием(63)", достижимой,
например, из пункта ("Установка на иденти\-фи\-ка\-цию (операнд
$\ldots$)", "Коммутативный и асоциативный символ", "Исходная
точ\-ка") оглавления программ. Контрольной точке предшествуют
проверки коммутатив\-нос\-ти и ассоциативности символа по текущему
идентифицируемому вхождению $v$. К чис\-лу коммутативных символов
здесь относится также символ "конкатенация", если его внешняя
одноместная операция выделена указателем "список". После
контроль\-ной точки "прием(63)" \ начинается обработка различных
подслучаев иденти\-фи\-ка\-ции. Заметим, что приемы компилятора,
обрабатывающие эти подслучаи, вообще го\-во\-ря, относятся к
различным значениям текущего уровня х7. Перейдем к
перечис\-ле\-нию данных подслучаев.

\subsubsection{Идентификация при наличии указателя "смодночлен" \ }

После контрольной точки "прием(263)" \ рассматривается случай,
когда иден\-ти\-фи\-ци\-ру\-е\-мая операция имеет вид $ax^n$ и
должна идентифицироваться как одночлен от заданной переменной $x$.
Этот случай (встречающийся крайне редко) определя\-ет\-ся
указателем "смодночлен", по которому вводится информационный
элемент (см\-од\-но\-член $v$ $x$). Ассоциативной и коммутативной
операцией здесь является опе\-ра\-ция "умножение". Компилятор
находит программные выражения х15 и х16, соот\-вет\-ст\-вен\-но,
для степени $n$ и для переменной $x$. Если ранее проведенная
идентифи\-ка\-ция пока не позволяет определить данные выражения,
то применение приема компиляции откладывается. В противном случае
проверяется, что $a$ есть еще не идентифицированная переменная, и
в программу компилируемого приема за\-но\-сит\-ся обращение к
процедуре "смодночлен", которая по заданным
идентифици\-ру\-ю\-ще\-му вхождению $V$ и переменной $X$,
определяемой выражением х16, находит коэффи\-ци\-ент $A$ и степень
$N$. Добавляется также оператор, проверяющий совпадение $N$ и х15.
Вводится информационный элемент (терм $a$ $\ldots$), определяющий
идентифи\-ка\-цию коэффициента $a$. После этого установка на
идентификацию х9 удаляется; теку\-щий уровень х7 сбрасывается до
0, и откат к началу цикла идентификации.

\subsubsection{Идентификация при наличии указателя "коэффициент" \ }

После контрольной точки "прием(219)" \ рассматривается случай,
когда иденти\-фи\-ци\-ру\-ет\-ся сумма, у которой некоторое
слагаемое выделено указателем "коэффици\-ент". Такое слагаемое
имеет вид $ax$ либо $ax/b$, причем переменная $x$
идентифици\-ру\-ет\-ся после определения идентифицирующих
выражений $A,B$ для $a,b$ как сум\-ма всех коэффициентов $k$ в
слагаемых, которые можно представить в виде $Ak$ либо,
соответственно, в виде $Ak/B$. Перемножение степеней с одинаковыми
основа\-ни\-я\-ми в этих представлениях не допускается. По
указателю "коэффициент" \ был вве\-ден информационный элемент
(коэффициент $v$ $x$ $t$), где $t$ - либо $a$, либо $a/b$.
Компи\-ля\-тор присваивает переменной х16 идентифицирующий терм
для $t$, находит остаток еще не идентифицированных слагаемых
рассматриваемой суммы, и для определения $x$ вставляет в программу
компилируемого приема обращение к процедуре "коэффи\-ци\-ент".
Если все остальные слагаемые идентифицируемой суммы уже были
обра\-бо\-та\-ны ранее, то добавляется оператор, проверяющий, что
возникающий после дан\-но\-го обращения остаток слагаемых
идентифицирующей суммы пуст. Затем - замена х7 на 0 и откат к
началу цикла идентификации.

\subsubsection{Идентификация при наличии указателя
"набор(первыйтерм)" \ }

Если прием имеет указатель "набор(первыйтерм)", то до обращения к
про\-це\-ду\-ре "идентификатор" \ был создан информационный
элемент (набор $u$ 0), у которого $u$ - вхождение в теорему
разгруппируемой приемом ассоциативно-коммутатив\-ной операции.
Если $u$ совпадает с текущим рассматриваемым вхождением $v$, то у
эле\-мен\-та (набор $u$ 0) последний разряд заменяется на
программное выражение, опре\-де\-ля\-ю\-щее идентифицирующее для
$v$ вхождение $V$. Этой информации уже достаточно для последующего
программирования процесса разгруппировки, и компилятор удаляет
установку на идентификацию х9. Текущий уровень х7 заменяется на 0,
и откат к началу цикла идентификации.

\subsubsection{Идентификация операндов ассоциативно-коммутативной
операции, пред\-став\-ля\-ющих собой переменные либо
функциональные переменные}

Перечисляемые в данном подразделе приемы компиляции срабатывают
при те\-ку\-щем уровне х7, равном 1. Ветвь этих приемов начинается
после контрольной точ\-ки "прием(65)". Просматриваются вхождения
х11 операндов текущей операции $v$. Как и выше, будем обозначать
посредством $V$ идентифицирующее вхождение,
соот\-вет\-ст\-ву\-ю\-щее вхождению $v$.

Начиная с контрольной точки "прием(66)" \ рассматривается случай,
когда по вхождению х11 расположена некоторая переменная $x$. Эта
переменная присваива\-ет\-ся х12. Если имеется информационный
элемент (знаксуммы $s$ $v$ $A$) либо информа\-ци\-он\-ный элемент
(заменазнака $u$ $s$ $x$ $r$ $A$), у которого х11 расположено
внутри $u$, то проверяется, что программное выражение $A$, которое
будет использоваться в нижеследующих приемах компиляции, уже
определилось. Далее рассматри\-ва\-ют\-ся следующие подслучаи:

\begin{enumerate}

\item Имеется информационный элемент (второйоперанд $v$ $x$)
(контрольная точ\-ка "прием(67)"). Это означает, что $x$ должно
идентифицироваться с отдель\-ным операндом операции $V$. Если уже
создан элемент (набороперандов $v$ $A$), у которого программное
выражение $A$ определяет список еще не идентифи\-ци\-ро\-ван\-ных
операндов операции $V$, то компилятор вводит в программу прие\-ма
оператор "входит($y$ $A$)", выбирающий для $x$ идентифицирующее
вхождение $y$. При этом $A$ корректируется: вхождение $y$ из него
исключается. Если эле\-мент (набороперандов $v$ $A$) отсутствует,
причем логический символ по вхожде\-нию $v$ определен неоднозначно
из-за возможной вырожденности рассматрива\-емой
ассоциативно-коммутативной операции, то элемент (набороперандов
$v$ $\ldots$) вводится, и далее - как выше. В остальных случаях
компилятор вводит в про\-грам\-му приема группу операторов,
перечисляющих вхождения $y$ опе\-ран\-дов операции $V$, отличные
от ранее использованных. Во всех случаях соз\-да\-ет\-ся
информационный элемент (терм $x$ $\ldots$) либо (вхождение $x$
$\ldots$), иденти\-фи\-ци\-ру\-ю\-щий переменную $x$. Значение х7
заменяется на 0, и откат к началу цик\-ла идентификации.

\item Имеется информационный элемент (переменная $x$ $A$),
указывающий, что пе\-ре\-мен\-ная $x$ должна идентифицироваться с
переменной либо логическим сим\-во\-лом, определяемыми программным
выражением $A$ (контрольная точка "при\-ем(68)"). Если уже был
создан информационный элемент (набороперан\-дов $v$ $B$), то
вводится оператор, проверяющий наличие символа $A$ среди еще не
иден\-ти\-фи\-ци\-ро\-ван\-ных операндов $B$ операции $V$. При
этом элемент (наборопе\-ран\-дов $v$ $B$) корректируется: из $B$
исключается однобуквенный терм $A$. При отсут\-ст\-вии элемента
(набороперандов $\ldots$) проверка наличия символа $A$ среди не
идентифицированных операндов операции $V$ реализуется с
использовани\-ем ин\-формационных элементов (операнд $\ldots$).

\item Имеется информационный элемент (неизвестная $x$),
указывающий, что пе\-ре\-мен\-ная $x$ должна идентифицироваться с
неизвестной текущей задачи (конт\-роль\-ная точка "прием(69)").
Если уже был создан информационный эле\-мент (набороперандов $v$
$B$), то компилятор вводит операторы, отбирающие в спи\-ске $B$
терм, являющийся неизвестной. При компиляции приема пакетного
опе\-ра\-то\-ра список неизвестных извлекается из комментария
(неизвестные $\ldots$), вво\-ди\-мо\-го перед обращением к этому
оператору. Если информационного эле\-мен\-та (набороперандов $v$
$\ldots$) нет, то компилятор вводит операторы, отбирающие еще не
идентифицированный операнд операции $v$, представляющий собой
неиз\-вест\-ную. Последующие приемы рассматриваемой ветви
компилятора применя\-ют\-ся лишь в том случае, если отсутствует
информационный элемент (неизвест\-ная $y$), относящийся к еще не
идентифицированному операнду $y$ операции $v$. Таким образом
обеспечивается приоритетное рассмотрение ситуаций, уменьшаю\-щих
перебор при идентификации операндов ассоциативно-коммутативной
опе\-ра\-ции.

\item Переменная $x$ уже была идентифицирована ранее - в виде
вхождения, либо терма, либо набора операндов текущей
ассоциативно-коммутативной опе\-ра\-ции $f$ (контрольная точка
"прием(70)"). Переменной х13 присваивается ин\-фор\-ма\-ци\-онный
элемент, определяющий значение переменной $x$. Если вхождение $v$
имеет вид $f(y \ x)$, где переменная $y$ выделена указателем
"группировка", то обработка операнда $x$ отменяется, так как этот
операнд будет учтен в про\-цес\-се группировок, определяющих $y$.
В противном случае - переход через "ветвь 2", где инициализируется
нулем переменная х14. Этой переменной далее
пере\-при\-сва\-и\-ва\-ет\-ся программное выражение, определяющее
набор $f$ - операндов тер\-ма, идентифицированного с $x$.

После переприсвоения - переход через "ветвь 1". Здесь
осуществляются кор\-рек\-ции выражения х14. Если имеется
информационный элемент (знаксум\-мы $s$ $v$ $k$), то в термах
набора, являющегося значением выражения х14,
предпри\-ни\-ма\-ет\-ся коррекция знака $s$ согласно индикатору
замены знака $k$, введен\-но\-му ранее при рассмотрении операндов
операции $v$. Если имеется информаци\-он\-ный элемент (заменазнака
$A$ $s$ $x$ $r$ $B$), у которого вхождение х11 пере\-мен\-ной $x$
расположено внутри вхождения $A$, то х14 корректируется так, чтобы
в нем был учтен переносимый на $x$ внешний знак $s$.

Далее находится информационный элемент (набороперандов $v$ $R$), у
ко\-то\-ро\-го программное выражение $R$ имеет своим значением
список всех еще не иден\-ти\-фи\-ци\-ро\-ванных операндов операции
$v$; если такого элемента не было, то он предварительно создается.
Затем компиляция разветвляется.

Если справочник "пересечениесписков" \ указывает по текущей
ассо\-ци\-а\-тив\-но-коммутативной операции $f$ специальную
процедуру $P$, используемую для ус\-мот\-рения представления терма
$t_1$ в виде $f(t_2 \ X)$ по заданным $t_1,t_2$, причем нет
указателей, отменяющих применение данного справочника, то
компилятор вставляет в программу приема обращение к процедуре $P$,
где в качестве $t_1$ выступает результат применения операции $f$ к
термам набора $R$, а в качестве $t_2$ -результат применения ее к
термам набора х14. Таким образом, из остатка неиспользованных $f$
- операндов идентифицирующего терма исключаются опе\-ранды,
соответствующие переменной $x$. Если операция $v$ имеет какие-то
дру\-гие еще не идентифицированные операнды, то корректируется
$R$. Иначе - вместо обращения к процедуре $P$ вставляется
обращение к процедуре "равнознач\-ны", проверяющей равенство
термов $t_1,t_2$.

Если обращение к справочнику "пересечениесписков" \ не
используется, то ком\-пи\-ля\-тор вставляет в программу приема
оператор, проверяющий вклю\-че\-ние набора х14 в набор $R$. Если
других еще не идентиицированных операндов у $v$ нет, то
добавляется оператор, проверяющий равенство длин этих набо\-ров.
Корректируется $R$.

В обоих случаях далее - откат к началу цикла идентификации.

\item Переменная $x$ уже была идентифицирована ранее - в виде
набора операн\-дов ассоциативно-коммутативной операции $g$,
отличной от текущей ассоциативно-коммутативной операции $f$
(контрольная точка "прием(71)"). Случай об\-ра\-ба\-ты\-вается
компилятором аналогично предыдущему; отличие состоит лишь в том,
что переменной х14 присваивается не набор $f$ - операндов терма,
иден\-ти\-фи\-ци\-рованного с $x$, а сам этот терм.

\item Существует фильтр приема "контекст(вид($x$ $A$)$B$)",
определяющий заголо\-вок терма, идентифицируемого с переменной $x$
(контрольная точка "прием(72)"). Проверяется отсутствие указателей
приема, которые могли бы разрешить отли\-чие данного заголовка от
заголовка х16 терма $A$. После этого переменная $x$
идентифицируется с произвольным еще не использованным операндом
иден\-ти\-фи\-ци\-рующего терма, имеющим заголовок х16. Отдельно
рассматриваются два случая - наличие либо отсутствие элемента
(набороперандов $v$ $R$). В каждом из них особо рассматривается
подслучай, когда имеется указатель "знаксум\-мы"; тогда перед
определением заголовка операнда предпринимается необходи\-мая
коррекция знака.

\item Существует фильтр приема, определяющий, что переменная $x$
должна быть идентифицирована с термом, являющимся десятичной
записью числа (конт\-роль\-ная точка "прием(73)"). Этот фильтр
имеет один из следующих типов: "десчисло($x$)"; "целое($x$)";
"натуральное($x$)". Рассматриваются два подслу\-чая.

Первый из них характеризуется следующими требованиями: заголовок
иден\-ти\-фи\-ци\-рующего терма совпадает с $f$; переменная $x$ не
выделена указателем "заменазнака" \ и указателем "единица" \ для
вырожденного значения 0; ин\-фор\-ма\-ционный элемент
(набороперандов $\ldots$), перечисляющий еще не
исполь\-зо\-ван\-ные операнды идентифицирующего терма, не введен.

Если либо $f$ отлично от умножения, либо переменная $x$ не
выделена указателем "единица" \ для вырожденного значения 1, то
компилятор вводит в программу приема операторы, идентифицирующие
$x$ с произвольным еще не исполь\-зо\-ван\-ным операндом
идентифицирующего терма, представляющим собой де\-ся\-тич\-ную
запись числа.

Если $f$ есть "умножение" \ и переменная $x$ выделена указателем
"единица" \ для вырожденного значения 1, то используется несколько
более сложная кон\-ст\-рук\-ция. Компилятор вводит операторы,
инициализирующие единичное значение $x$ и фиктивное нулевое
значение для вхождения операнда, идентифи\-ци\-ру\-ю\-ще\-го для
$x$. После них размещается оператор, выполняющий просмотр еще не
использованных сомножителей идентифицирующего терма,
представ\-ля\-ю\-щих собой десятичные записи чисел, и
корректирующий значения про\-грам\-м\-ных переменных для $x$ и
идентифицирующего вхождения.

Второй подслучай относится к идентификации целочисленных констант
(см. переход через "иначе 1"). В этом случае идентифицируемое
выражение име\-ет вид $nx$, где $n$ - целочисленная константа.
Компилятор вводит операторы, проверяющие, что идентифицирующий для
$v$ терм представляет собой де\-ся\-тич\-ную запись целого числа
$m$, делящегося на $n$, и определяющие значение $x$ как частного
от деления $m$ на $n$.

\item Переменная $x$ является последним еще не идентифицированным
операндом и идентифицируется по остаточному принципу (контрольная
точка "прием(74)").

Сначала выделяется специальный подслучай - наличие указателя
"группи\-ров\-ка", выделяющего переменную $x$ (контрольная точка
"прием(26)"). В этом подслучае $v$ имеет вид $f(x \ A)$ и является
опрандом некоторой внешней ассо\-ци\-а\-тив\-но-коммутативной
операции $g$, причем $A$ уже идентифицировано. $x$
груп\-пи\-ру\-ет\-ся из всех операндов надоперации $g$, имеющих
заголовок $f$, в которых выделяется подмножество операндов,
образующее $A$. Переменной х15 при\-сва\-и\-ва\-ет\-ся
информационный элемент, определяющий идентификацию $A$ (как
вхож\-де\-ния либо как переменной); х16 присваивается вхождение
надоперации $g$. На\-хо\-дит\-ся информационный элемент
(набороперандов х16 $\ldots$), задающий спи\-сок еще не
использованных операндов идентифицирующего терма для
над\-опе\-ра\-ции. Если такого элемента нет, то он водится.
Переменной х19 присваи\-ва\-ет\-ся список операторов компилируемой
программы, которые будут опре\-де\-лять набор $f$-членов терма,
идентифицированного с $A$, а переменной х20 - программная
переменная для этого набора. Наконец, определяется список х21
операторов компилируемой программы, которые осуществляют
извлечение $g$- членов терма для $x$, формируют этот терм и
находят модифицированный на\-бор для элемента (набороперандов х16
$\ldots$). Здесь особо рассматривается слу\-чай выделения
переменной $x$ указателем "заменазнака".

Если указанный выше специальный случай отсутствует, то после
конт\-роль\-ной точки "прием(74)" \ выполняется переход через
"ветвь 2" \ для рассмотре\-ния общего случая. Здесь прежде всего
проверяется, что операция $v$ не имеет еще не идентифицированного
отличного от х11 операнда, выделенного указателем "группировка".
При наличии указателя "знаксуммы", выделяющего вхождение $v$,
проверяется, что либо вхождение $v$ не является корневым
вхождением за\-ме\-ня\-е\-мо\-го терма, либо $x$ является
переменной-модификатором, введенной в теорему приема для
идентификации с остатком операндов
ассоциативно-ком\-му\-та\-тив\-ной операции. Если последние
условия не выполнены, то идентифика\-ция переменной $x$ по
остаточному принципу отменяется - она должна быть идентифицирована
с отдельным операндом.

Далее компиляция разветвляется в зависимости от того, имеется ли
инфор\-ма\-ци\-он\-ный элемент (набороперандов $A$). Если такой
элемент есть, то $A$ есть набор $f$ - членов идентифицирующего
терма $t$ для $x$, с точностью до коррек\-ции знака, выполняемой
при наличии указателя "заменазнака". В случае, когда указатели
приема не допускают возможности формрования $t$ по пустому
на\-бо\-ру $A$, в программу приема добавляется проверка непустоты
этого набора. Если элемента (набороперандов $A$) нет, то $x$
формируется из всех опе\-ран\-дов идентифицирующего для $v$ терма,
не указанных в информационных элемен\-тах (операнд $\ldots$). При
этом предпринимается учет указателей "единица" \ и "заменазнака".

\item Переменная $x$ идентифицируется путем группировки всех
операндов опера\-ции $V$, удовлетворяющих условию $P$, заданному в
указателе "перечень($x$ $P(x)$)" \ (контрольная точка
"прием(75)"). Проверяется, что все отличные от $x$ свобод\-ные
переменные фильтра $P(x)$ уже идентифицированы. Если элемента
(набор\-опе\-ран\-дов $v$ $A$) еще не было, то он вводится. Далее
создается вспомогатель\-ный программный блок х17. В него
отбираются копии всех информацион\-ных элементов текущего
программного блока, заголовки которых имеются в спис\-ке х16.
Единственный фрагмент программы блока х17 состоит из опера\-то\-ра
вида "принадлежит($y$ $A$)", перечисляющего еще не использованные
опе\-ран\-ды идентифицирующего вхождения $V$, причем добавлен
информационный эле\-мент (терм $x$ $y$), указывающий, что $x$
будет идентифицироваться с $y$. Нахо\-дит\-ся результат х18
компиляции фильтра $P(x)$ относительно программного блока х17. При
добавлении конъюнктивных членов оператора х18 к программе блока
х17 получается фрагмент, перечисляющий все термы $y$ набора $A$,
удовлет\-во\-ря\-ю\-щие условию $P(y)$. По этому фрагменту
строится вспомогательный опера\-тор х19, присваивающий первой
неиспользованной переменной $z$ текущего про\-грам\-м\-но\-го
блока х3 выписку всех допустимых $y$. х19 регистрируется в
компи\-ли\-ру\-е\-мой программе; для идентификации $x$ вводится
программное выраже\-ние х20, значение которого равно результату
объединения под операцией $f$ всех элементов набора $z$. Попутно
учитывается, если он есть, указатель "заменазна\-ка".

\end{enumerate}

\par\medskip

Далее рассматриваем случаи, относящиеся к идентификации
функциональ\-ной переменной, расположенной по вхождению х11.
Началом этого рассмотрения служит контрольная точка "прием(329)" \
(пункт оглавления программ "Идентификация фу\-нк\-ци\-ональной
переменной - исходная точка"). Ассоциативно-коммутативную
опе\-ра\-цию по вхождению $v$ обозначаем $f$. Функциональную
переменную далее обознача\-ем $g(t)$, причем переменной х12
присвоена переменная $g$. Рассматриваются следую\-щие подслучаи:

\begin{enumerate}

\item $g(t)$ является элементом уже идентифицированной матрицы $g$
(контроль\-ная точка "прием(246)"). Эта ситуация распознается по
наличию информацион\-но\-го элемента (элементыматрицы $g$ $A$ $m$
$n$), операторные выражения $A,m,n$ которого позволяют найти
операторное выражение х13 для терма $T$,
иденти\-фи\-ци\-ро\-ванного с $g(t)$. Затем выполняются действия,
аналогичные случаю уже идентифицированной обычной переменной.
Находится информационный эле\-мент (набороперандов $v$ $B$). Чтобы
установить возможность "выделения" \ тер\-ма $T$ в терме,
полученном применением операции $f$ к остаточным операндам набора
$B$, используется, если это возможно, справочник
"пересечениесписков". Иначе просто устанавливается включение в $B$
списка $f$-членов терма $T$.

\item Функциональная переменная $g(t)$ выделена указателем
"операнд" \ и дол\-жна идентифицироваться с отдельным операндом
идентифицирующей операции $V$ (контрольная точка "прием(84)").
Ситуация распознается по наличию информа\-ци\-онного элемента
(второйоперанд $v$ $g$). Если имеется информационный эле\-мент
(набороперандов $v$ $A$), то $g(t)$ идентифицируется с
произвольным эле\-ментом набора $A$. Если информационного элемента
(набороперандов $v$ $A$) нет, причем допускается случай отличия
заголовка идентифицирующей операции $V$ от $f$, то этот элемент
вводится, и далее - как выше. Иначе $g(t)$ идентифици\-ру\-ет\-ся
с вхождением произвольного еще не использованного операнда
операции $V$. Заметим, что для регистрации результата
идентификации вхождения функ\-ци\-о\-наль\-ной переменной во всех
подслучаях здесь используется процедура "учет\-опе\-ран\-да".

\item Ранее была идентифицирована функциональная переменная вида
$g(x)$ (конт\-роль\-ная точка "прием(76)"). Тогда имеется
информационный элемент (функ\-ция $g$ $x$ $A$ $B$) с ненулевым
$B$. В данном пункте компилятора предполагает\-ся, что у
идентифицируемого терма $g(t)$ выражение $t$ является
перемен\-ной. $B$ содержит информацию о терме $G$, определяющем
значение функции $g(x)$. Если $B$ - пара (вхождение $s$), то $s$
есть программ\-ное выражение, определяю\-щее корневое вхождение
терма $G$; если $B$ - пара (терм $s$), то $s$ есть программное
выражение, значением которого служит сам терм $G$. Переменной х15
сначала присваивается программное выражение для $G$. Если $t$
отлично от $x$, то х15 корректируется таким образом, чтобы
получилось программное выражение для терма, сопоставляемого $g(t)$
- путем подстановки $t$ вместо $x$ в $G$. Дальней\-шая обработка
данного случая - стандартная (см., например, случай
функциональ\-ной переменной - элемента идентифицированной
матрицы).

\item Функциональная переменная $g(t)$ идентифицируется путем
группировки всех операндов операции $V$, удовлетворяющих условию
$P$, заданному в указа\-те\-ле "перечень($g$ $P(g)$)" \
(контрольная точка "прием(147)"). Идентифицирую\-щий терм
определяется здесь так же, как в случае обычной переменной, однако
регистрация его происходит с использованием оператора
"учетоперанда".

\item Функциональная переменная является последним еще не
идентифицирован\-ным операндом и идентифицируется по остаточному
принципу (контрольная точ\-ка "прием(229)"). Идентифицирующий терм
определяется по информацион\-но\-му элементу (набороперандов $v$)
и регистрируется с использованием операто\-ра "учетоперанда".

\end{enumerate}

Кроме перечисленных выше случаев идентификации операнда,
представляю\-ще\-го собой переменную (обычную либо
функциональную), в данной ветви компиля\-то\-ра рассматривается
случай идентификации операнда х11, выделенного указате\-лем
"подтерм" \ (контрольная точка "прием(333)"). На момент
идентификации все переменные теоремного терма $t$, расположенного
по вхождению х11, должны быть определены. Это позволяет сначала
построить для $t$ соответствующий терм $T$ кон\-тек\-ста
срабатывания приема, а затем проверить его совпадение с
идентифици\-ру\-ю\-щим термом. Наличие указателя "подтерм" \
распознается по информационному элемен\-ту (стандтерм $\ldots$).

\subsubsection{Идентификация операндов ассоциативно-коммутативной
операции в об\-щем случае}

В этом подразделе собраны приемы идентификации операндов
ассоциативно-ком\-му\-та\-тив\-ной операции, выделяемых по
какому-либо характерному признаку (напри\-мер, по заголовку).
Некоторые из них относятся к переменным, но имеют мень\-ший
приоритет, чем приемы идентификации переменных, рассмотренные
выше. Это выражается в уровне срабатывания - для приемов данного
подраздела он равен 2 либо 5. Рассматриваемая ветвь компилятора
начинается с контрольной точки "при\-ем(77)". Прежде всего,
выбирается текущий обрабатываемый операнд х11
иден\-ти\-фи\-ци\-руемой операции $v$. Сначала разбирается случай,
когда этот операнд отли\-чен от переменной, т.е. по вхождению х11
расположен некоторый логический символ $s$. Сразу заметим, что
случай операнда-переменной относится только к указа\-те\-лю
"отрицание", когда при идентификации переменная $x$ и терм вида
$s(x)$ (где $s(s(x))=x$) выступают равноправным образом. Таким
образом, даже в случае переменной здесь возникает некоторый
"скрытый" \ заголовок $s$.

После проверки того, что по вхождению х11 расположен логический
символ, идет группа проверок целесообразности обработки операнда
х11 на данном уровне х7. Такая обработка на меньшем уровне х7 = 2
допускается лишь если число операн\-дов операции $v$, имеющих
заголовок $s$, не более трех, причем число уже
идентифи\-ци\-ро\-ван\-ных операндов этой операции менее двух. Эти
эвристические ограниче\-ния направлены на уменьшение перебора,
выполняемого компилируемым приемом. Да\-лее, требуется, чтобы в
первую очередь в качестве х11 выбирался тот из еще не
идентифицированных операндов операции $v$, у которого заголовок
идентифи\-ци\-ру\-ю\-ще\-го терма определяется однозначно.
Следующий приоритет отбора х11 - рассмот\-ре\-ние константного
терма либо такого терма, идентификация для которого
выполня\-ет\-ся с помощью справочника "вид". Этот справочник
используется в решателе пока лишь для идентификации выражений,
представимых в виде натуральной сте\-пе\-ни, т.е. для усмотрения
полного квадрата, куба, и т.п. При рассмотрении алгебраичес\-ких
выражений обнаружение таких множителей является достаточно
характер\-ным признаком, ускоряющим отсечение непригодных для
срабатывания приема ситуа\-ций. Поэтому оно и выносится
компилятором ближе к началу приема. Наконец, заблокировано
использование данной ветви компиляции в тех случах, когда
указа\-те\-ли приема явно определяют идентификацию х11 с первым
операндом идентифи\-ци\-ру\-ю\-ще\-го терма. Далее рассматриваются
следующие подслучаи:

\begin{enumerate}

\item Операнд х11 выделен указателем "развертка", причем все
свободные пере\-мен\-ные этого операнда уже идентифицированы \
(контрольная точка "прием(166)"). С помощью процедуры
"прогрвыражение" \ находится программное выраже\-ние, значением
которого служит набор термов, определяемый теоремным
выра\-же\-ни\-ем х11. В программу приема вставляется оператор,
проверяющий, что этот набор включается в набор еще не
использованных операндов иденти\-фи\-ци\-ру\-ю\-ще\-го терма. Если
х11 - последний не идентифицированный операнд опера\-ции $v$, то
добавляется проверка равенства числа элементов в этих наборах.

\item Операнд х11 представляет собой функциональную переменную
$g(t)$, иденти\-фи\-ка\-ция которой должна происходить либо с
первым операндом идентифи\-ци\-ру\-ю\-щей операции $V$ (указатель
"первыйтерм"), либо с тер\-мом, группируемым из всех операндов
$V$, содержащих переменные терма $t$. Последний случай
ре\-али\-зу\-ется по умолчанию, если ни один из остав\-ших\-ся не
идентифицированными операндов операции $v$ (кроме х11) не зависит
от переменных, входящих в $t$. Данная ветвь компилятора начинается
с контроль\-ной точки "прием(78)". Пе\-ре\-мен\-ной х14
присваивается либо список про\-грам\-мных выражений для
пе\-ре\-мен\-ных терма $t$ (тогда х13 равно 0), либо
одно\-эле\-мент\-ный список, состоящий из программного выражения
для набора та\-ких переменных (тогда х13 равно 1). Данный прием
компиляции применяется при уровне х7, равном 5.

\par\medskip

Оставшиеся приемы рассматриваемой ветви компилятора учитывают при
от\-боре обрабатываемого операнда х11 приоритет, согласно которому
пред\-по\-чте\-ние отдается константному терму либо терму, хотя бы
один из корневых опе\-ран\-дов которого отличен от переменной.
Кроме того, обработка х11 блокируется в ряде специальных случаев
(выделенный указателем "группировка" \ смежный операнд надоперации
операции $v$, либо наличие еще не идентифицированной переменной,
которая, согласно указателям приема, должна быть
иден\-ти\-фи\-ци\-рована раньше х11). С учетом этих ограничений,
далее рассматри\-ва\-ют\-ся следующие подслучаи:

\item Операнд х11 выделен указателем "подстановка", т.е.
фактически может от\-сут\-ст\-во\-вать, и тогда определенная в нем
переменная $x$ будет идентифицироваться с заданным логическим
символом $s$ (контрольная точка "прием(79)"). $x$
при\-сва\-и\-ва\-ет\-ся программной переменной х13. Затем
формируется список х15 всех переменных $y$ операнда х11, которые
встречаются в идентифицируемой час\-ти теоремы приема только
внутри подтермов, выделенных указателями "под\-ста\-нов\-ка".
Момент фактической идентификации такой переменной $y$ зависит от
того, какие из содержащих ее подтермов будут вырожденными, причем
в программу приема далее будет введен оператор, проверяющий, что
$y$ в конце концов оказалась идентифицирована. Проверяется, что на
текущий момент все переменные операнда х11, отличные от $x$ и не
входящие в список х15, уже идентифицированы. Иначе - переход к
следующему операнду х11. Далее компиляция разветвляется в
зависимости от того, введен ли уже ин\-фор\-ма\-ци\-онный элемент
(набороперандов $v$ $\ldots$) или нет. Обе ветви аналогичны;
ог\-ра\-ни\-чим\-ся рассмотрением случая, когда данный элемент
отсутствует. Снача\-ла вводится оператор, инициализирующий первую
неиспользуемую программ\-ную переменную $z$, которой будет
присвоен идентифицирующий терм для $x$, однобуквенным термом $s$.
Здесь же инициализируется нулем следующая про\-грам\-м\-ная
переменная (обозначим ее $u$); этой переменной будет присвоено
вхож\-де\-ние идентифицирующего операнда для х11, если таковой
найдется. Пе\-ре\-мен\-ной х16 присваивается набор той же длины,
что и х15. Для тех переменных $y$ списка х15, которые к текущему
моменту идентифицированы, в х16 раз\-ме\-ща\-ет\-ся
соответствующее программное выражение; для прочих переменных $y$
спис\-ка х15 - вводится новая программная переменная, которая
инициализиру\-ет\-ся нулем, а впоследствии ей будет присвоен
идентифицирующий терм, со\-от\-вет\-ствующий $y$. Далее создается
вспомогательный программный блок х20. В него заносится
единственный фрагмент программы, обеспечивающий просмотр еще не
использованных операндов х14 идентифицирующего вхождения $V$ (с
учетом необходимого для идентификации х11 заголовка).
Предпринима\-ет\-ся обращение к процедуре "идентификатор",
обеспечивающее создание в блоке х20 программы идентификации х11 с
х14. Если в фильтрах приема имеются условия, относящиеся только к
переменной $x$, то они компилируются и тоже заносятся в программу
блока х20. Для блокировки их повторной обработки вводятся
информационные элементы (комментарии $\ldots$). Переменной х22
при\-сва\-и\-ва\-ет\-ся список всех новых программных переменных,
добавленных в бло\-ке х20. В рамках блока х20 определяются
программные выражения для пере\-мен\-ной $x$ и для всех переменных
списка х15. После этого создается опера\-тор х25 для занесения в
программу основного программного блока х3, который обеспечивает
цикл просмотра операндов х14, попыток их идентификации с х11, а
также коррекции значений переменных $z,u$ и новых программных
пере\-мен\-ных для ранее не идентифицированных переменных списка
х15. Этот опера\-тор имеет вид кванторной импликации, связывающей
приставкой которой служит список х22, антецедентом - программа
блока х20, а консеквентом - операторы, выполняющие коррекции
значений переменных. Наконец, для тех переменных $y$ списка х15, у
которых х11 было последним содержащим $y$ не
иден\-ти\-фи\-ци\-ро\-ван\-ным подтермом, выделенным указателем
"подстановка", вводится опе\-ра\-тор, проверяющий отличие от нуля
введенной для их идентифицирующего терма программной переменной.

\item Операнд х11 выделен указателем "нормзнака" \ (контрольная
точка "прием(97)"). Тогда этот операнд имеет вид $g(x)$, где $x$ -
переменная, которая в рассмат\-ри\-ва\-е\-мом подслучае
предполагается уже идентифицированной. х11 будет
иден\-ти\-фи\-ци\-ро\-ваться с набором $g$ - отрицаний $f$ -
членов идентифицирующего терма для $x$. Программной переменной х12
присваивается переменная $x$, а х13 - набор $f$ - членов ее
идентифицирующего терма. Вводится программное выражение х14 для
набора $g$ - отрицаний элементов набора х13. Далее используется
ин\-фор\-ма\-ци\-он\-ный элемент (набороперандов $v$ $A$),
определяющий список $A$ еще не использованных операндов
идентифицирующего вхождения $V$. В програм\-му приема вводится
проверка включения набора х14 в $A$ (если х11 - последний не
идентифицированный операнд у $v$, то также проверка равенства длин
этих наборов). Корректируются информационные элементы
(набороперандов $v$ $A$) и (нормзнака х11 $\ldots$).

\item Операнд х11 содержит единственную переменную $x$, причем
справочник "по\-вто\-рение" \ указывает на возможность его
представления в виде $f(x \ldots x)$, где $f$ - рассматриваемая
коммутативно-ассоциативная операция по вхождению $v$ (контрольная
точка "прием(80)"). Этот же справочник определяет число $n$
повторений переменной $x$ в таком представлении. Данный прием
иденти\-фи\-ка\-ции пока используется только для обработки
константных натуральных сте\-пе\-ней, которые можно представить в
виде произведений выражения, иден\-ти\-фи\-ци\-ро\-ван\-ного с
$x$. Перед применением приема идентификации проверяется ряд
ограничений (в частности, отсутствие указателей, блокирующих
применение справочника "пересечениесписков"). Программной
переменной х16 при\-сва\-и\-ва\-ется набор $f$ - членов
идентифицирующего терма для $x$. Находится
ин\-фор\-ма\-ци\-он\-ный элемент (набороперандов $v$ $A$), дающий
список $A$ еще не исполь\-зо\-ван\-ных операндов идентифицирующего
вхождения $V$. При помощи справочни\-ка "пересечениесписков" \
находится процедура $P$, которая будет применяться для выделения
поднабора х16 в наборе $A$, и далее в программу приема
вставля\-ет\-ся $n$ - кратное исключение поднабора х16 из $A$.

\par\medskip

После выполнения ряда проверок, отсекающих рассмотрение в данной
ветви компилятора специальных случаев, обрабатываемых в других его
ветвях, спи\-сок приемов компиляции продолжается:

\item Операнд х11 выделен указателем "группировки" \ (контрольная
точка "при\-ем(81)"). Это означает, что он имеет вид $g(x y)$, где
$x$ - обычная либо функ\-ци\-о\-наль\-ная переменная, уже
идентифицированная с термом $f(t_1 \ldots t_n)$; $n \geq 1$, а
переменная $y$ должна идентифицироваться с таким термом $r$, что
все термы $g(t_1 \ r), \ldots , g(t_n \ r)$ содержатся среди еще
не использованных операндов идентифицирующего вхождения $V$. Здесь
$f,g$ - коммутативно-ассоциатив\-ные операции, причем $f$
расположена по вхождению $V$. Прежде всего, программ\-ной
переменной х14 присваивается набор $(t_1, \ldots, t_n)$. Затем -
переход через "ветвь 3", где программной переменной х16
присваивается переменная $y$. Находит\-ся информационный элемент
(набороперандов $v$ $A$), определяющий список $A$ еще не
использованных операндов идентифицирующего вхождения $V$. С
помощью справочника "пересечениесписков", если применение его в
данной ситуации не заблокировано указателями приема, находится
заголовок $P$ той проце\-ду\-ры, которая будет использоваться для
усмотрения представимости операнда в виде $g(t_i \ r)$. Символ $P$
присваивается переменной х18 (если специальной процедуры нет, то
х18 равно 0). Далее переменной х19 присваивается набор $g$ -
членов идентифицирующего терма $r$ переменной $y$. Если эта
переменная еще не идентифицирована, то для определения $r$
используется $t_1$ и какой-либо операнд списка $A$, представимый в
виде $g(t_1 \ r)$. Данный операнд присваи\-ва\-ет\-ся переменной
х20 (изначально обнуленной). Это нужно для того, чтобы
впоследствии исключить из рассмотрения уже обработанный терм
$t_1$. Нако\-нец, в программу приема вводится кванторная
импликация, осуществля\-ю\-щая просмотр еще не обработанных термов
$t_i$ и проверку для каждого из них нали\-чия операнда списка $A$,
представимого как $g(t_i \ r)$. Здесь отдельно
рассмат\-ри\-ва\-ют\-ся два подслучая - наличие специальной
процедуры $P$ (ненулевое х18) и ее отсутствие.

\item Операнд х11 - константный, причем не указано, что он должен
иденти\-фи\-ци\-ро\-вать\-ся с явным вхождением логического
символа. Если в этом случае еще не веден информационный элемент
(набороперандов $v$ $\ldots$) для остатка опе\-ран\-дов
идентифицирующего терма, то он вводится (контрольная точка
"прием(82)").

\par\medskip

Далее приемы компиляции рассматриваемой ветви распадаются на две
груп\-пы - для подслучая, когда информационный элемент
(набороперандов $v$ $\ldots$) уже имеется и для подслучая, когда
его еще нет. Начнем с рассмотрения первого подслучая.

\item Операнд х11 - константный (контрольная точка "прием(86)").
Если этот опе\-ранд - не последний из еще не идентифицированных
операндов вхождения $v$, причем допустимо использование
справочника "пересечениесписков" \ для по\-лу\-че\-ния специальной
процедуры $P$, выделяющей х11 среди еще не исполь\-зо\-ван\-ных
операндов идентифицирующего вхождения $V$, то в программу при\-ема
вставляется обращение к процедуре $P$. Корректируется список не
исполь\-зо\-ван\-ных операндов $V$. Если все операнды, кроме х11,
уже идентифицирова\-ны, то проверяется, что не использован
единственный операнд $V$, который равен х11. В случае указателя
"знаксуммы" \ предпринимается необходимая коррекция знака.

\item Операнд х11 относится к группе вхождений, выделенных
указателем "об\-щая\-сте\-пень", причем все остальные операнды
вхождения $v$ уже идентифици\-ро\-ва\-ны (контрольная точка
"прием(87)"). Выделенные данным указателем вхождения $w_1, \ldots,
w_n$ имеют вид двуместных операций, один операнд которых общий
(не\-ко\-то\-рая переменная $x$), а прочие операнды суть различные
и более нигде не встречающиеся в идентифицируемой части теоремы
переменные $y_1, \ldots, y_n$ (не\-ко\-торые из этих переменных
могут быть функциональными). Выделение об\-щей части $x$
идентифицирующих термов $t_1, \ldots, t_n$ вхождений $w_1, \ldots,
w_n$ пред\-при\-ни\-мается вспомогательной процедурой $P$, ссылка
на которую содержится в указателе. Информационный элемент
(общаястепень $P$ $x$ $(y_1, \ldots, y_n)$ $(w_1, \ldots, w_n)$
$(A_1 \ldots A_n)$) накапливает программные выражения $A_i$ для
термов $t_i$. В ука\-зан\-ной выше ситуации компилятор определяет
$A_i$ для терма $t_i$, соответствую\-ще\-го х11, формируя этот
терм из остатка неиспользованных операндов
иден\-ти\-фи\-ци\-ру\-ю\-ще\-го вхождения $V$.

\item Операнд х11 выделен указателем "группировка" \ (контрольная
точка "прием(\\ 25)"). Тогда этот операнд имеет вид $g(x \ t)$,
причем переменная $x$ иден\-ти\-фи\-ци\-руется как $f(X_1 \ldots
X_n)$, где $X_1, \ldots, X_n$ получаются путем выделения всех
операндов $B_1, \ldots, B_n$ идентифицирующего терма для $V$,
представимых в виде $g(X_1 \ T), \ldots, g(X_n \ T)$. Здесь $T$ -
идентифицирующий терм для $t$; $f$ - операция по вхождению $v$; $n
\geq 1$. Компилятор распознает данную ситуацию по наличию
информационного элемента (логарифмы х11 $\ldots$). Переменной х16
при\-сва\-и\-ва\-ет\-ся символ операции $g$; проверяется, что эта
операция ассоциативная и ком\-му\-та\-тив\-ная. Переменной х18
присваивается переменная $x$. Проверяется, что все переменные
терма $t$ уже идентифицированы. Если программное выражение $A$ для
набора не использованных операндов идентифицирующего терма $V$
от\-лич\-но от переменной, то для этого набора вводится
вспомогательная пе\-ре\-мен\-ная. Далее значением переменной х14
является выражение $A$, возможно, модифицированное указанным
образом. Переменной х20 присваивается про\-грам\-м\-ное выражение
для терма $T$. В программу приема вводится опе\-ра\-тор,
присваивающий первой неиспользуемой программной переменной набор
$R$ $g$ - членов терма $T$; эта программная переменная сохраняется
в х21. Далее со\-зда\-ет\-ся список операторов х22, которые
обеспечивают просмотр не использо\-ван\-ных операндов
идентифицирующего терма $V$, представимых в виде $g(X_i \ T)$, и
группировку из них значения $f(X_1 \ldots X_n)$. Сначала
переменной х22 при\-сва\-и\-ва\-ет\-ся 0, а затем ей
переприсваивается необходимое значение, причем
рас\-смат\-ри\-ва\-ют\-ся два случая: переменная $x$ либо выделена
указателем "заменазна\-ка" \ (тогда предпринимается учет знаков
операндов $V$ и коррекция знаков у $X_i$), либо не выделена. После
регистрации в программе операторов списка х22 проверяется,
остались ли не идентифицированные операнды вхождения $v$; если не
остались, то добавляется оператор, проверяющий пустоту списка не
использованных операндов вхождения $V$.

\item Общий случай идентификации операнда х11 (контрольная точка
"прием(99)"). В этом случае х11 идентифицируется с произвольным не
использованным опе\-ран\-дом $A$ идентифицирующего вхождения $V$,
и результат идентификации ре\-гис\-три\-руется процедурой
"учетоперанда". Эта же процедура обеспечивает ана\-лиз заголовка
операнда $A$. В особых случаях для идентификации х11
ис\-поль\-зу\-ет\-ся не один операнд вхождения $V$, а вся
оставшаяся не идентифици\-ро\-ван\-ной группа операндов, которые
соединяются расположенной по вхождению $v$ операцией $f$.
Например, это происходит, если х11 - последний не
иден\-ти\-фи\-ци\-ро\-ван\-ный операнд, и справочник "вид" \
предусматривает специаль\-ную процедуру его идентификации. Данный
справочник пока применяется лишь при компиляции распознавания в
одночлене заданной натуральной степени другого одночлена (полного
квадрата, куба и т.п.).

\par\medskip

На этом ветвь компилятора, отосящаяся к подслучаю, в котором
информа\-ци\-он\-ный элемент (набороперандов $v$) уже введен,
заканчивается. Ветвь, относя\-ща\-яся к альтернативному подслучаю,
начинается с контрольной точки "при\-ем(90)". Здесь расположены
следующие приемы компиляции:

\item $v$ - вхождение конъюнкции либо дизъюнкции, для которого
имеется ин\-фор\-ма\-ционный элемент (длялюбого $v$), задающий
необходимость учета возмож\-нос\-ти выделения $v$ в наборе
антецедентов кванторной импликации (контроль\-ная точка
"прием(91)"). Здесь компилятор вставляет в программу приема
об\-ра\-ще\-ние к процедуре "конъюнктоперанд" \ (в случае
конъюнкции) либо "дизъ\-юнкт\-опе\-ранд" \ (в случае дизъюнкции).
Эти процедуры перечисляют как опе\-ран\-ды конъюнкции
(соответственно, дизъюнкции), так и антецеденты кван\-тор\-ной
импликации (учтена возможность контрапозиции). Отбираются толь\-ко
операнды с заданным заголовком.

\item Общий случай идентификации операнда $v$ (контрольная точка
"прием(100)"). В накопителе х13 формируется оператор,
перечисляющий вхождения операндов идентифицирующего вхождения $V$;
эти вхождения становятся значениями пе\-ре\-мен\-ной х12. Если
имелся указатель, определяющий идентификацию х11 с первым
операндом $V$, то вместо этого в х13 заносится оператор
при\-сво\-е\-ния х12 вхождения данного первого операнда. Если
операция $V$ может оказаться вырожденной, то х13 корректируется:
учитывается вырожденный случай, в котором переменной х12
присваивается само $V$. Далее накопитель х13
ре\-гист\-ри\-ру\-ется в программе приема и добавляется группа
операторов, проверяющих отличие выделенного вхождения х12 от ранее
использованных. Для регистра\-ции идентификации операнда х11
используется процедура "учетоперанда". Ес\-ли не
идентифицированный операнд х11 вхождения $v$ был последним, то при
необходимости вводится проверка равенства чисел операндов
вхождений $v,V$.

\end{enumerate}

\subsubsection{Идентификация операнда коммутативно-ассоциативной
операции, вы\-де\-лен\-ного указателем "развертка" \ }

Этот прием компиляции располагается начиная с контрольной точки
"прием(211)". Уровень его срабатывания х7 достаточно большой - он
равен 6, т.е. приме\-не\-нию данного приема предшествуюет
исчерпание описанных выше приемов. Ситуация распознается
компилятором по наличию информационного элемента (развертка $A$),
в списке $A$ которого встречается терм $t$, размещенный по
вхождению $v$. Терм $t$ представляет собой одноместную операцию
$F$ над конечным семейством элемен\-тов, которую нужно
идентифицировать с термом вида $f(x_1 \ldots x_n)$, причем ${x_1,
\ldots x_n}$ идентифицируется с данным конечным семейством. Здесь
$f$ - коммутативно-ас\-со\-ци\-а\-тив\-ная операция по вхождению
$v$, обобщением которой на конечные семейст\-ва служит $F$
(например, $f$ может быть операцией $+$, а $F$ - $\sum$). Кроме
того, $t$ может иметь вид кванторной импликации $\forall_i(i \in
{1, \ldots ,n}\rightarrow P(i))$, идентифицируемой с конъюнкцией
$P(1) \ \& \ \ldots \ \& \ P(n)$. Компилятор определяет по $F$
символ $f$ с по\-мо\-щью справочника "развертка", присваивая его
переменной х13. В случае кван\-тор\-ной импликации этой переменной
присваивается символ "и". Фактическая иден\-ти\-фи\-ка\-ция х11
будет выполняться другими приемами компилятора; здесь же лишь
формируется необходимая для их срабатывания установка на
идентификацию (раз\-верт\-ка х11 $R$ 2), где $R$ - информационный
элемент (набороперандов $v$ $B$), опре\-де\-ля\-ю\-щий список еще
не использованных операндов, из которого будут извлекать\-ся
элементы конечного семейства. Если текущая установка на
идентификацию х2 оказывается исчерпанной (х11 - последний не
идентифицированный операнд $v$, а надоперация $v$ уже
идентифицирована), то она удаляется. Затем - откат к началу цикла
идентификации.

\subsubsection{Особые случаи идентификации операнда
ассоциативно-коммутативной опе\-ра\-ции}

После контрольной точки "прием(102)" \ собраны остальные приемы
компилятора, обеспечивающие идентификацию операнда х11
ассоциативно-коммутативной опе\-ра\-ции. Наименьший уровень х7
срабатывания таких приемов равен 4. Все они относятся только к
идентификации переменных - простых либо функциональных, причем
пер\-во\-оче\-ред\-ное применение их (см. рассмотренную выше ветвь
идентификации пе\-ре\-мен\-ных, относящуюся к "малому" \ уровню
срабатывания 1) нецелесообразно. В част\-нос\-ти, здесь находится
прием идентификации переменной, встречающейся в нес\-коль\-ких
различных одноименных операциях, как пересечения операндов этих
опе\-ра\-ций (обобщенный с учетом справочника
"пересечениесписков").

Начнем с рассмотрения случая, в котором по вхождению х11
расположена обыч\-ная переменная х12. Здесь выделяются следующие
подслучаи:

\begin{enumerate}

\item Переменная х12 идентифицируется с числовой константой
(контрольная точ\-ка "прием(103)"). Этот прием компиляции
дополняет аналогичный прием, при\-ме\-няв\-шийся на уровне 1 (там
его применение сопровождалось рядом ограни\-че\-ний, которые здесь
снимаются). Если операция по вхождению $v$ есть умножение, то при
отсутствии неиспользованного сомножителя идентифицирующего
вхож\-де\-ния $V$, представляющего собой десятичную константу, х12
идентифици\-ру\-ет\-ся с единицей. Иначе х12 идентифицируется с
произвольным не использованным операндом вхождения $V$, являющимся
десятичной константой. При компиляции отдельно рассматриваются
подслучаи наличия элемента (набороперандов $v$) и его отсутствия.
Предпринимается учет указателя "заменазнака", выделяющего х12.

\par\medskip

Для дальнейших приемов компиляции составляется список х13 всех
вхожде\-ний переменной х12 в идентифицируемую часть теоремы. Если
имеется указа\-тель "пересечение", специально выделяющий те
подтермы, из рассмотре\-ния которых должна происходить
идентификация х12, то х13 заменяется на набор вхождений х12 в эти
подтермы. После контрольной точки "прием(105)" \
на\-чи\-на\-ет\-ся рассмотрение случаев, в которых список х13
имеет более одного элемента.

\item Переменная х12 имеет несколько идентифицируемых вхождений;
хотя бы одно из них является операндом коммутативно-ассоциативной
операции $u$, иден\-ти\-фи\-ци\-ру\-е\-мой с указателем
"знаксуммы"; элемент (набороперандов $u$ $\ldots$) не введен,
причем обращение к процедуре "идентификатор" \ произошло из
ком\-пи\-ля\-ции фильтра "контекст" (контрольная точка
"прием(106)"). Это - ред\-кий особый случай: встречающееся в
фильтре выражение $t$ предметного уровня выделено указателем
"знаксуммы", означающим, что возможна идентифи\-ка\-ция $t$ как с
изменением знаков всех операндов, согласно указателю, так и без
изменения знаков. При этом для остальной части фильтра (и приема в
целом) несущественно, имело ли место изменение знаков или нет.
Соответственно, ком\-пи\-ля\-тор вставляет в программу фильтра
дизъюнктивный оператор, сна\-ча\-ла присваивающий некоторой
программной переменной $y$ набор корневых опе\-ран\-дов $t$, а
затем набор этих же операндов с измененными знаками. Для
корнево\-го вхождения $w$ подтерма $t$ вводится информационный
элемент (набороперан\-дов $w$ $y$); элемент (знаксуммы $\ldots$)
удаляется, и откат к началу цикла иденти\-фи\-ка\-ции.

\par\medskip

Далее проверяется, что если переменная х12 выделена указателем
"замена\-зна\-ка", то информационные элементы (заменазнака
$\ldots$), соответствующие точ\-кам перенесения знака на вхождения
списка х13, уже содержат программ\-ные выражения для этих точек.

\item Все вхождения списка х13 суть вхождения операндов подтермов,
имеющих один и тот же коммутативно - ассоциативный заголовок $f$
либо преобразуемых к та\-ко\-му виду путем тождественного
преобразования, состоящего в изменении зна\-ка всех корневых
операндов и вынесении этого знака наружу (контрольная точ\-ка
"прием(107)"). Этот случай распадается на два подслучая:

\begin{enumerate}

\item Все вхождения списка х13 относятся к различным вхождениям
своих над\-опе\-ра\-ций $f$ (контрольная точка "прием(109)").
Прежде всего, здесь про\-ве\-ря\-ется отсутствие такой не
идентифицированной переменной $y$, кото\-рая являлась бы операндом
всех надопераций вхождений списка х13, а также еще каких-то
операций в идентифицируемой части теоремы. Если такая переменная
$y$ имеется, то приоритетной является ее идентифи\-ка\-ция, а
обработка переменной х12 обрывается. Таким образом, в первую
оче\-редь идентифицируются те переменные, которые определяются как
"общая ча\-сть" \ возможно большего числа операций $f$.

Далее - переход через "ветвь 3", где анализируется случай
выделе\-ния рассматриваемых в списке х13 вхождений переменной х12
указателями "заменазнака". Чтобы идентификация переменной х12 как
общей части соответствующих $f$ - операций была корректной,
необходимо соответ\-ст\-вие переносимых на х12 внешних одноместных
операций $s$ этих $f$-опера\-ций, имеющихся у идентифицируемых
термов, таким операциям у иден\-ти\-фи\-ци\-ру\-ющих термов (с
точностью до повсеместной замены знака $s$). Про\-вер\-ка такого
соответствия обеспечивается вводимыми компилятором фильт\-ра\-ми
х20: все элементы списка х13, начиная со второго, сравниваются с
пер\-вым элементом.

После создания группы фильтров х20 - откат к переходу через "ветвь
1", где инициализируется нулем переменная х14 и вводится пустой
на\-ко\-пи\-тель х15. В процессе просмотра элементов х16 списка
х13 этот накопи\-тель заполняется наборами операндов надопераций
вхождений х16. Значе\-ние х14 формируется в цикле как "общая
часть" \ всех таких наборов. При заполнении списка х15 учитываются
два случая: надтерм вхождения х16 имеет вид $f(...x16 ...)$, либо
вид $f(... s(x16)...)$, где знак $s$ может быть изменен
одновременно у всех операндов и вынесен за операцию $f$. Во втором
случае знаки элементов набора, заносимого в список х15, заменяются
на про\-ти\-во\-по\-ложные. Собственно коррекция значения х14 на
очередном шаге цик\-ла выполняется, начиная с перехода через
"ветвь 2" \ (в том же фрагменте, где х14 было инициализировано).
Для первого элемента списка х13 перемен\-ной х14 присваивается
только что зарегистрированный в накопителе х15 набор. Для всех
последующих - реализуется переход через "иначе 1".

Здесь переменной х18 присваивается либо 0, либо название $P$ той
про\-це\-ду\-ры для нахождения "общей части" \ двух выражений,
которая определя\-ет\-ся справочником "пересечениесписков".
Переменной х19 присва\-и\-ва\-ет\-ся текущий (последний занесенный
в список х15) набор $f$- операн\-дов. Если имеется указатель
"выписка($\ldots$)", выделяющий специальные груп\-пы операндов,
участвующие в идентификации переменной х12, то х19
кор\-рек\-ти\-ру\-ет\-ся - в нем сохраняются только допустимые
согласно этому указа\-те\-лю операнды. Особо рассматривается
случай ненулевого х18 и дли\-ны набора х13, равной 2 - здесь
процедура $P$ сразу определяет не только "общую часть" \ двух
выражений, но и их остатки, что позволяет за один шаг провести
идентификацию х12 и сохранить данные остатки в
ин\-фор\-ма\-ци\-он\-ных элементах (набороперандов $\ldots$). Если
такой случай имеет место, то после его обработки происходит откат
к началу цикла идентифика\-ции, иначе - по окончании цикла
просмотра элементов х16 списка х13 выполняется переход через
"иначе 1". Здесь реализуется цикл определе\-ния остатков наборов
операндов надопераций $f$ вхождений списка х13 пос\-ле исключения
из них "общей части", идентифицируемой с х12. Эти ос\-тат\-ки
регистрируются в информационных элементах (набороперандов
$\ldots$). По окончании цикла регистрируется результат
идентификации перемен\-ной х12 (при необходимости учитывается
указатель "заменазнака").

\item Существуют различные вхождения списка х13, имеющие одно и то
же вхождение надоперации $f$ (контрольная точка "прием(110)").
Тогда вы\-би\-ра\-ет\-ся какая-то пара различных вхождений
$v_1,v_2$ списка х13, пред\-став\-ля\-ю\-щих собой
непосредственные операнды одного и того же вхождения $w$ операции
$f$, и переменная х12 идентифицируется с термом, встречаю\-щим\-ся
среди неиспользованных операндов идентифицирующего для $w$
вхож\-де\-ния $W$ хотя бы дважды. Отдельно рассматриваются
подслучаи нали\-чия информационного элемента (набороперандов $w$
$\ldots$) и его отсутствия.

\end{enumerate}

\item Все вхождения списка х13 суть вхождения операндов
коммутативно - ас\-со\-ци\-а\-тив\-ных операций, однако не все эти
операции имеют один и тот же заголо\-вок (контрольная точка
"прием(108)").

Проверяется, что для всех вхождений $w$ коммутативно -
ассоциативных опера\-ций, имеющих операнд из списка х13, уже
введены установки на идентифи\-ка\-цию (операнд $w$ $\ldots$) -
тогда определены и программные выражения для их идентифицирующих
вхождений. Чтобы идентифицировать переменную х12, используется
первый элемент списка х13, являющийся операндом некото\-рой
операции $f(\ldots)$, а также какой-то элемент х16 этого списка,
являющийся опе\-ран\-дом операции $g(\ldots)$ с другим заголовком.
Вхождения данных операций в теорему приема присваиваются
переменным х14 и х17 соответственно. Иден\-ти\-фи\-цирующий терм
для х12 может либо быть отдельным операндом операции $f(\ldots)$,
либо быть образован группой таких операндов. Но в последнем случае
он будет иметь известный заголовок $f$, и его можно найти среди
операндов операции $g(\ldots)$, имеющих этот заголовок. Переменная
х20 представляет собой накопитель, в который заносится пара
операторов: первый просматривает не\-ис\-поль\-зо\-ванные операнды
идентифицирующего терма для операции $f$, второй -
неиспользованные операнды идентифицирующего терма операции $g$,
имею\-щие заголовок $f$. Отдельно здесь рассматриваются случаи
наличия информа\-ци\-он\-но\-го элемента (набороперандов $\ldots$)
для неиспользованных операндов опера\-ции и отсутствия такого
элемента. В последнем случае учитываются возмож\-нос\-ти наличия
указателей "заменазнака" \ и "знаксуммы". Собственно идентификация
переменной х12 выполняется оператором х21 - дизъюнкцией операторов
пары х20. После того, как х12 идентифицирована по паре элементов
набора х13, начинается обработка всего этого набора. Прежде всего,
переменной х23 при\-сва\-и\-ва\-ется список всех символов $f_i$
коммутативно - ассоциативных операций, имеющих операнд из х13.
Затем вводится и в цикле просмотра списка х13 заполняется
накопитель х24 наборов $f_i$ - членов терма $t$, идентифированного
с х12. В этом же цикле происходит проверка корректности
идентификации переменной х12 - наборы $f_i$ - членов терма $t$
должны представлять собой часть наборов неиспользованных операндов
идентифицирующих термов для опера\-ций $f_i(\ldots)$. Здесь
"часть" \ понимается, в зависимости от указателей приема и символа
операции $f_i$, либо в смысле процедуры, определяемой справочником
"пересечениесписков", либо как обычное теоретико-множественное
вклю\-че\-ние.

\item Длина списка х13 равна 1, т.е. переменная х12 имеет
единственное вхождение в идентифицируемой части (контрольная точка
"прием(111)"). Уровень сра\-ба\-ты\-вания приема компиляции,
обрабатывающего данный случай, равен 6. Он имеет "остаточный" \
характер - применяется по исчерпании прочих средств идентификации
и идентифицирует переменную х12 с произвольным еще не
использованным операндом вхождения $V$, соответствующего $v$.
Особо выделен подслучай, когда кроме х12 не идентифицирован лишь
единственный операнд вхождения $v$, представляющий собой
функциональную переменную, зависящую от переменных внешних
связывающих приставок, в то время как х12 не входит в эти
приставки. Тогда х12 идентифицируется путем группировки всех
не\-ис\-поль\-зо\-ванных операндов вхождения $V$, не
пересекающихся с соответствую\-щи\-ми связывающими приставками.

\end{enumerate}

Среди приемов, обрабатывающих особые случаи идентификации операнда
ком\-му\-та\-ти\-вно - ассоциативной операции, упомянем также
прием идентификации функ\-ци\-о\-наль\-ной переменной (контрольная
точка "прием(112)"), срабатывающий на седь\-мом уровне. Если эта
переменная оказывается единственным не идентифициро\-ван\-ным
операндом рассматриваемой коммутативно - ассоциативной операции,
то она идентифицируется по остаточному принципу. Если остаются не
идентифици\-ро\-ва\-ны ровно два операнда, представляющие собой
различные функциональные перемен\-ные, то первый из них
идентифицируется с произвольным неиспользованным опе\-ран\-дом
идентифицирующего вхождения, а второй - с остатком этих операндов.

\subsubsection{Идентификация коммутативного, но не ассоциативного
символа}

Этот раздел процедуры "идентификатор" \ начинается с контрольной
точки "при\-ем(48)" \ и легко может быть найден через оглавление
программ. Его приемы сра\-ба\-ты\-ва\-ют при значении текущего
уровня х7, равном 2. Логический символ $f$ по текущему
идентифицируемому вхождению $v$ допускает произвольные
перестановки своих операндов, но не ассоциативен. При этом
отсутствует информационный элемент (коммутативно $v$), означающий,
что перестановки операндов $v$ при идентификации запрещены. В
основном, здесь обрабатываются символы симметричных двуместных
отношений. Рассматриваются следующие случаи:

\begin{enumerate}

\item $f$ - логическая связка "эквивалентно", причем вхождение $v$
выделено указате\-лем "Отрицание" \ (контрольная точка
"прием(227)"). Это означает, что при идентификации эквивалентности
допускается одновременный переход к от\-ри\-ца\-ни\-ям обеих ее
частей. Данный случай встречается достаточно редко - в при\-е\-мах
вывода теорем. Компилятор вставляет оператор "Операнды($\ldots$)",
при\-сва\-и\-ва\-ющий двум первым неиспользуемым программным
переменным $a,b$ вхож\-де\-ния операндов $v$ - сначала в прямом, а
затем в обратном порядке. Таким обра\-зом учитывается
коммутативность. Чтобы учесть указатель "Отрицание", пос\-ле этого
поочередно двум следующим программным переменным $c,d$
при\-сва\-и\-ва\-ют\-ся сначала вхождения термов $a,b$, а затем
корневые вхождения отрица\-ний этих термов. Полученные таким
образом идентифицирующие вхожде\-ния $c,d$ для первого и второго
операндов вхождения $v$ регистрируются с по\-мо\-щью обращений к
процедуре "учетоперанда".

\item $f$ - двуместная операция, имеющая своим операндом
переменную $x$, выде\-лен\-ную указателем "единица" \ (контрольная
точка "прием(49)"). Переменной х12 присваивается список
программных выражений для вхождений уже иден\-ти\-фи\-ци\-рованных
операндов вхождения $v$. Затем просматриваются еще не
иден\-ти\-фи\-ци\-рованные вхождения х13 операндов $v$. Если х13 -
вхождение операнда $x$, то вводится оператор
"альтернатива($\ldots$)", присваивающий некоторой про\-грам\-мной
переменной $z$ произвольный операнд идентифицирующего для $v$
вхож\-де\-ния $V$, если по вхождению $V$ находится символ операции
$f$, а в противном случае присваивающий этой переменной единицу
(однобуквенный терм, со\-глас\-но указателю "единица"). Если же
х13 - вхождение отличного от $x$ операнда, то вводится оператор
"альтернатива($\ldots$)", отличающийся от первого лишь тем, что во
втором подслучае переменной $z$ присваивается подтерм по
вхожде\-нию $V$. Далее идентифицирующий для вхождения х13 терм $z$
регистрируется с помощью процедуры "учетоперанда".

\item Операнды двуместной операции $f$ - переменные, относительно
которых тео\-ре\-ма приема симметрична (контрольная точка
"прием(50)"). Симметрич\-ность теоремы приема относительно данных
переменных $y,z$ проверяется путем пе\-ре\-ста\-новки их в теореме
и проверки того, что новая и старая версия теоремы пос\-ле
применения к ним процедуры "стандупорядочение" \ совпадают.
Прове\-ря\-ет\-ся также, что переменные $y,z$ еще не
идентифицированы. Ввиду симметричнос\-ти, нет необходимости
рассматривать при идентификации два случая: без
пе\-ре\-ста\-нов\-ки и с перестановкой операндов идентифицирующего
вхождения. Здесь переменная $y$ идентифицируется с первым
операндом, а $z$ - со вторым.

\par\medskip

Для оставшихся в рассматриваемой ветви компилятора приемов
создается спи\-сок х11 операндов идентифицируемого вхождения $v$,
в котором сначала рас\-по\-ла\-га\-ют\-ся операнды, отличные от
переменных, а затем - переменные. После этого не
идентифицированные элементы х12 списка х11 просматриваются по
порядку, и к ним применяются перечисляемые ниже приемы.

\item $v$ есть вхождение антецедента, выделенного указателем
"равно" \ (контроль\-ная точка "прием(165)"). Проверяется, что х12
- последний не идентифициро\-ван\-ный операнд вхождения $v$.
Находится информационный элемент (опе\-ранд $\ldots$),
определяющий программное выражение для уже
идентифициро\-ван\-но\-го операнда вхождения $v$. Переменной х16
присваивается программное вы\-ра\-же\-ние для списка посылок,
соответствующего контексту выполняемых преобра\-зо\-ва\-ний. Затем
в программу компилируемого приема заносится обращение к оператору
"транзитоперанд", перечисляющему возможные вхождения для
иден\-ти\-фи\-ка\-ции х12. Регистрация результата идентификации
х12 выполня\-ет\-ся про\-це\-ду\-рой "учетоперанда".

\item Общий случай идентификации коммутативного, но не
ассоциативного сим\-во\-ла (контрольная точка "прием(51)"). Здесь
х12 идентифицируется с произволь\-ным еще не использованным
операндом идентифицирующего вхождения. Ре\-гис\-тра\-ция
выполняется с помощью процедуры "учетоперанда".

\end{enumerate}

\subsubsection{Идентификация символа, обладающего специальной
симметрией}

Рассмотрение данного случая начинается с контрольной точки
"прием(62)". По вхож\-де\-нию $v$ (переменная х10) расположен
логический символ $f$, для которого спра\-воч\-ник
"схемаоперандов" \ определяет древовидную схему х11 допустимых
пере\-ста\-но\-вок операндов. Каждая вершина схемы х11
соответствует некоторому множест\-ву операндов операции $f$,
определяет разбиение его на подмножества и указы\-ва\-ет,
допустимы ли произвольные перестановки этих подмножеств при
идентифи\-ка\-ции. Она кодируется набором ($A \ B_1 \ \ldots \
B_n$), у которого $B_1, \ldots, B_n$ суть либо верши\-ны схемы,
соответствующие подмножествам операндов, либо, в случае
одноэлемент\-но\-го подмножества, номера операндов. Для ссылок на
операнды используются сим\-воль\-ные номера, начиная с 1. $A$ -
указатель допустимости перестановки подмножеств: 1 - допустима, 0
- не допустима. Заметим, что коммутативные операции не
учиты\-ва\-ют\-ся в справочнике "схемаоперандов"; он нужен только
для случаев специаль\-ной симметрии. Например, такая симметрия
встречается у выражения "угол($ABC$)", где допустима перестановка
$A$ и $C$, в то время как $B$ имеет фиксированную вто\-рую
позицию.

После оператора "повторение" \ начинается цикл обработки операндов
вхожде\-ния $v$. Прежде всего, создается информационный элемент
(схемаоперандов $v$ $A_1$ $A_2$) (см. переход через "иначе 2"). У
этого элемента $A_1$ представляет собой результат за\-ме\-ны в
древовидной схеме х11 всех номеров операндов операции $v$
вхождениями этих операндов в теорему приема. $A_2$ - накопитель, в
котором по мере идентифи\-ка\-ции регистрируются тройки (1 $C_1$
$C_2$), такие, что $C_1$ - либо набор из древовидной схемы $A_1$,
либо вхождение операнда операции $v$; $C_2$ - программное
выражение, зна\-че\-ни\-ем которого служит объект, с которым
идентифицируется $C_1$. Первый элемент 1 вве\-ден из технических
соображений - чтобы можно было использовать оператор "би\-ключ".
Если $C_1$ - набор, определяющий древовидное подразбиение
некоторого мно\-жест\-ва операндов операции $v$, то значением
$C_2$ служит соответствующая дре\-во\-вид\-ная конструкция,
образованная операндами идентифицирующего вхождения. В ней лишь
отброшены первые элементы - индикаторы допустимости перестановок.
Если же $C_1$ - вхождение операнда, то значением $C_2$ служит
вхождение соответ\-ству\-ю\-ще\-го идентифицирующего операнда. При
допустимости перестановок вет\-вей кор\-не\-во\-го набора схемы
$A_1$ накопитель $A_2$ инициализируется единственным элемен\-том,
соответствующим корневому набору этой схемы. Иначе $A_2$
образуется из всех на\-бо\-ров и вхождений, на которые ссылается
корневой набор.

Далее начинается цикл обработки неидентифицированных операндов х13
вхож\-де\-ния $v$. Древовидная структура $A_1$ (переменная х14)
просматривается по прин\-ци\-пу "сначала вглубь" \ до обнаружения
вхождения х13. При просмотре исполь\-зу\-ет\-ся стэк х15,
образованный тройками ($D_1 \ D_2 \ D_3$), где $D_1$ - набор
дерева $A_1$; $D_2$ - номер выделенного разряда в $D_1$, который
соответствует предыдущему эле\-мен\-ту стэка (нумерация начинается
с 0); $D_3$ - вхождение этого разряда. Новые трой\-ки заносятся в
начало стэка. После нахождения ветви, ведущей в дереве $A_1$ к
х13, начинается перемещение по ней от корня дерева. При этом в
$A_2$ заносятся элемен\-ты, соответствующие проходимым вершинам.
Здесь учитываются указатели до\-пус\-ти\-мос\-ти перестановок:
либо берется ветвь поддерева с заданным номером, либо -
произвольная ветвь, еще не использованная в $A_2$. По достижении
концевой вер\-ши\-ны определяется программное выражение для
вхождения х13, которое регистриру\-ет\-ся с помощью процедуры
"учетоперанда".

\subsubsection{Идентификация символа, допускающего
циклические перестановки опе\-ран\-дов либо изменение порядка
операндов на противоположный}

Такие символы часто встречаются в геометрических обозначениях
(например, "квад\-рат($ABCD$)"). Соответствующая ветвь компилятора
легко находится через ог\-лав\-ле\-ние программ.

Сначала рассматривается особый случай - вхождение $v$ выделено
указателем "сдвиг" \ (контрольная точка "прием(143)"). Переменной
х11 присваивается за\-бла\-го\-вре\-менно созданный по указателю
информационный элемент (сдвиг $v$ $A$ $t$ 0). Здесь $A$ - список
символьных номеров операндов вхождения $v$, внутри которого
проис\-хо\-дят циклические перестановки; $t$ - терм, при
формировании которого требуется синхронная перестановка корневых
операндов. Если по вхождению $v$ располага\-ет\-ся символ "набор",
то вставляется оператор, проверяющий совпадение коли\-честв
корневых операндов в идентифицируемом и идентифицирующем наборах.
Затем вводится обращение к процедуре "сдвиг", перечисляющей наборы
$w$ опе\-ран\-дов иден\-тифицирующего для $v$ вхождения $V$,
получающиеся при всевозможных пе\-ре\-ста\-новках указанного типа.
Кроме набора операндов, эта процедура выдает вели\-чи\-ну
циклического сдвига, причем программная переменная $x$ для нее
регистрируется в информационном элементе (сдвиг $\ldots$) вместо
последнего нуля. Затем неиден\-ти\-фи\-ци\-рованные операнды
вхождения $v$ идентифицируются с расположенными на
со\-от\-вет\-ству\-ющих позициях элементами набора $w$.

\par\medskip

Рассмотрение общего случая циклических перестановок начинается с
контроль\-ной точки "прием(161)". Здесь находится информационный
элемент (цикл\-упо\-ря\-до\-чение $v$ $A$), присваиваемый
переменной х11. Символьный номер $A$ определяет тип допустимых
перестановок операндов вхождения $v$. Если он равен 0, то
допуска\-ют\-ся произвольные циклические перестановки; если он
равен 1, то - лишь одна циклическая перестановка (после нее на
первом месте оказывается второй опе\-ранд); тип 2 означает, что
допускается не циклическая перестановка, а лишь измене\-ние
порядка операндов на противоположный; тип 3 - что допускаются
вообще про\-из\-воль\-ные (не обязательно циклические)
перестановки операндов; тип 4 - допуска\-ют\-ся произвольные
циклические перестановки, быть может, сопровождаемые измене\-нием
порядка операндов на противоположный.

Сначала рассматривается случай $A=2$, т.е. возможность изменения
порядка операндов на противоположный. Компиляция предусмотрена
лишь для числа опе\-ран\-дов вхождения $v$, равного 3 либо 4.
Создается дизъюнктивный оператор х15, который поочередно
присваивает первым неиспользованным программным пе\-ре\-мен\-ным
операнды идентифицирующего для $v$ вхождения $V$ - сначала в
прямом, а затем в обратном порядке. Этот оператор заносится в
компилируемую программу, после чего результаты идентификации
операндов регистрируются с помощью процедуры "учетоперанда".

Если $A$ не равно 2, то переход через "иначе 2". Здесь
проверяется, фиксировано ли число операндов операции по вхождению
$v$. Если нет, то в программу приема заносится проверка совпадения
чисел операндов идентифицируемого и иден\-ти\-фи\-ци\-ру\-ющего
вхождений $v$, $V$. Далее - переход через "ветвь 1".

Проверяется, идентифицирован ли хотя бы один операнд вхождения
$v$. Если нет, то выполняется определяющая циклический сдвиг
идентификация пер\-во\-го опе\-ран\-да х12 вхождения $v$. При
$A=4$ в программу заносится оператор, поочередно присваивающий
указателю $u$ изменения порядка операндов значения 0 и 1. Этот
указатель регистрируется в информационном элементе (подобны $v$
$u$). При $A$ от\-лич\-ном от 1 в качестве идентифицирующего для
х12 берется произвольный опе\-ранд вхождения $V$; если $A$ равно
1, то - только первый либо второй операнды.

Если уже имеется идентифицированный операнд вхождения $v$, то
находится про\-из\-воль\-ный не идентифицированный операнд х12.
Если $A$ не равно 3, то про\-ве\-ря\-ет\-ся, что операнд х13,
циклически предшествующий операнду х12, уже идентифици\-ро\-ван с
некоторым вхождением $s$. Тогда х12 идентифицируется путем
циклического сдви\-га $s$; в случае $A=4$ учитывается указатель
изменения порядка. Если $A$ равно 3, то х12 идентифицируется с
произвольным еще не использованным операндом вхожде\-ния $V$.
Здесь учитывается возможность выделения одного из операндов
вхождения $v$ указателем "пустоеслово". Такой операнд
идентифицируется последним, по ос\-та\-точ\-но\-му принципу
(возможно, с единицей, соответствующей пустому остатку
опе\-ран\-дов).

\subsubsection{Идентификация связывающей приставки, если в ней
выделена пе\-ре\-мен\-ная, идентифицируемая по остаточному
принципу}

Начало данной ветви компилятора - контрольная точка "прием(164)".
Символ $f$ по текущему вхождению $v$ - один из связывающих
символов "класс", "отображение", "существует", "длялюбого".
Уровень х7 срабатывания приемов компилятора равен 2. Переменной
х11 присваивается связывающая приставка вхождения $v$; в ней
на\-хо\-дит\-ся переменная х13, выделенная указателем
"кортежпеременных". Такая пе\-ре\-мен\-ная х13 будет
идентифицироваться с некоторой группой переменных
связы\-ва\-ю\-щей приставки идентифицирующего вхождения $V$.
Реализуется цикл про\-смот\-ра не идентифицированных вхождений х14
в связывающую приставку пере\-мен\-ных х15, которые должны быть
идентифицированы с единственной переменной. Они идентифицируются с
произвольными не использованными элементами $X$
иденти\-фи\-ци\-ру\-ющей связывающей приставки, причем без учета
порядка вхождения. Ес\-ли переменная х15 уже была идентифицирована
с некоторой переменной $Y$, то при этом проверяется равенство $X$
и $Y$.

После цикла просмотра вхождений х14 - переход через "иначе 2".
Здесь вы\-пол\-ня\-ет\-ся идентификация переменной х13. Сначала
рассматривается случай, когда эта переменная выделена указателем
"списокпеременных", определяющим ее иден\-ти\-фи\-ка\-цию со
списком всех переменных связывающей приставки вхождения $V$,
имеющих свободные вхождения в заданном терме $t$ теоремы приема.
Переменной х19 при\-сва\-и\-ва\-ет\-ся программное выражение для
этого списка, и идентификация х13 ре\-гист\-ри\-ру\-ется в
информационном элементе (наборпеременных х13 х19). Если же х13 не
выделена указателем "списокпеременных", то она идентифицируется со
списком всех не использованных переменных связывающей приставки
вхождения $V$. В случае, когда х13 была ранее идентифицирована из
других соображений с некоторым спи\-ском переменных, вставляется
оператор, проверяющий совпадение обоих списков (без учета порядка
их элементов).

\subsubsection{Идентификация антецедента - функциональной
переменной}

Если функциональная переменная $f(t)$ является антецедентом
кванторной имп\-ли\-ка\-ции, связывающая приставка $X$ которой
содержит переменные $y$, не входящие в $t$, то применяется прием
компиляции, идентифицирующий $f(t)$ с конъюнкцией всех еще не
использованных антецедентов, не имеющих вхождений переменных,
иденти\-фи\-ци\-ро\-ван\-ных с какой-либо из указанных переменных
$y$. Этот прием расположен пос\-ле контрольной точки "прием(234)";
он применяется при текущем уровне х7, равном 3.

\subsubsection{Идентификация ассоциативного, но не коммутативного
символа}

Данный случай обрабатывается начиная с контрольной точки
"прием(168)". Вхож\-де\-ния, выделенные указателем приема,
определяющим возможные циклические пе\-ре\-ста\-нов\-ки операндов,
здесь не рассматриваются. Выделяются два подслучая:

\begin{enumerate}

\item Идентифицируемая операция имеет вид $f(t_1 \ t_2)$ и
представляет собой за\-ме\-ня\-е\-мый терм теоремы приема, имеющей
вид тождества (контрольная точка "прием(244)"). Тогда в
идентифицирующей операции $f(A_1 \ldots A_n)$ выби\-ра\-ют\-ся
произвольные два идущих подряд операнда $A_i$, $A_{i+1}$; $t_1$
идентифици\-ру\-ет\-ся с первым из них, а $t_2$ - со вторым.
Остатки операндов, идущие до и пос\-ле пары $A_i,A_j$,
регистрируются в информационном элементе (замена\-груп\-пы
$\ldots$), который будет использован при синтезе преобразующей
части приема: они образут не изменяемый контекст преобразования.

\item Общий случай. Последовательно просматриваются операнды $t_i$
иден\-ти\-фи\-ци\-руемого терма $f(t_1 \ldots t_n)$. Операнд $t_1$
идентифицируется с первым операн\-дом $A_1$ идентифицирующей
операции $f(A_1 \ldots A_m)$. Каждый последующий опе\-ранд $t_i$,
кроме $t_n$, идентифицируется как следующий за операндом
$A_{i-1}$, сохраняемым в информационном элементе (ассоциативно
$\ldots$). Оба эти подслучая разби\-ра\-ют\-ся после контрольной
точки "прием(169)". Наконец, последний операнд $t_n$ (контрольная
точка "прием(170)") идентифицируется с термом $f(A_n \ldots A_m)$.

\end{enumerate}

\subsubsection{Идентификация набора без учета порядка элементов}

Если вхождение терма "набор($t_1 \ldots t_n$)" \ выделено
указателем "список", то опе\-ран\-ды $t_i$ идентифицируются с
операндами $A_j$ идентифицирующего терма "набор($A_1 \ldots A_n$)"
\ в произвольном порядке - каждый раз выбирается какой-либо еще не
исполь\-зо\-ван\-ный операнд (контрольная точка "прием(174)").

\par\medskip

На этом список приемов компилятора, обрабатывающих установку на
иден\-ти\-фи\-ка\-цию "операнд", завершается. Прежде, чем
переходить к обработке установок других типов, анализируется
наличие указателя "начало($\ldots$)", задающего
пер\-во\-оче\-редное рассмотрение антецедентов. Если текущая
установка на идентификацию х9 относится к антецеденту, не
выделенному указателем "начало", в то время как имеется другая
установка, относящаяся к выделенному антецеденту, то
рас\-смот\-ре\-ние установки х9 блокируется (контрольная точка
"прием(113)").

\subsection{Установка на идентификацию "корень"\ }

Если установка на идентификацию х9 имеет вид (корень $v$), то $v$
есть вхож\-де\-ние антецедента теоремы приема (иногда -
конъюнктивного члена заменяемой части теоремы), который должен
быть идентифицирован с каким-либо утверждением из контекста точки
привязки приема. Это может быть посылка или условие теку\-щей
задачи; посылка пакетного оператора; конъюнктивный член внешней по
отно\-ше\-нию к точке привязки конъюнкции, и т.п. Рассмотрение
установки "корень" \ начинается с контрольной точки "прием(114)".
Оно происходит при значениях 3 либо 8 теку\-ще\-го уровня х7. Если
вхождение $v$ выделено ука\-за\-те\-лем приема "конец", то уровень
3 отменяется. Как сказано выше, $v$, вообще говоря, не обязательно
является вхож\-де\-ни\-ем антецедента теоремы приема. Однако, для
краткости в подзаголовках ни\-же\-сле\-ду\-ю\-щих пунктов будем
называть его антецедентом.

Переменной х10 присваивается вхождение $v$. Если вхождение $v$
выделено ука\-за\-те\-лем приема "подчинено" \ (информационный
элемент (смпосылка $\ldots$)), опреде\-ля\-ю\-щим список
переменных, которые должны быть идентифицированы до обработки $v$,
то проверяется, что все эти переменные уже найдены. Если прием
имеет заго\-ло\-вок "параметризация" \ либо
"заменаусловия($\ldots$)", то он может выполнять замену сра\-зу
нескольких условий задачи: в одном расположена точка привязки, а
другие вы\-де\-ле\-ны установкой на идентификацию "корень". В этом
случае обработка других уста\-но\-вок "корень", относящихся к
антецедентам теоремы, откладывается до завер\-ше\-ния обработки
первых. Далее переменной х11 присваивается символ $f$,
располо\-жен\-ный по вхождению $v$, и переход к рассмотрению
перечисляемых ниже случаев.

\subsubsection{Прием с заголовком "свертка" \ }

В этом случае теорема приема представляет собой кванторную
импликацию, кон\-сек\-вент которой сам является кванторной
импликацией вида $\forall_{x_1 \ldots x_n}(A_1 \ldots A_m
\rightarrow A_0)$. Прием используется в задачах на доказательство:
$A_0$ идентифицируется с ус\-ло\-ви\-ем задачи, а $A_1, \ldots ,
A_m$ - с частью посылок этой задачи. Приемы такого типа
используются в решателе для реализации различных схем
математической ин\-дук\-ции. Точка привязки приема не обязательно
размещается внутри $A_0$ - например, в приеме для доказательства
индукцией по натуральному параметру она выбирается в антецеденте
"натуральное($n$)", и попытка применения приема начинается с
ус\-мот\-ре\-ния посылки "натуральное($\ldots$)".

Программа приема компиляции начинается с контрольной точки
"прием(203)". Проверяется, что $v$ есть вхождение консеквента либо
антецедента внешней имп\-ли\-ка\-ции; переменной х12 присваивается
вхождение этой импликации. Если $v$ - вхож\-де\-ние консеквента,
то проверяется, расположена ли по данному вхождению
функ\-ци\-о\-наль\-ная переменная. Если нет, то вхождению $v$
сопоставляется консеквент $K$ иден\-ти\-фи\-ци\-ру\-ю\-щей
импликации, и для последующего их сравнения создается установка на
идентификацию (операнд $v$ $\ldots$). В случае функциональной
переменной про\-ис\-хо\-дит непосредственная регистрация ее
идентифицирующего терма $K$.

Если $v$ - вхождение антецедента, то составляется список х13
программных вы\-ра\-же\-ний для уже использованных при
идентификации посылок задачи. Затем про\-ве\-ря\-ет\-ся наличие
указателя "подстановка", выделяющего вхождение $v$. Если его нет,
то вхождению $v$ сопоставляется произвольная еще не использованная
посылка за\-да\-чи, и для последующего их сравнения вводится
установка на идентификацию (опе\-ранд $v$ $\ldots$).

Если $v$ - выделенное указателем "подстановка" \ вхождение
антецедента $A_i$, то это означает, что посылка задачи для данного
антецедента может отсутствовать, при\-чем тогда некоторой
переменной $m$, входящей в $A_i$, присваивается заданная константа
$C$. Например, такая ситуация возникает в простейшем приеме
доказательства индук\-ци\-ей по натуральному параметру $x$, где
предусмотрено наличие посылки, определя\-ю\-щей нижнюю границу $m$
допустимых значений параметра $x$. При отсутствии дан\-ной посылки
параметру $m$ будет присвоена единица. Компилятор сначала вводит в
программу приема операторы, присваивающие первым неиспользуемым
про\-грам\-м\-ным переменным $y,z$, соответственно, константу $C$
и ноль. Затем создается кван\-тор\-ная импликация х21, выполняющая
просмотр неиспользованных посылок за\-да\-чи, идентификацию их с
подтермом $v$ и коррекцию значений $y,z$ в случае
обна\-ру\-же\-ния подходящей посылки $P$, соответственно, на
идентифицирующее зна\-че\-ние для $m$ и на терм $P$. Для получения
такой кванторной импликации ис\-поль\-зу\-ет\-ся вспомогательный
программный блок х17, в котором предпринимается
иден\-ти\-фи\-ка\-ция $v$ с текущей посылкой. После занесения в
компилируемую программу опе\-ра\-то\-ра х21 вводится
информационный элемент (терм $m$ $y$), регистрирующий
иден\-ти\-фи\-ка\-цию переменной $m$.

\subsubsection{Идентификация антецедента с переменным заголовком}

Если антецедент имеет вид "значение($f$ набор($t_1 \ldots t_n$))"
\ либо, при $n = 1$, вид "зна\-че\-ние($f$ $t_1$)", причем
переменная $f$ выделена указателем "символ", то он
иден\-ти\-фи\-ци\-ру\-ет\-ся с утверждением вида $F(T_1 \ldots
T_n)$, где $F$ - логический символ, со\-по\-став\-ля\-е\-мый при
идентификации переменной $f$. Прием компиляции для данного
слу\-чая начинается с контрольной точки "прием(344)". Переменная
$f$ становится здесь значением программной переменной х12. Если
$f$ уже идентифицирована и $F$ опре\-де\-ли\-лось, то
идентифицирующее утверждение $P$ - произвольное утверждение из
контекста применения приема, имеющее заголовок $F$. Иначе берется
произ\-воль\-ное утверждение $P$ из контекста применения приема, и
по его заголовку $F$ иден\-ти\-фи\-ци\-ру\-ет\-ся переменная $f$.
В обоих случаях создается новая установка на идентифи\-ка\-цию
(операнд $v$ $\ldots$), обеспечивающая дальнейшее сравнение $v$ и
$P$.

\subsubsection{Идентификация антецедента, выделенного указателем
"развертка" \ }

Если антецедент имеет вид кванторной импликации $\forall_i(i \in
{1 \ldots n} \rightarrow A(i))$ и выде\-лен указателем
"развертка", то он идентифицируется с конъюнкцией утверж\-де\-ний
контекста применения приема, представимых в виде $A(i)$. Ветвь
процедур ком\-пи\-ля\-ции, обрабатывающих данный случай,
размещается начиная с контрольной точ\-ки "прием(207)".
Предварительно предпринимается обращение к оператору
"учет\-нор\-ма\-ли\-заторов", вводящему на основе указателей
нормализации информа\-ци\-он\-ные элементы (быстрпреобр
$\ldots$).Эти элементы нужны для синтеза программных
вы\-ра\-же\-ний, дающих обрабаты\-ва\-е\-мые нормализаторами новые
термы. Здесь предвосхи\-ща\-ет\-ся возможный синтез таких термов
при идентификации $A(i)$.

После того, как установлено, что рассматриваемый антецедент имеет
указан\-ный выше вид, переменной х17 оказывается присвоено
выражение $n$. Далее рас\-смат\-ри\-ва\-ют\-ся два случая:

\begin{enumerate}

\item Все входящие в $n$ переменные уже идентифицированы, так что
для $n$ удает\-ся построить программное выражение х18 (контрольная
точка "прием(256)"). Переменной х19 присваивается терм $A(i)$, и
находится список х20 всех вхо\-дя\-щих в этот терм не
идентифицированных функциональных переменных ви\-да $f(\ldots \ i
\ \ldots)$. Обычная переменная $f$ для такой функциональной
переменной будет идентифицироваться с выражением вида "набор($t_1
\ldots t_n$)". Переменной х21 присваивается набор из нулей и
единиц - указателей многоместных функ\-ци\-о\-наль\-ных переменных
списка х20 (1 - многоместная, 0 - одноместная). Про\-ве\-ря\-ется,
что все входящие в терм $A(i)$ переменные, отличные от $i$ и не
встре\-ча\-ю\-щи\-е\-ся в наборе х20, уже идентифицированы. Если
прием имеет указа\-тель "внутрпосылка($\ldots$)", выделяющий еще
один кванторный антецедент ви\-да $\forall_i(i \in {1 \ldots n}
\rightarrow B(i))$, используемый для задания дополнительного
усло\-вия $B(i)$ на отбираемые для идентификации с $A(i)$
утверждения, то одновремен\-но проверяется, что идентифицированы
все входящие в $B(i)$ переменные, отлич\-ные от $i$ и не
встречающиеся в наборе х20.

Далее вводится пустой накопитель х22 для программных переменных,
зна\-че\-ни\-ями которых будут становиться наборы термов $t_1,
\ldots , t_n$, идентифици\-ру\-ю\-щие переменные из х20. После
контрольной точки "прием(209)" \ он заполняется программными
переменными $y$ (в количестве, равном длине на\-бо\-ра х20), для
инициализации которых в программу приема заносятся опе\-ра\-то\-ры
"равно($y$ пустоеслово)".

Если компилируемый прием имеет заголовок "заменатермов" \ либо
"заменаус\-ло\-вия", т.е. обеспечивает замену группы посылок или
условий, то рас\-смат\-ри\-ва\-е\-мая кванторная импликация может
быть не антецедентом теоремы при\-е\-ма, а конъюнктивным членом
его заменяемой части. Тогда она будет опре\-де\-лять подмножество
заменяемых утверждений. В этом случае инициализи\-ру\-ет\-ся
пустым набором новая программная переменная - накопитель
отбираемых для замены утверждений. Этот накопитель $X$
регистрируется в информаци\-он\-ном элементе (блокзамещения $X$).

Далее - переход через "ветвь 1", где находится результат х25
замены всех вхождений в $A(i)$ функциональных переменных $f(\ldots
i \ldots)$ набора х20 на тер\-мы, получаемые вычеркиванием
варьируемой переменной $i$. Если число аргумен\-тов такой
функциональной переменной равнялось 1, то она превращается в
обычную переменную. Это делается для того, чтобы получить из
$A(i)$ терм, который фактически будет идентифицироваться c текущим
просматри\-ва\-е\-мым утверждением контекста срабатывания приема.

После контрольной точки "прием(210)" \ вводится вспомогательный
програм\-м\-ный блок х26, в котором и будет обрабатываться "шаг
цикла" \ - идентифи\-ка\-ция терма х25 с текущим утверждением
контекста. В программу этого блока сразу заносится единственный
фрагмент, состоящий из: оператора, перечисляющего утверждения $U$
контекста срабатывания приема; оператора, проверяющего
сов\-па\-де\-ние заголовка утверждения с заголовком терма $A(i)$,
и оператора, при\-сва\-и\-ва\-ю\-щего новой программной переменной
корневое вхождение утверж\-де\-ния $U$. Перед обращением к
процедуре "идентификатор" \ для блока х26 пред\-при\-ни\-ма\-ется
следующая коррекция его информационных элементов:

\begin{enumerate}

\item Для всех многоместных функциональных переменных $f$ списка
х20 до\-бав\-ля\-ет\-ся информационный элемент (усмматрица $f$).
Такие функциональ\-ные переменные, после фиксации $i$, зависят от
прочих своих аргумен\-тов, и при обработке блока х26 будут
идентифицироваться по ним в ре\-жи\-ме "развертка". Добавленный
элемент определит регистрацию резуль\-та\-та промежуточной
идентификации $f$ в блоке х26 не как терма вида "набор($T_1 \ldots
T_k$)", а как набора термов $T_1, \ldots, T_k$ (строки либо
столб\-ца матрицы).

\item Если информационный элемент (развертка $\ldots$)
программного блока х3 указывает на термы $T$, содержащие
функциональные переменные спис\-ка х20, то в х26 регистрируется
еще один такой элемент, в котором пред\-при\-ня\-то исключение
аргумента $i$ из указанных функциональных перемен\-ных. Этим
достигается переадресация указателей режима "развертка" \ на
модифицированный по сравнению с $A(i)$ терм х25. Информационные
эле\-мен\-ты (единица $\ldots$), (заменазнака $\ldots$),
(заголовок $\ldots$) блока х26, ука\-зы\-ва\-ю\-щие на вхождения
внутри $A(i)$, корректируются так, чтобы они указывали на
соответствующие вхождения внутри терма х25.

\item Пусть имеется информационный элемент (внутрпосылка $P$ $Q$),
ссы\-ла\-ю\-щий\-ся на вхождение $P$ выделенного указателем
"идентификатор" \ ан\-те\-це\-ден\-та теоремы приема - кванторной
импликации вида $\forall_i(i \in {1 \ldots n} \rightarrow B(i))$.
Такая импликация вводит дополнительное условие $B(i)$ на
ут\-вер\-жде\-ния, выбираемые из контекста срабатывания приема для
иден\-ти\-фи\-ка\-ции их с х25. Чтобы согласовать обозначеня,
находится результат $B'$ исключения аргумента $i$ в функциональных
переменных списка х20, име\-ю\-щих\-ся в терме $B(i)$, и к списку
х27 установок на идентификацию бло\-ка х26 добавляется установка
"идентификатор", относящаяся к кор\-не\-во\-му вхождению терма
$B'$. При обработке блока х26 это обеспечит ком\-пи\-ля\-цию
проверки условия $B'$. Относящиеся к подтермам $B(i)$ элементы
(быстрпреобр $\ldots$) также корректируются для переадресации их
терму $B'$.

\end{enumerate}

Наконец, после контрольной точки "прием(275)" \ происходит
обращение к про\-це\-ду\-ре "идентификатор", обрабатывающей
программный блок х26. Она соз\-да\-ет в нем операторы,
идентифицирующие х25 с текущим просматри\-ва\-е\-мым утверждением
контекста. Если имелись фильтры приема, зависящие от
варь\-и\-ру\-е\-мой переменной $i$, то они компилируются и
добавляются в программу блока х26. Таким образом обеспечивается
еще одна возможность ограни\-че\-ния списка просматриваемых
утверждений контекста. Далее к программе блока х26 добавляются
операторы, пополняющие на текущем шаге цикла накопи\-те\-ли,
перечисленные в списке х22, и вводится кванторный оператор х29,
получен\-ный навешиванием на программу блока х26 квантора
существования по всем новым программным переменным, не
использованным пока в блоке х3. Так как в рассматриваемом случае
для числа $n$ отбираемых утверждений име\-ет\-ся программное
выражение х18, то с его помощью создается кванторный оператор х31,
реализующий последовательное перечисление значений $i$ от 1 до х18
и обращение для текущего $i$ к оператору х29. В этом цикле и
запо\-ня\-ют\-ся накопители списка х22, позволяющие в итоге
идентифицировать переменные списка х20. Предусматривается случай
возникновения чрезмерно громозд\-ко\-го оператора х31 - тогда этот
оператор и оператор х29 не используются, а цикл организуется путем
размещения программы блока х26 после опера\-то\-ров, перечисляющих
значения $i$. Выход из цикла осуществляется при по\-мо\-щи
оператора "ветвь", вставляемого перед перечислением значений $i$.

\item Длина $n$ набора $(A_1, \ldots, A_n)$ перед идентификацией
неизвестна. Случай ана\-ло\-ги\-чен предыдущему, и хотя
реализующая его программа выделена в не\-за\-ви\-си\-мую ветвь,
обе ветви почти идентичны. Даже номера программных перемен\-ных,
используемых для рассматриваемых при компиляции объектов - х20,
х21, х22, х23, х24, х26 и т.п, - сохраняются без изменений.
Переменная $n$ иден\-ти\-фи\-ци\-руется как длина набора,
найденного для первой переменной списка х20.

\end{enumerate}

\subsubsection{Идентификация антецедента, представляющего собой
функци\-о\-наль\-ную переменную}

В этом случае по вхождению $v$ расположено выражение $f(y)$, где
$f$ - перемен\-ная, выделенная указателем "отображение".
Проверяется, что для нее уже введен ин\-фор\-ма\-ци\-он\-ный
элемент (функция $f$ $X$ 0 $r$), где $r$ - пара (вхождение $A$)
либо (терм $A$), определяющая программное выражение $A$ для терма,
дающего значения функции $f$. $X$ - набор теоремных переменных,
рассматриваемых в качестве аргументов $f$. Проверяется также, что
$y$ - обычная переменная. Далее рассматриваются следую\-щие
подслучаи:

\begin{enumerate}

\item Имеется информационный элемент (результподст $y$ $B$). Этот
подслучай воз\-ни\-ка\-ет при компиляции приемов вывода теорем,
использующих указатель "уни\-фи\-ка\-ция". $y$ - теоремная
переменная, обозначающая подставляемые при уни\-фи\-ка\-ции термы;
$B$ - программное выражение для набора этих термов. На\-бор
переменных $X$ в данной ситуации одноэлементный; его единственная
пере\-мен\-ная $x$ обозначает список переменных $S$, вместо
которых подставляются термы унифицирующей подстановки. Список $S$
определяется по информацион\-но\-му элементу (наборпеременных $x$
$S$). С помощью перечисленных информацион\-ных элементов строится
оператор, находящий результат $R$ применения ранее найденной
унифицирующей подстановки к терму, определяемому про\-грам\-м\-ным
выражением $A$. Затем вставляется проверка включения
конъюнктив\-ных членов утверждения $R$ в контекст применения
приема.

\item Переменная $y$ уже идентифицирована. Тогда находится
программное выра\-же\-ние для утверждения $f(y)$, и добавляется
оператор, проверяющий, что оно встречается в контексте применения
приема.

\item Переменная $y$ еще не идентифицирована, причем $X$ состоит
из единст\-вен\-ной переменной $x$, для которой уже имеется
информационный элемент (на\-бор\-пе\-ре\-мен\-ных $x$ $S$). Тогда
для идентификации утверждения $f(y)$ в контексте $K$ применения
приема используется оператор "подборзначений". Он опреде\-ля\-ет
подстановку в определяемый программным выражением $A$ терм вместо
пе\-ре\-мен\-ных списка $S$ некоторых термов $R_1, \ldots, R_n$,
которая дает конъюнк\-тив\-ные члены утверждения из $K$. При этом
$y$ идентифицируется с термом "набор($R_1 \\ \ldots R_n$)".

\end{enumerate}

\subsubsection{Общий случай идентификации антецедента}

Началом данной ветви компилятора служит контрольная точка
"прием(116)". Как и вы\-ше, обозначаем $v$ идентифицируемое
вхождение антецедента; $f$ - заголовок ан\-те\-це\-ден\-та. Прежде
всего, инициализируется нулем переменная х12, которой будет
присвоен оператор, перечисляющий утверждения из контекста
применения при\-ема для идентификации их с $v$. Вид оператора
зависит от заголовка приема. Пере\-чис\-ле\-ние утверждений
достигается либо с помощью процедуры "обл", либо с помощью
оператора "ключ"; в последнем случае отбираются только утверждения
с заго\-лов\-ком $f$. После переприсвоения переменной х12 данного
оператора - переход через "ветвь 2". Далее выполняются следующие
коррекции оператора х12:

\begin{enumerate}

\item После контрольной точки "прием(117)" \ происходит учет
указателей "аль\-тер\-на\-тива", "вариант" \ и "комплексное",
относящихся к вхождению $v$. Он за\-клю\-ча\-ет\-ся в том, что
оператор "ключ($A$ $f$ $\ldots$)" \ в х12 заменяется либо на
дизъ\-юнк\-цию операторов, соответствующих альтернативным версиям
символа $f$, либо на оператор "альтернатива($\ldots$)", выбирающий
нужный заголовок со\-глас\-но ра\-нее идентифицированным
вхождениям из указателя "альтернатива".

\item После контрольной точки "прием(118)" \ происходит анализ
фильтров прие\-ма замены. Если в них явно указывается, что
идентифицируемый антецедент со\-дер\-жит неизвестные, а текущая
задача имеет тип "описать" \ либо "исследо\-вать", то х12
заменяется на оператор, перечисляющий в первом случае усло\-вия, а
во втором случае - посылки, отличные от утверждения, содержащего
точ\-ку инициализации приема.

\item После контрольной точки "прием(140)" \ происходит проверка
наличия ука\-за\-те\-лей "списокпосылок" \ либо "списокусловий",
явно определяющих область иден\-ти\-фи\-кации антецедента (в
первом случае - список посылок текущей за\-да\-чи, во втором -
список ее условий). Эти указатели порождают соответ\-ству\-ю\-щие
им информационные элементы (примечпосылки $\ldots$), (замечусловие
$\ldots$). х12 заменяется на оператор, перечисляющий посылки либо
условия текущей за\-да\-чи.

\end{enumerate}

Далее инициализируется пустой накопитель х13, в который при
необходи\-мос\-ти будет занесен оператор, учитывающий заголовок
текущего выделенного операто\-ром х12 утверждения. Если х12
выполняет перечисление с помощью оператора "ключ", то учет
заголовка уже произошел, и х13 остается пустым. Если же
перечисле\-ние выполняется с помощью операторов "посылка",
"условие", "обл", то вводится опе\-ра\-тор х14, проверяющий
наличие заголовка $f$. Далее х14 корректируется с уче\-том
указателей "альтернатива", "вариант", "комплексное" \ - как и выше
для перечис\-ле\-ния с помощью оператора "ключ", а затем заносится
в х13.

Наконец, переходя через "ветвь 2", попадаем на точку регистрации
накопи\-те\-лей х12, х13 в про\-грам\-ме компилируемого приема.
Далее в программу вставля\-ют\-ся операторы, блокирующие
рассмотрение не подходящих для идентифи\-ка\-ции утверждений -
например, утверждений из комментария (исключение $\ldots$) к
па\-кет\-но\-му оператору, либо уже использованных для
идентификации других антеце\-ден\-тов. Наконец, вводится установка
на идентификацию (операнд $\ldots$), обеспечи\-ва\-ю\-щая
сравнение отобранного утверждения с термом по вхождению $v$.

\subsection{Установка на идентификацию "извлекается"\ }

Установка на идентификацию (извлекается $v$) ссылается на
вхождение $v$ антеце\-ден\-та теоремы, для проверки истинности
которого необходимо обращение к прове\-роч\-но\-му пакетному
оператору. Рассмотрение этой установки начинается с контрольной
точ\-ки "прием(119)".

Обработка установки происходит при достаточно больших значениях
теку\-ще\-го уровня х7 - 7 либо 8. Это объясняется тем, что
обращение к проверочному опера\-то\-ру является сравнительно
трудоемкой процедурой, и ее целесообразно выполнять лишь после
установления непосредственно наблюдаемых признаков контекста
сра\-ба\-ты\-вания приема. После проверки того, что все
необходимые для компиляции пере\-мен\-ные антецедента $v$ уже
идентифицированы - переход через "ветвь 2".

Здесь переменной х10 присваивается вхождение $v$, переменной х11 -
символ $f$ по вхождению $v$. Далее, в зависимости от $f$,
начинается рассмотрение альтернатив\-ных подслучаев.

\subsubsection{Обработка кванторной импликации}

Если $f$ - квантор общности, то переход через "иначе 1" \ к
контрольной точке "при\-ем(141)". В этом подслучае антецедент $v$
имеет вид $\forall_x(A_1(x) \ \& \ldots \ \& A_n(x)\rightarrow
A_0(x))$, а проверочный оператор обрабатывает последовательность
утверждений, воз\-ни\-ка\-ющих из $A_0(x)$ при перечислении
значений переменных связывающей приставки $x$, определяемых
утверждениями $A_1(x), \ldots , A_n(x)$. Последние должны быть
программно реализуемыми. Переменной х12 присваивается связывающая
приставка $x$; пере\-мен\-ной х13 - терм $A_0(x)$. Проверяется,
что все параметры последнего терма, не входя\-щие в $x$, уже
идентифицированы. Затем создается вспомогательный програм\-мный
блок х15 для компиляции группы антецедентов $A_1(x), \ldots ,
A_n(x)$. Последова\-тель\-ность операторов, получающаяся после
такой компиляции, присваиватся переменной х16. Далее накопитель
программ блока х15 расчищается, и этот блок используется для
компиляции $A_0(x)$ с помощью проверочного оператора. На
конъюнкцию опера\-то\-ров результата компиляции х18 навешивается
квантор существования; полученный оператор х20 становится
консеквентом кванторной импликации х22, антеце\-ден\-ты которой
суть определяющие перечисление операторы х16. Эта кванторная
им\-пли\-ка\-ция и реализует проверку антецедента $v$.

\subsubsection{Обработка дизъюнкции}

Здесь $v$ - вхождение антецедента вида "или($A_1 \ldots A_n$)",
где $A_1, \ldots, A_n$ - конъюнк\-ции утверждений, для обработки
которых во вспомогательных программных бло\-ках могут быть
использованы установки (извлекается $\ldots$). В частности, на эту
роль годятся утверждения, допускающие обработку проверочными
операторами. Слу\-чай рассматривается после контрольной точки
"прием(142)". Последовательно рас\-смат\-ри\-ва\-ются утверждения
$A_i$. Каждое из них обрабатывается во вспомогательном
про\-грам\-мном блоке х16, и эти программные блоки, содержащие
фрагменты про\-грам\-мы для проверки истинности $A_i$,
регистрируются в накопителе х13. По окончании цик\-ла заполнения
х13 - переход через "иначе 1".

Если хотя бы один из программынх блоков списка х13 имеет
информацион\-ный элемент "выводимо", то необходим накопитель,
регистрирующий все исполь\-зо\-ван\-ные при проверках посылки.
Тогда вводится оператор "равно(начало(х3)пустоесло\-во)",
инициализирующий данный накопитель; номера переменных в операторах
из х13, больших или равных переменной "начало(х3)", увеличиваются
на единицу, и каж\-дый фрагмент программы из х13 дополняется
оператором, заносящим в нако\-пи\-тель все использованные в этом
фрагменте посылки.

Далее создается набор х14 результатов навешивания кванторов
существования по новым переменным на конъюнкции операторов
фрагментов программ, пред\-став\-лен\-ных в списке х13. Наконец,
формируется дизъюнкция х15 операторов списка х14, которая и
заносится в компилируемую программу.

\subsubsection{Создание обращения к проверочному оператору}

Начиная с контрольной точки "прием(132)", рассматривается случай,
когда ис\-тин\-ность антецедента $v$ проверяется путем
непосредственного обращения к про\-ве\-роч\-но\-му оператору.
Предварительно расположен регулятор уровня х7 при\-ме\-не\-ния
дан\-но\-го приема компиляции: если антецедент $v$ выделен
указателем "конец", то этот уро\-вень равен 8, иначе - равен 7.

Чтобы определить заголовок проверочного оператора, который будет
обеспе\-чи\-вать обработку антецедента $v$, предпринимается
просмотр расположенных внут\-ри $v$ вхождений х12 логических
символов х13. Для них выполняются обращения к справочнику
"легковидеть" \ либо (если имеется указатель на применение
уси\-лен\-но\-го проверочного оператора) справочнику "проверка",
который и определяет необ\-хо\-ди\-мый проверочный оператор. При
этом переменной х14 переприсваивается трой\-ка (заголовок
проверочного оператора $p$ - набор расположенных внутри $v$
вхож\-де\-ний, идентифицируемых с входными переменными этого
оператора - символьное чис\-ло уровней срабатывания оператора).
Особо рассматривается случай антецедента $v$, имеющего вид
"не(равно($t_1 \ t_2$))", для которого не найден проверочный
опе\-ра\-тор. Тогда используется проверочный оператор "различимы",
способный усматри\-вать различие объектов в некоторых простейших
случаях. После попытки определе\-ния $p$ для текущих х12, х13 -
переход через "ветвь 4".

Здесь, если х14 отлично от 0, т.е. оператор $p$ определен,
начинается под\-го\-тов\-ка ввода в компилируемую программу
обращения к нему. Прежде всего, прове\-ря\-ет\-ся наличие фильтров
"проверка($A$ $n$)", у которых $n$ - номер обрабатыва\-е\-мо\-го
антецедента $v$. Условия $A$ таких фильтров должны проверяться
непосредст\-вен\-но перед обработкой антецедента $v$. Находится
реализующий проверку истинности $A$ оператор х22, который
заносится в компилируемую программу. Чтобы в даль\-ней\-шем этот
фильтр уже не обрабатывать, он регистрируется в информационном
эле\-мен\-те (комментарий $\ldots$). Далее - переход через "ветвь
1".

После контрольной точки "прием(15)" \ выполняется учет указателей
приема "спу\-ск" \ и "спуск($i_1 \ldots i_n$)". Эти указатели
используются в приемах проверочных опе\-ра\-то\-ров для обрыва
проверки при неудачной попытке применения приема. В пер\-вом
случае "отказ" \ выдается, если после обработки всех антецедентов,
не выде\-лен\-ных указателем "блокпроверок", происходит откат. Во
втором случае выдача отказа при откате требует также
предварительной проверки антецедентов, номера которых суть $i_1,
\ldots , i_n$. В обоих случаях выдача отказа реализуется за счет
вставки опера\-то\-ра "ветвь", переводящего к фрагменту $F$,
состоящему из операторов "блок($\ldots$)", "учетвбуфере($\ldots$)"
\ и "стоп". Первый из них проверяет, не был ли текущий при\-ем
заблокирован специальным комментарием (приемы $\ldots$); второй -
регистри\-ру\-ет отказ в буфере результатов обращений к данному
проверочному оператору. В слу\-чае указателя "спуск" \ решение о
вставке оператора "ветвь" \ принимается, если ос\-та\-лись только
установки на идентификацию "извлекается". Во втором случае для
это\-го используется информационный элемент (спуск $A$), у
которого список $A$ изначаль\-но состоит из всех вхождений
антецедентов с номерами $i_1, \ldots, i_n$. Обрабо\-тан\-ные
антецеденты исключаются из $A$, и в тот момент, как список
оказывается пус\-тым, происходит вставка оператора "ветвь".
Фактически вставляется не оператор "ветвь(\\ $N$)", а фиктивный
оператор "2(1)". Здесь двойка будет заменена при
редактиро\-ва\-нии откомпилированной программы на "ветвь"; единица
же является но\-ме\-ром ссылки на фрагмент $F$, который пока
регистрируется не в фрагментах про\-грам\-мы блока х3, а в
комментарии (блокпрограммы $\ldots$). Вставка его в программу
будет проис\-хо\-дить одновременно с указанной заменой фиктивного
оператора перехода на реальный.

Далее переменной х15 присваивается обрабатываемый антецедент
(терм); пере\-мен\-ной х16 - список всех его свободных переменных.
Переменной х17 присваи\-ва\-ет\-ся список программных выражений
для входных термов обращения к проверочно\-му оператору.

Чтобы проверочный оператор получал в качестве входных данных
только тер\-мы, те элементы списка х17, которые представляют собой
однобуквенные тер\-мы, состоящие из логического символа $s$,
заменяются на выражения "набор($s$)". Без это\-го преобразования
на вход проверочного оператора попал бы сам логический сим\-вол
$s$.

Если антецедент представляет собой двуместное отношение,
выделенное указа\-те\-лем "дробь", то программные выражения списка
х17 модифицируются так, что\-бы при необходимости входные данные
проверочного оператора переставлялись (кон\-троль\-ная точка
"прием(222)"). Затем - переход через "ветвь 1".

Переменной х18 присваивается программное выражение для списка
посылок, от\-но\-си\-тельно которых будет происходить проверка
антецедента $v$. Если указатели при\-ема вводили дополнительные
посылки $P$ для данной проверки, то $P$ извлекается из
информационного элемента (занесениепосылки $P$), находится
программное вы\-ра\-же\-ние х20 для $P$, и конъюнктивные члены $P$
присоединяются к контексту про\-вер\-ки х18. Далее - переход через
"ветвь 1".

Инициализируется пустым словом накопитель х19 программных
выражений для комментариев создаваемого обращения к проверочному
оператору. Опреде\-ля\-ют\-ся посылки, использованные приемом и не
выделенные указателем "повтор"; эти по\-сыл\-ки регистрируются в
комментарии (исключение $\ldots$), заносимом в накопитель х19.
Такой же комментарий (исключение $\ldots$) вводится и для посылок,
перечисленных в информационном элементе (транзитпереход $\ldots$).

Если антецедент $v$ выделен указателем "внешобрыв", то
компилируется при\-ем проверочного оператора $P$, причем
установление ложности антецедента $v$ вле\-чет ложность
проверяемого оператором $P$ утверждения. Чтобы это учитыва\-лось
проверочным оператором, обрабатывающим антецедент $v$, ему
передается ком\-мен\-та\-рий (Обрыв $K$ $n$), где $K$ - ссылка на
текущий стэковый кадр, в котором реализу\-ет\-ся прием; $n$ -
символьный номер переменной проверочного оператора $P$, являющейся
его списком комментариев. В компилируемую программу заносится
оператор, опре\-де\-ля\-ю\-щий ссылку $K$, а в х19 - программное
выражение для комментария (Обрыв $K$ $n$).

Если список х19 программных выражений для комментариев непуст, то
х19 пере\-при\-сва\-и\-ва\-ет\-ся программное выражение для списка
этих комментариев. Рас\-смат\-ри\-ва\-ют\-ся указатели приема
"комментарий($\ldots$)"; "комментарии($\ldots$)", определя\-ю\-щие
дополнительные комментарии, вводимые при обращении к
провероч\-но\-му оператору. По ним вводятся программные выражения
для списков новых комментариев, и х19 корректируется для включения
этих списков. Затем - переход через "ветвь 1".

Если компилируется прием пакетного оператора, то переменной х20
при\-сва\-и\-ва\-ет\-ся программное выражение для списка
комментариев обращения к этому опера\-то\-ру, иначе х20 равно 0. В
первом случае рассматриваются указатели приема
"исклю\-че\-ние($\ldots$)", "удалениепримечания($\ldots$)", и х20
корректируется так, чтобы были уда\-ле\-ны комментарии, на которые
ссылаются данные указатели. Затем - снова пере\-ход через "ветвь
1".

В случае проверочного оператор либо синтезатора программное
выражение х19 корректируется так, чтобы в список комментариев
вошли все элементы, опреде\-ля\-е\-мые программным выражением х20.
Наконец, создается оператор х21, осущест\-вля\-ю\-щий обращение к
проверочному оператору для обработки антецедента $v$. Его
единственная выходная переменная - "начало(х3)" \ - накопитель
использованных при проверке утверждений.

Перед регистрацией оператора х21 в программе приема выполняется
ряд пред\-ва\-ри\-тель\-ных его преобразований. Прежде всего,
проверяется наличие информа\-ци\-он\-но\-го элемента (сброс
$\ldots$), указывающего, что при неудачной попытке про\-вер\-ки
истинности $v$ должен быть выдан отказ на тот пакетный оператор
(провероч\-ный либо синтезатор), к которому относится
компилируемый прием. Тогда х21 заменя\-ет\-ся на фиктивный
оператор "1(х21 $n$)", который при редактировании программы
бу\-дет развернут в два оператора: "х21 иначе($\ldots$)". При этом
$n$ - ссылка на сохраняемый в информационном элементе
(блокпрограммы $n$ $F$) фрагмент программы $F$, со\-сто\-я\-щий из
единственного оператора "стоп". К нему будет выполняться переход
по "иначе" \ после попытки проверки $v$.

Если имеется указатель приема "замещение", требующий замены
заголовка ан\-те\-це\-ден\-та $v$ при выполнении специального
условия $U$, то находится оператор х26 для проверки $U$, создается
версия х28 антецедента $v$, в которой выполнена за\-ме\-на
заголовка, и определяется альтернативная версия х33 проверочного
оператора х21 для обработки х28. Затем х21 заменяется на условный
оператор "альтернати\-ва(х26 х33 х21)", и пе\-ре\-ход через "ветвь
1".

Переменной х22 присваивается результат модификации оператора х21
проце\-ду\-рой "учетпассива".

Если антецедент $v$ выделен указателем приема "См", то при
неустановлении его истинности организуется слежение за последующим
возникновением этого анте\-це\-ден\-та в текущей задаче. Для этого
используется комментарий (внимание $\ldots$), формируемый
процедурой "См". Компилятор определяет программное выра\-же\-ние
х26 для антецедента $v$, заменяет х22 на фиктивный оператор "1(х22
$n$)" \ и со\-хра\-ня\-ет в информационном элементе (блокпрограммы
$n$ $F$) ссылку на фрагмент про\-грам\-мы $F$, обеспечивающий
обращение к процедуре "См" \ при неудачной попытке про\-вер\-ки
истинности $v$.

Наконец, после контрольной точки "прием(21)" \ происходит
регистрация опе\-ра\-то\-ра х22 в компилируемой программе.

Если антецедент $v$ выделен указателем "внешобрыв", то после
оператора х22 размещается фиктивный оператор "1(х22 1)", который
будет заменен при ре\-дак\-ти\-ро\-ва\-нии программы на переход
"иначе($\ldots$)" \ к фрагменту х25, сохраняемому пока в
информационном элементе (блокпрограммы 1 х25). Фрагмент х25
учитывает ин\-фор\-ма\-цию о ложности антецедента $v$,
представленную комментарием "внешобрыв"; передает ее при
необходимости внешнему проверочному оператору, регистрирует в
буфере неудачу проверки, и выдает отказ.

Если антецедент $v$ выделен указателем "Обрыв($\ldots$)",
определяющим лимит чис\-ла шагов работы интерпретатора, отведенных
для выполнения проверки, то перед оператором х22 вставляется
оператор "лимит($\ldots$)" \ для соответствующего числа ша\-гов, а
после х22 - оператор "Обрыв", отменяющий установленный лимит по
за\-вер\-ше\-нии проверки.

Далее происходит регистрация в информационном элементе (выводимо
$\ldots$) вы\-ход\-ной переменной использованного для обработки
$v$ проверочного оператора. Если антецедент $v$ выделен указателем
"откат", то после х22 вставляется фиктивный оператор "2($n$)",
преобразуемый впоследствии в переход "ветвь $\ldots$" \ к
фрагмен\-ту, состоящему из единственного оператора "обрыв".

\subsection{Установка на идентификацию "значения"\ }

Установка на идентификацию (значения $M$) ссылается на список $M$
вхождений анте\-це\-ден\-тов теоремы, которые обрабатываются с
помощью одного обращения к па\-кет\-но\-му синтезатору. До
обработ\-ки должны быть идентифицированы входные (в смыс\-ле
применяемого синтезато\-ра) переменные антецедентов списка, а
термы для выходных переменных будут найде\-ны синтезатором. Выбор
подходящего синтезатора осу\-щест\-вля\-ет\-ся компилятором
са\-мо\-сто\-я\-тель\-но. Рассмотрение этой установки начинается с
контрольной точ\-ки "при\-ем(180)".

Рассмотрение установок (значения $M$) происходит при текущем
уровне х7, рав\-ном 2, либо 6, либо большем 8. Переменной х10
присваивается список $M$. Если хотя бы один из антецедентов этого
списка выделен указателем "конец" \ либо имеется еще не
обработанная установка (контекст $\ldots$), то допускается лишь
уровень х7, боль\-ший 8. Переменной х11 присваивается конъюнкция
$K$ антецедентов списка $M$. Чтобы определить синтезатор, который
будет обрабатывать эти антецеденты, про\-смат\-ри\-ва\-ют\-ся
отличные от логических связок и кванторов логические символы х14,
входящие в х11. Для каждого такого символа справочник "значения" \
пред\-ла\-га\-ет список отнесенных к нему названий синтезаторов.
Названия х17 из этого спи\-ска просматриваются, и справочник
"синтезатор" \ дает набор х18, определяющий фор\-мат обращения к
синтезатору х17. Этот набор имеет вид ($T$ вход($x_1 \ldots x_n$)
выход($y_1 \ldots y_m$) $A_1 \ldots A_k$), где $T$ - шаблон
обрабатываемой синтезатором конъюнкции утвер\-жде\-ний; $x_1,
\ldots , x_n$ - список входных переменных шаблона; $y_1, \ldots ,
y_m$ - список вы\-ход\-ных переменных шаблона; $A_1, \ldots , A_k$
- информационные термы, уточняющие об\-щие особенности
синтезатора. Переменной х19 присваивается шаблон $T$; х20 и х21 -
списки входных и выходных переменных шаблона. Находится
объединенный спи\-сок х22 этих переменных, и проверяется, что
найденная выше конъюнкция $K$ пред\-ста\-ви\-ма как результат
подстановки в шаблон $T$ некоторого набора термов х23 вме\-сто
переменных списка х22. Заметим, что здесь не анализируется
возможность пере\-ста\-но\-вок операндов коммутативных операций,
так что порядок антецедентов списка $M$ должен строго
соответствовать порядку конъюнктивных членов шаблона $T$.

Далее переменной х24 присваивается список теоремных термов,
соответ\-ству\-ю\-щих входным переменным синтезатора х17.
Переменной х25 присваивается список всех свободных переменных тех
входных термов, которые пока не идентифицированы с помощью
информационного элемента (выражение $\ldots$). Последний способ
иден\-ти\-фи\-ка\-ции означает, что терм идентифицируется "в
целом", возможно, без идентифи\-ка\-ции каких-либо входящих в него
переменных.

Если некоторая переменная х26 списка х25 еще не идентифицирована,
но су\-щест\-вует указатель "переменные($\ldots$)", определяющий
ее идентификацию с на\-бо\-ром новых переменных, имеющим заданную
длину, то в компилируемую про\-грам\-му заносятся операторы,
определяющие требуемый список переменных для х26. За\-тем -
переход через "ветвь 2".

Здесь проверяется, что каждая переменная из х25 либо
идентифицирована, ли\-бо выделена указателем "новаяпеременная",
означающим, что для идентификации с ней должна быть выбрана новая
переменная. Переменной х26 присваивается спи\-сок всех теоремных
переменных, соответствующих выходным переменным шаблона $T$.

Если имеются подтермы входных термов списка х24, которые должны
об\-ра\-ба\-ты\-вать\-ся нормализаторами, то проверяется, что для
них уже введены информа\-ци\-он\-ные элементы (быстрпреобр
$\ldots$), необходимые для компиляции обращений к нормализаторам.
Если это не так, то при уровне х7, меньшем 6, обработка дан\-ной
установки на идентификацию откладывается, а на 6-м уровне
предприни\-ма\-ет\-ся обращение к процедуре "учетнормализаторов",
вводящей информационные эле\-мен\-ты (быстрпреобр $\ldots$). Далее
- откат через "ветвь 1".

Если имеются фильтры приема вида "проверка($n$ $A$)", означающие,
что про\-вер\-ка условия $A$ должна происходить непосредственно
перед обработкой $n$-го антеце\-ден\-та теоремы, причем $n$ -
номер первого из антецедентов списка $M$, то выполня\-ет\-ся
компиляция этих фильтров.

После контрольной точки "прием(184)" \ расположен цикл заполнения
нако\-пи\-те\-ля х27 программными выражениями для входных термов
списка х24. Эти програм\-м\-ные выражения создаются процедурой
"метаперевод". После контрольной точ\-ки "прием(185)" \
предпринимается обработка указателей приема "комментарий",
"ком\-мен\-тарии", относящихся к антецедентам списка $M$. Она
аналогична обработке, имев\-шей место для проверочных операторов;
накопитель х28 заполняется программ\-ны\-ми выражениями для
наборов комментариев компилируемого обращения к синте\-за\-то\-ру.
После контрольной точки "прием(186)" \ происходит заполнение пары
нако\-пи\-те\-лей х29 программными выражениями для комментариев,
исключаемых при обращении к синтезатору из списка комментариев
того пакетного оператора, к которому отно\-сит\-ся компилируемый
прием. Первый элемент пары х29 заполняется программ\-ны\-ми
выражениями для отдельных комментариев; второй - для групп
комментариев. Да\-лее - переход через "ветвь 1".

Здесь процесс компиляции разветвляется: отдельно рассматриваются
случаи при\-ема сканирования задачи и приема пакетного оператора.

\subsubsection{Обращение к синтезатору из приема сканирования
задачи}

Этот подслучай рассматривается начиная с контрольной точки
"прием(187)". Пе\-ре\-мен\-ной х30 присваивается список
неиспользуемых программных переменных, име\-ю\-щий ту же длину,
что список х26 выходных теоремных переменных анте\-це\-ден\-тов
$M$. Эти переменные будут использоваться как выходные переменные
обращения к синтезатору. Переменной х31 присваивается набор
информационных элементов (терм $\ldots$), определяющих связь между
теоремными переменными списка х26 и про\-грам\-м\-ны\-ми
переменными списка х30. Переменной х32 присваивается список
по\-сы\-лок, используемых синтезатором. При наличии указателей
приема "занесениепо\-сыл\-ки", относящихся к антецедентам группы
$M$, список х32 пополняется.

После контрольной точки "прием(188)" \ переменной х33
присваивается опе\-ра\-тор, выполняющий обращение к синтезатору.
Он регистрируется в компили\-ру\-е\-мой программе; при наличии
относящегося к $M$ указателя "Обрыв($\ldots$)" \ вводятся
опе\-ра\-то\-ры, учитывающие ограничение на трудоемкость
обращения. В заключение эле\-мен\-ты списка х31 и элемент
(выводимо $\ldots$), ссылающийся на использованные
син\-те\-за\-то\-ром посылки, регистрируются в программном блоке.

\subsubsection{Обращение к синтезатору из пакетного оператора}

Этот подслучай рассматривается начиная с контрольной точки
"прием(189)". Преж\-де всего, находится программная переменная х31
для списка комментариев пакет\-но\-го оператора, к которому
относится компилируемый прием. Затем х31 корректируется с учетом
списка исключаемых из обращения к синтезатору комментариев,
пере\-чис\-лен\-ных в накопителе х29. Далее к х31 добавляются
комментарий (исключение $\ldots$), перечисляющий использованные
для непосредственной идентификации анте\-це\-ден\-тов посылки, а
также все комментарии накопителя х28.

После контрольной точки "прием(267)" \ выполняется учет указателей
"спуск", обеспечивающих обрыв применения пакетного оператора при
неудачной по\-пыт\-ке обращения к синтезатору. Это делается так
же, как для проверочных операторов.

Дальнейшие действия аналогичны случаю приема сканирования задачи:
соз\-да\-ет\-ся оператор х35, выполняющий обращение к синтезатору
(контрольная точка "при\-ем(191)"), учитывается указатель "Обрыв",
выполняется регистрация в про\-грамм\-ном блоке оператора х35 и
сопровождающих обращение информационных эле\-мен\-тов. Добавляется
лишь учет указателя "сброс", аналогичного указателю "спуск".

\subsection{Установка на идентификацию "программа"\ }

Установка на идентификацию (программа $v$) ссылается на программно
реали\-зу\-е\-мый антецедент $v$. Рассмотрение ее начинается с
контрольной точ\-ки "при\-ем(125)". Уровень х7, на котором
обрабатывается установка, должен быть больше 0, но мень\-ше 7.
Дополнительные условия на этот уровень накладываются идущими
вна\-ча\-ле операторами. Если х7 = 1, то либо антецедент имеет вид
$x=t$, где все перемен\-ные выражения $t$ идентифицированы, а $x$
еще не идентифицирована, либо вооб\-ще все переменные антецедента
уже идентифицированы. Если антецедент $v$ выде\-лен указателем
"конец", то х7 = 6. В зависимости от х7, накладываются
ограни\-че\-ния на типы еще не обработанных установок на
идентификацию. Во всех этих случа\-ях, установки (операнд
$\ldots$) уже должны быть обработаны. Если антецедент содер\-жит
символ "значение", то х7 больше 2.

Переменной х10 присваивается вхождение антецедента $v$; переменной
х11 - сам этот антецедент. Далее рассматриваются подслучаи,
определяемые видом анте\-це\-ден\-та.

\subsubsection{Антецедент имеет вид дизъюнкции}

Подслучай рассматривается начиная с контрольной точки
"прием(278)". Если анте\-це\-дент имеет такую свободную переменную
$x$, которая уже идентифицирована, од\-на\-ко информационный
элемент (транслвыражения $x$ $\ldots$), дающий программное
вы\-ра\-же\-ние значения $x$ в формате, ориентированном на
вычисления, отсутствует, то предпринимается попытка создать этот
элемент. Для этого анализируются фильт\-ры приема. Если какой-либо
из них указывает, что $x$ должна идентифицироваться с числовой
константой ("десчисло", "целое", "натуральное"), то для получения
про\-грам\-м\-но\-го выражения, дающего значение $x$ в формате
десятичного числа ЛОСа, используется обращение к процедуре
"прогрвыражение". После рассмотрения ука\-зан\-ных переменных $x$
- переход через "ветвь 3".

Здесь определяется список х13 еще не идентифицированных переменных
анте\-це\-ден\-та $v$ - компилируемый оператор должен будет
присвоить им некоторые зна\-че\-ния. Последовательно
просматриваются дизъюнктивные члены х16 утверждения $v$. Для
компиляции его создается вспомогательный программный блок х17,
обрабаты\-ва\-е\-мый процедурой "идентификатор". Единственной
установкой на идентификацию здесь является (программа $w$), где
$w$ - корневое вхождение утверждения х16. Пере\-мен\-ной х19
присваивается конъюнкция операторов, выполняющих обработку
дизъюнк\-тив\-но\-го члена. Она регистрируется в накопителе х12.
При этом х14 играет роль нако\-пи\-те\-ля наборов информационных
элементов (транслвыражения $\ldots$), дающих программ\-ные
переменные для значений переменных списка х13. Так как итоговый
опе\-ра\-тор для $v$ будет представлять собой дизъюнкцию
операторов списка х12, то нуж\-но, чтобы в различных дизъюнктивных
членах значения одной и той же перемен\-ной списка х13 давались
одной и той же программной переменной - иначе потре\-бу\-ет\-ся
дополнительная синхронизация выходных переменных. Такая
синхрони\-за\-ция пока не реализована, а вместо нее проверяется
совпадение значений х14 для всех дизъюнктивных членов. По
завершении просмотра дизъюнктивных членов в программу заносится
дизъюнкция операторов списка х12; корректируется пер\-вая
неиспользуемая программная переменная в х3, и предпринимается
регистрация ин\-фор\-ма\-ци\-он\-ных элементов из х14.

\subsubsection{Антецедент имеет вид конъюнкции}

Подслучай рассматривается начиная с контрольной точки
"прием(283)". Ра\-зу\-ме\-ет\-ся, сам по себе конъюнктивный
антецедент в теоремах приемов не возникает. Од\-на\-ко,
конъюнктивное утверждение, компилируемое с установкой на
идентифи\-ка\-цию "программа", может появиться, например, как
дизъюнктивный член другого ком\-пи\-ли\-ру\-емого утверждения (см.
разобранный выше случай дизъюнктивного анте\-це\-ден\-та).

Переменной х12 присваивается список всех еще не идентифицированных
пе\-ре\-мен\-ных рассматриваемого антецедента $v$. Вводится
вспомогательный программный блок х13, в котором будет происходить
компиляция $v$. Создается список х14 установок на идентификацию,
состоящий из пар (программа $w$) для всевозможных
конъюнк\-тив\-ных членов $w$ утверждения $v$. После обращения к
процедуре "идентификатор" \ из программного блока х13 извлекаются
возникшие там операторы, и конъюнкция их регистрируется в
программе блока х3. Из блока х13 в блок х3 переносятся также
информационные элементы (транслвыражения $\ldots$), определяющие
идентификацию переменных списка х12.

\subsubsection{Антецедент имеет своим заголовком отрицание}

Подслучай рассматривается начиная с контрольной точки
"прием(284)". Пере\-мен\-ной х17 присваивается утверждение под
отрицанием. Проверяется, что все сво\-бод\-ные переменные этого
утверждения уже идентифицированы. Переменной х19
при\-сва\-и\-ва\-ет\-ся вспомогательный программный блок, а
переменной х20 - одноэлемент\-ный список установок на
идентификацию, состоящий из пары (программа $w$); $w$ -
кор\-не\-вое вхождение утверждения х17. После обращения к
процедуре "идентифи\-ка\-тор" \ находится конъюнкция х21
операторов, возникших в программном блоке х19. Далее на нее
навешивается квантор существования по всем ее новым переменным, и
отрицание полученного оператора регистрируется в программном блоке
х3.

\subsubsection{Антецедент имеет своим заголовком квантор существования}

Подслучай рассматривается начиная с контрольной точки
"прием(289)". Пере\-мен\-ной х12 присваивается подкванторное
утверждение $A$. Проверяется, что все сво\-бод\-ные переменные
антецедента $v$ уже идентифицированы. Вводится вспомога\-тель\-ный
программный блок х14 и создается список х15 установок на
иденти\-фи\-ка\-цию, состоящий из единственного элемента
(программа $w$), где $w$ - корневое вхож\-де\-ние подкванторного
утверждения. После обращения к процедуре "идентифи\-ка\-тор" \
находится конъюнкция х16 операторов программного блока х14. На нее
наве\-ши\-ва\-ет\-ся квантор существования по всем новым
переменным, и результат регистриру\-ет\-ся в программе блока х3.

\subsubsection{Антецедент представляет собой кванторную
импликацию}

Подслучай рассматривается начиная с контрольной точки
"прием(330)". Антецедент имеет вид $\forall_i(i \in \{m, \ldots ,
n \} \ \& \ P(i) \rightarrow Q(i))$ и определяет цикл вычислений
для последовательных значений целочисленной переменной $i$,
удовлетворяющих условию $P$. Программной переменной х13
присваивается изменяемая в цикле переменная $i$; находятся
операторные выражения х18 и х19 для начала и конца цикла. Эти
выражения определяют значения в формате "целое со знаком".
Переменной х20 присваивается список конъюнктивных членов
утверждения $P(i)$, накладываю\-ще\-го дополнительные условия на
изменяемый параметр $i$.

Если компилируется прием пакета продукций, то $Q(i)$ может
определять пре\-об\-ра\-зо\-вания ранее созданных структур данных
(например, числовых массивов). Та\-кая ситуация возникает после
модификации теоремы приема процедурой "схемавы\-числ". Необходимые
для доопределения преобразований пометки регистри\-ру\-ют\-ся этой
процедурой в описании приема. В частности, они связывают
переменные, ис\-поль\-зу\-е\-мые в $Q(i)$ для обозначения одной и
той же структуры данных до и после преобразования. Переменной х21
присваивается список данных пометок. Затем пе\-ре\-менной х22
присваивается список конъюнктивных членов утверждения $Q(i)$. Если
в них встречается некоторая функциональная переменная $f(i)$,
причем $f$ более нигде в теореме приема не появляется, то эта
переменная заменяется на обычную пере\-мен\-ную $f$.

Далее формируется список х25 троек $(x_j, \ a_j, \ b_j)$,
соответствующих всевоз\-мож\-ным вхождениям в $Q(i)$ и $P(i)$
выражений вида $a+bi$. Для каждого такого вы\-ра\-же\-ния
выбирается новая переменная $x_j$; $a_j,b_j$ - значения $a,b$ в
этом выраже\-нии. Все вхождения в $P(i),Q(i)$ указанных выражений
заменяются на соответ\-ст\-ву\-ю\-щие переменные $x_j$, которые
будут независимо друг от друга и от $i$ инициализи\-ро\-вать\-ся и
изменяться в цикле со своими шагами $b_j$.

Затем в программу вводится оператор, инициализирующий переменную
$i$. Зна\-че\-ние ее будет сохраняться в программной переменной
х26. Тройки списка х25 пре\-об\-ра\-зу\-ются: каждое $a_j$ и $b_j$
заменяется на соответствующее ему программное вы\-ра\-же\-ние.
Вводится накопитель х28 программных переменных для текущих
зна\-че\-ний теоремных переменных $x_j$. Цикл организуется с
помощью оператора "повторе\-ние", к которому будут происходить
откаты при каждом изменении $i$. Для компиля\-ции консеквента
$Q(i)$ вводится вспомогательный программный блок х30. При этом
отдельно рассматриваются случаи вырожденного (тождественно
истинного) и не\-вы\-рож\-ден\-ного $P(i)$. После регистрации
операторов, реализующих $Q(i)$, размещают\-ся операторы,
проверяющие завершение цикла и корректирующие $i$, $x_j$. По
заверше\-нии цикла происходит переход через "иначе" \ либо "ветвь"
\ к фрагментам, продолжа\-ю\-щим реализацию приема.

\subsubsection{Операторы типа присвоения}

Здесь рассматриваются следующие подслучаи:

\begin{enumerate}

\item Обычное присвоение. Рассмотрение подслучая начинается с
контрольной точ\-ки "при\-ем(285)". Антецедент $v$ имеет вид
"равно($x$ $t$)" \ (быть может, при пере\-ста\-нов\-ке операндов);
$x$ - еще не идентифицированная переменная; $t$ - терм, все
переменные которого идентифицированы. При помощи операторного
вы\-ра\-же\-ния "типзнач" \ определяется указатель "вычисл($f$)" \
формата $f$, в кото\-ром должно быть вычислено значение выражения
$t$. Такие форматы перечислены в справочной информации логического
символа "тип". Затем процедура "прогр\-выражение" \ дает
программное выражение для вычисления значения $t$ в
тре\-бу\-е\-мом формате. В компилируемую программу заносится
оператор при\-сво\-е\-ния для программной переменной,
соответствующей переменной $x$, и регисти\-ру\-ет\-ся
информационный элемент (транслвыражения $x$ $\ldots$),
определяющий иден\-ти\-фи\-ка\-цию $x$.

\item Групповое присвоение. Рассмотрение пдслучая начинается с
контрольной точ\-ки "прием(287)". Антецедент $v$ имеет вид
"равно(набор($x_1 \ldots x_n$)$t$)"; $x_1, \ldots, x_n$ - еще не
идентифицированные попарно различные переменные; $t$ - терм, все
переменные которого идентифицированы. При помощи процедуры
"прогр\-вы\-ра\-же\-ние" \ находится программное выражение х18 для
вычисления значения $t$. Этой процедуре передается неопределенный
указатель "вычисл(объект)" \ тре\-бу\-емого формата данных,
который может быть уточнен при определении х18. Далее происходит
инициализация символом "объект" \ указателя х19 фор\-ма\-та данных
для элементов набора $t$. Если формат значения $t$ был уточнен и
име\-ет после уточнения вид "набор($A$)", то указатель $A$
переприсваивается перемен\-ной х19. Наконец, реализуется цикл
просмотра теоремных переменных $x_i$, вво\-да операторов,
присваивающих соответствующим программным переменным $i$ - й
элемент значения $t$, и регистрации информационных элементов
(трансл\-вы\-ра\-жения $x_i$ $\ldots$).

\item Идентификация одноэлементного списка. Рассмотрение
начинается с кон\-троль\-ной точки "прием(288)". Антецедент $v$
имеет вид "равно(перечень(набор($x$))$t$)". Как и в случае
обычного присвоения, переменная $x$ еще не идентифицирована, а все
переменные терма $t$ идентифицированы. Находится программное
выра\-же\-ние х20, вычисляющее значение $t$. По скорректированному
указателю "вы\-числ(объект)" \ формата данных для представления
одноэлементного мно\-жест\-ва - значения $t$ определяется
указатель х21 формата данных, в котором пред\-став\-лен элемент
этого множества. Далее в компилируемую программу заносятся:
оператор, проверяющий одноэлементность значения $t$, и оператор,
при\-сва\-и\-ва\-ю\-щий программной переменной для $x$ элемент
этого значения. Предпола\-га\-ет\-ся, что конечные множества при
вычислениях на ГЕНОЛОГе задаются конеч\-ны\-ми наборами.

\item Перечисление делителей целого числа. Рассмотрение начинается
с кон\-троль\-ной точки "прием(290)". Антецедент $v$ имеет вид
"делит($x$ $t$)", где $x$ - еще не идентифицированная переменная;
$t$ - терм, все переменные которого иден\-ти\-фи\-ци\-рованы.
Определяется программное выражение х13 для вычис\-ле\-ния значения
$t$ в формате десятичных чисел ЛОСа. Если в фильтрах приема
ука\-за\-но, что $x$ имеет своим значением простое число, то в
компилируемую про\-грам\-му вводится оператор, перечисляющий все
простые делители $t$, иначе - все целочисленные делители (включая
отрицательные).

\item Идентификация матрицы. Рассмотрение начинается с контрольной
точки "при\-ем(320)". Антецедент $v$ имеет вид "равно(Матрица($A$
$m$ $n$)$t$)", где $m$ - еще не идентифицированная переменная. Он
равнозначен присвоению перемен\-ным $A$, $m$, $n$: массива,
перечисляющего элементы матрицы $t$, числа строк и чис\-ла
столбцов этой матрицы. Если $m$ либо $n$ - выражение, все
переменные которо\-го уже идентифицированы, то вместо присвоения
реализуется сравнение. Сна\-ча\-ла находится программное выражение
х18 для представления матрицы $t$. Это представление может иметь
один из двух форматов - "матрица($R$)", либо "вектор($R$)" \
(число столбцов матрицы равно 1). Здесь $R$ - формат
пред\-став\-ле\-ния элемента матрицы либо вектора. Матрица
задается тройкой ($M_1 \ M_2 \ M_3$, где $M_1$ - массив элементов;
$M_2,M_3$ - числа строк и столбцов, представ\-лен\-ные в формате
"целое со знаком". Вектор задается аналогичной парой ($M_1 \
M_2$). В зависимости от того, как определяется формат значения $t$
после примене\-ния процедуры "прогрвыражение", далее отдельно
рассматриваются матричный и векторный подслучаи.

\item Определение наибольшего либо наименьшего элемента набора.
Рассмотре\-ние начинается с контрольной точки "прием(321)".
Антецедент $v$ имеет вид "точ\-ка\-макс(отображение($i$
принадлежит($i$ номера($m$ $n$)) $t(i)$)$x$ $y$)" \ либо
"точкамин(\\ ото\-бражение($i$ принадлежит($i$ номера($m$ $n$))
$t(i)$)$x$ $y$)". Происходит присвоение переменным $x$, $y$ номера
$i$ и значения $t(i)$, соответственно, для наибольшего ли\-бо
наименьшего элемента набора. Если таких $i$ несколько, создаваемый
ком\-пи\-ля\-то\-ром оператор выбирает первое из них.

Теоремная переменная $i$ присваивается программной переменной х13;
вы\-ра\-же\-ние $t(i)$ - переменной х16. Проверяется, что все
входящие в $t(i)$ отличные от $i$ переменные уже идентифицированы.
По косвенным признакам определяется формат х17 для вычисления
значения $t(i)$ - целое число либо число с плаваю\-щей запятой.
Переменным х18, х19 присваиваются программные выражения для $m,n$.
Далее в компилируемую программу заносятся операторы,
ини\-ци\-али\-зи\-ру\-ю\-щие отбираемые значения $x,y$ - для
номера $i$ и соответствующего значе\-ния $t(i)$. Фактически эти
значения будут определяться с помощью квантор\-ной импликации,
выполняющей перечисление всех целочисленных значений от $m$ до
$n$, сравнение текущего значения $t(i)$ с $y$ и необходимую
коррекцию $x,y$. Для получения программного выражения,
вычисляющего в цикле значение $t(i)$, вводится вспомогательный
программный блок х21. При организации цикла процедура "циклпарам"
\ выделяет всевозможные изменяемые выражения $a+bi$, вводя для них
новые переменные со своими шагами изменения. Это происхо\-дит
аналогично рассмотренному выше случаю компиляции кванторной
импли\-ка\-ции.

\item Создание набора псевдокоманд для вычисления значений
числовой функ\-ции. Рассмотрение начинается с контрольной точки
"прием(292)". Антецедент $v$ име\-ет вид "равно($f$
отображение($x_1 \ldots x_n$ и(число($x_1$) $\ldots$ число($x_n$))
$t$))", где вы\-ра\-же\-ние $t$ без связанных переменных
определяет значения функции $f$. Иден\-ти\-фи\-кация $f$
заключается в определении набора псевдокоманд х19,
поз\-во\-ля\-ю\-ще\-го вычислять значение $t$ с помощью оператора
"Выч(программа $\ldots$)". Она осуществляется процедурой
"вычпрог". При этом переменной х20 присваи\-ва\-ет\-ся набор
констант, используемых в х19. Для регистрации идентифика\-ции
служит информационный элемент (усмфункция $f$ $\ldots$).

\item Рекурсивное определение функции на конечном отрезке целых
чисел. Та\-кие определения возникают при решении задач на синтез
программ для решения дифференциальных уравнений либо для решения
обычных уравнений ме\-то\-дом итераций. Компилятор ГЕНОЛОГа
получает в этих случаях не тео\-ре\-му приема, а систему условий
задачи на описание, в рамках которой создава\-лась схема
вычислений. Для ссылок на эти условия используются установки на
идентификацию (программа $\ldots$). Различаются два случая -
отрезок целых чисел фиксирован (как при решении дифференциального
уравнения) либо верх\-няя граница его является плавающей (как при
решении обычного уравнения мето\-дом итераций).

В первом случае функция $f$ определяется утверждениями "равно($f$
отобра\-же\-ние($x$ существует($i$ и(принадлежит($i$ номера($m$
$n$)) равно($x$ $A+Bi$)) значение($g$ дробь($x-A$, $B$)))))",
"равно($g(m)$ $a$)", "длялюбого($j x_1 \ldots x_k$ если
принадле\-жит($j$ номера($m$ $n-1$))то и($A_1 \ldots A_n$))".
Здесь $g$ - вспомогательная функ\-ция целочисленного аргумента,
возникающая из $f$ при масштабировании аргумен\-та; второе
утверждение инициализирует цикл вычислений значений $g$ на
от\-рез\-ке; последнее - определяет шаг цикла, выражая значение
$g(j+1)$ через $g(j)$. Эта конструкция обобщается для нескольких
функций, определяемых в одном цикле (используется при решении
систем дифференциальных урав\-не\-ний). Данный случай
рассматривается компилятором начиная с контроль\-ной точки
"прием(293)" \ (для нескольких функций - начиная с "прием(300)").

Во втором случае функция $f$ определяется утверждениями
"равно($f(m)$ $a$)", "длялюбого($i$ если принадлежит($i$
номера($m$ $n$))то $A(i)$)". Первое из них оп\-ре\-де\-ля\-ет
значение $f$ в начале отрезка; второе - выражает значение $f(i+1)$
через $f(i)$. Кроме этих утверждений, компилятору передается также
усло\-вие на значение $n$ - при выполнении его цикл обрывается.
Случай рассматрива\-ет\-ся начиная с контрольной точки
"прием(312)".

\item Изменение элемента массива. Этот случай может возникнуть в
продукции вы\-чис\-ли\-тельного пакета. Теорема такой продукции
предварительно мо\-ди\-фи\-ци\-ру\-ет\-ся процедурой
"схемавычисл", вводящей для изменной версии массива $x$
вспомогательное обозначение - некоторую новую переменную $y$.
Инфор\-ма\-ция о соответствии между $x$ и $y$ сохраняется в терме
"схемавычисл($\ldots$ замена($x$ $y$)$\ldots$)", регистрируемом
при компиляции в качестве дополнительного указа\-те\-ля приема.
Антецедент $v$ имеет вид "равно(значение($y$ $n$)$t$)". Заметим,
что многомерные массивы конвертируются процедурой "схемавычисл" \
в одно\-мер\-ные, и тогда $n$ становится выражением для вычисления
нужной позиции одно\-мер\-но\-го массива, соответствующей
рассматриваемой точке многомерного.

Рассмотрение подслучая начинается с контрольной точки
"прием(342)". Пе\-ре\-мен\-ные $x$,$y$ присваиваются,
соответственно, программным переменным х18 и х16. Проверяется, что
все переменные выражений $n$, $t$ уже идентифици\-ро\-ва\-ны.
Чтобы не изменить тот элемент массива, который нужен для
после\-ду\-ю\-щих вычислений, проверяется, что выражение
"значение($x$ $n$)" \ не встречается в антецедентах, указанных в
оставшихся установках на идентификацию. На\-хо\-дит\-ся
информационный элемент (транслвыражения $x$ $\ldots$), ссылающийся
на изменяемый массив. По нему определяется формат элемента
массива, и соз\-да\-ет\-ся программное выражение х24 для
вычисления значения $t$ в этом фор\-ма\-те. Предварительно
создается программное выражение х23 для полу\-че\-ния значения $n$
в формате "целое со знаком". Наконец, в компилируемую
про\-грам\-му заносится оператор "Выч(запись $\ldots$)",
реализующий изменение массива $x$.

\item Изменение значения переменной. Этот случай, как и
предыдущий, возни\-ка\-ет при компиляции продукций вычислительного
пакета. Данный прием компи\-ля\-ции выделен контрольной точкой
"прием(343)" \ и представляет собой упро\-щен\-ную версию
предыдущего приема.

\item Сравнение двух значений (контрольная точка "прием(347)").
Антецедент име\-ет вид "равно($t_1$ $t_2$)", причем все его
переменные уже идентифицированы. Опре\-де\-ля\-ют\-ся программные
выражения для значений $t_1,t_2$, и в компилируе\-мую программу
заносится их равенство.

\end{enumerate}

\subsubsection{Общий случай}

Компиляция программно реализуемого антецедента в общем случае
осуществляет\-ся с использованием справочника "вычисл". Этот
справочник связывает вычисли\-мые утверждения либо выражения
конкретных типов с вычисляющими их операторами ЛОСа. Он
реализуется на ГЕНОЛОГе. Теорема приема такого справочника имеет
вид "вычисл($f$ $F$ $A_1 \ldots A_m$ $T$)", где $f$ - логический
символ, на котором будет происходить обращение к справочни\-ку;
$F$ - содержащее $f$ вычисляемое утверждение либо вы\-ра\-же\-ние;
$T$ - терм, определяющий используемый для вычисления оператор либо
операторное выражение. Каждое $A_i$ - терм вида "вход($x_i$
$t_i$)", либо "выход($x_i$ $t_i$)", либо "выход($t$)". В первых
двух случаях указывается, рассматривается ли пере\-мен\-ная $x_i$
как входная или как выходная, и фиксируется формат $t_i$ ее
значений. В третьем случае вычисляется значение выражения $F$, и
$t$ - формат, в котором при использовании операторного выражения
$T$ будет представлен результат. Здесь $T$ может иметь также вид
"и($C_1 \ldots C_n \ D$)", где $C_1, \ldots , C_n$ - операторы,
выполне\-ние которых предшествует вычислению операторного
выражения $D$. Форматы, исполь\-зу\-е\-мые при вычислениях на
ГЕНОЛОГе, перечислены в справочной информации для логического
символа "тип". Обращение к справочнику "вычисл" \ имеет
единст\-вен\-ную входную переменную х1 - одноэлементный набор,
состоящий из пустого накопи\-те\-ля. При обращении этот накопитель
заполняется всевозможными наборами ($F$ $A_1 \ldots A_m$ $T$),
соответствующими указанным выше теоремам для символа $f$.
Использо\-ва\-ние справочника позволяет быстро вводить в
компилятор новые возможности для вы\-чис\-ле\-ний на ГЕНОЛОГе -
достаточно создать единственный прием с теоремой указан\-но\-го
выше вида и реализовать на ЛОСе используемые в $T$ процедуры.

Перед обработкой общего случая компилятор присваивает программной
пе\-ре\-мен\-ной х12 список свободных переменных антецедента $v$,
а переменной х13 - список тех из них, которые уже
идентифицированы. Вводятся пустые накопители х14, х15. После
контрольной точки "прием(286)" \ реализуется цикл заполнения этих
нако\-пи\-те\-лей. Здесь находятся всевозможные вхождения в $v$
более чем двуместных ком\-му\-та\-тив\-но-ассоциативных операций
$g(t_1 \ldots t_n)$, у которых полностью идентифици\-ро\-ва\-ны
переменные не менее двух, но не всех операндов. Для подоперации
$g(\ldots)$, образованной операндами со всеми идентифицированными
переменными, вво\-дит\-ся обозначающая ее новая переменная $y$.
Эта переменная регистрируется в х14, обозначаемая ею подоперация -
в х15, а сам антецедент х11 модифицируется - вы\-де\-лен\-ная
подоперация в нем заменяется на $y$. Такая разгруппировка нужна
для удобства последующей идентификации антецедента $v$ с шаблонами
$F$ - чтобы уже "известные" \ операнды ассоциативно-коммутативной
операции рассматривались как один операнд.

Далее - переход через "ветвь 1". Переменной х16 присваивается
список всех входящих в $v$ логических символов. Выполняется
просмотр элементов списка х16. На текущем символе х17
предпринимается обращение к справочнику "вычисл",
за\-пол\-ня\-ю\-ще\-му накопитель х18 наборами, ссылающимися на
операторы ЛОСа, ко\-то\-рые могли бы быть использованы для
обработки $v$. Просматриваются наборы х20 = ($F$ $A_1 \ldots A_m$
$T$) из х18. Анализируются числовые типы данных,
идентифици\-ро\-ван\-ных в $v$. При наличии явного несоответствия
их входным типам данных, указанным в наборе х20, этот набор
отбрасывается. Далее - переход через "ветвь 2", где
про\-ве\-ря\-ет\-ся совпадение заголовков шаблона $F$ и
антецедента $v$. Находится результат х23 переобозначения
переменных х21 шаблона $F$ на переменные х22, не встречающиеся в
$v$, и с помощью процедуры "унификация" \ определяется подстановка
вместо пе\-ре\-мен\-ных списка х22, преобразующая х23 в антецедент
$v$. Переменной х24 присваива\-ет\-ся набор подставляемых термов.

Находится список х25 соответствующих входным переменным $x_i$
оператора $T$ троек ($t_i$ $y_i$ $r_i$), где $t_i$ - теоремное
выражение, значение которого должно пода\-вать\-ся на вход
оператора; $y_i$ - переменная, в которую $x_i$ перешла при
переобозначении переменных в $F$; $r_i$ - тип значения $t_i$.
Проверяется, что все переменные термов $t_i$ уже идентифицированы.
Аналогичный список х26 троек ($t_i$ $y_i$ $r_i$) составляется для
выходных переменных оператора $T$. Проверяется, что выражения
$t_i$ списка х26 суть попарно различные еще не идентифицированные
переменные. Составляется список х27 программных выражений для
вычисления значений входных термов $t_i$. Находится результат х28
такого же переобозначения переменных в операторе $T$, которое было
сделано для $F$. Определяется список х29 всех свободных
пере\-мен\-ных терма х28. Вводится накопитель х30 программных
выражений для пере\-мен\-ных списка х29, который заполняется в
цикле синхронного просмотра обоих спи\-с\-ков. При этом для
выходных переменных выбираются новые программные пере\-мен\-ные, и
это соответствие регистрируется в информационных элементах
(транслвы\-ра\-же\-ния $\ldots$). Наконец, определяется результат
х31 подстановки в х28 выражений х30 вме\-сто переменных х29, и
конъюнктивные члены оператора х31 заносятся в компили\-ру\-е\-мую
программу - они и выполнят обработку антецедента $v$.

\subsection{Установка на идентификацию "идентификатор"\ }

Если антецедент $v$ выделен установкой (идентификатор $v$), то он
определяет не\-ко\-то\-рые вспомогательные термы (например, с
помощью обращений к задачам и пакетным нормализаторам), которые
либо сравниваются между собой (как запи\-си), либо
идентифицируются с заданными шаблонами. В последнем случае
продол\-же\-ние идентификации обеспечивается с помощью установок
(операнд $\ldots$). Чаще все\-го антецедент $v$ имеет вид
равенства, одна из частей которого определяет
вспо\-мо\-га\-тель\-ный терм, а другая задает шаблон для
идентификации с ним.

Обработка установки "идентификатор" \ начинается с контрольной
точки "при\-ем(126)". Если антецедент выделен указателем "начало",
причем все перемен\-ные, на которые ссылается данный указатель,
уже идентифицированы, то компиля\-ция происходит при текущем
уровне х7, равном 0. Если антецедент выделен указате\-лем "конец",
то она откладывается до уровня 7. В обычной ситуации компиля\-ция
выполняется при х7, равном 5. Предварительно проверяется
отсутствие информа\-ци\-он\-но\-го элемента (внтурпосылка $v$
$\ldots$), означающего, что $v$ есть кванторная импли\-ка\-ция,
сопровождающая некоторую другую кванторную импликацию и
компили\-ру\-ет\-ся при рассмотрении последней.

Перед обработкой установки выполняется обращение к процедуре
"учетнор\-ма\-ли\-за\-то\-ров", вводящей те необходимые для
компиляции нормализаторов информа\-ци\-он\-ные элементы
(быстрпреобр $\ldots$), которые возможно создать на текущем
эта\-пе компиляции. После оператора "равно(х7 5)" \ выполняется
проверка наличия более приоритетных еще не обработанных установок
на идентификацию х12. Пред\-ва\-ри\-тель\-но определяется список
х11 еще не идентифицированных переменных анте\-це\-ден\-та $v$.
Более приоритетными считаются установки типа (операнд $\ldots$),
(извлекается $\ldots$) и (корень $\ldots$) (последние - только
если все их переменные уже идентифициро\-ва\-ны), при условии, что
они не выделены указателями "конец", не относятся к антецедентам,
содержащим переменные списка х11 и не должны обрабатываться после
идентификации переменных из х11, не содержат подтермов, которые
перед идентификацией должны специально формироваться. При этом сам
антецедент $v$ не должен быть выделен указателем "начало". Ес\-ли
найдена более приоритетная установка, то обработка данной
установки откладывается, иначе - откат к переходу через "ветвь 2".

Здесь переменной х10 присваивается корневое вхождение антецедента
$v$. Далее начинается рассмотрение подслучаев для различных
заголовков этого антецедента.

\subsubsection{Эквивалентность либо равенство}

Подслучай рассматривается начиная с контрольной точки
"прием(148)". Преж\-де всего, выбирается вхождение х11 той части
равенства, которая должна будет оп\-ре\-де\-лить вспомогательный
терм для последующей его идентификации (либо сравнения) с другой
частью равенства либо эквивалентности. Подтерм по вхождению х11
при\-сва\-и\-ва\-ет\-ся переменной х12. Находится список х13 всех
свободных переменных терма х12, из которого исключаются такие
переменные х16, которые встречаются в х12 толь\-ко внутри
какого-либо уже идентифицированного "в целом" \ подтерма х15.
Иден\-ти\-фи\-ка\-ция таких переменных для определения
соответствующего х11 вспомогательного терма не обязательна. После
перехода через "ветвь 2" \ проверяется, что отсутствует указатель
приема "видпеременной", определяющий обработку антецедента $v$
лишь после идентификации еще не идентифицированной его переменной
$x$. Проверяется, что каждая переменная списка х13 либо уже
идентифицирована, либо для нее долж\-на быть выбрана новая
переменная, либо набор новых переменных, либо матри\-ца новых
переменных. Проверяется, что переменные вспомогательных посылок,
ис\-поль\-зу\-е\-мых нормализаторами, обрабатывающими подтермы
терма х12, либо иден\-ти\-фи\-ци\-ро\-ва\-ны, либо выбираются как
новые переменные. Если имеется указатель прие\-ма, определяющий
для не идентифицированной переменной списка х13 выбор но\-вой
переменной, либо списка новых переменных, либо матрицы новых
переменных, то в программу приема заносятся операторы, выполняющие
такой выбор, а в инфор\-ма\-ци\-он\-ных элементах программного
блока регистрируется идентификация переменной. Далее - переход
через "ветвь 1". Здесь компиляция разветвляется. Рассматриваются
следующие подслучаи:

\begin{enumerate}

\item х12 - переменная $x$ , которая должна идентифицироваться с
много\-чле\-ном, причем антецедент $v$ имеет вид "равно($x$
отображение($y$ число($y$) $ay^n+p(y)$))" \ (контрольная точка
"прием(349)"). Это достаточно редкий случай, в кото\-ром
антецедент дает идентификацию старшего коэффициента многочлена,
его сте\-пе\-ни и суммы младших членов. Информационный элемент
(сммногочлен $x$ $t$) определяет программное выражение $t$ для
набора коэффициентов много\-чле\-на $x$, расположенных по
возрастанию степеней. Если на момент обра\-бот\-ки установки
выражение $t$ было не определено (равно 0), то предпринима\-ет\-ся
попытка здесь же определить его, используя вхождение,
идентифицированное с $x$ и применяя для нахождения набора
коэффициентов процедуру "сммно\-го\-член" \ либо, для комплексного
случая, "смМногочлен". Затем регистри\-ру\-ют\-ся операторные
выражения, определяющие по известному набору коэффици\-ен\-тов
многочлена его старший коэффициент $a$, степень $n$ и сумму
млад\-ших коэффициентов $p(y)$.

\item х12 - выражение "отображение($x$ $P(x)$ $t(x)$)", причем
противоположный опе\-ранд равенства $v$ представляет собой
переменную $y$, для которой имеется ука\-за\-тель приема,
определяющий ее идентификацию как функциональной пе\-ре\-мен\-ной.
Это - тоже крайне редкий случай. Его обработка начинается пос\-ле
контрольной точки "прием(350)". Если переменная $x$ еще не
идентифи\-ци\-ро\-ва\-на, то вводится оператор, выбирающий для нее
новую переменную. Затем - откат к переходу через "ветвь 2". Здесь
определяются программ\-ные выраже\-ния х16 и х17, соответственно,
для термов $t(x)$ и $P(x)$, и предпринима\-ет\-ся идентификация
обычной переменной $y$ как функциональной. Для этого вво\-дит\-ся
информационный элемент (функция $y$ $x$ $\ldots$), который далее
можно бу\-дет использовать для формирования выражений вида $y(a)$.

\item Общий случай (контрольная точка "прием(351)". С помощью
процедуры "ме\-та\-пе\-ре\-вод" \ находится программное выражение
х14, определяющее терм х12. Предварительно проверяется отсутствие
таких обрабатываемых нор\-ма\-ли\-за\-то\-ра\-ми под\-термов терма
х12, для которых еще не введен информационный эле\-мент
(быс\-тр\-преобр $\ldots$). Если обращение к процедуре
"учетнормализаторов" \ не создает этих информационных элементов,
то обработка установки от\-кла\-ды\-ва\-ет\-ся.

Если имеется фильтр приема, заключенный в служебную конструкцию
"про\-вер\-ка($\ldots$)", указывающую, что его следует проверять
непосредственно пе\-ред обработкой антецедента $v$, то этот фильтр
компилируется и вставляется в про\-грам\-му. Затем - переход через
"ветвь 2".

Если противоположный операнд $w$ равенства либо эквивалентности
$v$ выде\-лен указателем "развертка", то происходит преобразование
текущей установки на идентификацию. Вместо нее вводится установка
(развертка $\ldots$), определяю\-щая идентификацию $w$ с термом -
значением программного выражения х14. В противном случае - переход
через "ветвь 2".

Здесь рассматривается подслучай, в котором антецедент $v$ выделен
указате\-лем приема "старшийчлен($\ldots$)". Тогда он имеет вид
"равно($t$ \ $ay^n+b$)". Иден\-ти\-фи\-кация его состоит в
рассмотрении выражения для $t$ (т.е. значения х14) как многочлена
от переменной, идентифицированной с $y$. При этом определяются
выражения для коэффициента $a$ при старшей степени, суммы $b$
младших чле\-нов и степени многочлена $n$. Данный случай
аналогичен рассмотренному вы\-ше случаю выделения антецедента
указателем "сммногочлен($\ldots$)". Отличие состоит лишь в том,
что здесь правая часть не имеет функциональной запи\-си
"отображение($\ldots$)". Если указателя "старшийчлен($\ldots$)" \
не было, то пере\-ход через "ветвь 1".

Находится противоположный член х16 равенства либо эквивалентности.
Ес\-ли все его переменные идентифицированы, то определяется
программное вы\-ра\-же\-ние х18 для этого члена. В компилируемую
программу вставляется опера\-тор, сравнивающий значения выражений
х18 и х14.

Далее, если ни один из перечисленных подслучаев не имел места,
выполня\-ет\-ся откат к переходу через "ветвь 1". Здесь, после
контрольной точки "прием(352)", рассмотрение общего случая
продолжается. Если программное выражение х14 отлично от
переменной, то для него вводится вспомогательная переменная. Если
противоположный член х15 равенства либо эквивалентности
представля\-ет собой функциональную переменную, то она здесь же
идентифицирует\-ся. Иначе (быть может, после коррекции
информационного элемента (свертка $\ldots$)) - переход через
"ветвь 1".

Здесь происходит ввод в компилируемую программу оператора,
присваиваю\-ще\-го новой программной переменной х16 корневое
вхождение в терм, опреде\-ля\-е\-мый выражением х14. Это
инициирует цикл идентификации по х14 про\-ти\-во\-по\-лож\-ной
части равенства либо эквивалентности. Впрочем, перед
заверше\-ни\-ем рассмотрения "общего случая" \ возникает еще одно
ответвление програм\-мы компилятора - если антецедент $v$ выделен
указателем "дизъюнктчлен" \ (конт\-роль\-ная точка "прием(115)".
Это достаточно сложный подслучай, и мы выне\-сем его рассмотрение
в следующий пункт. Для продолжения рассмотре\-ния общего случая
переходим через "ветвь 1".

Переменной х15 присваивается вхождение противоположного
(идентифици\-ру\-е\-мо\-го по х14) члена равенства либо
эквивалентности. Вводится информаци\-он\-ный элемент (операнд х15
$\ldots$), указывающий идентифицирующее корне\-вое вхождение для
х15, а также элемент (подтерм х15), указывающий, что для
идентификации х15 используется вспомогательный терм. Затем
анализиру\-ет\-ся заголовок х17 терма х15. Если этот заголовок
представляет собой логичес\-кий символ, причем отсутствует
указание на то, что идентифицирующий терм $T$ может иметь другой
заголовок, то в компилируемую программу заносит\-ся оператор,
контролирующий заголовок $T$. Предпринимается попытка выпол\-нить
идентификацию подтерма х15 с применением справочника "вид" \ (этот
справочник уже рассматривался ранее в связи с установкой (операнд
$\ldots$)). Ес\-ли х17 - переменная, то в зависимости от того,
была ли она идентифициро\-ва\-на, либо проверяется совпадение
ранее найденного для нее терма с новым тер\-мом х14, либо
регистрируется ее идентификация с х14. Наконец, если одношаго\-вая
идентификация подтерма х15 не состоялась, происходит откат к
пере\-хо\-ду через "ветвь 1", где для продолжения обработки х15
создается установка на идентификацию (операнд х15 х16).

\item Антецедент $v$ выделен указателем "дизъюнктчлен".
Рассмотрение этого под\-слу\-чая начинается после контрольной
точки "прием(115)". Предвари\-тель\-но, как и в общем случае, было
создано программное выражение х14 для иден\-ти\-фи\-ци\-ру\-ю\-щей
части х12 рассматриваемых равенства или эквивалентности. Дан\-ный
указатель выделяет антецедент вида "равно($A$ $B$)", у которого
иден\-ти\-фи\-ци\-ру\-ю\-щая часть $A$, после обработки
нормализаторами, может приобрести вид дизъюнкции. Тогда $B$ будет
идентифицироваться не с самой дизъюнкци\-ей, а последовательно со
всеми ее дизъюнктивными членами. Прием выпол\-ня\-ет эквивалентную
замену, и заменяющий терм должен формироваться как дизъюнкция
отдельных утверждений, соответствующим подслучаям
иден\-ти\-фи\-ка\-ции $B$. Эта схема действий бывает удобна для
создания приемов, реша\-ю\-щих вспомогательные уравнения и
формирующих на основе отдельных серий их решений ответ основного
уравнения.

Переменной х15 присваивается корневое вхождение терма,
определяемого иден\-ти\-фи\-ци\-ру\-ю\-щей частью $A$. Затем
находится информационный элемент (дизъ\-юнкт\-член $C_1$ $C_2$
$C_3$ $C_4$). У него $C_1$ - набор вхождений всех антецедентов,
вы\-де\-лен\-ных указателем "дизъюнктчлен"; $C_2$ - сначала 0, а
затем программ\-ная переменная для накопителя дизъюнктивных членов
заменяющего терма прие\-ма; $C_3$ - сначала 0, а затем метка
отката при обрыве идентификации; $C_4$ - сначала 0, а затем набор
меток отката для продолжения перечислений
иден\-ти\-фи\-ци\-ру\-емых дизъюнктивных членов. Длина этого
набора равна длине набо\-ра $C_1$.

Если $C_2$ оказывается равно 0, то выбирается новая метка перехода
х17, и в программу вставляется оператор "переходпометке(х17)". К
этой точке будут происходить откаты, если идентификация
какого-либо антецедента списка $C_1$ окажется неудачной - чтобы
предотвратить выдачу в качестве результата час\-тич\-ной
дизъюнкции. Затем в программу вставляется оператор,
ини\-ци\-али\-зи\-ру\-ю\-щий пустым словом накопитель
дизъюнктивных членов результата. Пе\-ре\-мен\-ная, являющаяся этим
накопителем, регистрируется как $C_2$, а метка х17 - как $C_3$.
Здесь же происходит инициализация $C_4$ набором из нулей. Если
ком\-пи\-ли\-ру\-ет\-ся прием сканирования задачи, то после
инициализации накопи\-те\-ля результата размещается оператор,
инициализирующий набор информацион\-ных элементов оператора
"заменавхождения", которым будет пользоваться при\-ем. Далее -
откат к переходу через "ветвь 2".

Здесь выбирается новая ссылка х18 на дополнительный фрагмент
програм\-мы, который будет вставлен впоследствии с помощью
информационного элемен\-та (блокпрограммы $\ldots$), и в
компилируемую программу заносится фиктив\-ный оператор "1($P$
х18)", где $P$ реализует перечисление дизъюнктивных членов
вхождения х15. При редактировании программы он будет преобразован
в "$P$ иначе х18". По окончании рассмотрения всех подслучаев прием
будет пере\-хо\-дить к фрагменту по ссылке х18. Затем выбирается
новая метка перехода х19, и вводится оператор
"меткаперехода(х19)". К нему будут выполняться пере\-хо\-ды для
рассмотрения очередного дизъюнктивного члена. Далее размещает\-ся
фиктивный оператор "2($N$)", где $N$ - символьный номер, следующий
за х18. При редактировании программы он будет преобразован в
"ветвь $N$" \  и обеспечит переход к фрагменту программы,
организующему откат к метке х17 при неудачной идентификации.

Если прием имел еще и указатель "дизъюнктблок($T$)", определяющий
при\-со\-е\-ди\-не\-ние к результату дополнительного
дизъюнктивного члена $T$ (например, каких-то особых решений
уравнения), то создается набор х20 операторов, по\-пол\-няющих
накопитель $C_2$ утверждением, определяемым по $T$.

Наконец, в информационных элементах (блокпрограммы $\ldots$)
регистриру\-ют\-ся фрагменты, к которым имеются переходы по
ссылкам х18 и $N$. Если рас\-смат\-ри\-ва\-е\-мый антецедент -
первый в цепочке вложенных перечислений, опреде\-ля\-е\-мых
антецедентами из $C_1$, то фрагмент х18 полагается равным х20,
иначе он содержит откат к продолжению предыдущего перечисления.

Пополнение накопителя $C_2$ по завершении рассмотрения очередного
под\-слу\-чая выполняет оператор, вставляемый компилятором на
этапе синтеза пре\-об\-ра\-зу\-ю\-щей части приема (например, в
случае приемов сканирования задачи - см. процедуру
"преобразователь").

\end{enumerate}

\subsubsection{Антецедент с заголовком "альтернатива" \ }

Подслучай рассматривается после контрольной точки "прием(149)".
Антецедент $v$ здесь имеет вид "альтернатива($A$ $B_1$ $B_2$)",
причем все переменные утвержде\-ния $A$ уже идентифицированы и оно
играет роль переключателя, выбирающего для реализации один из
операторов $B_1$, $B_2$. Те конъюнктивные члены утверждения $B_i$,
которые представляют собой равенства, будут обрабатываться с
установкой "иден\-ти\-фи\-ка\-тор", прочие члены - с установкой
"извлекается" \ (т.е. с помощью прове\-роч\-ных операторов).

Для получения операторов, проверяющих истинность $A$, создается
вспо\-мо\-га\-тель\-ный программный блок х12. Его первая
неопределенная программная перемен\-ная берется на 1 большей, чем
первая неопределенная программная переменная блока х3, которая
будет играть роль накопителя $P$ использованных приемом посылок.
После компиляции условия $A$ процедурой "идентификатор" \
происходит занесе\-ние в конец программы блока х12 операторов,
пополняющих накопитель $P$. Процедура "сборкафильтра" \ формирует
оператор х13 для проверки $A$, помещая под кванто\-ром
существования по всем новым переменным конъюнкцию операторов блока
х12. Далее предпринимается компиляция утверждений $B_1$, $B_2$.
Для каждого из них созда\-ет\-ся свой программный блок х16, и
после применения к нему процедуры "идентифика\-тор" \ происходит
добавление операторов, пополняющих $P$. Пара вспомогатель\-ных
программных блоков с результатами обработки $B_1, B_2$ сохраняется
в накопите\-ле х14, и переход через "иначе 2". Переменной х16
присваивается список всех еще не идентифицированных переменных,
входящих в $B_1,B_2$. Далее выполняются пре\-об\-ра\-зо\-ва\-ния
программ $S_1,S_2$, реализующих $B_1$ и $B_2$, направленные на
синхрони\-за\-цию обозначений программных переменных,
идентифицирующих переменные х19 из х16. Если некоторая такая
переменная х19 вычисляется в $S_1, S_2$ с помощью различ\-ных
программных переменных, то вводится новая программная переменная,
которой в каждой из программ $S_1,S_2$ переприсваиваются значения,
найденные для х19. Имен\-но она далее и рассматривается как
идентифицирующая для х19. Список перемен\-ных, идентифицирующих
для переменных списка х16, регистрируется в накопи\-те\-ле х17. По
окончании обработки переменных списка х16 - переход через "иначе
1". Здесь предпринимается отбрасывание из программ $S_1,S_2$
операторов, не используемых при вычислении значений х17. Затем -
переход через "ветвь 1" и формирование опе\-ра\-то\-ра х19 вида
"альтернатива($\ldots$)", реализующего антецедент $v$. Перед х19
встав\-ля\-ет\-ся оператор, инициализирующий пустым словом
накопитель $P$.

\subsubsection{Антецедент с заголовком "или" \ }

Подслучай рассматривается после контрольной точки "прием(150)".
Антецедент $v$ имеет вид "или($A_1$ $\ldots$ $A_n$)". Те
конъюнктивные члены утверждений $A_i$, кото\-рые представляют
собой равенства, будут обрабатываться с установкой
"идентификатор", прочие члены - с установкой "извлекается" \ (т.е.
с помощью проверочных операто\-ров).

Компиляция совершенно аналогична ранее разобранному случаю
заголовка "аль\-тернатива". Последовательно просматриваются
вхождения х12 дизъюнктивных чле\-нов $A_i$. Для текущего такого
члена создается вспомогательный программный блок х13. х11 играет
роль накопителя блоков с уже созданными фрагментами про\-грам\-мы
для обработки $A_i$. После заполнения х11 - переход через "иначе
2". Создается спи\-сок х13 еще не идентифицированных в основном
блоке х3 переменных антецедента $v$. Эти переменные х16
просматриваются с целью синхронизации программных переменных в
различных блоках списка х11, определяющих их значение. х14
используется как накопитель этих программных пере\-мен\-ных. После
некоторой расчистки про\-грамм для обработки дизъюнктивных членов
создается оператор х16 - дизъюнкция конъ\-юнк\-ций данных
программ. Этот оператор регистрируется в компилируемой
про\-грам\-ме после оператора, инициализирующего накопитель
использованных посылок.

\subsubsection{Перечисление целых чисел}

Здесь рассматриваются два подслучая. В первом из них (контрольная
точка "при\-ем(152)") антецедент $v$ имеет вид "целое($x$)", и
компилятор вводит оператор "Це\-лое($\ldots$)" \ для перечисления
всех целых значений в порядке возрастания их моду\-лей. Переменная
$x$ идентифицируется с термами, представляющими эти числа.

Второй подслучай (контрольная точка "прием(172)") относится к
анте\-це\-ден\-ту вида "принадлежит($x$ номера($m$ $n$))",
перечисляющему все целочисленные зна\-че\-ния от $m$ до $n$.
Перечисление реализуется оператором "Номера".

\subsubsection{Антецедент с заголовком "длялюбого" \ }

Рассмотрение данного случая начинается с контрольной точки
"прием(245)". Анте\-це\-дент $v$ имеет вид кванторной импликации
"длялюбого($x_1 \ldots x_n$ если $A_1 \ldots A_m$ то $A_0$)". х10
- корневое вхождение этого антецедента; х11 - его связывающая
при\-став\-ка. Предусмотрена компиляция в следующих подслучаях:

\begin{enumerate}

\item Проверка совпадения пар термов, перечисление которых
задается кван\-тор\-ной импликацией (контрольная точка
"прием(249)"). Консеквент $A_0$ пред\-став\-ля\-ет собой
равенство, все переменные которого, отличные от $x_1, \ldots,
x_n$, уже иден\-ти\-фи\-ци\-ро\-ва\-ны. Утверждения $A_1, \ldots,
A_m$, рассматриваемые как программно ре\-али\-зу\-е\-мые
антецеденты, компилируются во вспомогательном программном бло\-ке
х14 в программу $P$, перечисляющую некоторые значения переменных
$x_1, \ldots, \\ x_n$. Относительно этого же блока определяются
программные выражения $T_1,T_2$ для обеих частей равенства.
Наконец, создается кванторный оператор х20 ви\-да "длялюбого($y_1
\ldots y_k$ если $P$ то равно($T_1$ $T_2$))", проверяющий, что при
всех допустимых значениях переменных $x_1, \ldots, x_n$ равенство
соединяет одинаковые (после определяемой приемом нормализации)
термы.

\item Векторная идентификация (контрольная точка "прием(250)").
Кванторная им\-пли\-ка\-ция имеет единственный антецедент $A_1$
вида "принадлежит($x_1$ номера(1 $N$))"; длина связывающей
приставки равна 1. $A_0$ - равенство, все не
иден\-ти\-фи\-ци\-ро\-ван\-ные переменные которого, отличные от
$x_1$, суть обозначения $f$ для его же функциональных переменных
$f(x_1)$. Эти функциональные перемен\-ные идентифицируются с
векторами (наборами термов) в цикле измене\-ния параметра $x_1$.
Прежде всего, составляется список х19 указанных перемен\-ных $f$ и
для каждой из них вводится программная переменная х20 -
накопи\-тель набора термов, инициализируемая пустым словом.
Создается информацион\-ный элемент (вектор $\ldots$), связывающий
переменную с ее накопителем. Формирует\-ся оператор х22 вида
"Номера($\ldots$)", который будет выполнять перечисле\-ние
значений переменной $x_1$. Для компиляции консеквента создается
вспомога\-тель\-ный программный блок х23, которому сообщается
идентификация перемен\-ной $x_1$ с выходной переменной пока нигде
не зарегистрированного опера\-то\-ра х22. Консеквент $A_0$
обрабатывается в этом блоке при помощи установки на идентификацию
(идентификатор $\ldots$). Затем просматриваются переменные $f$
списка х19, и для каждой из них к программе блока х23 добавляется
опе\-ра\-тор, пополняющий накопитель переменной $f$ очередным
термом. Этот терм является идентифицирующим для функциональной
переменной "значение($f$ $x_1$)". Наконец, вводится оператор вида
"длялюбого($y$ если х22 то существует($z_1 \\ \ldots z_q$ $P$))",
где $P$ - конъюнкция операторов программы блока х23.
Пере\-мен\-ные $y,z_j$ - новые программные переменные,
встречающиеся, соответственно, в операторе х22 и в $P$.

\item Матричная идентификация (контрольная точка "прием(248)").
Здесь кван\-тор\-ная приставка состоит из двух переменных, которые
будем обозначать да\-лее через $i,j$. Число антецедентов также
равно 2 - "принадлежит($i$ номера(1 $N$))" \ и "принадлежит($j$
номера(1 $M$))". Программные выражения для вычис\-ле\-ния $N,M$ в
формате десятичных чисел присваиваются переменным х18 и х22.
Кон\-сек\-вент $A_0$ имеет вид "равно(значение($B$ набор($i$
$j$))$R$)". При компиляции пред\-по\-ла\-га\-ется, что матрица $B$
уже идентифицирована и данные о ней содержат\-ся в информационном
элементе (элементыматрицы $B$ $\ldots$). Находится спи\-сок х29
всех еще не идентифицированных переменных $f$ выражения $R$,
отлич\-ных от $i,j$, и проверяется, что они относятся к
функциональным перемен\-ным "значение($f$ набор($i$ $j$))" того же
выражения. Эти функциональные перемен\-ные должны быть
идентифицированы с матрицами тех же размеров, что и матри\-ца $B$,
и зарегистрированы в информационных элементах (элементыматрицы $f$
$\ldots$).

Чтобы идентифицировать в цикле перечисления значений $i,j$
выражение $R$ с текущим элементом матрицы $B$, удобно заменить все
вхождения функ\-ци\-о\-наль\-ных переменных "значение($f$
набор($i$ $j$))" \ на обычные переменные $f$. Резуль\-тат такого
преобразования $R$ присваивается переменной х31. Затем
вво\-дят\-ся операторы программы, инициализирующие пустыми словами
накопители строк матриц, соответствующих переменным $f$. Для
регистрации идентификации этих матриц создаются информационные
элементы (элементыматрицы $f$ $\ldots$).

Для организации внешнего цикла (варьирование переменной $i$)
вводится вспо\-мо\-га\-тель\-ный набор операторов х33. Кроме
оператора "Номера($\ldots$)", в него заносятся также операторы,
инициализирующие пустыми словами накопители элементов текущей
строки для каждой переменной $f$ из х29. Переменной х32
присваивается список данных накопителей.

Аналогично, для организации внутреннего цикла (по переменной $j$)
вво\-дит\-ся вспомогательный набор операторов х34. Создается
вспомогательный про\-грам\-мный блок х35 для компиляции шага
цикла. Из него исключаются ин\-фор\-ма\-ци\-он\-ные элементы
(элементыматрицы $f$ $\ldots$), соответствующие функциональ\-ным
переменным набора х29, так как в рамках шага цикла эти переменные
будут идентифицироваться не как матрицы, а как обычные термы. В
х35 регист\-ри\-ру\-ют\-ся программные выражения для текущих
значений $i,j$, взятые из набо\-ров х33, х34. Затем переменной х36
присваивается программное выражение для корневого вхождения
текущего элемента идентифицирующей матрицы $B$. Если это выражение
не является переменной, то для него вводится новая перемен\-ная. К
накопителю операторов внутреннего цикла добавляются те
опе\-ра\-то\-ры блока х35, которые могли возникнуть в нем при
компиляции вычисления х36.

Переменной х37 присваивается список тех новых программных
пере\-мен\-ных, которые появились в программном блоке х35 по
сравнению с основным про\-грам\-мным блоком х3. Это список будет
нужен как связывающая пристав\-ка кванторной импликации,
реализующей внутренний цикл.

Далее накопитель программы блока х35 сбрасывается (его элементы
уже уч\-те\-ны в х34). Ссылки из информационных элементов блока
х35 на вхождения в подтерм $R$ преобразуются в ссылки на
соответствующие вхождения в терм х31, так как именно он будет
использоваться при идентификации на шаге цикла. Затем происходит
обращение к процедуре "идентификатор", выполняющей дан\-ную
идентификацию. При этом используется единственная установка на
иден\-ти\-фи\-ка\-цию (операнд $\ldots$), связывающая программную
переменную х36 - те\-ку\-щий элемент матрицы $B$ - с корневым
вхождением в терм х31.

После идентификации х31 к концу программной заготовки блока х35
до\-бав\-ля\-ют\-ся операторы, регистрирующие текущие значения
переменных списка х29 в накопителях строки для их матриц.
Переменной х38 присваивается конъ\-юнк\-ция операторов
программного блока х35, на которую навешивается кван\-тор
существования по всем новым переменным этого блока, кроме уже
учтенных в списке х37. Наконец, создается оператор - кванторная
импликация, ре\-али\-зу\-ю\-щая внутренний цикл по $j$.
Антецедентами ее служат операторы списка х34, а консеквентом -
оператор х38. Данная кванторная импликация заносится в
одноэлементный список х39, который затем пополняется операторами,
ре\-гист\-ри\-ру\-ю\-щими текущие версии накопителей строки матриц
$f$ списка х29 в информационных элементах (элементыматрицы $f$
$\ldots$). Наконец, вводится ито\-го\-вый оператор х41 для
реализации антецедента $v$. Антецедентами его слу\-жат операторы
списка х33 (они обеспечивают цикл по $i$), а консеквен\-том -
конъюнкция операторов набора х39.

\end{enumerate}

\subsection{Установка на идентификацию "контекст"\ }

Установка на идентификацию (контекст $A$) возникает в тех случаях,
когда при\-ем имеет указатель "контекст($\ldots$)", определяющий
идентификацию каких-то пере\-мен\-ных вне рассмотрения теоремы.
Этот указатель организован так же, как одноимен\-ный фильтр
"контекст($\ldots$)". Он определяет значения своих внутренних
пере\-мен\-ных (не определенных по другим частям описания приема),
удовлетворяющие задан\-ным в нем условиям. В отличие от фильтра
"контекст($\ldots$)", внутренние перемен\-ные которого связаны
квантором существования, указатель "контекст($\ldots$)" \ передает
зна\-че\-ния своих внутренних переменных в основной цикл
идентификации, где они мо\-гут быть использованы наравне с
переменными, идентифицированными по теоре\-ме приема.

Терм $A$ установки (контекст $A$) имеет вид "идентификатор($B_1
\ldots B_n$)"; со\-от\-вет\-ству\-ю\-щий указатель - вид
"контекст(и($B_1 \ldots B_n$))". Обработка установки начинает\-ся
с контрольной точки "прием(127)". Терм $A$ присваивается здесь
переменной х10; теорема приема - переменной х11. Уровни х7
обработки установки "контекст" \ - либо 0 (случай пакетных
синтезаторов, которые часто получают входную инфор\-ма\-цию через
список комментариев, извлекая ее оттуда с помощью указателя
"контекст"), либо 2, либо 7.

Сначала рассматривается особый случай - $B_1$ имеет вид
"вид(корень $f(X)$)" \ для некоторой еще не идентифицированной
функциональной переменной $f$, а ком\-пи\-ли\-ру\-е\-мый прием
относится к пакетному нормализатору. Тогда для идентифика\-ции $f$
по корневому вхождению преобразуемого нормализатором терма сразу
вво\-дит\-ся информационный элемент (функция $f$ $\ldots$).

Если указанный случай не имеет места, то для обработки установки
(кон\-текст $\ldots$) используется справочник "блокпроверок",
который обрабатывает указатель "кон\-текст($\ldots$)" \ так, как
если бы он был фильтром. Отличие состоит лишь в том, что на
заключительном этапе обработки этот справочник присоединяет к
компили\-ру\-е\-мой программе все операторы, реализующие фильтр,
не навешивая на их конъюнкцию квантор существования. Кроме того, в
основной программный блок переносятся из блока компилияции фильтра
все информационные элементы, определяющие иден\-ти\-фи\-кацию
внутренних переменных. Заметим, что процедура справочника
"блок\-про\-ве\-рок" \ на символе "контекст" \ представляет собой
один из важных крупных бло\-ков компилятора и будет рассмотрена
ниже в специальном разделе.

\subsection{Проверка истинности антецедента с помощью вспо\-мога\-тель\-ной
задачи либо общей провероч\-ной про\-це\-ду\-ры}

В этом разделе объединены установки на идентификацию (легковидеть
$v$), (ус\-ма\-три\-ва\-ется $v$), (доказать $v$), (очевидно $v$),
(следствие $v$). Здесь $v$ - вхождение антеце\-ден\-та, для
проверки истинности которого нужно использовать либо
вспомога\-тель\-ную задачу, либо вспомогательную проверочную
процедуру общего назначения (про\-це\-ду\-ры "легковидеть",
"очевидно").

Обработка рассматриваемой установки ($P$ $v$) начинается с
контрольной точки "прием(133)". Так как использование
вспомогательной задачи - достаточно тру\-до\-ем\-кая процедура, то
уровень х7 компиляции этой установки берется равным 8, либо, при
выделении антецедента $v$ указателем "начало($\ldots$)", равным 6.
Это обеспе\-чи\-ва\-ет размещение обращений к проверкам в конце
программы приема. Если $P$ = "доказать", то проверяется отсутствие
менее трудоемких вариантов установок - "ус\-мат\-ривается" \ и
"легковидеть". Проверя\-ет\-ся отсутствие установки "свертка", при
которой может быть продолжена непосредственная идентификация.
Проверя\-ет\-ся также, что все свободные переменные антецедента
$v$, не выделенные указате\-лем "новаяпеременная", уже
идентифицированы.

Переменной х10 присваивается программное выражение для
определяемого ан\-те\-це\-ден\-том $v$ проверяемого утверждения.
Если компилируется прием сканиро\-ва\-ния задачи и $P$ =
"доказать", то имеет место особый случай сведения задачи на
доказательство к задаче на доказательство одного лишь утверждения
$v$. Компи\-ля\-ция здесь будет несколько отличаться от прочих
случаев, в которых лишь обес\-пе\-чи\-ва\-ет\-ся проверка
истинности $v$ перед реализацией основных действий прие\-ма.
Соответственно, в данном случае переменной х11 присваивается 1,
иначе ей при\-сва\-и\-ва\-ет\-ся программное выражение для списка
утверждений, образующих кон\-текст проверки.

Если х11 отлично от 1, то анализируются информационные элементы
(уда\-ле\-ни\-епо\-сылок $\ldots$), определяющие условия на
утверждения списка х11, отбрасываемые из контекста проверки.
Выполняется соответствующая коррекция программного вы\-ра\-же\-ния
х11. Затем - откат к переходу через "ветвь 4", где аналогичным
обра\-зом х11 корректируется с учетом информационных элементов
(занесениепосылки $\ldots$), добавляющих некоторые утверждения к
контексту проверки.

Если $P$ = "очевидно", то в компилируемую программу заносится
оператор "оче\-видно(х10 х11 $\ldots$)", реализующий проверку
истинности х10 относительно х11 либо при помощи подходящего
проверочного оператора, либо при помощи некоторых про\-стейших
общих соображений. В противном случае - переход через "иначе 1".

Инициализируется пустым словом накопитель х12 программных
выражений,оп\-ре\-де\-ляющих наборы комментариев, передаваемых
вспомогательным задаче либо опе\-ра\-тору при проверке $v$. Для
его заполнения просматриваются указатели прие\-ма "комментарий($i$
$\ldots$)", относящиеся к антецеденту $v$. По ним обычным образом
вво\-дят\-ся программные выражения для комментариев. Фактически
каждое такое вы\-ра\-же\-ние определяет не комментарий, а либо
пустой список, либо одноэлемент\-ный список, состоящий из
комментария. Это делается для того, чтобы учесть усло\-вия, при
которых комментарий должен быть введен - при их нарушении выдается
пус\-той список. После просмотра указателей
"комментарий($\ldots$)" \ - переход через "иначе 1".

В случае $P$ = "легковидеть" \ к х12 добавляется набор, состоящий
из коммента\-рия "извлекается", которым для ускорения проверки
будет сопровождаться вспомога\-тель\-ная задача. В случае приема
синтезатора аналогичным образом добавля\-ет\-ся комментарий
"значение". Далее по списку х12 не более чем одноэлементных
фраг\-мен\-тов списка комментариев определяется программное
выражение х13 для самого списка комментариев. Затем компиляция
разветвляется. Рассматриваются следую\-щие подслучаи:

\begin{enumerate}

\item Компилируется прием сканирования задачи, причем $P$ =
"доказать". Тогда - переход через "иначе 1". Здесь в компилируемую
программу вводится опера\-тор, присваивающий первой неиспользуемой
программной переменной "начало(х3)" \ ту задачу на доказательство
$Z'$, к которой сводится текущая задача на до\-ка\-за\-тель\-ство
$Z$. Задача $Z'$ получается из $Z$ при помощи оператора "спуск",
заменяющего ее условие на проверяемый антецедент (он задается
программ\-ным выражением х10). Вводится также оператор,
пополняющий коммента\-рии задачи $Z'$ с учетом х13. Наконец,
вводятся оператор "подуровень($\ldots$)", ус\-та\-нав\-ли\-вающий
уровень обращения к $Z'$ равным максимальному уровню зада\-чи $Z$,
и оператор "равно(ответзадачи($\ldots$)истина)", осуществляющий
обращение к решению $Z'$ и проверку того, что это решение было
получено.

Если прием имел указатель "Обрыв($\ldots$)", устанавливающий
ограничение на трудоемкость решения задачи $Z'$, то перед
обращением к ее решению встав\-ля\-ет\-ся оператор
"лимит($\ldots$)", контролирующий это ограничение, а после
обраще\-ния - оператор "Обрыв", отменяющий контроль. Затем -
переход через "ветвь 1", где очередной неиспользуемой программной
переменной передается фор\-ми\-ру\-е\-мый на основе комментариев
(выводимо $\ldots$) список посылок, исполь\-зо\-ван\-ных при
решении задачи $Z'$. Эта переменная регистрируется в
информаци\-он\-ном элементе (выводимо $\ldots$).

\item $P$ = "следствие". Тогда переменной х14 присваивается
программная пере\-мен\-ная, значением которой в контексте
срабатывания приема является теку\-щая задача. Если компилируется
прием сканирования задачи, то текущая зада\-ча определяется
переменной "х1"; в случае пакетного оператора она находится с
помощью оператора "текущаязадача($\ldots$)". Переменной х15
присваива\-ет\-ся обращение к процедуре "следствие", которая будет
выполнять проверку ис\-тин\-нос\-ти антецедента. Переменной х16
присваивается оператор, устанавли\-ва\-ю\-щий уровень обращения к
вспомогательной задаче на доказательство, решае\-мой внутри
указанной процедуры. Далее х16 и х15 регистрируются в
компили\-ру\-е\-мой программе; если имелся указатель приема
"Обрыв($\ldots$)", относя\-щий\-ся к $v$, то перед х15 вставляется
оператор "лимит($\ldots$)", а после х15 - опера\-тор "Обрыв".

\item В оставшихся случаях компилятор добавляет к программе
операторы "уро\-вень\-обращения($N$)", "следствие(х10 х11
$\ldots$)". Здесь $N$ определяется в зависимо\-сти от заголовка
установки $P$.

\end{enumerate}

\subsection{Установка на идентификацию "новаргумент"\ }

Установка на идентификацию (новаргумент $A_1$ $A_2$) возникает по
указателям прие\-ма "новаргумент($f$ $x$ $N$)" \ либо
"функаргумент($f$ $x$ $a$ $N$)". Эти указатели определя\-ют такую
идентификацию выражения $f(t)$, при которой все вхождения
перемен\-ной $x$ в результат обработки нормализатором $N$
идентифицирующего терма, сопоставля\-е\-мо\-го данному выражению,
расположе\-ны только внутри вхождений подтермов,
со\-от\-вет\-ствующих $t$. Перед обработкой уста\-нов\-ки все
переменные, входящие в $t$, долж\-ны уже быть идентифицированы.
Допуска\-ет\-ся обобщение на многомерный слу\-чай ($x$,$t$
становятся выражениями вида "набор($\ldots$)"). В случае указателя
"функаргумент" \ добавляется набор $a$ соответствующих
от\-дель\-ным элементам $t_i$ набора $t$ индикато\-ров связанных
переменных. Каждый такой ин\-ди\-ка\-тор - 0 либо указание на
переменную выражения $t_i$, при идентификации кото\-рой
учитывается возможность переобо\-зна\-че\-ния ее как связанной
переменной.

Элементы $A_1$, $A_2$ установки "новаргумент" \ суть: программное
выражение для терма $f(t)$, определяемого указа\-те\-лем приема, а
также вхождение этого терма в теорему приема. Обработка
уста\-нов\-ки начинается с контрольной точки "прием(137)". Уровень
компиляции х7 при этом равен 6. Переменной х10 присваивается
вхождение терма $f(t)$ в теорему приема, а переменной х11 -
переменная $f$. Находится указатель приема х12, породив\-ший
рассматриваемую установку. Переменной х13 присва\-и\-ва\-ет\-ся
список переменных выражения $x$ из указателя х12. Предполагается,
что это выражение - либо отдельная переменная, либо терм
"набор($\ldots$)" \ с операндами, пред\-став\-ляющими собой
попарно различные переменные. Далее компиляция
раз\-вет\-вля\-ет\-ся.

\subsubsection{Случай указателя "новаргумент" \ }

В этом случае указатель х12 имеет вид "новаргумент($f$ $x$ $N$)" \
и относится к иден\-ти\-фи\-кации выражения $f(t)$. Переменной х14
присваивается терм $t$; определя\-ет\-ся программное выражение х15
для $t$. Находится программное выражение х16 для списка переменных
х13. Если $N$ - название невырожденного нормализатора (т.е.
отлично от символа "фикс"), то корректируется программное
выражение $A_1$ из ус\-та\-нов\-ки - оно начинает определять
результат применения к терму $f(t)$ нор\-ма\-ли\-за\-то\-ра $N$.
Заметим, что при обращении к $N$ ему передается комментарий
(новаргумент $P$ $X$), где $P$ - терм $t$ (если $t$ - набор
термов, то берется первый терм этого набора); $X$ - список
переменных х13. После коррекции $A_1$ - откат к переходу через
"ветвь 3".

Если $t$, $x$ - не векторные, то в программу заносится оператор
"новаргумент($\ldots$)", проверяющий условие вхождения переменной
$x$ в идентифицирующий терм $A_1$ толь\-ко внутри $t$ и
присваивающий новой программной переменной результат замены в
идентифицирующем терме всех вхождений $t$ на $x$. Этот результат
будет исполь\-зо\-вать\-ся в качестве шаблона для формирования
новых термов вида $f(\ldots)$. Он ре\-гис\-три\-руется в
информационном элементе (функция $\ldots$), что и завершает
иден\-ти\-фи\-ка\-цию в данном подслучае.

Для векторных $t$, $x$ действия аналогичны, но вместо оператора
"новаргу\-мент" \ используется оператор "Новаргумент".

\subsubsection{Случай указателя "функаргумент" \ }

В этом случае х12 имеет вид "функаргумент($f$ $x$ $a$ $N$)".
Переменной х15 присваива\-ет\-ся набор программных выражений для
компонент вектора $t$; переменной х16 - программное выражение для
набора переменных $x$. Как и в предыдущем случае, при
невырожденном $N$ корректируется программное выражение $A_1$ из
установки. Затем - откат к переходу через "ветвь 1". Здесь
переменной х17 присваивает\-ся набор программных выражений для
переменных списка $a$, и переход через "иначе 1". Дальнейшие
действия аналогичны разобранным в подслучае указателя
"новаргу\-мент", но вместо оператора "новаргумент" \ применяется
оператор "функаргумент".

\subsection{Установка на идентификацию "развертка"\ }

Рассматриваемая установка имеет вид (развертка $v$ $A_1$ $A_2$).
Здесь $v$ - вхожде\-ние в теорему приема терма, идентифицируемого
по указателю "развертка($\ldots$)". Такой терм имеет вид операции
над конечным семейством, которое должно быть определено по
конкретному набору идентифицирующих термов. Дополнительно
разрешается также идентификация кванторной импликации как
конъюнкции и описателя "ото\-бра\-же\-ние" \ как набора. $A_1$ -
программное выражение для вхождения (при $A_2 = 0$) либо терма
(при $A_2 = 1$) для идентификации с $v$. Возможен также
специальный случай, когда $A_1$ - информа\-ци\-он\-ный элемент
(набороперандов $B_1$ $B_2$), дающий про\-грам\-мное выражение
$B_2$ для набора термов, среди которых осуществляется отбор
идентифицируемых с $v$ эле\-мен\-тов. В этом случае $A_2 = 2$. Во
всех случаях иден\-ти\-фи\-ка\-ция $v$ выполняется за счет
просмотра заданного списка термов и извлечения из него элементов,
составляю\-щих "таблицы" \ значений идентифицируемых
функ\-ци\-о\-наль\-ных переменных, встре\-ча\-ю\-щих\-ся в $v$.
Заметим, что установки на идентифика\-цию (развертка $\ldots$) не
вво\-дят\-ся непосредственно при обращении к процедуре
"иден\-тификатор", а возникают в процессе реализации этой
процедуры.

Обработка установки начинается с контрольной точки "прием(167)".
Уровень компиляции х7 равен 2, так как фактически выполняется не
очень трудоемкая не\-по\-сред\-ственная идентификация, аналогичная
имевшей место при установке "опе\-ранд". Переменной х10
присваивается идентифицируемый подтерм. Если все сво\-бод\-ные
переменные терма х10 уже идентифицированы, причем этот терм не
имеет ви\-да $F$(отображение($x$ $F(x)$ $t(x)$)), где $t(x)$
содержит связанные переменные, то начиная с контрольной точки
"прием(212)" \ реализуется простейший подслучай идентифи\-ка\-ции.

Переменной х11 присваивается заголовок терма х10. Этот заголовок -
либо кван\-тор общности, либо символ одноместной операции,
применяемой к семейству, за\-дан\-но\-му термом
"отображение($\ldots$)". По нему определяется тот символ х12
ком\-му\-та\-тив\-но-ассоциативной операции, которая соответствует
данной операции над семей\-ст\-ва\-ми. В случае квантора общности
х12 - логическая связка "и"; в случае описателя "отображение" \
х12 - символ "набор"; в прочих случаях этот символ определяется по
х11 с помощью справочника "развертка". В компи\-ли\-ру\-е\-мую
программу заносится оператор, присваивающий новой программной
перемен\-ной "начало(х3)" \ набор $N_1$ х12 - членов
идентифицирующего терма, соответствую\-ще\-го х10. Находится также
программное выражение х14 для набора $N_2$ х12 - членов тер\-ма
х10 (это возможно, так как все свободные переменные в х10 уже
идентифицирова\-ны). Если $v$ - корневое вхождение
идентифицируемой части теоремы, причем компили\-ру\-ет\-ся прием
замены, то проверяется включение $N_2$ в $N_1$, и формируется
ин\-фор\-ма\-ци\-он\-ный элемент (корни $\ldots$), определяющий
остаток не использованных кор\-не\-вых операндов
идентифи\-ци\-ру\-ю\-ще\-го терма. В противном случае вводятся
опе\-ра\-то\-ры, проверяющие совпаде\-ние множеств $N_1$, $N_2$.

Если не все переменные х10 уже идентифицированы, либо нарушается
приве\-ден\-ное выше условие на отсутствие связанных переменных в
$t(x)$, то переход че\-рез "иначе 2" \ к контрольной точке
"прием(213)". Здесь снова находится сим\-вол
ассоциативно-коммутативной операции, соответствующей операции над
семей\-ст\-ва\-ми, являющейся заголовком терма х10; он
присваивается переменной х11. Пе\-ред контрольной точкой
"прием(214)" \ инициализируются нулями переменные х12, х13 и х14.
Им будут переприсваиваться, соответственно: варьируемая в цикле
иденти\-фи\-ка\-ции теоремная переменная, играющая роль номера
элемента семейства; теорем\-ный терм для длины семейства;
теоремный терм для элемента семейства. Пос\-ле оператора "ветвь 1"
\ начинается анализ подслучаев для определения х12, х13, х14.
Здесь рассматриваются следующие подслучаи:

\begin{enumerate}

\item х10 имеет вид "длялюбого($i$ если принадлежит($i$ номера(1
$n$))то $F$)". Тогда х12 полагается равным переменной $i$; х13 -
терму $n$; х14 - терму $F$.

\item х10 имеет вид "отображение($i$ принадлежит($i$ номера(1 $n$)
$t$))". Тогда х12 по\-ла\-га\-ется равным переменной $i$; х13 -
терму $n$; х14 - терму $t$.

\item х10 имеет вид $F$(отображение($i$ и(целое($i$) \ $1 \le i$ \
$i \le n$)$t$)); вместо "целое" \ здесь допускается использование
символа "натуральное". Тогда х12 полага\-ет\-ся равным переменной
$i$; х13 - терму $n$; х14 - терму $t$.

\item х10 имеет вид "длялюбого($i$ $j$ если принадлежит($i$
номера(1 $n$)) принадле\-жит($j$ номера(1 $m$)) то $F$). Это -
случай двухпараметрической идентификации конъ\-юнкции утверждений.
Переменной х12 здесь присваивается $i$; переменной х13 - терм $n$;
переменной х14 - терм $F$. Кроме того, переменной х16
присваива\-ет\-ся $j$, а переменной х17 - $m$. После перехода
через "ветвь 2" \ попадаем на ветвь программы, начинающуюся с
контрольной точки "прием(261)". Она содер\-жит в себе всю
процедуру идентификации для данного под\-слу\-чая и будет
рассмот\-ре\-на ниже в отдельном подразделе.

\end{enumerate}

После определения значений х12, х13, х14 - откат к переходу через
"ветвь 1" \ (кроме указанного выше двухпараметрического
подслучая). Далее компиляция раз\-вет\-вля\-ет\-ся - в зависимости
от того, идентифицирована ли уже длина набора $n$.

\subsubsection{Случай не идентифицированной длины набора}

В этом случае проверяется, что х13 - еще не идентифицированная
переменная. Если х11 - символ "набор", то вводится оператор,
проверяющий, что идентифицирую\-щий терм имеет заголовок "набор";
находится программное выражение х16 для числа корневых операндов
этого терма, и регистрируется идентификация х13 с помо\-щью х16.
Затем - откат к переходу через "ветвь 1" \ для рассмотрения
подслу\-чая идентифицированной длины набора. Если же х11 отлично
от символа "набор", то откат к переходу через "ветвь 2".

Здесь размещена контрольная точка "прием(215)". Далее х15 -
переменная для длины набора. Переменной х16 присваивается
программное выражение для на\-бо\-ра корневых х11- членов
идентифицирующего терма.

Терм х14 является шаблоном идентификации - он будет сравниваться с
элемен\-та\-ми набора х16 при варьировании переменной х12. Не
идентифицированные встре\-чающиеся в х14 функциональные переменные
вида "значение($f$ х12)" \ будут по\-рож\-дать в цикле изменения
х12 некоторые наборы термов. Переменной х17
при\-сва\-и\-ва\-ет\-ся список всех таких переменных $f$. Перед
рассмотрением общего случая выделя\-ют\-ся два простейших
подслучая. В первом из них х14 само является функциональ\-ной
переменной "значение($f$ х12)". Тогда вводится информационный
элемент (вектор $f$ х16), идентифицирующий $f$ непосредственно с
набором х16. Одновременно $f$ задает\-ся и в формате терма. Кроме
того, х15 идентифицируется с длиной набора х16. Во втором случае
х14 имеет вид "значение(значение($f$ х12)$X$)". Это - случай
иден\-ти\-фи\-ка\-ции набора функций, зависящих от $X$ (например,
при решении системы диф\-фе\-рен\-ци\-аль\-ных уравнений). Здесь
используется информационный элемент (Набор $f$), указывающий на
несколько нестандартную регистрацию идентификации $f$ с
по\-мо\-щью информационных элементов (терм $f$ $\ldots$) и
(функция $f$ $\ldots$).

Если х14 не имеет указанного простейшего вида, то - откат к
переходу через "ветвь 1". Здесь проверяется, что все переменные
терма х14, отличные от варьи\-ру\-е\-мой переменной х12 и
функциональных переменных списка х17, уже
иден\-ти\-фи\-ци\-ро\-ва\-ны. В программу приема заносятся
операторы, инициализирующие пус\-ты\-ми словами накопители для
идентификации переменных х17, причем составля\-ет\-ся список х18
программных переменных, используемых в качестве накопителей. Если
набор идентифицирующих термов представляет собой остаток операндов
неко\-то\-рой операции, то вводится накопитель х19 остатка тех же
операндов после цик\-ла варьирования х12.

Находится список х20 вхождений в терм х14 всевозможных
функциональ\-ных переменных "значение($f$ х12)" \ для $f$ из х17;
проверяется, что каждое вхождение х12 в х14 расположено внутри
одного из вхождений списка х20. Затем находит\-ся результат х21
замены в х14 каждой функциональной переменной "значение($f$ х12)"
\ на обычную переменную $f$. Это делается для того, чтобы на
текущем шаге цикла варьирования х12 идентифицировать $f$ как
обычную переменную и занести резуль\-тат идентификации в
соответствующий накопитель списка х18. Для иденти\-фи\-ка\-ции х21
создается вспомогательный программный блок х23. Предвари\-тель\-но
переменной х22 присваивается не более чем одноэлементный список
опера\-то\-ров, идентифицирующих заголовок х21. Если имеется
информационный элемент (за\-го\-ло\-вок $\ldots$), указывающий,
что х21 может идентифицироваться с термом, имею\-щим другой
заголовок, то х22 оставляется пустым. Очередной идентифицирующий
терм, извлекаемый из набора х16 для идентификации х21, будет
присваиваться про\-грам\-мной переменной "начало(х3)". Это
присвоение является по отношению к блоку х23 внешним, так что в
его программу сначала заносятся лишь х22 и опера\-тор,
присваивающий очередной программной переменной корневое вхождение
в теку\-щий идентифицирующий терм. В х23 заносится информационный
элемент (опе\-ранд $\ldots$), связывающий корневые вхождения терма
х21 и текущего идентифицирую\-ще\-го терма; переменной х24
присваивается список установок на идентификацию, состоя\-щий из
единственной установки (операнд $\ldots$) такого же вида.
Выполняется коррек\-ция тех информационных элементов программного
блока х23, которые ссылались на вхождения в теорему приема,
расположенные внутри х14. Вместо этих вхожде\-ний подставляются
соответствующие вхождения в х21.

Далее - переход через "ветвь 1", и после контрольной точки
"прием(217)" \ - об\-ра\-ще\-ние к процедуре "идентификатор".
После того, как в программном блоке х23 возникла программа для
идентификации х21, к ней добавляются операторы,
ре\-гис\-т\-ри\-рующие в накопителях списка х18 термы,
идентифицированные с со\-от\-вет\-ст\-ву\-ю\-щи\-ми переменными
списка х17. Переменной х26 присваивается результат навешива\-ния
квантора существования по всем новым переменным блока х23 к
конъюнк\-ции операторов его программы. Наконец, создается и
заносится в программный блок х3 реализующая цикл идентификации
кванторная импликация х27. Ее антеце\-дент перечисляет термы
списка х16, присваивая текущий такой терм программ\-ной переменной
"начало(х3)". Консеквентом служит либо х26, либо, если был введен
накопитель остатка идентифицирующих операндов, дизъюнкция,
регистрирующая в случае ложности х26 неиспользованный текущий
идентифицирующий терм в спи\-с\-ке х19.

Если был введен накопитель остатка идентифицирующих операндов, то
в про\-грам\-му заносится ряд дополнительных операторов.
Во-первых, при отсутствии ин\-фор\-ма\-ци\-он\-но\-го элемента,
разрешающего идентифицировать $v$ с пустым списком термов,
вводится оператор, проверяющий непустоту первого накопителя списка
х18. Корректируется указанный в установке на идентификацию
информационный эле\-мент (набороперандов $\ldots$). Если $v$ -
последний не идентифицированный операнд этого элемента, то
вводится оператор, проверяющий пустоту остатка х19.

Далее вводятся информационные элементы, регистрирующие результаты
иден\-ти\-фи\-ка\-ции переменных списка х17. Для каждой переменной
создается два таких элемента - (терм $\ldots$) и (вектор
$\ldots$). В заключение регистрируется результат
иден\-ти\-фи\-ка\-ции длины набора.

\subsubsection{Случай идентифицированной длины набора}

Рассмотрение этого подслучая начинается с контрольной точки
"прием(223)". Пе\-ред этим переменной х15 присваивается
программное выражение для длины набо\-ра. Основное отличие от
случая не идентифицированной длины набора состоит в том, что
знание диапазона изменения варьируемой переменной х12 позволяет
яв\-но использовать текущее значение этой переменной на каждом
шаге цикла иден\-ти\-фи\-ка\-ции. Напомним, что в предыдущем
подразделе текущий идентифицируемый терм х21 не содержал
варьируемой переменной; здесь же он, вообще говоря, будет
содер\-жать эту переменную. В остальном действия аналогичны.

Переменной х16 присваивается программное выражение для набора
идентифи\-ци\-ру\-ю\-щих термов; х17 присваивается список всех
таких переменных $f$, что х14 име\-ет подтерм вида $f(X)$, где $X$
- переменная х12 либо набор переменных, включаю\-щий х12. Если х14
само имеет вид $f(X)$, то идентификация сводится к созда\-нию
информационного элемента (вектор $f$ $\ldots$). Иначе формируется
набор х18, со\-по\-став\-ля\-ющий каждой многоместной
функциональной переменной $f$ списка х17 единицу, а каждой
одноместной - 0. Проверяется, что все свободные переменные терма
х14, не входящие в х17 и отличные от х12, уже идентифицированы. В
компилируемую программу заносятся операторы, инициализирующие
пустыми словами накопители наборов, идентифицирующих переменные
списка х17. Переменной х19 присваивается список этих накопителей
(программных переменных). Если х11 отлично от символа "набор", то
вводится накопитель х20 использованных термов
идентифицирую\-ще\-го набора. Находится результат х23 замены в х14
каждой одноместной функциональ\-ной переменной $f(X)$ на $f$, а
каждой многоместной - на результат исключения переменной х12 из
списка аргументов $X$ (имеются в виду $f$ из х17).

Если х17 состоит из единственной переменной, выделенной указателем
приема "коэфф", то возникает особый случай, который будет
рассмотрен ниже в специаль\-ном подразделе (программа здесь
начинается с контрольной точки "прием(254)").

Иначе - переход через "ветвь 1" \ к общему случаю, где создается
вспомога\-тель\-ный программный блок х24 для обработки текущего
шага идентификации. Этому программному блоку передаются
информационные элементы, определяющие теку\-щее значение
варьируемой переменной х12. Если х11 - символ "набор", то
иден\-ти\-фи\-ци\-ру\-ю\-щий терм для х23 берется как х12-й
элемент идентифицирующего набора; в противном случае он выбирается
произвольным образом среди элементов
иден\-ти\-фи\-ци\-ру\-ю\-ще\-го набора, не зарегистрированных в
х20. Для всех многоместных функ\-ци\-о\-наль\-ных переменных $f$
списка х17 в новый программный блок заносится
инфор\-ма\-ци\-он\-ный элемент (усмматрица $f$). Так как
многоместная переменная должна бу\-дет идентифицироваться с
матрицей, то на текущем шаге остаточную функциональ\-ную
переменную, имеющая на один аргумент меньше, нужно
идентифицировать не с термом, а с подматрицей (например, с
набором). На это и указывают элемен\-ты (усмматрица $\ldots$).

Реализуется цикл коррекций информационных элементов блока х24,
учиты\-ва\-ю\-щих переход к новому идентифицируемому терму х23 и
предпринятые вычер\-ки\-ва\-ния вхождений х12 в функциональные
переменные. Создается одноэлементный спи\-сок х25 установок на
идентификацию для х24. Если терм х23 сам должен
иденти\-фи\-ци\-ро\-вать\-ся с указателем "развертка", то вместо
установки (операнд $\ldots$) в х25 вводится установка (развертка
$\ldots$). После контрольной точки "прием(259)" \ происходит
об\-ра\-ще\-ние к процедуре "идентификатор" \ для блока х24. К
концу программы блока х24 присоединяются операторы, пополняющие
накопители идентифицирующих набо\-ров для переменных списка х17.
Если был введен накопитель х20, то в него заносится ссылка на
использованный терм идентифицирующего набора. Далее находится
ре\-зуль\-тат х27 навешивания квантора существования по всем новым
программным переменным блока х24 на конъюнкцию операторов этого
блока. Наконец, создается и регистрируется в программном блоке х3
реализующая цикл идентификации кван\-тор\-ная импликация х28. Если
эта импликация оказывается чрезмерно громоздкой, то цикл
реализуется с помощью оператора "ветвь".

Если $v$ представляло собой корневое вхождение заменяемого терма,
то вво\-дит\-ся информационный элемент (корни $\ldots$),
определяющий остаток неиспользо\-ван\-ных корневых операндов
идентифицирующего терма. Если остаток должен быть пуст, то
вводится оператор, проверяющий данное условие. Наконец, результаты
иденти\-фи\-ка\-ции переменных списка х17 регистрируются в
информационных элементах (век\-тор $\ldots$) либо (элементыматрицы
$\ldots$).

\subsubsection{Случай указателя "коэфф" \ }

Напомним, что указатель "коэфф($K$)" \ применяется для
идентификации век\-то\-ра либо матрицы $K$, элементы которых суть
коэффициенты членов заданного вида, выделяемых в многоместной
коммутативно-ассоциативной операции $f$.
Иденти\-фи\-ци\-ру\-е\-мый с этой операцией по указателю
"развертка" \ терм имеет вид $F$(отображение($x$ $P(x)$
$g(K(Y)Z)$)); $F$ - обобщение операции $f$ на произвольные
конечные семейст\-ва. Для каких-либо комбинаций индексов $Y$ могут
отсутствовать члены $g(K(Y)Z)$, и тогда элемент вектора (матрицы)
идентифицируется с нулем операции $g$, явля\-ю\-щим\-ся
одновременно единицей операции $f$.

Учет указателя "коэфф" \ начинается с упоминавшейся выше
контрольной точ\-ки "прием(254)". Для обработки текущего шага
идентификации здесь вводится вспо\-мо\-га\-тель\-ный программный
блок х25, которому передается информация о теку\-щем значении
варьируемой переменной х12. В программу этого блока включаются
опе\-ра\-то\-ры, обеспечивающие просмотр элементов списка х16
идентифицирующих тер\-мов (операнды операции $f$), не учтенных в
накопителе х20 уже использованных для идентификации термов.
Программной переменной "плюссимв(начало(х3)3)" \
при\-сва\-и\-ва\-ет\-ся корневое вхождение выбранного в списке х16
терма. Ссылки из ин\-фор\-ма\-ци\-он\-ных элементов блока х25 на
вхождения расположенные внутри х14, заменя\-ют\-ся ссылками на
соответствующие вхождения в х23. Проверяется, что в результа\-те
элиминации перечисляемых индексов идентифицируемый терм х23
приобрел вид $g(K \ Z)$, т.е. функциональная переменная $K$
превратилась в обычную перемен\-ную. Добавляются информационный
элемент, указывающий, что для $K$ допустимо вы\-рож\-ден\-ное
значение - единица операции $g$, а также, если он нужен,
информа\-ци\-он\-ный элемент о перенесении на коэффициент $K$
знака одночлена. После контроль\-ной точки "прием(255)"  \
происходит обращение к процедуре "идентификатор". Пе\-ре\-мен\-ной
х29 присваивается программное выражение для коэффициента $K$ в
слу\-чае успешной идентификации.

Реализующая цикл идентификации кванторная импликация х32
перечисляет зна\-че\-ния варьируемой переменной х12 из заданного
диапазона. Для текущего тако\-го значения она сначала присваивает
накопителю коэффициента $K$ вырожден\-ное нулевое значение,
обращаясь сразу после этого к кванторной импликации х31,
пере\-при\-сва\-и\-ва\-ю\-щей этому накопителю значение х29,
определяемое с помощью про\-грам\-мы блока х25 и регистрирующей в
х20 использованный идентифицирующий терм. После х31 в консеквенте
оператора х32 размещен оператор, пересылающий теку\-щее значение
$K$ в накопитель вектора значений $K$.

Наконец, выполняются действия по регистрации результатов
идентификации, ана\-ло\-гич\-ные рассмотренным выше.

\subsubsection{Двухпараметрическая идентификация конъюнкции}

В рассмотренных выше случаях указатель "развертка" \ относился к
одно\-па\-ра\-мет\-ри\-чес\-ко\-му семейству - единственная
варьируемая переменная принимала цело\-чис\-лен\-ные значения из
заданного промежутка. При идентификации конъюнкций
ут\-вер\-жде\-ний возникла надобность использовать
двухпараметрическое семейство, где варьируются две переменные.
Такое семейство задается теоремным термом вида "длялюбого($i$ $j$
если принадлежит($i$ номера(1 $n$))принадлежит($j$ номера(1 $m$))
то $F(i,j)$)".

Выше мы уже дошли до точки программы, где переменные $i,j$ были
присвое\-ны программным переменным х12 и х16; границы диапазона
$n,m$ - переменным х13 и х17, а идентифицируемый в цикле терм
$F(i,j)$ - переменной х14. Дальней\-шие действия начинаются с
контрольной точки "прием(261)". Прежде всего, находят\-ся
программные выражения х18 и х19 для численных значений $n$ и $m$.
Вводит\-ся оператор, присваивающий новой программной переменной
список идентифици\-ру\-ю\-щих утверждений, причем эта программная
переменная становится значени\-ем переменной х20. Находится список
х21 всех таких переменных $f$, для кото\-рых в х14 встречается не
идентифицированная функциональная переменная $f(i,j)$, и
проверяется, что все свободные переменные терма х14, не входящие в
х21 и отлич\-ные от $i,j$, уже идентифицированы. Вводятся
накопители матриц (представлен\-ных как наборы наборов термов) для
всех переменных списка х21, причем перемен\-ной х23 присваивается
список этих накопителей. Инициализируется пустым словом так\-же
накопитель х24 вхождений в список х20 использованных при
идентификации тер\-мов. Определяется результат х27 замены в терме
х14 всех функциональных перемен\-ных $f(i,j)$ на обычные
переменные $f$. Он будет играть роль идентифицируемого тер\-ма на
текущем шаге цикла идентификации.

Для организации цикла по переменной $i$ создается список
операторов х29, со\-сто\-я\-щий из оператора "Номера($\ldots$)",
перечисляющего значения $i$, а также из опера\-то\-ров,
инициализирующих пустыми словами накопители очередной строки для
мат\-риц списка х21. Переменной х28 при этом оказывается присвоен
список, начинаю\-щий\-ся с программной переменной, значением
которой служит $i$, и перечисляющий да\-лее накопители строк.

Для сохранения значения $j$ резервируется программная переменная,
присваи\-ва\-е\-мая х30. Создается вспомогательный программный
блок х31, которому переда\-ет\-ся информация о текущих значениях
$i,j$. Программа этого блока состоит из операто\-ров,
перечисляющих еще не использованные идентифицирующие термы списка
х20, имеющие тот же заголовок, что и х27. Выполняется обращение к
процедуре "иден\-ти\-фи\-катор", создающей в программном блоке х31
процедуру для идентификации х27 с выбранным идентифицирующим
термом. К концу этой программы присое\-ди\-ня\-ют\-ся операторы,
пополняющие накопители строк очередными значениями, а так\-же
оператор, регистрирующий в накопителе х24 использованное вхождение
иден\-ти\-фи\-ци\-ру\-ю\-ще\-го терма в список х20.

Наконец, предпринимается сборка кванторной импликации х37,
выполняю\-щей цикл идентификации. Ее антецеденты - операторы
списка х29, обеспечивающие внеш\-ний цикл по $i$. Внутренний цикл
по $j$ реализуется кванторной импликацией х35, расположенной в
консеквенте х37. Консеквентом импликации х35 служит резуль\-тат
навешивания квантора существования на конъюнкцию операторов
програм\-м\-но\-го блока х31. После х35 в консеквенте импликации
х37 размещены опера\-то\-ры, регистрирующие накопители строк в
накопителях матриц. Компиляцию заверша\-ет регистрация
идентификации переменных списка х21 в информационных элемен\-тах
(элементыматрицы $\ldots$).

\subsection{Установка на идентификацию "транзитпереход"\ }

Установка (транзитпереход $v$) ссылается на антецедент $v$,
выделенный указа\-те\-лем приема "транзитпереход". Такой
антецедент имеет вид $f(A_1 \ A_2)$, где $f$ - транзитив\-ное
бинарное отношение. При его обработке сначала идентифицируется
один из операндов $A_1, A_2$, а другой доопределяется путем
рассмотрения имеющихся в кон\-текс\-те идентификации цепочек
утверждений вида $f(B_i \ B_{i+1})$. При этом исполь\-зу\-ет\-ся
вспомогательный оператор "транзитпереход".

Рассмотрение установки начинается с контрольной точки
"прием(173)". Уро\-вень х7, на котором происходит обработка, равен
5. Определяется тот операнд $A_i$, кото\-рый представляет собой
уже идентифицированную переменную. х13 становится равно
программному выражению для значения $A_i$. Для перечисления
возможных значе\-ний другого операнда создается обращение х16 к
оператору "транзитпереход"; это обращение заносится в
компилируемую программу. Если компилируется прием па\-кет\-но\-го
оператора, то добавляется проверка непересечения цепочки
утвержде\-ний, использованных процедурой "транзитпереход" \ при
определении противопо\-лож\-но\-го операнда, с утверждениями,
зарегистрированными в комментарии (исключение $\ldots$) к
пакетному оператору. Наконец, для регистрации идентификации
противополож\-но\-го операнда осуществляется обращение к процедуре
"учетоперанда".

\subsection{Установка на идентификацию "группировка"\ }

Установка (группировка $v$ $x$) возникает при компиляции приема
замены, имеюще\-го указатель "набор(второйтерм)". Такой прием
основан на теореме вида $f(P(a)\ P(b)) = P(h(a \ b))$, $f(P(a \
c)\ P(b \ c)) = P(h(a \ b)\ c)$  и т.п., где операции $f,h$
явля\-ют\-ся ком\-му\-та\-тив\-ными и ассоциативными. При
компиляции теорема об\-об\-ща\-ет\-ся на про\-из\-воль\-ное число
операндов этих операций, причем реализуется в режиме
группи\-ров\-ки операндов операции $f$ (т.е. в указанном случае
замена выполняется сле\-ва направо). Предполагается, что в
преобразовании участвуют все корневые $f$ - члены
иден\-ти\-фи\-ци\-рующего терма. В установке $v$ является корневым
вхождением заменяемой части тео\-ре\-мы приема; $x$ -
программ\-ной переменной, значением которой служит корневое
вхожде\-ние иден\-ти\-фи\-ци\-рую\-ще\-го терма.

Обработка установки начинается с контрольной точки "прием(28)".
Сначала из\-вле\-ка\-ет\-ся информационный элемент (перечень $A_1$
$A_2$ $A_3$ $A_4$), сформированный на предварительном этапе
компиляции. У него $A_1$ - вхождение в заменяющий терм теоремы
выражения $h(a \ b)$; $A_2$ - вхождение корневого операнда
заменяемого терма, используемого в качестве шаблона идентификации
для выделения очередного груп\-пи\-ру\-е\-мо\-го $f$- члена. Этот
шаблон может не в точности совпадать с термом $P(a)$ либо $P(a \
c)$, а содержать его в качестве своего подтерма. $A_3$ -
переменная $a$, используемая в шаблоне для идентификации с
операндами операции $h(\ldots )$; $A_4$ - сначала 0, а
впоследствии будет изменено на программное выражение для
результата группи\-ров\-ки $h(\ldots )$. $A_2$ и $A_3$
присваиваются, соответственно, переменным х11 и х12. Переменной
х13 присваивается вхождение переменной $a$ в шаблон идентификации;
переменной х14 - вхождение внешней операции $P$; переменной х15 -
символ этой операции. Далее компиляция разветвляется.

\subsubsection{Коммутативно-ассоциативная операция $P$}

В этом подслучае операция $P$ - коммутативно-ассоциативная и имеет
ровно два операнда - переменные $a,b$, причем вхождение переменной
$b$ в шаблон иденти\-фи\-ка\-ции единственное. Рассмотрение
подслучая начинается с контрольной точки "при\-ем(29)". Если для
выделения общей части подтермов с заголовком $P$
предус\-мот\-ре\-на специальная процедура (она находится с помощью
справочника "пересечениеспис\-ков"), то ее заголовок присваивается
переменной х16. Если же применение та\-кой процедуры для подтерма
х14 заблокировано указателем приема, то х16
пере\-при\-сва\-и\-ва\-ет\-ся 0. Выбирается не используемая в
описании приема переменная х17, и находится результат х18 замены
на нее вхождения х14 в шаблон $A_2$. Инициализи\-ру\-ют\-ся нулями
переменные х20 и х21. Значение первой из них будет изменено на
программное выражение для набора наборов $P$-членов,
соответствующих кор\-не\-вым $f$ - членам идентифицирующего терма.
Значением второй станет программное вы\-ра\-же\-ние для
пересечения наборов $P$ - членов. Для определения х20 и х21
рас\-смат\-ри\-ва\-ют\-ся следующие два подслучая:

\begin{enumerate}

\item х18 - однобуквенный терм, состоящий из переменной х17
(контрольная точ\-ка "прием(30)"). Это означает, что операция $P$
в шаблоне $A_2$ была корневой. Прежде всего, рассматривается
подслучай приема нормализатора, имею\-ще\-го указатель
"попытка($s$ теквхожд)". Вводятся оператор, проверяющий
отсут\-ст\-вие комментария ($s$ $t$) , где $t$ - заменяемый
подтерм, а также заготовка опе\-ра\-то\-ра "ветвь" \ для
регистрации данного комментария при откате. Затем - откат к
переходу "ветвь 3". Создаются вспомогательные операторы х22 и х23,
кото\-рые будут использоваться при формировании х20 и х21. Первый
из них нужен для определения набора $P$ - членов на текущем шаге
цикла; второй - опре\-де\-ля\-ет этот набор для первого корневого
операнда идентифицирующего терма.

После контрольной точки "прием(33)" \ выполняется учет указателя
приема "за\-ме\-на\-знака($\ldots$)". Это происходит лишь в
случае, когда х16 равно 0, т.е. не применяется специальная
процедура для определения общей части двух термов с заголовком
$P$. Если такая процедура использовалась бы, то учет
возмож\-нос\-ти занесения внешнего знака внутрь операции $P$
предпринимался бы внутри нее. Проверяется, что переменная х12
выделена как указателем "заменазнака($s$ $\ldots$)", так и
указателем "единица($e$ $\ldots$)". Создается константный терм х30
ви\-да $s(e)$ (в случае операции умножения - минус единица), и
выражения х22, х23 корректируются так, чтобы в случае внешнего
знака $s$ рассматривае\-мо\-го корневого $f$ - члена
идентифицирующего терма этот знак заносился внутрь списка
$P$-операндов в виде $s(e)$. Терм х30 сохраняется для дальнейшего
ис\-поль\-зо\-ва\-ния, будучи переприсвоен переменной х24.

Затем создается набор х25 операторов, просматривающих корневые $f$
- члены идентифицирующего терма для определения набора наборов их
$P$ - членов и пересечения этих наборов. Если х16 равно 0
(контрольная точка "прием(34)"), то пересечение определяется
оператором "пересечениесписков", иначе (кон\-т\-роль\-ная точка
"прием(35)") - специальной процедурой х16. Операторы набора х25
регистрируются в компилируемой программе, и происходит
перепри\-сво\-е\-ние значений х20, х21. Кванторная импликация из
х25, реализующая цикл просмотра, на каждом шаге проверяет
непустоту пересечения. В частности, оно считается пустым, если
состоит только из "минус единицы" \ - терма х24.

\item х18 - неоднобуквенный терм (контрольная точка "прием(37)").
Тогда вво\-дит\-ся оператор, проверяющий, что заголовки всех
корневых $f$ - членов иден\-ти\-фи\-ци\-ру\-ю\-ще\-го терма
совпадают с заголовком шаблона х18. После него размеща\-ет\-ся
оператор, выделяющий вхождение первого корневого операнда
иденти\-фи\-ци\-ру\-ю\-ще\-го терма. С помощью процедуры
"идентификатор" \ предпринима\-ет\-ся формирование операторов,
идентифицирующих первый корневой опе\-ранд с шаблоном х18. После
них помещается оператор, определяющий набор $P$ - членов терма,
идентифицированного с переменной х12 шаблона х18. Пере\-мен\-ная,
которой присвоен этот набор, и есть новое значение х21. В ней
будет накапливаться пересечение всех списков $P$ - членов термов,
идентифицируе\-мых с переменной х12 шаблона х18 в цикле просмотра
корневых опе\-ран\-дов идентифицирующего терма. Вводится оператор,
инициализирующий про\-грам\-м\-ную переменную для накопителя
набора наборов $P$ - членов; этот накопи\-тель сразу же
переприсваивается переменной х20. Для компиляции шага
иденти\-фи\-ка\-ции вводится вспомогательный программный блок х27.
Предприни\-ма\-ет\-ся обращение к процедуре "идентификатор" \ для
блока х27, которое дает про\-грам\-му идентификации шаблона х18 с
текущим корневым операндом иден\-ти\-фи\-ци\-ру\-ю\-ще\-го терма.
После этой программы помещается оператор, присваиваю\-щий
некоторой новой программной переменной набор $P$ - членов терма,
иденти\-фи\-ци\-ро\-ван\-ного с х12. Далее добавляется оператор,
находящий пересечение это\-го набора с накопителем х21
(применяется либо оператор "пересечениесписков", либо специальный
оператор х16). Фактически, в зависимости от х16, компи\-ля\-ция
здесь разветвляется, однако дальнейшие действия идентичны - на
основе программы блока х27 создается оператор х29, реализующий
цикл просмот\-ра корневых операндов идентифицирующего терма
(начиная со второго операн\-да) и коррекции накопителей х20, х21.

\end{enumerate}

После определения х20, х21 - откат к переходу через "ветвь 1".
Здесь пред\-при\-ни\-ма\-ет\-ся коррекция указателей нормализации,
относящихся к подтерму $h(\ldots)$ заменяющего терма - они
переключаются на переменную х17, которая будет впо\-след\-ствии
обозначать указанный подтерм. Программной переменной х22
присва\-и\-ва\-ет\-ся переменная $b$ подтерма $P(a \ b)$ - она
будет идентифицироваться с пересече\-ни\-ем наборов $P$ - членов.
Если прием имеет указатель "перечень($\ldots$)", определяю\-щий
идентификацию $b$ не со всем пересечением, а лишь с теми его
термами, которые удовлетворяют условию, приведенному в указателе
(контрольная точка "прием(93)"), то х21 заменяется на программное
выражение для этого подмножества пере\-се\-че\-ния.

Затем - откат к переходу через "ветвь 1", где регистрируется
результат иден\-ти\-фи\-ка\-ции переменной $b$. Вводится заготовка
х24 программного выражения для теку\-ще\-го операнда подтерма
$h(\ldots)$ заменяющего терма. Если имелся указатель
нормализа\-ции, относящийся к х12, то по нему здесь же выполняется
коррекция текущего операн\-да х24 - он обрабатывается
соответствующим нормализатором.

Наконец, создается группа операторов х25, в которой
предпринимается цикл про\-смот\-ра набора х20 наборов $P$- членов
для определения остатков этих наборов после удаления их общей
части х21. Каждый такой остаток является входным данным для
программного выражения х24, определяющего очередной операнд
подтерма $h(\ldots)$. Эти операнды соединяются операцией $h$, и
результирующий терм присваива\-ет\-ся программной переменной
"плюссимв(х23 1)". Результат идентификации подтер\-ма $h(\ldots)$
регистрируется в упоминавшемся выше информационном элементе
(перечень $\ldots$), а также в информационном элементе (терм х17
$\ldots$). Фактически компиля\-ция распадается здесь на две ветви
- при х16 = 0 используется оператор "вычеркива\-ние", иначе
остатки наборов определяются процедурой х16.

\subsubsection{Не коммутативно-ассоциативная операция $P$}

Если операция $P$ не является коммутативно-ассоциативной, то
первый корне\-вой операнд идентифицирующего терма позволяет
идентифицировать все переменные шаблона, кроме переменной х12,
соответствующей группируемым под операцию $h$ подтермам. После
этого просматриваются оставшиеся корневые операнды,
иден\-ти\-фи\-ци\-ру\-ющие группируемые значения х12.

Рассмотрение подслучая начинается с контрольной точки
"прием(145)". Пе\-ре\-мен\-ной х16 присваивается одноэлементный
набор установок на идентификацию, ис\-поль\-зу\-е\-мых при
сопоставлении шаблону $A_2$ первого корневого операнда
иден\-ти\-фи\-ци\-ру\-ю\-щего терма. Если имеется указатель
"заменазнака", определяющий занесение внутрь текущего корневого
$f$ - члена заданного символа одноместной операции, то этот символ
присваивается переменной х17. В компилируемую программу
включа\-ет\-ся оператор, проверяющий, что каждый корневой операнд
идентифицирующего тер\-ма имеет (с точностью до отбрасывания
"знака" \ х17) тот же заголовок, что и шаблон $A_2$. После этого
первой неиспользуемой программной переменной присваивается
вхож\-де\-ние первого корневого операнда идентифицирующего терма.
Затем предпринима\-ет\-ся обращение к процедуре "идентификатор",
позволяющее создать программу иден\-ти\-фи\-кации шаблона с первым
корневым операндом. Переменной х19 присваива\-ет\-ся программное
выражение для значения переменной х12, определившегося в
резуль\-та\-те данной идентификации. Фактически это первый из
операндов группирующей операции $h(\ldots)$. х20 становится
накопителем группируемых операндов.

Далее вводится вспомогательный программный блок х23 для
идентификации шаб\-ло\-на с остальными корневыми операндами
идентифицирующего терма. Из него уда\-ля\-ют\-ся информационные
элементы блока х3, определяющие идентификацию пе\-ре\-мен\-ной
х12. С помощью справочника "прогрблок" \ повторно обрабатываются
от\-но\-ся\-щи\-е\-ся к х12 указатели приема "заменазнака", чтобы
они были учтены в х23. Происходит обращение к процедуре
"идентификатор" \ для вспомогательного бло\-ка (контрольная точка
"прием(176)"). Переменной х24 присваивается программ\-ное
выражение для подтерма, идентифицированного с переменной х12.
Создается опе\-ра\-тор х26, представляющий собой конъюнкцию
операторов блока х23 и опера\-то\-ра, регистрирующего в накопителе
х20 очередное значение х24. Наконец, вводит\-ся кванторная
импликация х27, реализующая цикл просмотра оставшихся корне\-вых
операндов идентифицирующего терма. После этого программное
выражение для группирующего терма $h(\ldots)$, определяемого по
накопителю х20, регистрируется в последнем разряде информационного
элемента (перечень $\ldots$).

\subsection{Установка на идентификацию "усм"\ }

Установка (усм $v$) ссылается на антецедент $v$, который должен
обрабатываться иден\-ти\-фи\-ци\-рующим оператором. Такие
операторы представляют собой сильно упро\-щен\-ные и ускоренные
версии проверочных операторов и синтезаторов. Они извлека\-ют
результат почти непосредственно из имеющихся утверждений
контекста, используя лишь малое число нетрудоемких логических
переходов. Для ускоренного поис\-ка посылок идентифицирующие
операторы пользуются специальными дре\-во\-вид\-ны\-ми структурами
данных, хранящимися в комментариях (списокпосылок $\ldots$), (отр
$\ldots$), (выражение $\ldots$). С целью ускорения применяются
также комментарии (Буфер $\ldots$), со\-хра\-ня\-ющие результаты
нескольких предшествующих обращений к оператору. Жес\-т\-кие
органичения на быстродействие идентифицирующих операторов
продикто\-ва\-ны тем, что они обычно реализуются на ранних этапах
попытки применения приема, и поэтому поток обращений к ним
достаточно интенсивен. Главным образом, иден\-ти\-фицирующие
операторы применяются пока в приемах по геометрии.

Программы идентифицирующих операторов реализуются непосредственно
на ЛО\-Се, а чтобы компилятор мог воспользоваться ими, служат
справочники "усм" \ и "См". При обращении к справочнику "усм" \
задается заголовок идентифицирую\-ще\-го оператора $f$.
Результатом обращения служит набор (вход($A_1 \ldots A_m$)
выход($B_1 \ldots B_n$) усм($T$)$C_1 \ldots C_k$). Здесь $T$ -
шаблон обращения к оператору, т.е. конъюнкция
об\-ра\-ба\-ты\-ва\-е\-мых им антецедентов. Заметим, что один
оператор может обрабаты\-вать сра\-зу несколько различных
антецедентов теоремы приема, выделенных указателем "усм".
Разбиение антецедентов на группы, обрабатываемые одним и тем же
иден\-ти\-фи\-ци\-ру\-ющим оператором, предпринимается
компилятором самостоятельно. $A_1, \ldots , A_m$ - подтермы
шаблона, поступающие на входы оператора; $B_1, \ldots, B_n$ -
подтермы шаб\-ло\-на, получаемые как значения выходных переменных
оператора. Обращение к опе\-ра\-то\-ру имеет вид $f(x_1 \ x_2
\ldots x_{m+1} \ y_1 \ldots \ y_n)$, причем $x_1$ - текущая задача
на иссле\-до\-ва\-ние либо на доказательство, в контексте списка
посылок которой работает опера\-тор; $x_2, \ldots, x_{m+1}$
соответствуют входным термам $A_1, \ldots , A_m$; $y_1, \ldots,
y_n$ соответствуют выходным термам $B_1, \ldots , B_n$. $C_1,
\ldots, C_k$ суть информационные элементы, уточ\-ня\-ю\-щие формат
идентифицирующего оператора. Типы этих элементов перечислены в
справочной информации для символа "усм". Сразу выделим из них
элемент "уро\-вень($u$)", который указывает на приоритет
использования идентифицирующего опе\-ра\-то\-ра при компиляции (в
первую очередь рассматриваются операторы с мень\-ши\-ми значениями
$u$). Такие приоритеты позволяют во многих случаях уменьшать
пере\-бор, идентифицируя в первую очередь объекты, определенные с
меньшей степе\-нью неоднозначности. Например, выгоднее сразу
идентифицировать точку как пере\-се\-че\-ние двух прямых, чем
просматривать все точки прямой либо все прямые, проходя\-щие через
точку.

Чтобы найти заголовки идентифицирующих операторов, которые могли
бы по\-зво\-лить обработать заданный антецедент, применяется
справочник "См". Перед об\-ра\-ще\-ни\-ем к нему вводится
одноэлементный набор, состоящий из пустого накопителя. Этот набор
передается справочнику как значение его входной переменной х1.
Теку\-щий символ обращения - какой-либо выделенный в антецеденте
логический символ $s$. Справочник "См" \ заполняет накопитель х1
заголовками всех тех идентифици\-ру\-ю\-щих операторов, у которых
в их шаблоне символ $s$ был выделен в качестве точ\-ки привязки.
Выбор точки привязки выполняется компилятором, создающим прием
справочника "См", достаточно произвольным образом. Он не очень
существенен - важно лишь при обработке антецедента просмотреть все
входящие в него логи\-чес\-кие символы.

Обработка установки (усм $v$) начинается с контрольной точки
"прием(121)". Уро\-вень х7, на котором будет происходить
компиляция, определится впоследствии, по информационному элементу
"уровень($\ldots$)" \ используемого идентифицирующего
опе\-ра\-тора. Пока же проверяется отсутствие установок на
идентификацию (корень $\ldots$) и (операнд $\ldots$), так как они
дают менее трудоемкую идентификацию и долж\-ны обрабатываться в
первую очередь. Учитываются также указатели приема "конец(\\
$\ldots$)". Если некоторый такой указатель ссылается на текущий
антецедент $v$, в то время как имеются установки (усм $\ldots$)
либо (извлекается $\ldots$), не относящиеся к антецеденту,
выделенному указателем "конец($\ldots$)", то обработка установки
отме\-ня\-ет\-ся.

Далее обрабатываемый антецедент (терм) присваивается переменной
х10. Ком\-пи\-ля\-ция начинается с рассмотрения вырожденного
случая - антецедент имеет вид "несовп($A_1$ $A_2$)". Такие
антецеденты вводятся процедурой "развязка" \ при
мо\-ди\-фи\-ка\-ции теоремы и представляют собой указания на
формальное различие термов $A_1$, $A_2$. Компилятор находит
программные выражения $t_1, t_2$ для $A_1,A_2$ и вставляет
опе\-ра\-тор "не(равно($t_1$ $t_2$))".

В общем случае предпринимается просмотр терма х10 для определения
точки привязки, по которой будет найден идентифицирующий оператор.
Переменной х11 присваивается текущее вхождение в х10, а х12 -
символ по этому вхождению. Если антецедент имеет вид "не(равно($x$
$t$))", где $x$ - переменная, то по теореме приема предпринимается
попытка определить тип значений данной переменной, и х12
пе\-ре\-при\-сва\-и\-ва\-ется этот тип. Затем - откат к переходу
через "ветвь 1".

Проверяется, что х12 не является квантором либо логической
связкой. С по\-мо\-щью справочника "См" \ по символу х12 находится
список идентифицирующих операто\-ров, в шаблоне которых он выделен
как точка привязки. Переменной х13 оказывается присвоен
одноэлементный набор, состоящий из этого списка. Затем
про\-ис\-хо\-дит просмотр списка х13, и переменной х15
присваивается текущий заголовок идентифицирующего оператора. Для
него выполняется обращение к справочнику "усм", дающему формат х16
обращения к оператору. После контрольной точки "при\-ем(123)" \
наступает момент учета текущего уровня х7 - проверяется, что он
ра\-вен значению, указанному в информационном элементе
"уровень($\ldots$)" \ из х16. Пере\-мен\-ной х18 присваивается
список всех отличных от х10 антецедентов (термов),
упо\-ми\-на\-е\-мых в остающихся установках на идентификацию (усм
$\ldots$). Этот список, вместе с х10, будет использоваться при
реализации шаблона идентифицирующего опе\-ра\-то\-ра. Шаблон
извлекается из х16, и переменной х24 присваивается список его
конъ\-юнк\-тив\-ных членов, в которых предпринято такое
переобозначение переменных, чтобы они не встречались в х18 и х10.
При этом х21 - список "старых" \ переменных шаб\-ло\-на; х22 -
список его новых переменных.

Учитывается возможность, что х10 - квантор существования либо его
отри\-ца\-ние. Тогда переменной х25 присваивается пара (указатель
отрицания перед кванто\-ром - связывающая приставка квантора). В
этом случае переменной х26 присваива\-ет\-ся подкванторное
утверждение; иначе х26 равно х10.

После перехода через "ветвь 1" \ происходит обращение к процедуре
"реализа\-ция" \ (контрольная точка "прием(124)"). Здесь
определяется такой набор термов х27, что при подстановке их вместо
переменных х22 в утверждения шаблона х24 получается подмножество
утверждений списка х18, пополненного утверждением х26. Требуется,
чтобы первый элемент шаблона переводился в х26. Перемен\-ной х28
присваивается неиспользованный остаток утверждений списка х18.
Если фор\-мат идентифици\-ру\-ю\-ще\-го оператора не имеет
элемента "точкапривязки", то перемен\-ной х29 присваива\-ет\-ся
набор входных термов шаблона идентификации (эти тер\-мы
представлены в "старых" \ переменных списка х21). Если элемент
"точкапри\-вяз\-ки" \ имеется, то про\-ве\-ря\-ет\-ся, что
антецедент был выделен указателем "теквхожд($\ldots$)" \ - в этом
случае должен найтись информационный элемент (входвтерм $v$).
Да\-лее определяется набор х30 результатов переформулировки
входных термов шабло\-на идентификации через переменные теоремы
приема. Для этого реализует\-ся подстановка термов х27 вместо
переменных х21 и применяется стандартизирующая перестановка
операн\-дов ком\-му\-та\-тив\-ных операций. Проверяется, что у
каждого вход\-но\-го терма либо иденти\-фи\-ци\-ро\-ваны все его
свободные переменные, либо его значе\-ние
иденти\-фи\-ци\-ро\-ва\-но с помощью элемента (выражение $\ldots$)
"в целом", без обяза\-тель\-ной иденти\-фи\-ка\-ции внутренних
переменных. Аналогичным образом определяется набор х32
результа\-тов переформулировки выходных термов шаблона
идентификации через пере\-мен\-ные теоремы. После контрольной
точки "прием(193)" \ проверяется, что ни один из выходных термов
еще не идентифицирован. Переменной х33 присваивается
про\-грам\-м\-ная переменная, значением которой служит текущая
задача. Эта перемен\-ная представляет собой первое входное данное
идентифицирующего оператора.

Создается накопитель х34 программных выражений для операндов
обращения к идентифицирующему оператору х15. Сначала в него
заносится х33. После кон\-троль\-ной точки "прием(195)" \
начинается цикл занесения в х34 выражений для остав\-ших\-ся
входных данных. Те термы набора х30, которые отличаются от
переменных и не имеют информационного элемента (выражение
$\ldots$), непосредственно определяю\-ще\-го их значение,
обрабатываются процедурой "метаперевод". Для выходных тер\-мов
обращения вводится список х36 новых программных переменных. Они
регист\-ри\-ру\-ют\-ся в х34, и создаются информационные элементы,
связывающие их значения с выходными термами.

Если в формате идентифицирующего оператора был указан элемент
"терм($D$)", выделяющий подтерм $D$ некоторого выходного терма, то
предпринимается до\-пол\-ни\-тель\-ная идентификация $D$ как
подтерма выходного значения, путь к кото\-ро\-му
(последовательность номеров проходимых операндов) совпадает с
путем к $D$ в вы\-ход\-ном терме. Если при этом значение $D$ уже
было идентифицировано ранее, то в накопитель операторов х35
заносится проверка совпадения старого и нового зна\-че\-ний $D$.

По окончании обработки выходных термов - откат к переходу через
"ветвь 1", где переменной х36 присваивается обращение к
идентифицирующему оператору. Если х25 было отлично от 0, то на х36
навешивается внешний квантор существования, а при необходимости -
также отрицание. Затем х36 регистрируется в компилиру\-е\-мой
програм\-ме; добавляются операторы из накопителя х35, и удаляются
все установ\-ки (усм $\ldots$), относящиеся к обработанным
оператором х36 антецедентам.

\subsection{Установка на идентификацию "свертка"\ }

Установка на идентификацию "свертка" \ относится к приемам,
имеющим заголо\-вок "свертка". Теорема такого приема имеет вид
$\forall_{x_1 \ldots x_n}(A_1 \ \&  \ldots  \ \& \ A_m \rightarrow
\forall_{y_1 \ldots y_k}(B_1 \ \& \ \ldots \\ \& \ B_s \rightarrow
B_0))$. Прием применяется в задачах на доказательство, причем
утверж\-де\-ния $B_1, \ldots, B_s$ идентифицируются с некоторыми
посылками данной задачи, а $B_0$ - с ее условием. При
идентификации проверяется, что оставшиеся посылки задачи не имеют
свободных вхождений переменных $y_1, \ldots , y_k$. Установка
"свертка" \ иниции\-ру\-ет выделение списка таких оставшихся
посылок.

Обработка установки начинается с контрольной точки "прием(204)".
Уровень х7 достаточно большой (равен 7), так как предварительно
должны быть идентифици\-ро\-ва\-ны $y_1, \ldots , y_k$ и все
переменные утверждений $B_1, \ldots , B_s$. Для этого же в начале
обработки проверяется отсутствие установок (корень $\ldots$),
(операнд $\ldots$). Далее пе\-ре\-мен\-ной х10 присваивается
список программных выражений для посылок, с кото\-ры\-ми были
идентифицированы антецеденты теоремы приема и антецеденты ее
консек\-вен\-та. Затем х10 заменяется на программное выражение для
набора этих посы\-лок. Переменной х13 присваивается связывающая
приставка $y_1 \ldots y_k$. Прове\-ря\-ет\-ся, что все ее
переменные уже идентифицированы, и переменной х14
присваи\-ва\-ет\-ся набор программных выражений для переменных
$y_i$. Наконец, вводится опера\-тор, определяющий список не
использованных при идентификации посылок задачи, а также оператор,
проверяющий, что переменные х14 не имеют свободных вхожде\-ний в
эти посылки.

\subsection{Установка на идентификацию "теквхожд"\ }

Установка (теквхожд $v$) возникает в тех случаях, когда
компилируется прием за\-ме\-ны, точка привязки которого выбрана не
в заменяемом подтерме, а в антецеденте. Тогда $v$ - вхождение
корня заменяемой части теоремы приема, и установка иниции\-ру\-ет
поиск в задаче вхождения, к которому будет применяться замена.

Обработка установки начинается после контрольной точки
"прием(206)". Уро\-вень х7 равен 4. Рассматриваются два различных
подслучая.

\subsubsection{Заменяемый подтерм представляет собой
функциональную переменную}

В этом подслучае переменной х10 присваивается вхождение $v$. По
этому вхожде\-нию располагается функциональная переменная $f(x)$,
где $f$ уже идентифицировано с помощью информационного элемента
(функция $f$ $A_1$ $A_2$ $A_3$), а $x$ - еще не
иден\-ти\-фи\-ци\-ро\-ван\-ная переменная. $f$ присваивается
переменной х11. С помощью указан\-но\-го информационного элемента
находится программное выражение х14 для тер\-ма, определяющего
значения функциональной переменной $f(z)$. Программное
выра\-же\-ние для переменной $z$, используемой в данном
функциональном шаблоне, при\-сва\-и\-ва\-ет\-ся переменной х15.
Затем в компилируемую программу вставляется обращение к процедуре
"смфунк", которая находит в задаче вхождения подтермов,
предста\-ви\-мых в виде $f(t)$. Она выдает в качестве выходных
значений координаты дан\-ных вхождений, а также термы $t$.
Регистрируется идентификация $x$ с $t$. В информа\-ци\-он\-ных
элементах (переходник $\ldots$) и (корень $\ldots$) сохраняются
программные выраже\-ния для координат заменяемого подтерма.

\subsubsection{Общий случай}

Здесь сначала определяется индикатор х10, определяющий область
поиска в зада\-че вхождения заменяемого терма. Если поиск ведется
по посылкам и условиям, то х10 равно 0. Если же в фильтрах приема
явно указано, где расположен заме\-ня\-е\-мый подтерм, то х10
равно логическому символу "посылка" \ либо "условие". На осно\-ве
индикатора х10 создается оператор х11, перечисляющий координаты
утверждений из соответствующей области задачи. Переменной х13
присваивается заголовок за\-ме\-ня\-е\-мо\-го подтерма.
Добавляется оператор, проверяющий, что текущее утверждение не
находится в посылке, с которой идентифицирован антецедент
привязки. Добавля\-ет\-ся оператор, перечисляющий все вхождения в
текущее утверждение логичес\-ко\-го символа х13. Эти вхождения и
рассматриваются как идентифицирующие для заменяемого терма. Для их
обработки вводится новая установка на идентифи\-ка\-цию (операнд
$\ldots$). Координаты выбранного вхождения заменяемого терма
регист\-ри\-ру\-ют\-ся в информационных элементах (переходник
$\ldots$) и (корень $\ldots$).

\subsection{Установка на идентификацию "унификация"\ }

Данная установка встречается только у приемов вывода теорем,
имеющих заго\-ло\-вок "теорема". При получении новой теоремы
иногда применяется процедура уни\-фи\-ка\-ции, определяющая
наименьшую подстановку, отождествляющую (унифици\-ру\-ю\-щую)
заданные пары термов $(A_1(x), B_1(y)), \ldots, (A_n(x), B_n(y))$.
Эти пары иден\-ти\-фи\-ци\-руются вместе со своими наборами
переменных $x,y$ из других частей теоре\-мы приема. Обращение к
процедуре унификации для них обозначается в тео\-ре\-ме с помощью
группы антецедентов вида "$A_1(r)=B_1(s), \ldots, A_n(r)=B_n(s)$".
Такие антецеденты выделяются указателем приема "унификация".
Процедура унифи\-ка\-ции определяет для наборов переменных $x,y$
(обычно эти переменные относятся к различным теоремам и поэтому
различны) наборы термов $r,s$, дающие унифи\-ци\-ру\-ю\-щую
подстановку. Результат идентификации набора $r$ фиксируется в
информа\-ци\-он\-ном элементе программного блока (унификация $r$
$X$ $T$). Здесь $X$ - программ\-ное выражение для набора
переменных $x$; $T$ - программное выражение для набора тер\-мов
$r$. Аналогичным образом регистрируется $s$. Если $A_i$ и $B_i$
относятся к одной и той же теореме, то $y$ может совпадать с $x$,
а $r$ - с $s$.

Установка на идентификацию (унификация $s$) опре\-де\-ля\-ет
наборы $s$ вхожде\-ний антецедентов для унифицируемых пар термов.
Обработ\-ка ее начинается с конт\-роль\-ной точки "прием(224)".
Переменной х10 присваива\-ет\-ся набор антецедентов $s$ (в формате
термов). Проверяется, что все эти антеце\-ден\-ты суть равенства.
Далее заполняется ряд наборов: х12 - набор теоремных
пере\-мен\-ных, обозначающих пе\-ре\-мен\-ные либо группы
переменных, вместо которых осущест\-вля\-ет\-ся унифицирую\-щая
подстановка (выше см. $x,y$); х13 - набор переменных для
подставляемых термов либо групп термов (выше - $r,s$); х14 - набор
наборов вхож\-де\-ний в антецеденты $s$ функциональных переменных,
участвующих в унифика\-ции (выше - $A_i(r), B_i(s)$); х15 - набор
наборов заменяющих эти вхождения термов, ис\-поль\-зу\-емых при
формиро\-ва\-нии пар унифицируемых термов (выше -
$A_i(x),B_i(y)$). По окончании заполнения перечисленных
накопителей - переход через "иначе 2". Здесь инициализируется
пус\-тым словом накопитель х16 программных вы\-ра\-же\-ний для
установок на унифи\-ка\-цию, передаваемых процедуре "унификация".
Далее реализуется цикл синхрон\-но\-го просмотра наборов х10, х14
и х15 для заполнения х16. Там, где это необходимо, в программу
вставляются опера\-то\-ры для проверки совпадения заголовков
унифи\-ци\-ру\-е\-мых термов. По окончании цик\-ла предпринимается
регистрация в х16 ря\-да специальных дополнительных эле\-мен\-тов.
Наконец, в программу заносится обраще\-ние к процедуре
"унификация" \ и предпринимается регист\-ра\-ция результатов
иден\-ти\-фи\-ка\-ции переменных списка х13.

\subsection{Установка на идентификацию "тип"\ }

Установка (тип $x$ $A$) означает, что теоремную переменную $x$
нужно идентифици\-ро\-вать с логическим символом, являющимся типом
объектов, определяемых теорем\-ным выражением $A$. Обработка
установки начинается с контрольной точки "при\-ем(237)".
Переменной х11 присваивается программное выражение для терма,
иден\-ти\-фи\-ци\-рованного с $A$. Затем в компилируемую программу
заносятся опера\-то\-ры, определяющие с помощью справочника "тип"
\ тип значения заголовка терма х11. Регистрируется результат
идентификации переменной $x$ с этим типом.

\subsection{Установка на идентификацию "типзначения"\ }

Эта установка аналогична предыдущей. Она имеет вид (типзначения
$v$), где $v$ - вхождение антецедента $\forall_x(A(x)\rightarrow
P(t(x)))$, выделенного указателем "типзначе\-ния". Происходит
идентификация переменной $P$ с логическим символом - типом
зна\-че\-ния выражения $t(x)$, принимаемого им в предположении
истинности антецедентов $A(x)$. Компиляция начинается с
контрольной точки "прием(242)". Для определения ти\-па значения
относительно заданного контекста применяется процедура
"типзначения($\ldots$\\ )".

\subsection{Установка на идентификацию "чертеж"\ }

Установка используется только при компиляции приемов анализатора
"чертеж", позволяющего строить эскизы по условиям планиметрических
задач. Так как она тесно связана с используемыми при посторении
эскиза специальными структу\-ра\-ми данных, рассмотрение ее будет
отложено до описания анализатора "чертеж".

\subsection{Установка на идентификацию "числоценка"\ }

Установка (числоценка $v$) возникает при компиляции антецедентов
"равно($x$ $t$)", выделенных указателем "числоценка". Эти
антецеденты обеспечивают присвое\-ние переменной $x$ десятичной
записи приближенного численного значения констант\-но\-го
числового терма $t$. Приближенное значение получается при помощи
опера\-то\-ра "числоценка". Данная возможность фактически в
решателе сейчас не использу\-ет\-ся.

\subsection{Установка на идентификацию "выч"\ }

Установка (выч $v$) возникает при компиляции антецедентов,
выделенных указа\-те\-лем "выч". Они реализуются путем вычислений
в машинном формате "с плава\-ю\-щей запятой". Установки "выч" \
достаточно интенсивно используются при компиля\-ции приемов
анализатора "чертеж" \ и приемов справочника "опр",
обслужива\-ю\-ще\-го данный анализатор.

Обработка установки начинается с контрольной точки "прием(272)".
Если за\-го\-ло\-вок приема отличен от "выч($\ldots$)", то переход
через "иначе 2". В этом слу\-чае антецедент должен иметь вид
присвоения "равно($x$ $t$)" \ переменной $x$ зна\-че\-ния
выражения $t$. Все переменные $t$ до этого должны быть
идентифицированы с константными числовыми термами. Переменной х13
присвавается программное вы\-ра\-же\-ние для определяемого по $t$
константного числового терма. В программу прие\-ма заносится
обращение к процедуре "вычконст", определяющей приближенное
зна\-че\-ние терма с помощью арифметики чисел машинного формата "с
плавающей за\-пя\-той". Найденное значение переводится в формат
десятичного числа ЛОСа. В этом же формате идентифицируется и $x$.

Если прием имеет заголовок "выч($\ldots$)" \ (случай справочника
"опр"), то рас\-смат\-ри\-ва\-ет\-ся более широкий список
возможных типов антецедентов. Допускаются при\-сво\-е\-ния,
проверочные равенства и отрицания равенств, а также проверка
выпол\-не\-ния неравенств. При компиляции уже не используется
обращение к про\-це\-ду\-ре "вычконст". Для получения программного
выражения, находящего численное зна\-че\-ние того или иного
подтерма, применяется блок компилятора "прогрвыраже\-ние",
создающий цепочку вычислений в терминах операторов
"выч($\ldots$)". Для про\-вер\-ки условий равенства и неравенств
используется оператор "Выч($\ldots$)". При при\-сво\-е\-нии
значение программной переменной $x$ регистрируется в формате
данных "с плавающей запятой" \ с помощью информационного элемента
(выч $x$ $\ldots$).

\subsection{Установка на идентификацию "вычисл"\ }

Данная установка, хотя и имеет название, похожее на названия
предыдущих уста\-но\-вок, ни\-как не связана с численными
процедурами. Она возникает в тех ситуациях, когда при решении
задачи на исследование требуется выразить какие-либо
не\-из\-вест\-ные выражения через известные параметры задачи, быть
может, пополненные заданными неизвестными параметрами. Для такого
выражения ("вычисления") ис\-поль\-зу\-ется вспомогательная задача
на описание. Обращение к вспомогательному вычислению представлено
в виде группы антецедентов "равно($x_1 \ t_1$)", $\ldots$,
"равно($x_n \\ t_n$)". Эти антецеденты порождают условия
вспомогательной задачи, причем $x_1, \ldots, x_n$ игра\-ют роль
неизвестных. Для выделения антецедентов применяется указатель
прие\-ма "вычисл($N$ $P$)". Здесь $N$ - список номеров
антецедентов; $P$ - дополнитель\-ная информация. Основные типы
элементов набора $P$ таковы: "посылки($A$)" \ - указа\-ние списка
$A$ дополнительных посылок, используемых при вычислении;
"удале\-ние\-по\-сы\-лок($B$)" \ - перечисление списка $B$
названий разделов, посылки которых не ис\-поль\-зу\-ют\-ся при
вычислении; "известно($C$)" \ - перечисление неизвестных, которые
счи\-та\-ют\-ся при вычислении известными. После обработки
антецедентов переменные $x_1, \ldots, x_n$ оказываются
идентифицированы с результатами вспомогательного вычисления.

Установка имеет вид (вычисл $V$ $P$), где $V$ - набор вхождений
выде\-лен\-ных ан\-те\-це\-дентов, $P$ - то же, что в указателе
приема. Обработка ее начинается с кон\-троль\-ной точки
"прием(268)". Переменной х11 присваивается набор переменных $x_1,
\ldots, x_n$; переменной х12 - набор программных выражений для
термов $t_1, \ldots, t_n$. Переменной х13 присваивается
программное выражение для списка посылок вспомогательной задачи, с
учетом элемента "посылки($\ldots$)" \ набора $P$. Переменной х14
присваивается программное выражение для списка названий разделов,
посылки которых не будут использоваться во вспомогательной задаче.
Переменной х15 присваивается список программных выражений для
переменных (обычно - неизвестных текущей задачи), которые будут
рассматриваться во вспомогательной задаче как известные. В
про\-грам\-му приема заносится обращение к оператору "вычисл",
использующего х12-х15 для создания и решения вспомогательной
задачи на описание. После этого ос\-та\-ет\-ся лишь
зарегистрировать результаты идентификации переменных списка х11.

\subsection{Установка на идентификацию "рекурсия"\ }

Если нужно сформировать некоторый набор термов $a(1) \ldots a(n)$
с помощью ре\-кур\-сив\-но\-го определения $a(1)=t, \forall_i(i
\in \{1, \ldots, n-1 \} \rightarrow a(i+1)=F(a(i)))$, то па\-ра
образующих определение утверждений используется в качестве
антецедентов тео\-ре\-мы приема. Эта пара выделяется указателем
приема "рекурсия($\ldots$)". Аналогич\-ным образом можно
использовать рекурсивное определение, определяющее груп\-пу
наборов. При этом связанная переменная $i$ и длина набора $n$
должны быть одни и те же у всех кванторных импликаций. Установка
на идентификацию (рекурсия $A$) ссылается на набор $A$
вхож\-де\-ний антецедентов, образующих определение.

Обработка установки начинается с контрольной точки "прием(270)".
Перемен\-ной х10 присваивается набор программных выражений для
первых элементов опре\-де\-ля\-е\-мых наборов; переменной х11 -
список теоремных переменных, обозначающих эти наборы. Далее
создается набор х12 термов, полученных из термов $F(a(i))$ заменой
всех встречающихся в них функциональных переменных $f(i)$ для $f$
из х11 на обычные переменные $f$. Эти термы будут использоваться в
качестве шаблонов при компиляции шага рекурсии. Одновременно
определяются общая связанная переменная $i$ всех кванторных
импликаций, присваиваемая переменной х14, а также теоремный терм
для длины набора, присваиваемый переменной х13. После перехода
через "иначе 1" \ переменной х15 присваивается программное
выражение для длины набора, пред\-став\-лен\-ной в формате
десятичного числа. Заполняются накопители х16 и х17
про\-грам\-м\-ных переменных, обозначающих, соответственно,
последние (текущие) элемен\-ты сформированной части наборов и сами
наборы. Они инициализируются по извест\-ным первым элементам
наборов, извлекаемым из х10.

Далее вводится вспомогательный программный блок х18 для компиляции
шага рекурсии. В нем зарегистирована идентификация переменных
списка х11 с соответ\-ст\-ву\-ю\-щи\-ми текущими элементами
наборов. Предпринимается коррекция ин\-фор\-ма\-ци\-он\-ных
элементов (быстрпреобр $\ldots$) блока х18, учитывающая замену
функцио\-наль\-ных переменных $f(\ldots)$ на обычные переменные.
Относительно программного бло\-ка х18 определяется набор х19
программных выражений для новых элементов на\-бо\-ров. Переменной
х20 присваивается список новых переменных блока х18, который
бу\-дет играть роль связывающей приставки кванторной импликации,
реализующей цикл итеративного заполнения наборов. Переменной х21
присваивается список анте\-це\-ден\-тов этой кванторной
импликации. Сначала в нем идет оператор "Номера($\ldots$)",
перечисляющий значения $i$ номера текущего элемента набора, а
затем распо\-ло\-же\-ны операторы программного блока х18.
Переменной х22 присваивается набор конъ\-юнк\-тив\-ных членов
консеквента импликации. Здесь размещаются операторы измене\-ния
текущих элементов наборов и регистрации их в накопителях наборов.
Нако\-нец, кванторная импликация заносится в программу, и
выполняется регистра\-ция результатов идентификации переменных
списка х11.

\subsection{Компиляция обращения к техническому анализатору}

При вычислениях на ГЕНОЛОГе могут использоваться специальные
пакеты про\-дук\-ци\-он\-но\-го типа, называемые техническими
анализаторами. Технический анализа\-тор выполняет рассмотрение
некоторой технической структуры данных и определяет для ее
элементов значения заданного набора параметров. Эти значения
регистрируются в двойнике анализируемой структуры данных, у
которой вместо элементов "оригина\-ла" \ размещаются наборы
значений их параметров. Примерами вычислений тако\-го рода могут
служить разметка шахматной позиции указаниями числа ходов,
необ\-хо\-ди\-мых заданной фигуре для достижения заданной позиции;
разметка какой-ли\-бо вычислительной схемы указаниями глубины ее
элементов, и т.п. Обращение к техническому анализатору $f$ как
оператору ЛОСа имеет вид $f(x_1 \ \ldots \ x_n \ y)$, где $x_1,
\ldots, x_n$ - входные значения, причем $x_1$ - анализируемая
структура данных, а $x_2, \ldots \\ , x_n$ уточняют тип
выполняемой разметки (например, указывают исходное поле
шах\-мат\-ной фигуры, которая будет перемещаться по доске). $y$ -
выходная перемен\-ная, которой присваивается структура данных с
наборами значений параметров. Чтобы обратиться к тому же
техническому анализатору из приема ГЕНОЛОГа, при\-ме\-ня\-ет\-ся
несколько модифицированная запись $f(t_1 \ \ldots \ t_n \ e \ r_1
\ \ldots \ r_k)$. Здесь $t_1, \ldots, t_n$ - входные данные, т.е.
$t_1$ представляет анализируемую структуру данных, а $t_2, \ldots
, t_n$ - уточняют тип разметки. $e$ - обозначение того элемента
структуры данных $t_1$, пара\-мет\-ры разметки которого нужно
вычислить для дальнейшего использования их в теореме приема; $r_1,
\ldots, r_k$ - переменные, соответствующие этим параметрам.
Ан\-те\-це\-дент такого вида выделяется указателем приема
"теханализатор". При обра\-бот\-ке его предполагаются уже
идентифицированными все переменные термов $t_1, \ldots, t_n, e$.
"Выходные" \ переменные $r_1, \ldots r_k$ должны быть попарно
различны и еще не иден\-ти\-фи\-ци\-ро\-ваны.

Для обработки антецедента, выделенного указателем "теханализатор",
при\-ме\-ня\-ют\-ся две различные установки на идентификацию -
(теханализатор $v$) и (смана\-ли\-затор $v$ $R$ $e$). Первая из
них ссылается на вхождение антецедента $v$ и обеспе\-чи\-ва\-ет
создание оператора, обращающегося к техническому анализатору для
полу\-че\-ния необходимой разметки анализируемого объекта. Вторая
нужна для извле\-че\-ния из найденной разметки данных, относящихся
к конкретному элементу $e$. У нее $R$ - программное выражение для
разметки; $e$ - то же, что в антецеденте. Вторая установка
вводится компилятором после обработки первой.

\subsubsection{Установка на идентификацию "теханализатор" \ }

Обработка установки (теханализатор $v$) начинается после
контрольной точки "при\-ем(318)". Переменной х11 присваивается
название анализатора $f$; переменной х12 - набор элементов,
определяющих формат технического анализатора. В этом на\-бо\-ре
находится элемент х13 вида "знач($x$ $A$ набор($y_1 \ldots
y_k$))", определяющий выделение в шаблоне $A$ антецедента $v$
переменной $x$ для текущего элемента структуры данных и набора
$(y_1 \ldots y_k)$ его параметров, вводимых при разметке.
Определяется подста\-нов\-ка (х16 - х17), переводящая шаблон $A$ в
рассматриваемый антецедент. С помо\-щью этой подстановки и
элементов "вход($x_i$ $d_i$)" \ формата, указывающих типы $d_i$
зна\-че\-ний входных данных $x_i$, составляется набор х18 пар
($t_i$, вычисл($d_i$)), необходимый для компиляции входных данных
$t_i$ в требуемых форматах. Находится список х19 программных
выражений для входных данных $t_1, \ldots , t_n$. После этого в
компи\-ли\-ру\-е\-мую программу заносится оператор, обращающийся к
процедуре "сманализатор($\ldots$)", которой передаются название
анализатора и набор его входных данных. Эта про\-це\-ду\-ра
сначала проверяет наличие комментария (теханализатор $f$ $\ldots$)
к теку\-щей задаче, сохранившего результат предыдущих обращений к
процедуре $f$ с теми же входными данными, и если он есть,
извлекает разметку непосредственно из него. Иначе она обращается к
техническому анализатору, сохраняет результат обраще\-ния в
указанном комментарии, и затем выдает его в качестве значения
своей выходной переменной. Результат $R$ обращения к процедуре
"сманализатор" \ регистрируется не в информационном элементе
программного блока, а в новой установке на иден\-ти\-фи\-ка\-цию
(сманализатор $v$ $R$ $e$), которая вводится вместо установки
(теханализа\-тор $v$).

\subsubsection{Установка на идентификацию "сманализатор" \ }

Обработка установки на идентификацию "сманализатор" \ начинается
после контроль\-ной точки "прием(319)". Сначала здесь выполняются
те же действия, что и в слу\-чае установки "теханализатор" \ -
определяется формат оператора и находится подста\-нов\-ка
(х17,х18), преобразующая шаблон антецедента $A$ в антецедент $v$.
Перемен\-ной х14 присваивается переменная шаблона $A$,
обозначающая тот элемент анализиру\-е\-мой структуры данных, для
которого вычисляется набор значений парамет\-ров; переменной х19 -
соответствующий терм $e$ из антецедента $v$. Переменной х21
при\-сва\-и\-ва\-ет\-ся программное выражение для $e$. Переменной
х25 присваивается программное выражение для анализируемой
структуры данных $t_1$. Далее используется справочник "элемент",
позволяющий по программным выражениям для структуры данных, ее
элемента и разметки структуры данных определить программное
выражение х26 для набора параметров разметки, соответствующего
элементу. В компилируе\-мую программу заносится оператор,
присваивающий новой программной переменной зна\-че\-ние х26, а
также оператор, проверяющий, что набор параметров х26 не содержит
элемента "неопред" \ (не определенное при разметке значение).
После этого, в со\-от\-вет\-ствии с нумерацией переменных $r_1,
\ldots , r_k$ в шаблоне "знач($\ldots$), предпринима\-ет\-ся
регистрация их идентификации с элементами набора х26.

\subsection{Установка на идентификацию "пересечподст"\ }

В приемах вывода теорем иногда возникает необходимость выделения
таких под\-мно\-жеств антецедентов двух кванторных импликаций,
которые оказываются одина\-ко\-вы\-ми после применения к ним
подстановки, унифицирующей для каких-то двух заданных термов.
Пусть, например, имеются кванторные импликации $\forall_x(A(x) \
\& \ B(x)\\ \rightarrow P(x))$ и $\forall_y(C(y) \ \& \ D(y)
\rightarrow Q(y))$. При унификации $P(x)$ и $Q(y)$,
определя\-е\-мой антецедентом $P(r)=Q(s)$, возникает подстановка
групп термов $r,s$ вместо $x,y$. Если нужно выделить теперь
подгруппы $A(x)$ и $C(y)$ всех антецедентов двух имплика\-ций,
совпадающих после применения к ним найденной унифицирующей
подстановки, то добавляется еще один антецедент теоремы приема,
имеющий вид $A(r) = C(s)$. Этот антецедент выделяется указателем
приема "пересечподст".

Установка на идентификацию (пересечподст $v$) ссылается на
вхождение $v$ анте\-це\-ден\-та теоремы, выделенное указателем
"пересечподст". Обработка этой уста\-нов\-ки начинается после
контрольной точки "прием(11)". Переменным х17 и х18
при\-сва\-и\-ва\-ют\-ся, соответственно, программное выражение для
набора переменных, по кото\-рым действует унифицирующая
подстановка, и для набора подставляемых термов. Находятся
информационные элементы х19 и х22 вида (операнд $\ldots$),
определяю\-щие вхождения кванторных импликаций с антецедентами
$A(x)$ и $C(y)$, и в программу заносится оператор
"пересечподст($\ldots$)", который по наборам антецедентов данных
кванторных импликаций, а также по паре х17, х18 определяет наборы
антеце\-ден\-тов, идентифицируемые, соответственно, с $A(x)$ и
$C(y)$.

\subsection{Действия процедуры "идентификатор" \ по исчерпании
уста\-но\-вок на идентификацию}

По завершении цикла просмотра установок на идентификацию (см. выше
подраздел "Цикл просмотра установок на идентификацию") - переход
через "иначе 1". Здесь проверяется, исчерпан ли список установок
х2. Если не исчерпан, то текущий уровень х7, управляющий
включением приемов компилятора, увеличивается на 1, и откат к
началу идентификации. Если же уровень х7 достиг максимально
допустимого значения 9, вместо его увеличения происходит отказ от
компиляции приема.

Если список установок на идентификацию исчерпан (контрольная точка
"при\-ем(128)"), то предпринимаются перечисляемые ниже действия,
завершающие соз\-да\-ние идентифицирующей программы.

\subsubsection{Анализ зависимостей переменных, расположенных под
свя\-зы\-ва\-ю\-щи\-ми \\ сим\-во\-лами}

Если в идентифицируемой части теоремы приема встречается квантор
либо описа\-тель $A$ по переменным списка $X$, то нужно убедиться
в том, что термы $t$, с кото\-ры\-ми идентифицированы свободные в
$A$ переменные $y$, не содержат переменных, соответствующих
переменным из $X$. Исключение составляет случай
функци\-о\-наль\-ной переменной $f(x_1 \ldots x_k)$. Если она
идентифицирована с термом $t$, то выполня\-ет\-ся проверка
независимости $t$ лишь от тех переменных $X$, которые не упомянуты
сре\-ди $x_1, \ldots, x_k$. Вставка компилятором операторов,
обеспечивающих такие провер\-ки, начинается с контрольной точки
"прием(129)".

Прежде всего, проверяется, что не имеет места обработка процедурой
"иден\-ти\-фи\-ка\-тор" \ вспомогательного программного блока,
введенного при рассмотре\-нии программно реализуемого антецедента.
Затем просматриваются такие вхожде\-ния х10 в идентифицируемую
часть теоремы приема, внутри которых расположен кван\-тор либо
описатель. Для х10 проверяется отсутствие информационного
элемен\-та (обобщпост $\ldots$), отменяющего указанные выше
проверки. Переменной х11 присваи\-ва\-ет\-ся подтерм по вхождению
х10. Затем начинается цикл просмотра свобод\-ных переменных х12
подтерма х11, играющих при анализе зависимостей роль указан\-ной
выше перемен\-ной $y$.

Для переменной х12 проверяется сначала отсутствие фильтра приема,
опреде\-ля\-ю\-ще\-го, что она идентифицируется с десятичной
записью числа. Такая за\-пись вообще не имеет переменных, и
сопоставление ее со связывающими приставками не требуется.
Отсекаются другие случаи, в которых х12 идентифицируется с
конс\-тант\-ным термом - если значением х12 служит объект,
встречающийся в вычисле\-ни\-ях, либо, согласно указателям
"символ", "симметрично", значением служит логичес\-кий символ.
Наконец, отбрасывается случай вхождения переменной х12 внутри
под\-тер\-ма, выделенного указателем "функподст".

После этих проверок составляется список х13 всех тех теоремных
перемен\-ных внешних по отношению к вхождениям х12 в х11
связывающих приставок, которые (точнее, их идентифицирующие
переменные) не должны входить в терм,
иден\-ти\-фи\-ци\-ро\-ван\-ный с х12. Отбрасываются те связывающие
приставки, для которых ука\-зан\-ная проверка не имеет смысла
(например, вырождающиеся при идентификации из-за наличия указателя
"развертка", и т.п.). Переменной х14 присваивается про\-грамм\-ное
выражение для списка свободных переменных терма,
идентифицированного с х12. Затем - переход через "ветвь 1".

Здесь просматриваются переменные х15 списка х13, с пропуском тех
пере\-мен\-ных, для которых либо уже гарантировано невхождение их
в х14, либо такое вхожде\-ние допускается согласно указателю
приема. Наконец, создается оператор х16, про\-ве\-ря\-ю\-щий
невхождение идентифицирующей переменной для х15 в х14 (либо
непересе\-че\-ние группы переменных, идентифицированных с х15, и
списка х14). Этот опе\-ра\-тор заносится в компилируемую программу
с помощью процедуры "вставкафильтра".

\subsubsection{Учет вхождений символа "примечание" \ в фильтры}

Если фильтры приема имеют вхождение символа "примечание", то при
их реали\-за\-ции может понадобиться накопитель комментариев,
передаваемых преобразую\-щей процедуре приема. После контрольной
точки "прием(130)" \ происходит ввод тако\-го накопителя,
регистрируемого в информационном элементе (примечание $\ldots$).

\subsubsection{Учет указателей "подствпосылки" \ }

После контрольной точки "прием(156)"\ происходит учет указателя
"подствпосылки", определяющего подстановку некоторого терма вместо
заданной переменной во все утверждения комментария
"коррекцияпосылок". Предполагается, что компили\-ру\-ет\-ся прием
некоторого нормализатора. Определяются программные выражения х10 и
х11 для указанных переменной и терма, после чего в программу
заносится обра\-ще\-ние к оператору "подствпосылки".

\subsubsection{Учет элементов "транслвыражения" \ для исключения
избыточных фильт\-ров}

Если программный блок имеет информационный элемент
(транслвыражения $\ldots$), определяю\-щий, что при идентификации
некоторой переменной $x$ ее значением ста\-но\-вит\-ся десятичное
число, то в информационном элементе (комментарии $\ldots$)
ре\-гист\-ри\-ру\-ет\-ся указание на то, что обработка фильтра
"десчисло($x$)" \ избыточна.

После перечисленных действий применение процедуры "идентификатор"
\ за\-вер\-ша\-ет\-ся.

\subsection{Процедура "учетоперанда"\ }

Для регистрации в программном блоке результата идентификации
некоторого тео\-рем\-но\-го вхождения $v$ c термом или вхождением,
относящимся к текущему кон\-тек\-сту вычислений, используется
процедура "учетоперанда". Значительная часть прие\-мов оператора
"идентификатор" \ завершается обращением именно к этой
проце\-ду\-ре. Она вставляет в компилируемую программу операторы,
анализирующие заго\-ло\-вок идентифицирующего терма (например,
проверяющие совпадение его с символом по вхождению $v$); вводит
информационные элементы программного блока, сохра\-ня\-ю\-щие
различную информацию об идентификации вхождения $v$; определяет
но\-вые установки на идентификацию для вхождений, расположенных
внутри $v$.

Обращение к процедуре имеет вид "учетоперанда(х1 х2 х3 х4 х5 х6 х7
х8). Здесь х1 - вхождение $v$ в теорему приема; х2 - программное
выражение либо программ\-ная переменная, значением которых служат
либо идентифицирующий терм $t$ для $v$, либо корневое вхождение
этого терма в некоторый надтерм; х3 - программный блок. Если х2 -
программное выражение для вхождения, то х4 равно 0, иначе х4 равно
1. х5 - описание приема; х6 - заголовок приема. Выходной
переменной х7 присваива\-ет\-ся список новых установок на
идентификацию; переменной х8 - список тех подчинен\-ных $v$
вхождений, которые далее будут рассматриваться процедурой
"идентифика\-тор" \ как уже учтенные. В этот список само вхождение
$v$ не заносится.

Ветвь оглавления программ, посвященная процедуре "учетоперанда",
распо\-ло\-же\-на в том же списке, что и корневые ветви процедуры
"идентификатор", т.е. в подразделе "Формирование идентифицирующей
процедуры". К началу про\-грам\-мы "учетоперанда" \ можно перейти
также непосредственно из главного меню, набрав название этой
программы.

\subsubsection{Учет указателя "смравно" \ }

Прежде всего, проверяется наличие информационного элемента
(смравно $A$), в спи\-ске $A$ которого содержится вхождение $v$.
Это - достаточно редкая ситуация. В ней предполагается, что х2
определяет вхождение идентифицирующего терма $t$, при\-чем
продолжать идентификацию можно либо рассматривая само это
вхождение, либо перейдя к корневому вхождению произвольного
выражения $s$, для которого в контексте идентификации имеется
равенство $t=s$. Перечисление таких аль\-тер\-на\-тив\-ных
вхождений, "ответвляющихся" \ от вхождения х2, реализуется
опера\-то\-ром "смравно" \ (случай приема сканирования задачи)
либо оператором "Смравно" \ (при\-ем пакетного оператора).
Переменной х2 переприсваивается та программная перемен\-ная,
которая перечисляет указанные вхождения. Затем - откат к переходу
через "ветвь 2" \ для продолжения обработки вхождения $v$.

\subsubsection{Идентификация переменной с числовой константой}

После контрольной точки "прием(9)" \ рассматривается подслучай, в
котором на те\-ку\-щем теоремном вхождении $v$ расположена
переменная $x$, причем имеется фильтр "десчисло($x$)" \ либо
"целое($x$)" \ либо "натуральное($x$)". Проверяется, что этот
фильтр не был учтен ранее, и в информационном элементе
(комментарии $\ldots$) указыва\-ет\-ся, что далее он будет
считаться учтенным. Переменной х14 присваивается программ\-ное
выражение для корневого вхождения терма, идентифицирующего для
$v$. Если ко вхождению $v$ должен относиться внешний знак "минус",
то переменной х15 при\-сва\-и\-ва\-ет\-ся программное выражение
для вхождения, на котором может оказать\-ся такой знак. Далее в
компилируемую программу заносится оператор, прове\-ря\-ю\-щий, что
по вхождению х14 расположена десятичная запись числа. В случае
фильт\-ра "натуральное($x$)" \ либо "целое($x$)" \ вводится также
оператор, проверяющий, что чис\-ло имеет соответствующий тип.
Наконец, создаются информационные элементы
(тран\-сл\-вы\-ра\-жения $x$ десчисло $\ldots$) и (вхождение $x$
х14), регистрирующие идентифи\-ка\-цию переменной $x$.

\subsubsection{Идентификация переменной с указателем шахматной
позиции}

После контрольной точки "прием(18)" \ рассматривается подслучай, в
котором на текущем теоремном вхождении $v$ расположена переменная
$x$, идентифицируемая с константной структурой данных,
используемой при анализе шахматной позиции. Эта ситуация
распознается по наличию внешнего "шахматного" \ отношения $f$,
кото\-ро\-му подчинено $v$. Если такое отношение указывает, что
$x$ идентифицируется с направляющим вектором шахматной линии либо
с координатами шахматного поля, то переменной х13 присваивается
идентифицирующий терм для $v$, и вводится ин\-фор\-ма\-ци\-он\-ный
элемент (транслвыражения $x$ $\ldots$ числнабор(х13)),
обеспечи\-ваю\-щий переход от терма для пары координат (вектора
или поля) к самой паре координат. В остальных случаях $x$
идентифицируется с десятичным числом (например, с от\-дель\-ной
координатой шахматного поля).

\par\medskip

Далее переменной х9 присваивается список всех вхождений,
расположенных внут\-ри текущего вхождения $v$ и отличных от него.

\subsubsection{Текущее вхождение выделено указателем "развертка" \ }

Если текущее вхождение выделено указателем "развертка" \
(контрольная точка "при\-ем(19)"), то сразу выдается результат, в
котором указана новая установка на иден\-ти\-фи\-кацию (развертка
$\ldots$). Все вхождения списка х9 здесь считаются учтен\-ны\-ми,
так как при обработке установки (развертка $\ldots$) будет
использоваться рекурсив\-ное обращение к процедуре
"идентификатор".

\subsubsection{Текущее вхождение выделено указателем "подтерм" \ }

Данная ситуация распознается по наличию информационного элемента
(станд\-терм $T$), где $T$ - терм, расположенный по текущему
вхождению $v$. Здесь вместо иден\-ти\-фи\-ка\-ции $T$
предпринимается определение программного выражения х11 для $T$ и
регистрация в программе оператора, сравнивающего идентифицирующий
терм (см. х2) со значением выражения х11. Все вхождения,
расположенные внутри $v$, после этого считаются учтенными.

\subsubsection{Учет указателя "знаксуммы" \ }

После контрольной точки "прием(8)" \ проверяется наличие указателя
"знаксум\-мы", выделяющего ту ассоциативно-коммутативную операцию,
операндом которой слу\-жит текущее вхождение $v$. Для этого
используется информационный элемент (знак\-сум\-мы $A_1 \ A_2 \
A_3$). Здесь $A_1$ - изменяемый знак; $A_2$ - вхождение
ассоциативно-ком\-му\-та\-тив\-ной операции; $A_3$ - либо 0, либо
программное выражение для индика\-то\-ра одновременной замены
знака $A_1$ у всех операндов операции $A_2$. Если индикатор $A_3$
уже определен, то выражение х2 корректируется с учетом замены
знака; при этом используется оператор "коррекциязнака" \ (х2
задает вхождение) либо операторное выражение "измзнака" \ (х2
задает терм). Если же индикатор еще не определен, то он
определяется по текущему вхождению, в зависимости от наличия или
отсут\-ст\-вия у $v$ знака $A_1$. Одновременно корректируется х2.

\subsubsection{Идентификация набора}

После контрольной точки "прием(2)" \ рассматриваются случаи, когда
заголов\-ком терма $T$, расположенного по текущему вхождению $v$,
является один из символов "префикс", "конкатенация", "суффикс". В
этих случаях идентифицирующий терм может иметь вид
"набор($\ldots$)", и при идентификации из него будут извлекаться
те или иные поднаборы. Одновременно компилятор обеспечивает и
альтернативный режим "обычной" \ идентификации для $T$.

Сначала переменной х11 присваивается указатель учета порядка
элементов на\-бо\-ра: если порядок несущественен, то х11 равно 1,
иначе - 0. Далее рассматрива\-ют\-ся следующие подслучаи:

\begin{enumerate}

\item $T$ имеет вид "префикс($A$ $B$)". Заголовки подтермов $A,B$
присваиваются пе\-ре\-мен\-ным х12 и х13. Выделяются  подслучаи:

\begin{enumerate}

\item х12 и х13 - символы "значение", т.е. $A$ и $B$ имеют вид
$f(x)$, $g(y)$. Прове\-ря\-ет\-ся, что $A,B$ - функциональные
переменные. После этого вво\-дит\-ся оператор, устанавливающий,
что идентифицирующий терм имеет заго\-ло\-вок "набор". Формируется
пара (вхождение $\ldots$), определяющая
иден\-ти\-фи\-ци\-ру\-ю\-щее вхождение для $A$, а также пара (терм
$\ldots$), определяю\-щая идентифицирующий терм для $B$. Эти пары
регистрируются в соответ\-ств\-у\-ю\-щих функциональным переменным
$f,g$ информационных элемен\-тах (функция $\ldots$).

\item х12 и х13 - символы переменных. Если значение переменной х12
не иден\-ти\-фи\-ци\-ро\-вано, то для выделения идентифицирующего
ее элемента набо\-ра используется оператор "элементнабора" \ (х11
= 1) либо оператор\-ное выражение "элементномер" \ (х11 = 0).
Идентифицирующий терм для х13 теперь можно получить с помощью
операторного выражения "остатокна\-бора". Если х13 еще не было
идентифицировано, то регистрируются зна\-че\-ния для х12 и х13;
если же х13 уже было идентифицировано, то вво\-дит\-ся оператор,
сравнивающий старый и новый идентифицирующий термы, а
регистрируется только значение х12.

Если значение переменной х12 уже было идентифицировано, то
вводится оператор, выделяющий элемент набора для сопоставления его
перемен\-ной х12, а также оператор, сравнивающий этот элемент с
ранее найденным значением х12. После этого х13 обрабатывается так
же, как в предыду\-щем случае.

Заметим, что оператор "элементнабора" \ и операторное выражение
"эле\-мент\-номер" \ могут использоваться для работы с наборами,
заданными как в виде терма "набор($\ldots$)", так и с наборами,
заданными с помощью опе\-ра\-ций "префикс", "суффикс",
"конкатенация".

\item $A$ - неоднобуквенный терм, х13 - переменная. В этом случае
вво\-дит\-ся оператор, выделяющий элемент набора, сопоставляемый
$A$, и предпри\-ни\-ма\-ет\-ся еще одно обращение к оператору
"учетоперанда" \ - теперь уже для идентификации вхождения $A$ с
выбранным элементом. Предвари\-тель\-но обрабатывается х13 - если
оно еще не было идентифицировано, то регистрируется результат его
идентификации с остатком набора, а если уже было, то проверяется
совпадение старого и нового идентифици\-ру\-ю\-щих термов.

\item $A$ - логический символ, х13 - переменная. Вводится
оператор, выделяю\-щий элемент набора для сопоставления его $A$, и
далее - оператор, проверя\-ю\-щий, что выделенным элементом служит
логический символ $A$. Если х13 еще не идентифицировано, то
регистрируется его идентификация с остат\-ком набора, иначе -
проверяется совпадение старого и нового идентифи\-ци\-ру\-ю\-щих
термов для х13.

\end{enumerate}

\item $T$ имеет вид "конкатенация($A_1 \ldots A_n$)". Сначала
здесь рассматривается под\-слу\-чай, когда $A_1$ имеет вид
"набор($B_1 \ \ldots \ B_k$)", $n=2$, причем $A_2$ - перемен\-ная
$x$. Эта переменная присваивается переменной х13. Выполняется
просмотр опе\-ран\-дов $B_i$ и заполнение накопителей х14, х15,
х16. В накопитель х15 заносят\-ся программные выражения для
корневых вхождений идентифицирующих тер\-мов, сопоставляемых
идентифицируемым термам $B_i$. В наборе х14 со\-хра\-ня\-ют\-ся
новые установки на идентификацию, возникающие при рассмотрении
опе\-ран\-дов; значением переменной х16 после просмотра становится
сим\-воль\-ная константа, равная числу операндов $k$. Обработка
очередного операнда про\-ис\-хо\-дит по схеме, аналогичной
применявшейся в случае "префикс"а. Если $B_i$ - еще не
идентифицированная переменная, то с помощью оператора
"элементна\-бо\-ра" \ либо операторного выражения "элементномер" \
для нее выбирается еще не использованный, согласно списку х15,
элемент идентифицирующего на\-бо\-ра. Если $B_i$ - уже
идентифицированная переменная, то в наборе нахо\-дит\-ся элемент,
равный ранее сопоставленному этой переменной. Наконец, если $B_i$
- неоднобуквенный терм, то выбирается неиспользованный элемент
набора (ес\-ли х11 = 0, то - элемент с номером $i$), и
предпринимается вторичное обра\-ще\-ние к процедуре "учетоперанда"
\ - для учета идентификации операнда $B_i$ с этим элементом. Здесь
может быть пополнен новыми установками список х14. Обработка их и
отсечение неподходящих вариантов идентификации бу\-дут происходить
уже после выхода из процедуры "учетопе\-ран\-да". Однако, при
вложенном обращении к процедуре проверяется соответствие
заголовков $B_i$ и выбранного для него элемента, что обычно
со\-кра\-ща\-ет перебор вариантов до приемлемого.

По окончании просмотра операндов $B_i$ рассматривается переменная
$x$. Если она еще не идентифицирована, то идентифицируется с
остатком элементов на\-бо\-ра, иначе - проверяется совпадение
этого остатка с ранее найденным значением $x$.

Если конкатенация не имеет указанного выше вида, то переход через
"ветвь 2". Здесь сначала проверяется, что идентифицирующий терм
имеет своим за\-го\-лов\-ком один из символов "набор", "префикс",
"конкатенация". Если программ\-ное выражение х2 не является
переменной, задающей корневое вхождение иден\-ти\-фи\-ци\-рующего
терма, то вводится вспомогательная программная перемен\-ная для
такого вхождения. Она переприсваивается переменной х2, а
указа\-тель вхождения х4 заменяется на 0. Далее используется
операторное выраже\-ние "компонентынабора", дающее список возможно
меньших фрагментов иден\-ти\-фи\-ци\-рующего набора, конкатенацией
которых он является. С помощью это\-го выражения создается
информационный элемент (набороперандов $v$ $\ldots$), в котором
найденные фрагменты перечисляются для последующей
иденти\-фи\-ка\-ции их с операндами конкатенации $A_i$. Чтобы
выполнить эту идентифи\-ка\-цию, процедура повторно вводит
установку (операнд $v$ $\ldots$).

\item $T$ имеет вид "суффикс($A$ $B$)", где $A,B$ - переменные.
Случай совершенно анало\-ги\-чен рассмотренному выше случаю
"префикс($A$ $B$)". Отличие состоит в том, что вместо операторного
выражения "элементномер", использованного ра\-нее для нахождения
$i$-го от начала набора элемента, применяется операторное
вы\-ра\-же\-ние "Элементномер" \ для нахождения $i$ -го от конца
элемента.

\end{enumerate}

\subsubsection{Идентификация функциональной переменной}

После контрольной точки "прием(3)" \ рассматривается случай, в
которых терм $T$ по текущему вхождению $v$ имеет вид "значение($f$
$t$)". Здесь выделяются следую\-щие подслучаи:

\begin{enumerate}

\item Переменная $f$ выделена указателем приема "отображение" \
(контрольная точ\-ка "прием(15)"). Эта переменная присваивается
программной переменной х10. Создается пара х11 вида (вхождение
$R$) либо (терм $R$), определяющая про\-грамм\-ное выражение $R$
для вхождения идентифицирующего значения функ\-ции $f$ терма либо
для самого идентифицирующего терма. Если имелся указа\-тель
"заменазнака", определяющий отнесение к $f$ заданного внешнего
знака, то предпринимается коррекция выражения $R$. Так как новая
версия этого выра\-же\-ния задает терм, то одновременно заголовок
пары х11 заменяется на сим\-вол "терм". Затем - переход через
"ветвь 3". Начиная с этой точки, разбира\-ет\-ся ряд подслучаев.

\begin{enumerate}

\item Имеется указатель "новаргумент" \ либо "функаргумент",
выделяющий фу\-нк\-ци\-о\-наль\-ную переменную $f$ (контрольная
точка "прием(11)"). Тогда для продолжения обработки текущего
вхождения $v$ вводится новая ус\-та\-нов\-ка на идентификацию
(новаргумент $\ldots$), и выход из процедуры "учетопе\-ран\-да".

\item Функциональная переменная $f$ выделена указателем
"повторение" \ (кон\-трольная точка "прием(13)"). В этом случае
$T$ имеет вид $f(y=z)$, где $y,z$ - различные переменные.
Идентификация должна заключаться в на\-хож\-де\-нии внутри
идентифицирующего для $T$ терма $A$ такого подтерма $s$, который
имеет не менее двух вхождений в $A$ и содержит не менее двух
свободных переменных. После этого создается шаблон $B$
функциональной идентификации для $f$, получаемый из $A$ заменой
всех вхождений $s$ на новую переменную $y$. Сам подтерм $s$
идентифицируется с переменной $z$. Для перечисления возможных $s$
в компилируемую программу вставляется обращение к оператору
"повтор". Создается информационный элемент (функция $f$ $\ldots$),
регистрирующий результаты идентификации переменной $f$.

\item Уже создан информационный элемент (функция $f$ $X$ $A$ $B$)
(контрольная точка "прием(14)"). Если последний разряд $B$ этого
элемента равен 0, т.е. иден\-ти\-фи\-ка\-ция $f$ еще не
состоялась, то данный разряд заменяется на пару х11, и завершение
процедуры. Иначе - переход через "иначе 3" \ к ветви, сравнивающей
старую и новую версии идентификации $f$. Переменной х14
присваивается набор заголовков аргументов идентифицируемой
функ\-ци\-о\-наль\-ной переменной $f(t)$. Если $X$ совпадает с
$t$, т.е. ранее $f$ иденти\-фи\-ци\-ро\-ва\-лось для того же
набора переменных, то рассмотрение под\-слу\-чая сводится к
занесению в компилируемую программу оператора,
про\-ве\-ря\-ю\-ще\-го совпадение старого и нового выражений,
определяющих значение $f$. В противном случае - переход через
"иначе 1".

Сначала рассматривается один специальный подслучай. Переменной х16
присваивается список, образованный термами - аргументами
функ\-ци\-о\-наль\-ной переменной $f(t)$. Проверяется, что списки
$X$ и х16 имеют одина\-ко\-вую длину. Переменной х17 присваивается
список вхождений аргу\-мен\-тов $f(t)$. Рассматриваемый подслучай
состоит в том, что элементы списка $X$ и заголовки термов х16
отличаются лишь в одной позиции - для $X$ пусть это будет
некоторая переменная $x$, а для х16 - терм $u$. Значением х18
становится одноэлементный список, состоящий из $u$, а значением
х19 - одноэлементный список, состоящий из $x$. Проверяется
отсутствие ука\-за\-те\-ля приема, определяющего, что $x$ должно
рассматриваться не как единственная переменная, а как список
переменных. Переменной х20 при\-сва\-и\-ва\-ется одноэлементый
список, состоящий из вхождения аргумента $u$.

Если переменная $x$ уже идентифицирована, то находится
программ\-ное выражение х21 для нее. По $B$ находится программное
выражение для терма $C$, определяющего значение $f(X)$, и в
компилируемую про\-грам\-му заносится оператор "усмподст",
предпринимающий попытку пред\-ста\-вить идентифицирующий терм $D$
для $f(t)$ в виде результата подстановки в $C$ вместо $x$
некоторого терма $s$. Для обработки сопоставления аргументу $u$
терма $s$ предпринимается повторное обращение к процедуре
"учетопе\-ран\-да".

Если же переменная $x$ еще не идентифицирована, но зато $u$
представ\-ля\-ет собой уже идентифицированную переменную, то
предприни\-ма\-ет\-ся попытка представить $C$ как результат
подстановки в $D$ вместо $u$ некото\-ро\-го терма $p$. В
информационном элементе (функция $f$ $\ldots$) вместо $X$
помещается $u$, шаблон $B$ корректируется по терму $D$, и
регистри\-ру\-ет\-ся идентификация $x$ с $p$.

Если указанный выше подслучай различения списков $X$ и х16 в
единст\-вен\-ной позиции не имеет места, то откат к переходу через
"ветвь 1". Здесь проверяется, что все аргументы $f(t)$ суть
переменные. Предпри\-ни\-ма\-ет\-ся сравнение списка х14 указанных
аргументов и списка $X$. Переменным х14 и х15 переприсваиваются
подсписки сравниваемых списков, образован\-ные теми разрядами, в
которых они различаются. Если все переменные из х14 уже
идентифицированы, то определяется набор х16 программ\-ных
выражений для них. Если все переменные из х15 идентифицированы, то
аналогичым образом определяется список х17 программных
выраже\-ний, значения которых суть переменные, идентифицированные
с перемен\-ными х15. Затем в компилируемую программу вставляются
оператор, находя\-щий идентифицирующий терм для $f(t)$ согласно
информационному эле\-мен\-ту (функция $f$ $\ldots$), а также
оператор, сравнивающий его с теку\-щим идентифицирующим термом,
определяемым программным выражением х2.

Рассматриваются также подслучаи, в которых х14, х15
одноэлемент\-ны, причем переменная одного из них не
идентифицирована, а другого - иден\-ти\-фи\-ци\-ро\-вана со
списком переменных. Для сравнения старой и новой версий
идентифицирующего термов здесь используются операторы "усм\-подст"
\ и "Реализация". Они определяют набор значений не
идентифици\-ро\-ван\-ной переменной и сохраняют его в
информационном элементе (ре\-зульт\-подст $\ldots$).

\item Функциональная переменная $f$ выделена указателем
"вхождение" \ (конт\-рольная точка "прием(12)"). В этом случае
текущий идентифици\-ру\-е\-мый терм $T$ имеет вид $f(x,t)$, где
$x$ - некоторая уже идентифицирован\-ная переменная либо список
переменных. Дальнейшая идентификация должна происходить за счет
выделения в текущем идентифицирующем терме про\-из\-вольного
вхождения $w$ подтерма, который будет идентифицироваться с $t$.
После этого новые термы вида $f(A,B)$ будут получаться путем
заме\-ны вхождения $w$ на $B$ и подстановки терма (или термов) $A$
вместо всех расположенных вне $w$ вхождений $x$. В вырожденных
случаях терм $T$ мо\-жет не содержать ссылки на $x$.

Переменной х13 присваивается вхождение аргумента функциональной
пе\-ре\-мен\-ной $f$. Если $x$ пропущено, то заголовком этого
аргумента не будет служить символ "набор", и тогда - переход через
"иначе 2" \ к обра\-бот\-ке вырожденного случая. Иначе находится
список х15 теоремных пере\-мен\-ных, входящих в подтерм $x$, и
вводится информационный элемент (функ\-ция $f$ х15 0 х11),
регистрирующий идентификацию $f$. В компилируе\-мую программу
заносится оператор, перечисляющий вхождения $w$ внутри
иден\-тифицирующего терма. Вводится элемент (вхож\-де\-ние\-терма
$f$ $\ldots$), ука\-зы\-вающий программное выражение для вхождения
$w$, идентифици\-ру\-е\-мо\-го с $t$. Наконец, для инициализации
идентификации $w$ с $t$ предприни\-ма\-ет\-ся повторное обращение
к оператору "учетоперанда". Вырожденный слу\-чай обрабатывается
аналогично.

\item Общий случай. Проверяется отсутствие информационного
элемента ви\-да (функция $f$ $\ldots$). Находится список $x$ всех
переменных терма $t$, и вво\-дит\-ся информационный элемент ($f$
$x$ 0 х11), где х11 - ранее созданная па\-ра, определяющая
выражение для значений функциональной переменной.

\end{enumerate}

\item Идентифицируемый терм $T$ имеет вид $f(t)$, где $f$ ранее
было идентифици\-ро\-ва\-но с набором переменных $X$, а $t$
определяет номер переменной этого спис\-ка (контрольная точка
"прием(16)"; обычно вместо $f(t)$ в таких случаях
ис\-поль\-зу\-ет\-ся обозначение $x(i)$). Находится программное
выражение х11 для числен\-но\-го значения $t$, и с его помощью
создается программное выражение х12 для рассматриваемой
переменной, извлекаемой из списка $X$. В компилируемую
про\-грам\-му заносится оператор, проверяющий совпадение текущего
иденти\-фи\-ци\-ру\-ю\-ще\-го терма с этой переменной.

\item Имеется информационный элемент (элементыматрицы $f$ $A$ $n$
$m$), согласно ко\-то\-ро\-му $f$ уже идентифицировано с матрицей,
причем $A$ - программное выраже\-ние для набора наборов элементов
матрицы (термов); $n,m$ - программные вы\-ра\-же\-ния для размеров
матрицы (контрольная точка "прием(17)"). В этом слу\-чае $t$ имеет
вид "набор($i$ $j$)". Определяются программные выражения х11, х12
для $i,j$, строится программное выражение х13 для текущего
элемента матрицы, и в компилируемую программу заносится
опе\-ра\-тор для сравнения этого эле\-мен\-та с текущим
идентифицирующим термом.

\item В ряде случаев обработка функциональной переменной,
выделенной ука\-за\-те\-лем специального типа, предусмотрена в
рамках основной части про\-це\-ду\-ры "идентификатор". В этих
случаях процедура "учетоперанда" \ просто созда\-ет новую
установку на идентификацию (операнд х1 х2), вводя при
необходи\-мо\-сти для х2 вспомогательную переменную, ссылающуюся
на идентифици\-ру\-ю\-щее вхождение, и завершает свою работу. К
числу таких случаев отно\-сит\-ся выделение $f$ указателями:
"заменатермов", "Бинарнаяоперация", "сммно\-го\-член",
"функподст". Обработка их процедурой "идентификатор" \ была
опи\-са\-на выше.

\end{enumerate}

\subsubsection{Идентификация с применением справочника "вид" \ }

После контрольной точки "прием(4)" \ предпринимается попытка
использовать при идентификации текущего вхождения $v$ справочник
"вид". Этот справочник слу\-жит для указания специальных процедур
идентификации выражений $t$, имею\-щих единственную переменную
$x$. Например, в случае идентификации степенного вы\-ра\-же\-ния
$x^n$ с константным натуральным показателем степени $n$ он дает
ссыл\-ку на процедуру "выделениестепени". Все такие
вспомогательные процедуры $P$ име\-ют одинаковый формат обращения
$P$(х1 х2 х3 х4 х5 х6). Здесь х1 - вхождение первого символа
идентифицирующего терма; х2 - дополнительная информация (в
приведенном примере - показатель выделяемой степени $n$); х3 -
список утвержде\-ний контекста идентификации; х4 - список
комментариев, накладывающих воз\-мож\-ные ограничения на
идентификацию. Значением выходной переменной х5 ста\-но\-вит\-ся
терм, идентифицированный с $x$; х6 - список посылок,
использованных для обоснования корректности преобразований,
применявшихся при идентификации.

Переменной х10 присваивается список переменных текущего
идентифици\-ру\-е\-мо\-го терма $T$; проверяется, что он
одноэлементный, и переменной х11 присваивается его единственная
переменная $x$. Находится результат х12 обращения к
спра\-воч\-ни\-ку "вид" \ на логическом символе - заголовке терма
$T$. Если он ненулевой, то представляет собой пару (название
вспомогательной процедуры - программное вы\-ра\-жение для
передаваемой ей дополнительной информации). Проверяется
отсутст\-вие явного запрета на использование справочника "вид".
Переменной х13 присваивает\-ся програмное выражение для списка
посылок контекста идентификации; перемен\-ной х14 - программное
выражение для списка комментариев, по умолчанию извлекае\-мых из
текущих задачи или пакетного оператора. Если имеются указатели
прие\-ма "выделениестепени($\ldots$)", дополняющие список
комментариев обращения к вспомо\-га\-тель\-но\-му оператору, то
х14 корректируется с их учетом. Затем создается и
регистри\-ру\-ет\-ся в компилируемой программе обращение х15 к
вспомогательному операто\-ру. Если переменная $x$ уже была
идентифицирована, то добавляется оператор, про\-ве\-ря\-ю\-щий
совпадение ее "старого" \ и "нового" \ значений. Иначе - вводится
инфор\-ма\-ци\-он\-ный элемент (терм $x$ $\ldots$) для регистрации
идентификации $x$.

\subsubsection{Общий случай идентификации терма, отличного от переменной}

Далее переменной х10 присваивается заголовок идентифицируемого
терма. Снача\-ла рассматривается случай, в котором х10 -
логический символ. Здесь переменной х11 присваивается оператор,
проверяющий наличие заголовка х10 у идентифици\-ру\-ю\-ще\-го
терма.

После контрольной точки "прием(5)" \ проверяется наличие указателя
"аль\-тер\-на\-ти\-ва", ссылающегося на текущее идентифицируемое
вхождение. Такой указа\-тель разрешает находиться на заданных
позициях не тем символам, которые указаны в теореме, а некоторым
альтернативным символам. По нему был создан используе\-мый здесь
информационный элемент (альтернатива $A$ $B$), у которого $A$ -
набор вхожде\-ний в теорему приема, $B$ - набор соответствующих
этим вхождениям альтерна\-тив\-ных заголовков подтермов.
Требуется, чтобы альтернативные значения, указанные в $B$,
использовались одновременно для всех вхождений $A$. Если
какое-либо из вхожде\-ний $w$ списка $A$ уже идентифицировано (что
распознается по информацион\-но\-му элементу (операнд $w$
$\ldots$)), то х11 заменяется на оператор, анализирующий
за\-го\-ло\-вок идентифицирующего терма в зависимости от того,
каким был заголовок для $w$. Если там он был изменен, то и здесь
берется альтернативная версия из $B$, иначе - берется текущий
заголовок х10. В случае, когда вхождение из $A$
идентифици\-ру\-ет\-ся впервые, х11 заменяется на дизъюнкцию,
допускающую оба варианта заго\-лов\-ка. После коррекции х11 -
откат к переходу через "ветвь 2".

Если прием имеет указатель "вариант", допускающий в качестве
заголовка те\-ку\-ще\-го идентифицирующего терма любой символ из
заданного списка $S$, то х11 корректируется на соответствующую
дизъюнкцию. Список $S$ извлекается из ра\-нее созданного
информационного элемента (замены $\ldots$). Еще две коррекции х11,
рас\-ши\-ря\-ю\-щие список возможных заголовков идентифицирующего
терма, связаны с указателями приема "частнпроизв" \ и
"комплексное". В первом случае раз\-ре\-ша\-ет\-ся вместо символа
"частнпроизв" \ рассматривать символ "производная" \ (обыч\-ная
производная идентифицируется как частная производная первого
порядка); во вто\-ром - одновременно рассматриввать
комплекснозначные и вещественнозначные ана\-ло\-ги операций.

После перечисленных коррекций оператора х11 попадаем на
контрольную точ\-ку "прием(6)". Если идентифицируемый терм $T$
неоднобуквенный, то х11 пере\-при\-сва\-и\-ва\-ет\-ся
одноэлементный набор, состоящий из оператора х11. Если имеется
ин\-фор\-ма\-ци\-он\-ный элемент (заголовок $\ldots$),
указывающий, что заголовок идентифици\-ру\-ю\-ще\-го терма вообще
несущественен, то х11 заменяется на пустой набор. Если программное
выражение х2 отлично от переменной либо определяет
идентифицирующий терм, а не идентифицирующее вхождение, то
вводится вспомогательная переменная $X$ для идентифицирующего
вхождения, переприсваиваемая х2. При этом в накопитель х12
заносится оператор, присваивающий значение переменной $X$.
Наконец, операторы накопителей х11 и х12 заносятся в компилируемую
программу. Если иденти\-фи\-ци\-ру\-ет\-ся набор $T$ с
несущественным порядком элементов, то в компилруемую програм\-му
заносится также оператор, проверяющий совпадение числа элементов
иден\-ти\-фи\-ци\-ру\-ю\-ще\-го и идентифицируемого наборов. Для
продолжения обработки иден\-ти\-фи\-ци\-ру\-е\-мо\-го терма $T$
создается новая установка на идентификацию (операнд $\ldots$).

Если идентифицируемый терм $T$ - однобуквенный, то обработка его
сводится к занесению в программу оператора х11. Предварительно,
для служебных слов "свой", "чужой", обозначащих в шахматах цвет
своих либо чужих фигур, предприни\-ма\-ет\-ся коррекций х11 на
соответствующий оператор "свой($\ldots$)" \ либо
"чужой($\ldots$)".

\subsubsection{Общий случай идентификации переменной}

Этот случай обрабатывается после контрольной точки "прием(7)".
Значением про\-грам\-м\-ной переменной х10 служит переменная $x$,
расположенная на текущем иден\-ти\-фи\-ци\-ру\-емом вхождении.

Если имеется информационный элемент (параметры $\ldots$),
указывающий, что иден\-ти\-фи\-кация переменной $x$ не нужна, то
процедура завершается. В противном слу\-чае проверяется наличие
информационного элемента, который уже определял бы ранее найденную
идентификацию $x$. Если такой элемент имеется, то создается
опера\-тор, проверяющий совпадение старой и новой версий
идентификации; иначе - пред\-при\-ни\-ма\-ет\-ся регистрация
идентификации $x$ согласно х2. В последнем случае, если име\-лась
ссылка на $x$ из указателя "заменазнака", выражение для
идентифицирующего тер\-ма корректируется с учетом возможной замены
знака.

\section{Компиляция операторных выражений}

Компиляция операторных выражений ГЕНОЛОГа выполняется процедурой
"прогр\-выражение". Обращение к ней имеет вид "прогрвыражение(х1
х2 х3 х4)". Оно пред\-ставляет собой программное выражение ЛОСа.
Здесь х1 - теорема приема; х2 - операторное выражение ГЕНОЛОГа,
для которого требуется получить вычисляю\-щее его значения
операторное выражение ЛОСа $R$; х3 - набор указателей,
уточняю\-щих формат значений выражения $R$; х4 - программный блок,
относительно кото\-ро\-го строится $R$. Выражение $R$ выдается в
качестве значения операторного выраже\-ния "прогрвыражение(х1 х2
х3 х4)". Если компиляция не удалась, то в качестве значе\-ния
выдается 0. Заметим, что для получения программных выражений,
создающих но\-вые термы по используемым в качестве шаблонов
"теоремным" \ термам, применя\-ет\-ся другая процедура -
"метаперевод". Ее описание будет приведено в сле\-ду\-ю\-щем
разделе.

Перечислим используемые типы элементов списка х3 указателей
формата зна\-че\-ния:

\begin{enumerate}

\item "вхождение" \ - значением выражения $R$ должно служить
вхождение в терм ли\-бо набор;

\item "терм" \ - значением $R$ должен служить терм или набор;

\item "переменная" \ или "логсимвол" \ - значением должен служить
символ перемен\-ной либо, соответственно, логический символ;

\item "число" \ - значением должно служить десятичное число;

\item "операнд" \ - нет жесткого ограничения на выбор формата
"вхождение" \ либо "терм", однако предпочтительнее формат
"вхождение";

\item "блокпроверок" \ - предпочтительно не вводить при компиляции
вспомога\-тель\-ные программные переменные (т.е. не изменять
указанную в программном бло\-ке х4 первую неиспользуемую
переменную);

\item "набор" \ - значением должен служить набор;

\item "комментарий" \ - х2 представляет собой элемент комментария;

\item "выч" \ - значением должно служить число в формате "с
плавающей за\-пя\-той";

\item "вычисл($A$)" \ - значением должен быть объект типа $A$,
согласно классифика\-ции типов данных, используемых при
вычислениях на ГЕНОЛОГе. Эта клас\-си\-фи\-ка\-ция может быть
найдена в справочной информации для символа "тип";

\end{enumerate}

 Для перехода к началу процедуры "прогрвыражение" \ через
оглавление прог\-рамм выбирается подраздел ("Компилятор ГЕНОЛОГа",
"Процедура ПРОГРВЫ\-РА\-ЖЕ\-НИЕ").

Компиляция начинается с преобразования формата значения
"вычисл($A$)" \ в $A$, если $A$ - один из символов "вхождение",
"терм", "логсимвол". Это делается для того, чтобы в перечисленных
случаях работала ветвь процедуры "прогрвыраже\-ние",
ориентированная не на вычислительные, а на обычные логические
форматы дан\-ных. Появление логических форматов данных под
указателем "вычисл" \ воз\-мож\-но из-за того, что они иногда явно
указываются в шаблонах справочника "вы\-числ", обеспечивающего
компиляцию программно реализуемых антецедентов. В редких
слу\-ча\-ях, когда для получения значения х2 в "логическом" \
формате должен снова ис\-поль\-зо\-ваться справочник "вычисл",
указанная коррекция формата блокируется.

Далее - переход через "ветвь 2" \ к точке разветвления компиляции.

\subsection{Вычислительные форматы данных}

После контрольной точки "прием(7)" \ начинается ветвь процедуры,
обрабаты\-ва\-ю\-щая форматы значений "вычисл($A$)". Это -
сравнительно редкий случай, относя\-щий\-ся к обработке программно
реализуемых антецедентов теорем приемов. Преж\-де всего, терм
"вычисл($A$)" \ присваивается переменной х5, а наименование
формата $A$ - переменной х6. Далее компиляция разветвляется.

\subsubsection{Случай переменной}

После контрольной точки "прием(9)" \ рассматривается случай, когда
х2 - одно\-бук\-вен\-ный терм, образованный переменной х7. Здесь
разбираются следующие подслу\-чаи:

\begin{enumerate}

\item Имеется информационный элемент (транслвыражения х7 $F$ $P$).
Тогда $P$ - про\-грамм\-ное выражение, дающее значение х7 в
формате $F$. Если этот фор\-мат совпадает с требуемым форматом х6,
либо хотя бы один из форматов не опре\-де\-лен (имеет вид
логического символа "объект"), то происходит выдача
ре\-зуль\-та\-та $P$. В случае, когда $F$ определен, а х6 - нет,
происходит кор\-рек\-ция набора х3 - указатель "вычисл(объект)" \
в нем заменяется на "вычисл($F$)". Это может позволить внешней
процедуре уточнить формат, в котором представ\-ле\-но
результирующее программное выражение. При рассогласовании
число\-вых форматов $F$ и х6 создается программное выражение,
конвертирующее значе\-ния $P$ требуемым образом.

\item х6 - шахматный формат "полефигуры" \ (координаты шахматного
поля). Тогда предпринимается обращение к процедуре
"прогрвыражение" \ для получе\-ния соответствующего х2
программного выражения х8 в формате "терм". Далее х8 переводится в
требуемый формат с помощью операторного выражения "числ\-набор".

\item Остаточный случай, в котором предпринимается попытка
получить зна\-че\-ние х2 в логическом формате и от него перейти к
числовому формату. Снача\-ла программной переменной х8
присваивается логический формат "вхожде\-ние". Если
обнаруживается, что для теоремной переменной х7 имелся указа\-тель
"заменазнака", то х8 заменяется на формат "терм". Далее с помощью
повторного обращения к процедуре "прогрвыражение" \ находится
программ\-ное выражение х9 для х2 в формате х8. Если использовался
формат "терм", то х9 корректируется на формат "вхождение". Затем в
компилируемую про\-грам\-му вставляется оператор, проверяющий, что
по вхождению х9 нахо\-дит\-ся десятичная запись числа. Этот
оператор не вводится, если из информацион\-но\-го элемента
(комментарии $\ldots$) видно, что в процессе идентификации
перемен\-ной х7 расположение по вхождению х9 десятичной записи уже
гаранти\-ро\-ва\-но. Наконец, в программу вводится оператор,
присваивающий новой программ\-ной переменной "начало(х4)" \
численное значение выражения по вхождению х9. Это значение
регистрируется в информационном элементе (транслвыражения
$\ldots$), и выполняется его преобразование в требуемый формат х6.

\end{enumerate}

\subsubsection{Случай десятичной записи}

Если х2 - десятичная запись числа, то переменной х7 присваивается
данное чис\-ло. Затем строится программное выражение, переводящее
х7 в требуемый формат х6. В случае не определенного формата х6
происходит его доопределение как "вы\-числ(десчисло)".

\subsubsection{Случай константного однобуквенного терма}

Рассматриваются следующие подслучаи:

\begin{enumerate}

\item х2 - числовая константа "е" \ либо "пи". Тогда определяется
численное значе\-ние данной константы с точностью до 14 десятичных
знаков после запятой, кото\-рое переводится в формат х6.

\item х2 - единица измерения "м" \ либо "сек". Она преобразуется
при вычисле\-ни\-ях в числовую константу 1.

\item х2 - символ "текпозиция" \ при х6 = "шахматы". Создается
программное выра\-же\-ние для шахматной позиции, определяемой
текущей задачей.

\item х2 - символ "свой" \ либо "чужой", понимаемый в задаче на
выбор хода в шах\-ма\-тах как указатель цвета своих либо чужих
фигур. Создается соответствую\-щее программное выражение,
определяющее цвет фигур по текущей задаче.

\item В остальных случаях результатом служит сам логический символ
х2.

\end{enumerate}

\subsubsection{Условное выражение}

После контрольной точки "прием(27)" \ рассматривается случай,
когда х2 име\-ет вид "вариант($B$ $t_1$ $t_2$)". Здесь $B$ - терм
теоремного уровня, который должен компи\-ли\-ро\-вать\-ся с
помощью установки на идентификацию (программа $\ldots$), т.е. так
же, как компилируются программно реализуемые антецеденты. Для
обработки его соз\-да\-ет\-ся вспомогательный программный блок х8.
После обращения к процедуре "иден\-ти\-фи\-ка\-тор" \ в блоке х8
формируется программа, проверяющая условие $B$. Она
группи\-ру\-ет\-ся в конъюнкцию операторов х12, причем по всем
новым программным переменным на нее навешивается квантор
существования. Далее находятся программные выраже\-ния х13, х14
для $t_1,t_2$, и выдается операторное выражение "вариант(х12 х13
х14)".

\subsubsection{Конкатенация}

После контрольной точки "прием(28)" \ рассматривается случай,
когда х2 имеет вид "конкатенация($t_1 \ldots t_n$)". Определяется
список х8 программных выражений для под\-наборов $t_1, \ldots,
t_n$, и по нему строится результирующее выражение.

\subsubsection{Набор}

После контрольной точки "прием(29)" \ рассматривается случай,
когда х2 имеет вид "набор($t_1 \ldots t_n$)". Если формат х6 не
имеет вида "набор($t$)", определяющего формат $t$ элементов
набора, то определяется список х8 программных выражений для
эле\-мен\-тов в неопределенном формате "вычисл(объект)". Иначе
программные выра\-же\-ния для элементов определяются в формате
$t$. В обоих случаях по х8 стро\-ит\-ся результирующее выражение
"набор($\ldots$)".

\subsubsection{Вектор}

После контрольной точки "прием(61)" \ рассматривается случай,
когда х2 имеет вид "Матрица($B$ $n$ 1)", а х6 - вид "вектор($t$)".
Такой формат означает пред\-став\-ле\-ние числового вектора в
машинном формате $t$. Для представления используется пара ($M$
$N$), где $M$ - ссылка на числовой массив; $N$ - число разрядов
вектора в формате "целое со знаком". Фактически реализуется
переход от задания вектора с помощью числового массива $M$ к
заданию его в виде пары ($M$ $N$). Программное выраже\-ние $M'$
для $M$ берется из информационного элемента (транслвыражения $B$
массив($t$) $M'$); выражение для $N$ находится по $n$ с помощью
обращения к процедуре "прогр\-вы\-ра\-же\-ние".

\subsubsection{Описатель "класс" \ }

Случай, когда х2 имеет вид "класс($x_1 \ldots x_n \ B(x_1 \ldots \
x_n)$)" , разбивается на два под\-слу\-чая:

\begin{enumerate}

\item Утверждение $B(x_1 \ \ldots \ x_n)$ представляет собой
конъюнкцию программно ре\-али\-зу\-е\-мых условий, определяющих
перечисление допустимых значений пере\-мен\-ных $x_1, \ldots, x_n$
без использования вспомогательных параметров. Этот случай
рассматривается после кон\-троль\-ной точки "прием(31)".
Переменной х8 при\-сва\-и\-ва\-ет\-ся набор конъюнк\-тив\-ных
членов утверждения $B(x_1 \ \ldots \ x_n)$. Вводится
вспомогательный программ\-ный блок х9 для компиляции элементов
списка х8. После применения к блоку х9 процедуры "идентификатор" \
из него извлекается конъюнкция х13 опера\-то\-ров, реализующих
необходимое перечисление. От\-но\-си\-тель\-но х9
опре\-де\-ля\-ет\-ся программное выражение х17 для набора текущих
значений переменных $x_1, \ldots, x_n$. Если $n=1$, то выражение
х17 определя\-ет значение единственной пере\-мен\-ной, а не
набора. Наконец, по х13 и х17 формируется результирующее
выра\-же\-ние "выписка($\ldots$)".

\item Утверждение $B(x_1 \ \ldots x_n)$ задает условия на
переменные $x_1, \ldots, x_n$ с помо\-щью вспомогательных
параметров. Содержащие эти вспомогательные парамет\-ры утверждения
сгруппированы внутри $B(\ldots)$ под общим квантором
сущест\-во\-ва\-ния. Фактически в компиляторе рассматривается
только случай $n = 1$. При этом утверждение $B(x_1)$ имеет вид
"и(существует($y_1 \ldots y_m$ и(равно($x_1 \ t$) принадлежит($Y \
s$) $C$))$D(x_1)$)", где $y_1, \ldots, y_m$ - вспомогательные
пара\-мет\-ры; "принадлежит($Y \ s$)" \ - утверждение,
инициирующее перечисление вспо\-мо\-га\-тель\-ных параметров путем
просмотра некоторого известного спи\-ска $s$; $C$ - утверждения,
доопределяющие вспомогательные параметры и проверя\-ю\-щие их
допустимость; $D(x_1)$ - дополнительные ограничения на
регистрируемые в результирующем списке значения $x_1$.

Рассмотрение данного случая начинается с контрольной точки
"прием(45)". Программной переменной х8 присваивается теоремная
переменная $x_1$. Вхож\-де\-ние квантора существования в
консеквент теоремы приема присваива\-ет\-ся переменной х10; список
параметров $y_1, \ldots, y_m$ - переменной х11. Список
конъ\-юнк\-тив\-ных членов утверждения под квантором существования
присваи\-ва\-ет\-ся переменной х12. В нем находится равенство х13,
выражающее переменную $x_1$ через вспомогательные параметры.

Далее инициируются нулевые значения переменных х16, х17, х18.
Присвое\-ние фактических значений этим переменным происходит после
контроль\-ной точки "прием(46)". Сначала в списке х12 находится
утверждение х19 вида "принадлежит($Y \ s$)". Компиляция происходит
лишь в тех случаях, когда $Y$ - либо вспомогательный параметр
$y_i$, либо имеет вид $y_i(R)$, где все перемен\-ные внутри $R$
уже идентифицированы. Последний случай обычно означает, что
вспомогательный параметр $y_i$ представляет собой некоторую
рекур\-сив\-но определяемую последовательность, а $y_i(R)$ - ее
первый член. Тогда вводит\-ся новая переменная $y'$, которая будет
идентифицироваться в процессе про\-смот\-ра списка $s$; для учета
ее связи с $y_i$ в накопителе х21 сохраняется равенст\-во "$y_i(R)
= y'$. В обоих случаях программной переменной х16
присваива\-ет\-ся переменная, по которой ведется просмотр списка
$s$ ($y_i$ либо введенная во вто\-ром случае переменная $y'$), а
переменной х17 - терм $s$. Будем далее обозначать варьируемую
переменную х16 через $y$. х18 становится равно остатку списка х12
после исключения из него утверждений х13 и х19, пополненному
равенст\-вом для $y'$ (если оно есть). Далее - откат к переходу
через "ветвь 3".

После контрольной точки "прием(47)" \ проверяется, что х16 было
опреде\-ле\-но, т.е. утверждение х19 имело указанный выше
допустимый вид. Затем перемен\-ной х19 присваивается переменная
компилируемой программы, которая играет роль накопителя
результата. Вводится оператор, инициализирующий х19 пус\-тым
словом. Здесь компиляция разветвляется.

\begin{enumerate}

\item После контрольной точки "прием(48)" \ рассматривается
случай, в кото\-ром $s$ имеет вид "номера($N_1 \ N_2$)", т.е.
перечисление ведется по задан\-но\-му отрезку целых чисел.
Переменным х21 и х22 присваиваются программ\-ные выражения для
$N_1 - 1$ и $N_2$ соответственно. В компилируемую програм\-му
заносятся операторы, присваивающие эти значения двум новым
пе\-ре\-мен\-ным. Первая из них используется как указатель
текущего значения из $s$ ; вторая - как указатель максимального
значения из $s$. Заме\-тим, что первая переменная (она
обозначается далее как х23) уменьшена на единицу; это происходит
из-за того, что увеличение ее значения в цик\-ле будет выполняться
до ее использования.

Чтобы упростить вычисления, связанные с шагом цикла, внутри
равенст\-ва х13 и утверждений списка х18 находятся все
подвыражения вида $a+by$, где $a,b$ не содержат $y$. Для каждого
такого подвыражения вво\-дит\-ся своя новая переменная $x$,
которая будет инициироваться и изменять\-ся в цикле независимо от
других. Все вхождения подвыражений $a+by$ в х13 и х18 заменяются
на такие переменные $x$. Переменной х25 снача\-ла присваивается
список троек ($x$ $a$ $b$). После контрольной точки "прием(49)" \
вторые и третьи компоненты троек списка х25 заменяются на
про\-грамм\-ные выражения. Первое из них инициирует $x$, второе -
дает шаг измене\-ния $x$. Как и в случае основной варьируемой
переменной $y$, инициали\-за\-ция происходит с учетом того, что
увеличение значения $x$ в цикле выполня\-ет\-ся до его
использования. Заметим, что пока данная ветвь компиля\-то\-ра
ориентирована только на вычисления в формате "с плавающей
за\-пя\-той" \ (своим возникновением она обязана рассмотрению
задач на програм\-ми\-ро\-ва\-ние процедур численного решения
дифференциальных уравнений).

После контрольной точки "прием(50)" \ вводится список х26
про\-грамм\-ных переменных, хранящих текущие значения параметров
списка х25. В ком\-пи\-ли\-руемую программу заносятся операторы,
инициирующие эти пере\-мен\-ные.

После контрольной точки "прием(51)" \ вводится оператор
"повторе\-ние", представляющий собой точку отката к началу цикла.
Сразу после него размещаются операторы, увеличивающие значения
переменной $y$ и па\-ра\-мет\-ров списка х25. Затем размещается
оператор, проверяющий, что $y$ не превосходит максимально
допустимого значения. После него вставляется вспомогательный терм
"иначе(фикс)", который впоследствии будет пре\-об\-ра\-зо\-ван в
оператор перехода.

После контрольной точки "прием(52)" \ вводится вспомогательный
про\-грам\-м\-ный блок х27 для компиляции шага цикла. Затем
происходит об\-ра\-ще\-ние к процедуре "идентификатор",
выполняющей эту компиляцию. Пере\-мен\-ной х31 присваивается
программное выражение для вычисления зна\-че\-ния выражения $t$ -
правой части равенства х13. Ветвь для обработ\-ки дополительного
условия $D(x_1)$ на найденное текущее значение $x_1$ в компиляторе
лишь обозначена - на рассматривавшихся примерах надоб\-нос\-ти в
ней не возникало. После контрольной точки "прием(53)" \
вво\-дит\-ся оператор, регистрирующий текущее значение $x_1$ в
накопителе х19, а завершается программа оператором "продолжение",
обеспечивающим про\-дол\-жение перечисления. Наконец, происходит
подключение программы вспомогательного блока х27 к программе
основного блока х4. Здесь же введенный ранее вспомогательный терм
"иначе(фикс)", соответст\-ву\-ю\-щий переходу по завершении цикла,
преобразуется в оператор "иначе($\ldots$)", ссылающийся на
добавленный в конце программы блока х4 новый пус\-той фрагмент.
Далее происходит выдача результата - программ\-но\-го
вы\-ра\-же\-ния х19 для накопителя значений $x_1$.

\item После контрольной точки "прием(55)" \ рассматривается
случай, когда $s$ - переменная, имеющая своим значением ранее
идентифицированное ко\-неч\-ное множество. Это множество
определяется программным выражением $P$ из информационного
элемента (транслвыражения $s$ $h$ $P$). Указатель ти\-па значения
$h$ имеет вид "класс($p$)", т.е. множество представлено как
на\-бор своих элементов. Данный случай компилируется значительно
проще, чем предыдущий. Перечисление здесь реализуется не по схеме
"инициали\-за\-ция значений параметров и последующие итеративные
их изменения", а с помощью перечисляющего оператора ЛОСа "входит".
Для реа\-ли\-за\-ции утверждений "остаточного" \ списка х18
создается вспомога\-тель\-ный программный блок х24. После
контрольной точки "прием(57)" \ выполня\-ет\-ся обращение к
процедуре "идентификатор", создающей программу об\-ра\-бот\-ки
этих утверждений. Переменной х29 присваивается программ\-ное
выражение для вычисления правой части $t$ равенства х13. Для учета
до\-пол\-ни\-тельных ограничений $D(x_1)$ (если они есть, т.е. х9
не равно х10) сно\-ва предпринимается обращение к процедуре
"идентификатор", дополня\-ю\-щей программу блока х24 проверяющими
данные ограничения операторами. В конце программы блока х24
вводится оператор, пополняющий накопи\-тель х19 текущим значением
$x_1$, а также оператор "продолжение". Дальней\-шие действия
аналогичны случаю перечисления по отрезку целых чисел.

\end{enumerate}

\end{enumerate}

\subsubsection{Конечная таблица}

Если х2 имеет вид "отображение($x$ $\exists_i(i \in \{0, \ldots ,
n\} \ \& \ x = a+bi)$ $f(x)$)", а тип данных х6 - вид
"набор($r$)", то результат компиляции должен представлять со\-бой
программное выражение для массива значений $f(a+bi)$ для $i= 0,1,
\ldots, n$, представленных в машинном числовом формате $r$.
Обработка данного случая на\-чи\-на\-ется с контрольной точки
"прием(34)". Переменной х7 присваивается формат $r$; переменной х8
- переменная $x$; переменной х10 - переменная $i$. Теоремные
вы\-ра\-же\-ния $a,b$ присваиваются, соответственно, переменным
х16 и х17. Затем соз\-да\-ют\-ся программные выражение х18 и х19
для начала и конца промежутка из\-ме\-не\-ния индекса $i$, а также
программные выражения х20 и х21 для значений $a,b$. В
компилируемую программу заносится оператор, определяющий длину
результи\-ру\-ю\-ще\-го массива, а также оператор, выделяющий
память для этого массива. Ини\-циа\-ли\-зи\-ру\-ют\-ся изменяемые
в цикле значения $x,i$; величина х21 шага измене\-ния $x$
присваивается отдельной программной переменной. Затем размещается
опера\-тор "повторение", представляющий собой начало цикла
заполнения массива. Для ком\-пи\-ля\-ции операторов,
обеспечивающих вычисление значения $f(x)$, создается
вспо\-мо\-га\-тель\-ный программный блок х22. Программное
выражение, вычисляющее значе\-ние $f(x)$, присваивается переменной
х23. Операторы из блока х22 переносятся в теку\-щий блок х4, после
чего помещается группа операторов, завершающих шаг цик\-ла: запись
текущего значения в массив, проверка окончания и коррекция
значений $x,i$. По окончании цикла управление передается на новый
пустой фрагмент програм\-мы, размещаемый в конце списка фрагментов
блока х4.

\subsubsection{Конечная сумма}

Если х2 содержит конечную сумму $\sum_{i=m}^n a(i)$, то создается
программа для вы\-чис\-ле\-ния этой суммы в формате "с плавающей
запятой" \ либо "целое со знаком". Ука\-зан\-ная сумма в
логической записи представляет собой терм
"суммавсех(отображение($i$ и(целое($i$)меньшеилиравно($m$
$i$)меньшеилиравно($i$ $n$))$a(i)$))".

Обработка данного случая начинается после контрольной точки
"при\-ем(39)". Внутри х2 усматривается вхождение х7 конечной суммы
указанного вида. Про\-ве\-ря\-ет\-ся, что ни одна из свободных
переменных этой суммы не связана внешним кван\-то\-ром или
описателем. В противном случае ее обработка откладывается до
устра\-не\-ния внешних связывающих символов. Выражение х2 будет
компилироваться в два эта\-па: сначала определится значение
выделенной конечной суммы, затем в х2 вместо этой суммы будет
подставлена новая переменная с известным значением, и к
результа\-ту подстановки снова будет применена процедура
"прогрвыражение", которая и даст окончательный результат.

Переменной х8 присваивается вхождение символа "отображение"; х10 -
индекс суммирования $i$; х16, х17 - выражения $m,n$; х18 -
суммируемое выражение $a(i)$. Пос\-ле контрольной точки
"прием(40)" \ предпринимается выделение в х18 под\-вы\-ра\-же\-ний
вида $a+bi$, заменяемых на вспомогательные переменные, изменяемые
в цикле суммирования каждая со своим шагом $b$. Одновременно с
преобразова\-ни\-ем терма х18 составляется список х19 пар
$((a,b),x)$, где $x$ - вспомогательная перемен\-ная,
соответствующая значениям $a,b$. Переменным х20 и х21
присваиваются про\-грамм\-ные выражения для границ суммирования
$m,n$, представленные в машинном фор\-ма\-те "целое со знаком".

Далее вводится список х22 форматов, в которых будут представляться
значения вспомогательных переменных $x$. По умолчанию выбирается
формат "с плавающей запятой", но в тех случаях, когда видно, что
переменная используется как индекс массива, этот формат заменяется
на "целое со знаком". После контрольной точки "прием(41)" \
создается набор х23 программных выражений для инициализации
вспо\-мо\-га\-тельных переменных, а после контрольной точки
"прием(42)" \ - набор про\-грамм\-ных выражений для шага изменения
вспомогательных переменных. Затем пе\-ре\-мен\-ной х25
присваивается программная переменная $X$, значением которой будет
слу\-жить индекс $i$, и вводится список х26 программных переменных
для текущих зна\-че\-ний вспомогательных переменных. Накопителем
суммы будет служить пере\-мен\-ная, номер которой на единицу
больше номера переменной $X$.

В компилируемую программу заносятся операторы инициализации цикла:
при\-сво\-е\-ние исходного значения переменной $X$, присвоение
нуля накопителю сум\-мы, присвоение начальных значений переменным
списка х26, оператор "ветвь" \ для про\-должения вычислений по
завершении цикла суммирования, и оператор "повторе\-ние" \ для
откатов к очередному шагу цикла. В текущий программный блок х4
за\-но\-сят\-ся информационные элементы, задающие идентификацию
определенной пос\-ле инициализации переменной $i$, а также
вспомогательных переменных. Теперь все готово для определения
программного выражения, вычисляющего х18. Такое вы\-ра\-же\-ние
х29 и определяется путем повторного обращения к процедуре
"прогр\-вы\-ра\-же\-ние". Далее в компилируемую программу
вставляются операторы заверше\-ния шага цикла: контроль достижения
индексом $i$ максимального значения; коррекция накопителя суммы;
коррекции параметров цикла. Переход по завершении цик\-ла
организуется к фрагменту с оператором "обрыв", переводящим далее к
рас\-по\-ло\-жен\-но\-му перед началом цикла оператору "ветвь". В
свою очередь, этот опера\-тор приводит к новому пустому фрагменту
в конце накопителя фрагментов теку\-ще\-го программного блока х4.

Однако, после вычисления суммы компиляция выражения х2 еще не
за\-вер\-ше\-на. Для ее продолжения выбирается новая переменная
х33; определяется результат х34 замены в терме х2 вычисленной
суммы на эту переменную; вводится информа\-ци\-он\-ный элемент
(транслвыражения х33 $\ldots$), регистрирующий найденное
зна\-че\-ние суммы в программном блоке, и предпринимается
завершающее ком\-пи\-ля\-цию обращение к процедуре
"прогрвыражение" \ для х34.

\subsubsection{Использование информационного элемента
"выражение" \ }

Информационный элемент (выражение $t$ $r$ $P$) сохраняет ранее
найденное каким-либо способом программное выражение $P$ для
вычисления значений выражения $t$ в формате $r$. Если такой
элемент имеется, причем $t$ входит в компилируемый терм х2, то
можно упростить компиляцию, воспользовавшись программным
выражением $P$. Данный случай рассматривается начиная с
контрольной точки "прием(58)". Вы\-би\-ра\-ет\-ся новая переменная
х9; в программном блоке регистрируется информа\-ци\-он\-ный
элемент (транслвыражения х9 $r$ $P$), и находится результат х12
замены всех вхождений в х2 выражения $t$ на х9. Затем
компилируется х12.

\subsubsection{Матрица либо вектор, заданные описателем
"отображение" \ }

Если выражение х2 имеет вид "отображение($i$ $j$ и($i \in \{ 1,
\ldots ,m\}$ $j \in \{ 1, \ldots , m\}$) $a(i,j)$)" \ либо вид
"отображение($i$ $i \in \{1, \ldots , m \}$ $a(i)$)", т.е.
определяет, соответст\-вен\-но, матрицу либо вектор, причем
элементы этих матрицы или вектора иден\-ти\-фи\-ци\-ру\-ют\-ся с
константными числовыми термами, то для перехода к представлению х2
в вычислительном формате используются процедуры "конвертматр" \
либо "кон\-верт\-вект". Компиляция со вводом обращений к данным
процедурам начинается: для матриц - с контрольной точки
"прием(62)"; для векторов - с контрольной точки "прием(63)".
Программное выражение для матрицы либо вектора с констант\-ны\-ми
термами берется из информационного элемента (элементыматрицы
$\ldots$) или (вектор $\ldots$).

\subsubsection{Использование набора псевдокоманд}

Для вычисления значения числовой функции, заданной формулой в
базисе элемен\-тар\-ных функций, можно использовать оператор
"Выч(программа $N$ $r$ $m$)", ре\-али\-зу\-е\-мый за одно
обращение к интерпретатору ЛОСа. У этого оператора $N$ - на\-бор
псевдокоманд, кодирующих последовательность применений
элементарных операций к вход-выходным данным $r$ формата "с
плавающей запятой" \ и вход-выходным дан\-ным $m$ формата "целое
со знаком". Если к моменту компиляции выражения х2 уже имеется
информационный элемент (усмфункция $f$ $\ldots$), хранящий
программ\-ное выражение для набора псевдокоманд $N$, вычисляющих
некоторую функцию $f$, причем в х2 встречается подтермы $f(a)$, то
компилятор использует $N$ для вычис\-ле\-ния $f(a)$. Этот случай
рассматривается начиная с контрольной точки "прием(44)". После
регистрации в программе операторов, вычисляющих $f(a)$, выбирается
но\-вая переменная х16. В программный блок заносится
информационный элемент (транс\-л\-вы\-ражения х16 $\ldots$),
указывающий для х16 вычисленное значение $f(a)$. Затем
на\-хо\-дит\-ся результат х18 замены всех вхождений $f(a)$ в х2 на
переменную х16, и вы\-пол\-ня\-ет\-ся компиляция х18.

\subsubsection{Получение элемента матрицы либо массива}

Остаточные случаи компиляции выражения х2 вида "значение($f$ $n$)"
\ рассматри\-ва\-ют\-ся после контрольной точки "прием(32)".
Сначала рассматривается случай, ког\-да переменная $f$
идентифицирована с помощью информационного элемента
(эле\-мен\-тыматрицы $f$ $\ldots$), определяющего программное
выражение для набора на\-бо\-ров термов - элементов матрицы. Здесь
находятся программные выражения х10, х11 для номеров строки и
столбца элемента $f(n)$, и с их помощью создается программ\-ное
выражение, извлекающее нужное значение из набора наборов.

Затем рассматривается случай, когда $f$ идентифицирована с помощью
инфор\-ма\-ци\-онного элемента (транслвыражения $f$ $\ldots$),
причем значение ее вычислено в одном из форматов "матрица($t$)",
"вектор($t$)" \ или "массив($t$)". Во всех этих случа\-ях значение
$f(n)$ берется из известного массива, причем терм $n$ определяет
но\-мер элемента массива. Находится программное выражение х10 для
$n$, которое затем корректируется - либо с помощью информационного
элемента (сдвигнабора $\ldots$), указывающего величину смещения
$n$ по отношению к начинающейся с нуля ну\-ме\-ра\-ции элементов
массива, либо, в случае элемента (вектор $\ldots$), из х10 просто
вычитается единица. При необходимости уточняется входной формат
для х2 (по\-ла\-га\-ется равным $t$), и выдается программное
выражение, извлекающее из мас\-си\-ва нужный элемент.

\subsubsection{Создание набора псевдокоманд}

Если х2 представляет собой выражение, построенное из числовых
констант и пе\-ре\-мен\-ных только с помощью элементарных числовых
функций, причем нужно вы\-чис\-лить значение в формате "с
плавающей запятой", то в компилируемую про\-грам\-му вставляется
обращение к оператору "Выч(программа $\ldots$)". Этот оператор
исполь\-зу\-ет набор псевдокоманд, определяющих последовательность
действий при вычислении значения, и дает некоторое ускорения
вычислений на ЛОСе по срав\-не\-нию с цепочкой обращений к
операторным выражениям "выч", выполняющим те же действия.
Рассмотрение данного случая начинается после контрольной точки
"прием(33)". Сначала проверяется, не имеет ли х2 вида $f(a_1
\ldots a_n)$ где $n \le 2$, а каждое $a_i$ - либо переменная, либо
константа. В этом подслучае вместо набора псев\-до\-ко\-манд
используется одноразовое обращение к операторному выражению "выч".
Иначе (переход через "ветвь 2") происходят обращение к процедуре
"вычпрог", находящей программное выражение для указанного набора
псевдокоманд, и встав\-ка в программу оператора "Выч(программа
$\ldots$)". В тех случаях, когда рассматри\-ва\-ет\-ся константное
выражение, применяется процедура "вычконст", находящая его
приближенное значение непосредственно при компиляции.

\subsubsection{Вычисление значения элементарной числовой функции}

После контрольной точки "прием(59)" \ рассматривается случай, в
котором для вы\-чис\-ле\-ния значения элементарной числовой
функции в формате "с плавающей за\-пя\-той" \ применяется
обращение к операторному выражению "выч". После контроль\-ной
точки "прием(60)" \ аналогичные действия (но для существенно
меньшего спи\-ска операций) предпринимаются при вычислении в
формате "целое со знаком".

\subsubsection{Использование справочника "вычисл" \ }

Наконец, после контрольной точки "прием(8)" \ реализуется попытка
исполь\-зо\-вать для компиляции х2 справочник "вычисл". Этот
справочник уже встречался выше в описании процедуры
"идентификатор", где он применялся для обработки про\-грамм\-но
реализуемых утверждений. Если для обработки утверждений
специаль\-ного вида в заданных форматах вход-выходных данных была
создана своя програм\-ма, то справочник "вычисл" \ дает ссылку на
нее. Аналогичным образом этот спра\-воч\-ник применяется и для
реализации выражений. Тогда в теореме приема "вычисл" \ помещается
указатель "выход($t$)", означающий, что реализуется выражение, и
$t$ - формат данных результата. Так как схема компиляции здесь
похожа на схему, уже приведенную в описании процедуры
"идентификатор", то мы ее опускаем.

\subsection{Особые случаи компиляции}

Перед основной частью процедуры "прогрвыражение", ориентированной
на по\-лу\-че\-ние результата в одном из логических форматов
(терм, вхождение в терм, сим\-вол), располагается ветвь,
обрабатывающая ряд особых случаев, в основном, относя\-щих\-ся к
нелогическим типам данных. Некоторые из используемых здесь
указателей ти\-пов представляют собой устаревшие версии и
дублируют указатели "вычисл($\ldots$)".


\subsubsection{Указатель "выч" \ }

Этот указатель предназначен для получения результата в машинном
формате "с плавающей запятой". Он дублирует указатель
"вычисл(число)" \ и был исполь\-зо\-ван при компиляции вычислений,
сопровождающих построение эскиза чертежа в геометрических задачах.
Обработка его начинается после контрольной точки "при\-ем(2)". В
отличие от ветви, обрабатывающей указатель "вычисл(число)", здесь
не используется оператор "Выч(программа $\ldots$)", работающий с
набором псевдо\-ко\-манд, а значения элементарных функций
определяются с помощью операторного выра\-же\-ния "выч".

\subsubsection{Применение справочника "оператор" \ }

Если заголовок компилируемого выражения представляет собой
заголовок про\-грам\-мы ЛОСа для вычисления значения данного
выражения, то компиляция выполня\-ет\-ся с помощью справочника
"оператор" \ (контрольная точка "прием(6)"). Этот спра\-воч\-ник
определяет по заголовку выражения $f$ набор типов данных входных
пере\-мен\-ных его программы, а также тип значения результата (он
помещается в конце набора). Переменной х8 присваивается список
программных выражений для вход\-ных переменных, вычисленных в
требуемых форматах, и создается операторное выра\-же\-ние х10 для
обращения к программе $f$. Далее х10 корректируется в зависимости
от требуемого формата результата вычислений.

\subsubsection{Получение набора объектов}

После контрольной точки "прием(3)" \ рассматривается компиляция
выражения х2, значение которого должно представлять собой набор.
Если х2 - однобуквенный терм, состоящий из переменной х5, то
находится такой информационный элемент теку\-ще\-го программного
блока, который позволяет идентифицировать х5 в виде набора. Здесь
рассматриваются информационные элементы (наборпеременных
$\ldots$), (наборчле\-нов $\ldots$), (вектор $\ldots$). В первом
случае выдается выражение для набора переменных, в остальных - для
набора термов.

Если терм х2 выделен указателем "развертка", то компиляция
происходит ана\-ло\-гич\-но тому, как это делалось ранее. После
контрольной точки "прием(4)" \ опре\-де\-ля\-ют\-ся:
ассоциативно-коммутативная операция х7, которая будет соединять
по\-рож\-да\-е\-мые при развертке термы; шаблон общего члена х8, а
также пара теорем\-ных переменных (варьируемая при развертке
переменная $i$ - верхний предел ее зна\-че\-ний $n$). В качестве
нижнего предела берется 1. Если все вхождения индекса $i$ в шаблон
х8 располагаются только внутри подтермов вида $f(i)$ для одной и
той же функциональной переменной $f$, причем $n$ равно длине
набора х13, с которым идентифицирована $f$, то развертка
получается путем последовательной под\-ста\-нов\-ки вместо $f(i)$
в шаблон х8 элементов набора х13 (контрольная точка "прием(5)").
Иначе перечисление значений индекса $i$ при развертке
обеспечивается опера\-то\-ром "Номера".

Во всех прочих случаях для компиляции выражения х2 в формате
"набор" \ при\-ме\-ня\-ет\-ся справочник "прогрвыражение". Этот
справочник объединяет множест\-во специальных случаев компиляции,
соответствующих конкретным заголовкам вы\-ра\-же\-ния х2. Кроме
данной ветви, он используется также при обработке
рассмат\-ри\-ва\-е\-мо\-го ниже общего случая компиляции.

\subsection{Общий случай компиляции}

После контрольной точки "прием(10)" \ размещается основная ветвь
про\-грам\-мы, пред\-назначенная, главным образом, для получения
логических типов данных.

\subsubsection{Переменная}

Прежде всего, рассматривается случай, когда х2 - однобуквенный
терм, состоя\-щий из переменной х5. Началом этой ветви служит
контрольная точка "прием(11)". Если имеется указатель типа
значения "число", причем х5 идентифицируется по
ин\-фор\-ма\-ци\-он\-ному элементу (транслвыражения х5 $\ldots$
$t$), то выдается ответ - преобразован\-ное к формату десятичного
числа ЛОСа значение $t$. Иначе находится список х6 всех
информационных элементов $E$, идентифицирующих переменную х5.

Если имеется указатель типа результата "вхождение" \ или
"операнд", то вы\-пол\-ня\-ет\-ся преобразование программного
выражения для х5, извлекаемого из х6, к фор\-ма\-ту "вхождение". В
противном случае - проверяется наличие указателя "перемен\-ная" \
или "логсимвол". Здесь определяемое по х6 программное выражение
преобразу\-ет\-ся к формату отдельного символа. В остальных
случаях результат преобразуется к формату терма.

Наконец, при отсутствии идентифицирующего х5 информационного
элемента про\-ве\-ря\-ет\-ся наличие указателя приема,
определяющего выбор для х5 новой перемен\-ной. Если такой
указатель есть, то в компилируемую программу вводится опера\-тор
выбора новой для контекста срабатывания приема переменной.
Регистиру\-ет\-ся идентификация переменной х5, и выдается
программное выражение для но\-вой переменной либо однобуквенного
терма - в зависимости от указанных в наборе х3 требований.

\subsubsection{Служебный символ}

При компиляции служебного символа х2 рассматриваются следующие
подслучаи:

\begin{enumerate}

\item Символ "теквхожд". Этот символ обозначает подтерм,
идентифицируемый с тем термом теоремы, который содержит точку
привязки. Он определяется че\-рез информационный элемент
программного блока (корень $\ldots$) либо (теквхожд $\ldots$).
Первый используется для приема сканирования задачи, второй - для
па\-кет\-но\-го оператора.

\item Символ "корень". Этот символ обозначает терм задачи,
содержащий точ\-ку привязки, либо преобразуемый терм пакетного
оператора. В случае прие\-ма сканирования задачи определяется
через переменную сканирования х3, ссы\-ла\-ю\-щу\-юся на вхождение
текущего терма.

\item Символ "внешкорень". Ссылка на терм, обрабатываемый во
внешнем стэко\-вом кадре. Извлекается из информационного элемента
(внешкорень $\ldots$).

\item Символы "свой", "чужой" \ для цвета шахматных фигур.
Определяются через текущую задачу х1.

\item Символ "результат". Ссылка на ранее найденный заменяющий
терм. Опреде\-ля\-ет\-ся через информационный элемент (результат
$\ldots$).

\item Символ "фикс". х2 имеет вид "фикс($\ldots$)" \ и
представляет собой указатель вхож\-дения в теорему некоторого
подтерма $t$. Определяется программное выраже\-ние для вхождения
идентифицированного с $t$ подтерма $A$ либо самого подтерма $A$ (в
зависимости от указанного в х3 формата).

\item Символ "посылки". Обозначает список утверждений, относящихся
к контек\-сту применения приема. Программное выражение для него
определяется проце\-ду\-рой "посылки".

\item Символ "вход". Обозначает терм, передаваемый нормализатору
для обра\-бот\-ки. Используется при компиляции обращения к этому
нормализатору. Определя\-ет\-ся по информационному элементу
(нормализатор $\ldots$).

\item Символ "значение". х2 имеет вид "значение($f$ $t$)". Если
уже имеется информа\-ци\-он\-ный элемент (функция $f$ $t$
$\ldots$), то программное выражение для терма (либо вхождения),
идентифицированного с $f(t)$, берется непосредственно из этого
элемента. Иначе это программное выражение получается при помо\-щи
описываемой ниже процедуры "метаперевод".

\item Символ "модификатор". Обозначает остаток
неидентифицированных операн\-дов корневой
ассоциативно-коммутативной операции в приеме замены. По
ин\-фор\-ма\-ционному элементу (модификатор $x$) определяется
переменная $x$, вво\-ди\-мая перед компиляцией в теорему приема
для обозначения остатка корне\-вых операндов, и далее процедура
"прогрвыражение" \ определяет программ\-ное выражение для $x$ в
формате терма.

\item Символ "копия". х2 имеет вид "копия($t$)" \ и обозначает
теоремный терм $t$, кото\-рый должен строиться без применения к
нему указанных в описании прие\-ма нормализаторов. Для получения
искомого программного выражения исполь\-зу\-ет\-ся процедура
"метаперевод", применяемая к терму "фикс($t$)".

\item Символ "величина". х2 - десятичная запись числа. Выдается
программное вы\-ра\-же\-ние, значением которого служит это число в
формате десятичных чи\-сел ЛОСа.

\item Символ "логсимвол". х2 имеет вид "логсимвол($x$)", где $x$ -
переменная. Выда\-ет\-ся программное выражение для символа,
идентифицированного с $x$.

\end{enumerate}

\subsubsection{Обращение к справочнику "прогрвыражение" \ }

Для обработки прочих случаев используется справочник
"прогрвыражение". Ему передаются все входные значения процедуры
"прогрвыражение", причем логичес\-ким символом обращения служит
заголовок терма х2. Таким образом, расшире\-ние компилятора при
появлении новых заголовков операторных выражений ГЕНОЛОГа
происходит путем подключения новых процедур данного справочника.

\subsubsection{Логический символ, не являющийся служебным}

Логические символы, отличные от служебных, либо выдаются
непосредственно, либо (в зависимости от х3) преобразуются к
формату терма.

\section{Компиляция теоремных термов}

Чтобы получить программное выражение, значением которого является
терм, опре\-де\-ля\-е\-мый заданным подтермом теоремы приема после
идентификации его пере\-мен\-ных, используется процедура
"метаперевод". При построении программного вы\-ра\-же\-ния
учитываются указатели и нормализаторы приема. Отличие процедуры
"мета\-пере\-вод" \ от процедуры "прогрвыражение" \ состоит в том,
что там обрабатыва\-лись операторные выражения ГЕНОЛОГа, т.е.
термы "структурного уровня", здесь же рассматриваются подтермы
теоремы приема, т.е. термы "предметного уровня". Ис\-клю\-чение
составляли лишь обращения к процедуре "прогрвыражение" \ при
ком\-пи\-ля\-ции термов теоремного уровня в вычислительном
формате.

Операторное выражение "метаперевод(х1 х2)" \ имеет своими входными
па\-ра\-мет\-ра\-ми: теоремный терм х1, для которого нужно
построить программное выражение, а также программный блок х2. Если
внутри х1 размещена служебная конструкция "фикс($t$)", то символ
"фикс" \ отбрасывается, а $t$ компилируется без применения к нему
нормализаторов приема. В случае, когда терм $t$ должен
обрабатываться лишь первыми $k$ из имеющихся нормализаторов,
применяется запись "фикс($t$ $k$)".

Выйти на начало программы процедуры "метаперевод" \ можно через
пункт "Фор\-ми\-рование программного выражения для заданного
теоремного терма" \ оглавле\-ния программ.

\subsection{Развертка в дизъюнкцию квантора существования}

В начале процедуры рассматривается один редко встречающийся особый
случай - развертка квантора существования, выделенного указателем
приема "или", в ко\-неч\-ную дизъюнкцию. Обработка его происходит
после контрольной точки "прием(2)". Она начинается с обнаружения
информационного элемента (или х1 $A$ $B$). Здесь $A$ - терм
"набор($A_1 \ldots A_n$)", составленный из конъюнктивных членов
подквантор\-но\-го утверждения квантора существования х1,
определяющих перечисление значе\-ний переменных связывающей
приставки; $B$ - конъюнкция остальных членов
под\-кван\-тор\-но\-го утверждения, играющая роль шаблона
дизъюнктивного члена. Вво\-дит\-ся вспомогательный программный
блок х4, и с помощью процедуры "идентифика\-тор" \ в нем создается
программа для перечисления значений, удовлетворяющих условиям
$A_1, \ldots, A_n$. Последние обрабатываются как программно
реализуемые антеце\-ден\-ты. Затем относительно х4 находится
программное выражение х8 для терма $B$. С по\-мо\-щью программы
блока х4 создается терм "выписка($\ldots$)" \ для набора
дизъюнк\-тив\-ных членов, определяемых при перечислении значений
выражением $B$, и далее созда\-ет\-ся программное выражение х10
для искомой дизъюнкции.

\subsection{Учет нормализаторов}

После контрольной точки "прием(4)" \ начинается рассмотрение
нормализаторов, ко\-то\-рые должны применяться к теоремному терму
х1. Сначала здесь будет выполне\-но рекурсивное обращение к
процедуре "метаперевод" \ с заблокированным учетом
нор\-ма\-ли\-заторов, чтобы получить программное выражение,
определяющее х1 "в чис\-том виде", а затем будет
ком\-пи\-ли\-роваться обработка х1 нормализаторами.

Инициализируется нулем переменная х3. Если х1 имеет вид "фикс($t$
$k$)", то пе\-ре\-мен\-ной х3 переприсваивается значение $k$, а х1
в этом случае заменяется на $t$. Таким образом, далее ненулевое
значение х3 указывает на ограниченное приме\-не\-ние
нормализаторов. Если х1 имело вид "фикс($t$)", то вход в данную
ветвь вооб\-ще блокируется - нормализаторы здесь не вводятся.

Находится информационный элемент (быстрпреобр х1 $A$ $B$ $C$ $D$),
содержа\-щий информацию об обработке х1 нормализаторами. Здесь $A$
- список заголовков пакет\-ных нормализаторов и термов
"задача($\ldots$)", соответствующих обращениям к
вспо\-мо\-га\-тель\-ным задачам для преобразования х1. $B$ - набор
той же длины, что и $A$, элементы которого суть наборы программных
выражений для остальных вход\-ных переменных обращений к пакетным
нормализаторам. $C$ - набор той же длины, что и $A$, составленный
из сопровождающих обращения к нормализаторам указателей
"условие($\ldots$)", "вариант($\ldots$)", "лимит($\ldots$)". $D$ -
либо сигнализатор блокировки нор\-мализации (0 - нет блокировки, 1
- есть), либо программное выражение для ре\-зуль\-та\-та обработки
терма х1 нормализаторами. Информационные элементы (быстрпреобр
$\ldots$) формируются за\-бла\-го\-вре\-менно, по мере того, как
появляется возможность ком\-пи\-ляции выраже\-ний $B$. Для этого
служат обращения к процедуре "учетнорма\-ли\-за\-то\-ров" \ из
прочих бло\-ков компиляции, в основном из процедуры
"идентификатор".

Если ограниченная обработка нормализаторами не предусмотрена, а
результат $D$ уже имеется в найденном информационном элементе, то
он и выдается в качест\-ве ответа. Иначе - переход через "иначе
2". Здесь проверяется, что $D$ равно 0, и сразу же $D$ заменяется
на 1. Таким образом подготавливается блокировка обработки х1
нормализаторами при последующем рекурсивном обращении к процедуре
"мета\-пере\-вод".

\subsubsection{Учет цели "вспомописание" \ }

Если в наборе $A$ имеется указатель нормализации
"задача($\ldots$)", содержащий под\-терм "цель(вспомописание($y_1
\ldots y_m$))", то выполняются некоторые предвари\-тель\-ные
действия. В этом случае нормализатор определяет решение
вспомогательной зада\-чи на описание, условие которой получается
из утверждения х1 заменой подвыра\-же\-ний $Y_1, \ldots, Y_m$,
идентифицированных с переменными $y_1, \ldots , y_m$, на новые
пере\-мен\-ные $z_1, \ldots, z_m$ - неизвестные задачи. По
окончании решения применяется об\-рат\-ная замена $z_i$ на $Y_i$.

После контрольной точки "прием(29)" \ вводятся операторы,
выбирающие но\-вые переменные $z_1, \ldots, z_m$, и создается
информационный элемент (вспомописание $\ldots$), перечисляющий
программные переменные, значениями которых служат $z_1, \ldots,
z_m$. Переменной х5 при этом присваивается копия программного
блока х2, в кото\-рой исключены старые данные об идентификации
переменных $y_1, \ldots, y_m$, а вместо это\-го указана их
идентификация с $z_1, \ldots , z_m$. Далее - откат к переходу
через "ветвь 1" \ для продолжения основной линии компиляции.

\subsubsection{Компиляция с заблокированной нормализацией}

Переменной х6 присваивается программное выражение для теоремного
терма х1, не обработанного нормализаторами. Это выражение
получается путем рекурсив\-но\-го обращения к процедуре
"метаперевод". Указателем на блокировку нормализа\-ции служит
единица, помещенная в разряд $D$ информационного элемента
(быстрпре\-обр х1 $\ldots$). Компиляция выполняется с помощью
программного блока х5. После учета возможного отказа от компиляции
(х6 равно 0) предпринимается обраще\-ние к процедуре
"нормоператора", корректирующей номера связанных переменных в х6
так, чтобы они были не меньше номера первой неиспользуемой в
программном блоке х2 переменной. Вводится информационный элемент
(нормализатор х6); если элемент с таким заголовком уже имелся, то
его последний разряд заменяется на х6. Затем - переход через
"ветвь 2".

\subsubsection{Коррекция посылок нормализации}

Проверяется наличие информационного элемента (чисткапосылок х1 $y$
$T$). Такие элементы вводятся упомянутой выше процедурой
"учетнормализаторов". Они со\-про\-вож\-дают информационные
элементы (быстрпреобр х1 $\ldots$) и означают наличие указателя
нормализации "удалениепосылок($y$ $T$)". Последний определяет
от\-бра\-сы\-вание из списка посылок, передаваемых нормализаторам
при обработке х1, всех утверждений $y$, удовлетворяющих условию
$T$.

Происходит просмотр соответствующих друг другу вхождений х8 и х9 в
списки $A,B$ элемента (быстрпреобр х1 $A$ $B$ $C$ $D$). х10 -
текущий элемент списка $A$; х11 - текущий элемент списка $B$. Если
х10 является обращением к вспомогательной задаче либо к
нормализатору, имеющему список посылок, то предпринимается
коррекция программного выражения для списка посылок $S$,
расположенного на первой позиции набора х11. Для этого создается
вспомогательный программный блок х16, в котором размещается
оператор перечисления элементов $S$, и относительно которого далее
компилируется отрицание фильтра $T$. Таким образом получается
программа пере\-чис\-ле\-ния элементов $S$, не удовлетворяющих
условию $T$, и по ней создается про\-грамм\-ное выражение х21 для
скорректированного списка посылок, на которое и заменя\-ет\-ся
первый разряд набора х11. Затем - откат к переходу через "ветвь
1".

После контрольной точки "прием(55)" \ происходит учет указателей
нормализа\-ции "посылки($\ldots$)", определяющих дополнительные
посылки, используемые норма\-ли\-за\-то\-рами. Эти указатели
усматриваются через информационные элементы (посылки х1 $N$); $N$
- набор утверждений, добавляемых к посылкам. Переменной х8
присваива\-ет\-ся список программных выражений для элементов
списка $N$, и далее реализуется цикл просмотра наборов $A,B$ из
элемента (быстрпреобр х1 $\ldots$), аналогичный
предпри\-ня\-то\-му выше для элемента (чисткапосылок х1 $\ldots$).
Программные выражения для списка посылок, упоминаемые в $B$,
корректируются путем присоединения утвер\-жде\-ний списка х8.
Предусмотрена обработка служебного символа "одз", который мо\-жет
встретиться в $N$ и перейти в х8. Тогда присоединяются все
утверждения из облас\-ти допустимых значений терма х1. Последние
задаются программным выраже\-ни\-ем "Одз(х6)".

\subsubsection{Цикл обработки обращений к нормализаторам}

После контрольной точки "прием(41)" \ реализуется цикл просмотра
нормализато\-ров, упоминаемых в информационном элементе
(быстрпреобр х1 $A$ $B$ $C$ $D$). Перемен\-ной х7 присваивается
текущая позиция списка $A$; х8 - текущая позиция в $B$; х9 -
теку\-щая позиция в $C$. Если х3 отлично от 0, то проверяется, что
номер текущего элемента не превосходит х3.

Если текущий набор списка $C$ содержит элемент "лимит($\ldots$)",
то в компили\-ру\-е\-мую программу вводится соответствующий
оператор "лимит($\ldots$)". Если обра\-бот\-ка текущим
нормализатором будет занимать время, большее указанного в дан\-ном
операторе, то произойдет откат. По завершении компиляции обращения
к норма\-ли\-за\-то\-ру будет выполнен откат к "ветвь 2", где
произойдет вставка оператора "Обрыв", отменяющего контроль
трудоемкости применения нормализатора после получе\-ния
результата.

Далее - переход через "ветвь 3", где процесс компиляции
разветвляется. Рас\-смат\-ри\-ваются следующие случаи:

\begin{enumerate}

\item На позиции х7 расположен логический символ - название
некоторого пакет\-но\-го нормализатора $f$ (контрольная точка
"прием(48)"). Тогда переменной х10 присваивается оператор для
обработки нормализатором $f$ текущего терма. Его первым операндом
служит программное выражение х6 (текущий терм), прочие операнды
берутся из набора по вхождению х8. После коррекции обраще\-ния х10
для редко встречающейся ситуации компиляции приемов вывода теорем
- переход через "ветвь 2".

Здесь выполняется такое переобозначение связанных переменных
опера\-то\-ра х10, чтобы их номера были не меньше номера первой
неиспользуемой про\-грамм\-ной переменной блока х2.

Затем происходит учет информационного элемента (нормусм $P$ $Q$).
У него $P$ - некоторое утверждение; $Q$ - программное выражение
для результата обработ\-ки $P$ указанными в приеме
нормализаторами. Если обращение к нормализа\-то\-ру сопровождалось
вводом дополнительных посылок, одна из которых совпадает с
утверждением $P$ либо его отрицанием, то предпринимается контроль
лож\-нос\-ти этой посылки. Для этого х10 заменяется на условное
выражение "вариант($\ldots$)", анализирующее заголовок
утверждения, являющегося значением $Q$. Если этот заголовок -
логическая константа, для которой дополнительная посылка име\-ет
значение "ложь", то значением условного выражения становится
кон\-стан\-та "ложь", иначе - сохраняется значение х10. Смысл
преобразования х10 состоит в экономии на обращениях к пакетным
нормализаторам, если согласно контек\-сту они не требуются. Так
может случаться при компиляции дизъюнкций и условных выражений.

Далее - переход через "ветвь 1" \ и обращение к справочнику
"быстрпре\-обр" \ для определения формата х11 нормализатора $f$.
Здесь происходит еще одно разветвление компиляции.

Сначала рассматривается случай, в котором формат х11 содержит
эле\-мент "коррекцияпосылок". Этот элемент означает, что
нормализатор использует ком\-ментарий (коррекцияпосылок $M$),
сохраняющий информацию об утвержде\-ни\-ях, выведенных из посылок
нормализатора при его применении. Такие посылки могут возникать
для поддержания сопровождения по о.д.з. преобразуе\-мо\-го терма.
В свою очередь, далее подслучай разбивается на два - сначала
рас\-смат\-ри\-вается случай компиляции приема нормализатора,
затем - компиля\-ция приемов других типов. Начнем с рассмотрения
первого из них.

Если текущий набор списка $C$ не содержит элементов
"условие($\ldots$)", "вари\-ант($\ldots$)", "фильтр($\ldots$)",
управляющих обращениями к нормализатору в за\-ви\-си\-мости от
внешних обстоятельств, то происходит лишь ввод оператора,
кор\-рек\-тирующего список посылок нормализатора с помощью
процедуры "кор\-рек\-цияпосылок". Последняя выполняется на основе
содержимого коммента\-рия (коррекцияпосылок $\ldots$), в котором к
данному моменту компиляции уже содержатся те новые посылки,
которые должен ввести прием.

Если же текущий набор списка $C$ содержит элемент одного из
указанных ти\-пов, то переход через "иначе 4". Здесь происходит
просмотр элементов х16 спи\-ска $C$, имеющих заголовки "фильтр",
"условие", "вариант". Первый терм любо\-го такого элемента
представляет собой некоторое условие $U$ на текущий кон\-текст,
заданное на языке фильтров приема. Переменной х17 присваивается
опера\-тор, проверяющий данное условие.

Если х16 имеет заголовок "фильтр", то х17 заносится в
компилируемую прог\-рам\-му, блокируя применение приема при
нарушении условия.

Если х16 имеет заголовок "условие", то в программу заносится
оператор, при\-сва\-и\-вающий при выполнении условия $U$ новой
программной переменной $X$ нормализованное значение х10 и
корректирующий в этом случае список по\-сы\-лок, а иначе -
передающий $X$ старое значение х6, минуя обращение к
норма\-ли\-за\-то\-ру. Затем переменной х10 переприсваивается $X$.

Если х16 имеет заголовок "вариант", то находится программное
выраже\-ние х20 для обращения к другому нормализатору, которое
будет выполняться при выполнении условия $U$. Далее в
компилируемую программу заносятся: опера\-тор, присваивающий новой
переменной $X$ значение условного выражения,
об\-ра\-ща\-ю\-ще\-гося к нужному нормализатору в зависимости от
$U$, и оператор, вы\-пол\-ня\-ю\-щий коррекцию посылок.

\par \medskip

Если х11 не имеет элемента "коррекцияпосылок" \ либо компилируемый
при\-ем не является приемом нормализатора, то выполняются другие
ветви, на\-чи\-на\-ю\-щи\-е\-ся, соответственно, с перехода через
"иначе 2" \ и "иначе 3". Дейст\-вия здесь аналогичны разборанным
выше, но проще: не рассматривается слу\-чай заголовка "фильтр" \ и
не выполняются коррекции посылок.

\par \medskip

По завершении рассмотрения указанных выше альтернатив - переход
че\-рез "ветвь 1", расположенную непосредственно перед присвоением
значения пе\-ре\-мен\-ной х11.

Сначала здесь проверяется наличие указателя приема
"различны($\ldots$)", тре\-бу\-ю\-ще\-го, чтобы текущий
нормализатор $f$ изменял подаваемый на него терм. Если такой
указатель есть, то в компилируемую программу вставляется
опе\-ра\-тор, проверяющий различие значений х10 (после
преобразования) и х6 (до преобразования).

В заключение текущего шага цикла переменной х6 переприсваивается
зна\-че\-ние х10. Если выражение х10 оказывается чрезмерно
длинным, то для него вводится вспомогательная переменная. Затем
корректируется информа\-ци\-он\-ный элемент (нормализатор х6) -
соответственно изменению х6, и откат к про\-дол\-же\-нию цикла
просмотра нормализаторов.

\item На позиции х7 расположен терм "задача($A_1 \ldots A_n$)",
определяющий обраще\-ние к вспомогательной задаче для
преобразования текущего терма х6 (контроль\-ная точка
"прием(40)"). Этот терм присваивается переменной х10; перемен\-ной
х11 присваивается текущий набор списка $B$. Для обращения к
вспомога\-тель\-ной задаче из приема сканирования задачи будут
использоваться процедуры "преобразование" \ и "вспомописа\-ние".
Первая из них создает вспомогательную задачу на преобразование,
вторая - применяется, если некоторое $A_i$ имеет вид
"тип(описать)", и создает задачу на описание. Если обращение
происходит из пакетного оператора, то берутся упрощенные версии -
"вспомпреобразование" \ и "быстрописание". Таким образом, основную
часть обработки текущего нор\-ма\-ли\-за\-то\-ра составляет
компиляция входных данных для указанных про\-це\-дур.

Переменной х12 присваивается накопитель программных выражений для
пост\-ро\-е\-ния списка целей вспомогательной задачи. Кроме
собственно целей, в нем будут использоваться также специальные
информационные элементы, вос\-при\-ни\-ма\-е\-мые процедурами,
выполняющими создание и решение вспомогательной задачи. Накопитель
пред\-став\-ляет собой пару: первым элементом ее служит набор
программных вы\-ра\-же\-ний для отдельных целей задачи; вторым
элемен\-том - набор про\-грамм\-ных выражений для групп целей.
Сначала в накопи\-те\-ле регистрируется эле\-мент
(уровеньобращения $A_1$).

Далее происходит просмотр элементов $A_i$, определяющих цели и
коммен\-та\-рии задачи. Текущий такой элемент присвоен переменной
х13. Элементы с заголовками "коррекцияпосылок", "тип", "посылка" \
в этом просмотре про\-пус\-ка\-ют\-ся. В зависимости от заголовка
$A_i$, рассматриваются следующие под\-слу\-чаи:

\begin{enumerate}

\item Элемент $A_i$ имеет вид "цель($C$)". Тогда предпринимается
обращение к справочнику "подцель" \ на логическом символе -
заголовке $C$. Спра\-воч\-ник определяет пару, первый элемент
которой - программное выражение для отдельной цели вспомогательной
задачи либо для группы целей; второй элемент - указатель типа
первого элемента (1 - отдельная цель, 2 - группа целей).
Соответственно, пополняется первый или второй набор накопи\-те\-ля
х12.

\item Элемент $A_i$ имеет вид "комментарий(условие($U$)$K_1 \ldots
K_m$)". Терм "ус\-ло\-вие($U$)" \ определяет условие, при
выполнении которого новая задача дол\-жна снабжаться комментарием
($K_1 \ldots K_m$). Этот терм может отсут\-ство\-вать. В х12
комментарий $S$ регистрируется как программное выра\-же\-ние для
пары (комментарий $S$).Если комментарий начинается с символа
"титр", т.е. используется для текстового сопровождения процесса
решения, то про\-граммное выражение х18 для него создается
процедурой "транститр". Ина\-че происходит раздельное рассмотрение
случаев наличия либо отсут\-ст\-вия терма "условие($\ldots$)".
Операторы для проверки условия $U$ опреде\-ля\-ют\-ся процедурой
"фильтр"; программное выражение для коммен\-та\-рия находится при
помощи процедуры "транскоммент".

\item Прочие элементы $A_i$ рассматриваются как термы "теоремного"
\ уровня и регистрируются в х12 после применения к ним процедуры
"метаперевод". Исключение составляют однобуквенные термы, которые
переносятся в х12 непосредственно.

\end{enumerate}

По окончании цикла обработки элементов $A_i$ - переход через
"иначе 2". Здесь происходит регистрация в накопителе х12
комментария (коррекцияпосылок $\ldots$), если такой комментарий
уже был введен на предыдущих этапах компиляции. Затем компиляция
разветвляется. Если создается программа приема пакетного
оператора, то в нее заносится обращение к процедуре
"быстрописание" \ либо "вспомпреобразование". Если создается
программа приема вывода теорем, то аналогичным образом
используются процедуры "Вспомописание" \ и
"вспом\-преобразование". Наконец, для приема сканирования задачи
применяются об\-ра\-щения к процедурам "вспомописание" \ и
"преобразование". Во всех этих слу\-ча\-ях х6 заменяется на
результат обращения к процедуре, и далее - откат к следующему шагу
цикла просмотра нормализаторов.

\item Элемент $A_i$ представляет собой переменную, значением
которой служит наз\-ва\-ние применяемого нормализатора. Эта
возможность используется крайне редко - только в приемах вывода
теорем. С помощью процедуры "прогрвыраже\-ние" \ определяется
программное выражение х11 для названия нормализатора;
со\-з\-да\-ется программное выражение х12 для обращения к
нормализатору, и х6 заменяется на х12.

\end{enumerate}

\subsubsection{Завершение цикла обработки терма нормализаторами}

По окончании цикла просмотра нормализаторов выполняются два
несложных до\-пол\-ни\-тель\-ных преобразования. Во-первых,
проверяется наличие информа\-ци\-он\-ных элементов (свертка
$\ldots$), определяющих выполнение некоторой подстановки в
ре\-зуль\-ти\-ру\-ющий терм. Если эти элементы есть, причем
текущее обращение к проце\-ду\-ре "метаперевод" \ не является
внутренним звеном цепи рекурсивных обраще\-ний к этой же
процедуре, то х6 заменяется на результат применения к х6
соот\-вет\-ству\-ю\-щей подстановки. Во-вторых, если компилируемый
терм является заменяю\-щим термом приема и имеются информационные
элементы (учетзнака $\ldots$), (знаксуммы $\ldots$), указывающие,
что нужна коррекция знака терма, то вводится обраще\-ние к
процедуре "измзнака", обеспечивающей эту коррекцию. Затем выдается
резуль\-тат компиляции х6.

\par \medskip  Далее продолжается рассмотрение той ветви процедуры
"метаперевод", которая обеспечивает получение программного
выражения для терма х1 до его нормализа\-ции. Переход к этой ветви
- через оператор "ветвь 1", расположенный перед кон\-троль\-ной
точкой "прием(4)". Сразу же здесь вводится индикатор х3 заголовка
"фикс" \ терма х1, после чего заголовок "фикс" \ (если он есть)
отбрасывается.

\subsection{Случай однобуквенного терма}

После контрольной точки "прием(5)" \ рассматривается случай
однобуквенного тер\-ма х1. Если заголовок х1 - логический символ,
то в качестве ответа выдается сам терм х1. Исключение составляют
служебные слова "свой", "чужой", обозначающие в теоремах шахматных
приемов цвет фигур. Они компилируются с помощью опе\-ра\-тор\-ных
выражений "свойцвет($\ldots$)", "чужойцвет($\ldots$)".

После контрольной точки "прием(7)" \ начинается рассмотрение
случая, когда за\-го\-ло\-вок х1 - переменная $x$. Эта переменная
присваивается программной перемен\-ной х4.

\subsubsection{Переменная выделена указателем "свертка" \ }

Сначала рассматривается крайне редкий подслучай выделения
переменной $х$ указате\-лем "свер\-тка". Такая переменная вводится
в антецеденте "равно($x$ $a$)" \ и иден\-ти\-фи\-ци\-руется как
новая переменная . По окончании определяемых нормализа\-то\-ра\-ми
вспомогательных преобразований терма, содержащего $x$, в этот терм
подстав\-ля\-ет\-ся вместо $x$ выражение $a$. Во время
преобразований считаются истинными заданные в указателе "свертка"
\ сопровождающие $x$ посылки.

Если найден информационный элемент (свертка $x$ $A$ $B$ $C$), то
проверяется, что программное выражение $A$ для теоремного
выражения $a$ уже найдено (отлично от 0). Если имеется (отлично от
0) также программное выражение $C$ для новой перемен\-ной,
идентифицированной с $x$, то выдается ответ $C$. Если же $C$ равно
0, то в компили\-ру\-е\-мую программу заносится оператор,
выбирающий новую переменную; по нему доопределяется $C$; по
конъюнкции $B$ сопровождающих посылок находятся набор х9
программных выражений для этих посылок; такими посылками
пополня\-ют\-ся информационные элементы (быстрпреобр $\ldots$),
относящиеся к нормализации со\-дер\-жа\-щих $x$ термов, и снова
выдается ответ $C$.

\subsubsection{Общий случай уже идентифицированной переменной}

После контрольной точки "прием(10)" \ и до фрагмента с контрольной
точкой "при\-ем(12)" \ рассматриваются случаи, в которых
идентификация переменной $x$ уже за\-ре\-гист\-рирована в
информационном элементе с заголовком одного из видов:
"вхож\-де\-ние", "унисборка", "терм", "переменная", "наборчленов",
"наборпеременных". Здесь находится программное выражение для
представления значения $x$ в формате тер\-ма, которое и выдается
как ответ. В случае элемента "вхождение" \ предприни\-ма\-ет\-ся
попытка сразу же получить небольшую экономию за счет
непосредст\-вен\-но\-го преобразования выражений "первыйоперанд",
"второйоперанд", $\ldots$ в выраже\-ния "первыйтерм",
"второйтерм", $\ldots$.

\subsubsection{Ввод новой связанной переменной}

После контрольной точки "прием(12)" \ рассматривается случай,
когда еще не иден\-ти\-фи\-ци\-рованная переменная х4 представляет
собой связанную переменную за\-ме\-ня\-ю\-щего терма приема
замены. Тогда в компилируемую программу вводятся опе\-ра\-то\-ры,
выбирающие новую переменную для идентификации ее с х4.

\subsubsection{Переменная, обозначающая функцию}

После контрольной точки "прием(11)" \ рассматривается практически
не исполь\-зу\-е\-мая возможность идентифицировать функциональную
переменную как терм "ото\-бра\-жение($\ldots$)", задающий функцию.
Не используется она, в частности, из-за то\-го, что для построения
терма "отображение($\ldots$)" \ необходимо идентифицировать и
зарегистрировать в информационном элементе (функция х4 $\ldots$)
условия на об\-ласть определения функции. Однако, функциональные
переменные нужны лишь в качестве шаблонов для варьирования
подтермов, и никакой области определения с ними обычно не
связывается. Тем не менее, в компиляторе предусмотрена
воз\-мож\-ность построения указанного терма
"отображение($\ldots$)" \ по полностью уком\-плек\-то\-ван\-ному
информационному элементу (функция х4 $\ldots$). Сначала здесь
опреде\-ля\-ет\-ся программное выражение х4 для связывающей
приставки описателя "отображе\-ние", затем создается программное
выражение х8 для результирующего терма.

\subsubsection{Переменная, обозначающая матрицу}

Если имеется информационный элемент (элементыматрицы х4 $\ldots$),
определяю\-щий программное выражение для набора наборов термов,
образующих элементы матри\-цу, то создается результирующее
программное выражение х7 для терма, определяю\-ще\-го саму
матрицу.

\subsubsection{Выбор новой переменной согласно указателю
приема}

После контрольной точки "прием(13)" \ рассматривается ситуация, в
которой пере\-мен\-ная х4 выделена специальным указателем приема,
определяющим выбор для нее новой переменной либо группы новых
переменных. Переменной х8 присваива\-ет\-ся программное выражение
для списка использованных в контексте срабаты\-ва\-ния приема
"теоремных" \ переменных. Если указатель приема "переменные(х4
$n$)" \ определял идентификацию х4 с набором переменных длины $n$,
то находится про\-грам\-м\-ное выражение х11 для $n$, и в
компилируемую программу заносится обращение к операторному
выражению "кортежпеременных($\ldots$)", выполняющему выбор
груп\-пы новых переменных. Переменная х4 идентифицируется
одновременно и как терм "набор($\ldots$)", перечисляющий новые
переменные, и как список этих переменных. Аналогичным образом
обрабатывается указатель "элементыматрицы($\ldots$)",
опре\-де\-ля\-ю\-щий идентификацию х4 с матрицей новых переменных.
В остальных случаях применяется либо оператор "обозначения",
выбирающий новую переменную с уче\-том типа ее прорисовки, либо
оператор "новаяпеременная".

\subsubsection{Переменная идентифицирована при вычислениях}

Если имеется информационный элемент (трансл\-выражения х4
$\ldots$), то значение пе\-ре\-мен\-ной х4 переводится из
вычислительного формата в формат терма.

\subsubsection{Прочие случаи}

Если переменная х4 идентифицирована при унификации, то для
нахождения со\-от\-вет\-ст\-ву\-ю\-щего ей терма используются
информационные элементы (Таблзначение $\ldots$) и (унификация
$\ldots$).

Если х4 идентифицирована с помощью информационного элемента
(значение х4 $T$), в неопределенном формате значений, то выдается
программное выражение $T$.

\subsection{Специальные случаи неоднобуквенного терма}

\subsubsection{Использование ранее проведенной компиляции терма}

После контрольной точки "прием(14)" \ рассматривается случай, в
которых терм х1 уже компилировался, причем информационный элемент
(прогртерм х1 $\ldots$) со\-хра\-ня\-ет результат этой компиляции.
Тогда повторно выдается данный результат. Если име\-ет\-ся
информационный элемент (выражение х1 терм $\ldots$), означающий,
что терм х1 был идентифицирован как единое целое, без
идентификации составляющих его подтермов, то тоже выдается
извлекаемое из данного элемента выражение для х1. Исключение здесь
составляет ситуация, когда указатель приема "сборка" \
бло\-ки\-ру\-ет применение в заменяющей части копий равных им
подтермов заменяемой части.

\subsubsection{Заменяющий терм приема группировки}

Если прием имел указатель "набор(второйтерм)", то его заменяющий
терм со\-зда\-ет\-ся на основе информационного элемента (перечень
х1 $\ldots$). Проверяется, что послед\-ний разряд этого элемента
отличен от нуля; тогда он представляет собой программ\-ное
выражение для заменяющего терма и выдается как результат.

\subsubsection{Длина набора}

Если х1 имеет вид "длинанабора($x$)", то после контрольной точки
"прием(36)" \ пред\-при\-нимается попытка найти информационный
элемент (наборчленов набор $x$ $B$), в котором $B$ - программное
выражение для набора корневых операндов выра\-же\-ния
"набор($\ldots$)", с которым была идентифицирована переменная $x$.
Результа\-том является программное выражение х6 для длины набора
$B$.

\subsubsection{Коэффициенты многочлена}

Если х1 имеет вид "коэффициенты($x$)", то после контрольной точки
"прием(39)" \ предпринимается попытка найти информационный элемент
(сммногочлен $x$ $A$), за\-дающий программное выражение $A$ для
набора термов - коэффициентов много\-чле\-на $x$. По этому
выражению строится выражение для терма "набор($\ldots$)",
перечис\-ля\-ю\-ще\-го коэффициенты.

\subsubsection{Учет указателя "развертка" \ }

После контрольной точки "прием(37)" \ рассматривается случай,
когда терм х1 дол\-жен создаваться в режиме "развертки", т.е.
вместо указанной в теореме одномест\-ной корневой операции над
набором (или квантора общности) будет использо\-вать\-ся
соответствующая двуместная ассоциативная корневая операция $f$ (в
случае кван\-то\-ра общности - конъюнкция). Компиляция
разветвляется, в зависимости от того, является ли заголовком х1
квантор общности.

\begin{enumerate}

\item После контрольной точки "прием(53)" \ рассматривается
случай, когда заголо\-вок х1 отличен от квантора общности. Тогда
х1 - либо терм "отображение($\ldots$)", либо одноместная операция
от такого терма. В первом случае $f$ полага\-ет\-ся равным символу
"набор", во втором - определяется с помощью справоч\-ни\-ка
"развертка". Найденное значение присваивается переменной х6. Если
прием имел указатель "комплексное", то вместо операций "плюс",
"умножение" \ бе\-рут\-ся их комплексные аналоги. Затем - переход
через "ветвь 4". Здесь перемен\-ной х7 присваивается корневое
вхождение в х1 символа "отображение".

Далее компиляция снова разветвляется.

\begin{enumerate}

\item Сначала рассматривается случай, когда перечисление ведется
по единст\-вен\-но\-му параметру, т.е. терм по х7 имеет вид
"отображение($i$ $A(i)$ $t(i)$)". Параметр $i$ присваивается
переменной х8, вхождение $A(i)$ - переменной х9. Здесь компиляция
разветвляется еще раз.

\begin{enumerate}

\item Рассматривается случай, когда $A(i)$ определяет перечисление
це\-ло\-чис\-лен\-ных значений $i$ в заданном конечном промежутке.
Переменной х14 присваивается терм для начала этого промежутка,
переменной х12 - для его конца. Находится пара х15 программных
выражений для десятичных чисел ЛОСа - значений х14 и х12.

Если $t(i)$ имеет вид "значение($v$ $i$)", причем переменная $v$
была иден\-ти\-фи\-ци\-ро\-ва\-на с набором термов $N$ при помощи
информаци\-он\-но\-го элемента (вектор $v$ $\ldots$), а промежуток
х14, х12 - от начала до кон\-ца этого набора, то выдается
результат, в котором операция х6 применя\-ет\-ся к элементам
набора $N$. Особо рассматривается случай симво\-ла "перечень".

В противном случае для копиляции текущего терма $t(i)$ при
перечис\-ле\-нии значений $i$ вводится вспомогательный программный
блок х16. Процедура "метаперевод" \ дает программное выражение х17
для теку\-ще\-го $t(i)$, после чего строится программное выражение
х19 для всего набора термов $t(i)$. Далее результат находится
аналогично преды\-ду\-ще\-му случаю. Для обеспечения корректности
сопровождения сра\-ба\-ты\-ва\-ний приемов поясняющими текстами
оператор, содержащий х19, помещается в "скобки" \ из
вспомогательных процедур "титрбуф".

\item Альтернативный случай - $A(i)$ перечисляет все разбиения $i$
задан\-но\-го натурального числа $n$ в сумму неупорядоченных по
воз\-рас\-та\-нию натуральных чисел. Для перечисления значений $i$
используется процедура "Разбиения($\ldots$)"; в остальном схема
компиляции такая же, как при перечислении конечного отрезка целых
чисел.

\end{enumerate}

\item После контрольной точки "прием(57)" \ рассматривается
случай, когда пе\-ре\-чис\-ление ведется по двум параметрам. Здесь
терм по вхождению х7 имеет вид "отображение($i$ $j$
и(принадлежит($i$ $\{m, \ldots , n \}$) принадле\-жит($j$ $\{p,
\ldots , q \}$)) $t(i,j)$)". Хотя массив $t(i,j)$ двумерный, он
разворачивается в одномерный список термов, рассматриваемый как
набор операндов опе\-рации х6.

Индексы $i,j$ присваиваются переменным х8 и х9; границы
диапа\-зо\-нов $m,n,p,q$ присваиваются, соответственно, переменным
х13, х14, х15 и х16. Для компиляции текущего терма $t(i,j)$
вводится вспомогательный про\-грамм\-ный блок х18, программа
которого инициирована операторами "Но\-мера", перечисляющими
значения $i,j$. Программное выражение для те\-ку\-ще\-го терма
присваивается переменной х19, и далее находится программ\-ное
выражение х21 для набора операндов операции х6.

\end{enumerate}

\item После контрольной точки "прием(8)" \ рассматривается случай,
когда х1 - кван\-тор\-ная импликация. Переменной х6 присваивается
список антецедентов им\-пли\-ка\-ции х1. Затем компиляция
разветвляется.

\begin{enumerate}

\item Сначала рассматривается случай перечисления по единственному
па\-ра\-мет\-ру $i$. Здесь х1 имеет вид "длялюбого($i$ если $i \in
\{m, \ldots , n \}$ то $A(i)$)".

Индекс $i$ присваивается переменной х8; границы диапазона
пере\-чис\-ле\-ния $m,n$ присваиваются переменным х9, х10. Если х1
содержит еще не иден\-ти\-фи\-ци\-ро\-ванную функциональную
переменную $X(i)$, причем имеется ука\-за\-тель приема
"переменные($X$ $\ldots$)", определяющий выбор для $X$ набо\-ра
новых переменных, то в компилируемую программу вставляется
опе\-ра\-тор, реализующий такой выбор. Затем - откат к переходу
через "ветвь 2".

Переменной х11 присваивается пара программных выражений для
гра\-ниц диапазона $m,n$. Вводится вспомогательный программный
блок х13 для компиляции текущего утверждения $A(i)$, и переменной
х14 присваива\-ет\-ся программное выражение для этого утверждения.
Переменной х16 присваивается программное выражение для набора
утверждений $A(i)$. Ес\-ли это выражение не чрезмерно громоздко,
то по нему строится резуль\-ти\-ру\-ю\-щее выражение для
конъюнкции утверждений. Иначе - х16 исполь\-зо\-вать\-ся не будет,
а создание набора утверждений реализуется по схеме заполнения
накопителя. Новой переменной (накопителю) присваива\-ет\-ся пустое
слово. Затем помещается оператор "ветвь" \ для перехода по
завер\-ше\-нии перечисления; после него помещаются реализующие
перечис\-ле\-ние операторы из вспомогательного программного блока
х13, и далее - опе\-ра\-то\-ры, заносящие в накопитель очередное
$A(i)$ (т.е. х14).

\item Рассматривается случай перечисления по двум параметрам. х1
имеет вид "длялюбого($i$ $j$ если $i \in \{m, \ldots , n\} \ \& \
j \in \{p, \ldots , q\}$ то $A(i,j)$)". Этот случай аналогичен уже
рассмотренным выше.

\end{enumerate}

\end{enumerate}

\subsubsection{Заменяющий терм для группы антецедентов}

Этот крайне редкий случай обрабатывается после контрольной точки
"прием(15)". х1 - конъюнкция либо дизъюнкция, представляющая собой
заменяющий терм при\-ема. Заменяемые термы представляют собой
операнды конъюнкции, либо дизъ\-юнк\-ции, либо антецеденты
кванторной импликации, рассматривавшиеся при иден\-ти\-фи\-ка\-ции
как члены некоторой фиктивной конъюнкции или дизъюнкции. Чтобы
получить в такой ситуации заменяющий терм, используется
специальный опе\-ра\-тор "логзамена".

\subsubsection{Компиляция условного выражения с непосредственной
проверкой ус\-ло\-вия}

Если х1 имеет вид "вариант($A$ $t_1$ $t_2$)", причем указатель
приема "нормвариант($\ldots$)" \ определяет программную реализацию
проверки условия $A$, то результирующее про\-грамм\-ное выражение
будет определять не условное выражение х1, а одно из
вы\-ра\-же\-ний $t_1, t_2$, в зависимости от результатов проверки.
Обработка данного слу\-чая начинается после контрольной точки
"прием(60)". Чтобы получить программу про\-вер\-ки $A$, создается
вспомогательный программный блок х6, и выполняется обра\-ще\-ние к
процедуре "идентификатор" \ с установкой (программа $\ldots$) на
идентифи\-ка\-цию $A$. Находятся программные выражения х11, х12
для выражений $t_1,t_2$, и созда\-ет\-ся результирующее условное
программное выражение х13.

\subsubsection{Компиляция дизъюнкции либо конъюнкции с учетом
возможности вы\-рож\-де\-ния ее из-за появления логической
константы}

Если компилируется конъюнкция либо дизъюнкция утверждений $A_1,
\ldots , A_n$, обра\-ба\-ты\-ва\-емых нормализаторами, то после
того, как получен результат нормали\-за\-ции некоторого $A_i$,
обработка последующих утверждений может оказаться излишней. Это
произойдет, если данный результат будет представлять собой
константу "ложь" \ для конъюнкции либо константу "истина" \ для
дизъюнкции. Чтобы ввести со\-от\-вет\-ст\-ву\-ющую экономию,
используется специальная ветвь компиляции. Она начина\-ет\-ся
после контрольной точки "прием(3)". Находится программное
выражение х6 для $A_1$, и далее в цикле компиляции утверждений
$A_2, \ldots, A_n$ формируется программ\-ное выражение для
результата. На текущем шаге переменная х8 имеет своим
значе\-ни\-ем программную переменную, значением которой служит
частичная конъюнкция либо дизъюнкция $R$ - от первого до текущего
утверждения. При рассмотрении очеред\-но\-го $A_i$ находится
программное выражение для него, присваиваемое переменной х11.
Новая версия $R$ представляет собой условное выражение: если
заголовком ра\-нее найденной версии $R$ является логическая
константа $K$, обращающая в конс\-тан\-ту всю конъюнкцию либо
дизъюнкцию, то эта константа сохраняется, иначе к $R$
добав\-ля\-ет\-ся новый член х11. При добавлении логической
константы $K$ новая версия $R$ также будет равна $K$. Таким
образом, при появлении на некотором шаге константы $K$ необходимые
для получения последующих утверждений $A_i$ обраще\-ния к
нормализаторам будут пропущены.

\subsubsection{Идентифицировано вхождение терма}

После контрольной точки "прием(16)" \ рассматривается случай,
когда имеется ссыл\-ка на ранее идентифицированное вхождение $v$
терма, равного х1. При выполне\-нии определенных дополнительных
условий, в этом случае можно выдать в качестве результата подтерм
по вхождению $v$. В частности, должны отсутствовать
норма\-ли\-за\-то\-ры, применяемые к подтермам х1. Программное
выражение для $v$ извле\-ка\-ет\-ся из информационного элемента
(операнд $\ldots$).

\subsubsection{Регистрация обычной переменной как функциональной}

Перед рассмотрением серии случаев, в которых х1 имеет вид
"значение($f$ $t$)", пред\-при\-ни\-ма\-ет\-ся учет указателя
"функция($f$ $x$)", определяющего переход от обыч\-ной переменной
$f$ к функциональной. Данный указатель присваивается переменной
х6. Проверяется отсутсвие информационного элемента (функция $f$
$\ldots$), означаю\-ще\-го, что уже имела место регистрация $f$
как функциональной переменной. Наход\-ят\-ся программное выражение
х10 для переменной $x$ - аргумента $f$ как функциональ\-ной
переменной, а также х11 - для вхождения $v$, по которому $f$ была
идентифици\-ро\-ва\-на как обычная переменная. В компилируемую
программу вводятся опера\-то\-ры, проверяющие, что терм по
вхождению $v$ имеет вид "отображение($x$ $a(x)$ $t(x)$)". Эта
информация позволяет создать информационный элемент (функция $f$
($x$) $\ldots$), в котором имеются ссылки на вхождение выражения
$t(x)$ для значений функции, а также на список конъюнктивных
членов утверждения $a(x)$, определяющий область определения. После
создания такого информационного элемента - откат к переходу через
"ветвь 1". Фактическая компиляция х1 будет выполняться
нижеследую\-щи\-ми пунктами.

\subsubsection{Одз для заданного терма}

Если х1 имеет вид "одз($t$)", то с помощью операторного выражения
"Одз" \ нахо\-дит\-ся список утверждений для области допустимых
значений терма $t$, и вы\-да\-ет\-ся программное выражение для
конъюнкции этих утверждений.

\subsubsection{Заголовок "значение" \ }

После контрольной точки "прием(17)" \ разбирается серия случаев
компиляции выра\-же\-ния х1, имеющего вид "значение($f$ $t$)".
Переменная $f$ присваивается про\-грам\-мой переменной х4, и далее
компиляция разветвляется

\begin{enumerate}

\item Имеется информационный элемент (элементыматрицы $f$
$\ldots$), определя\-ю\-щий идентификацию $f$ как набора наборов
термов - элементов прямоугольной мат\-ри\-цы (контрольная точка
"прием(47)"). Выражение $t$ для координат эле\-мен\-та матрицы
имеет вид "набор($i$ $j$)". Предполагается, что после обработки
нор\-ма\-ли\-за\-то\-ра\-ми выражения $i$, $j$ суть десятичные
константы. Создается программ\-ное выражение х9, извлекающее из
матрицы требуемый терм. В нем исполь\-зу\-ет\-ся двухэтапное
преобразование термов $i,j$ - сначала к виду десятичного числа
ЛОСа, а затем к виду символьного числа для выделения нужного
элемен\-та набора.

\item Имеется информационный элемент (вектор $f$ $\ldots$),
определяющий иденти\-фи\-ка\-цию $f$ как набора термов
(контрольная точка "прием(51)"). Предпола\-га\-ет\-ся, что терм
$t$ после обработки нормализаторами становится десятичной
кон\-стан\-той. Для извлечения нужного элемента набора строится
программное вы\-ра\-же\-ние х8.

\item Имеется информационный элемент (наборпеременных $f$
$\ldots$), опреде\-ля\-ю\-щий идентификацию $f$ с набором
переменных (контрольная точка "прием(52)"). В этом случае
предполагается, что $t$ есть переменная, идентифициро\-ван\-ная с
десятичным числом (вычислительный формат ГЕНОЛОГа "десчисло"). Для
извлечения нужной переменной набора строится программное выражение
х8.

\item Имеется информационный элемент (транслвыражения $f$
$\ldots$), определяющий идентификацию $f$ с числовым вектором в
вычислительном формате "вектор(чи\-сло)". Этот формат - пара,
состоящая из ссылки на массив чисел форма\-та "с плавающей
запятой" \ и на целое число в машинном формате, равное длине
вектора. Строится программное выражение х9, извлекающее нужный
элемент массива и переводящий его в формат терма.

\item х1 имеет вид "значение(значение($f$ $i$)$t$)", причем
имеется информацион\-ный элемент (функции $f$ $A$), определяющий
идентификацию $f$ как набора функ\-ций (контрольная точка
"прием(61)"). Здесь $A$ - программная переменная для набора пар
($X_i$, $T_i$), где $T_i$ - выражение для значения $i$ - й
функции; $X_i$ - набор переменных, рассматриваемых как аргументы
функции. Переменной х9 присваивается программное выражение для
набора $t$ значений, подставляемых вместо аргументов $i$-й
функции; переменной х10 - выражение для $i$. Затем переменной х11
присваивается $i$ - я пара набора $A$, и в компилируемую
про\-грам\-му заносится оператор, находящий результат подстановки
в $T_i$ вместо ар\-гу\-мен\-тов $X_i$ их значений $t$.

\item $f$ - переменная, идентифицированная с термом "набор($A_1
 \ldots A_n$)" \ (контроль\-ная точка "прием(62)"), а $t$ - переменная,
идентифицированная с десятич\-ным числом. В этом случае создается
программное выражение х11 для выде\-ле\-ния операнда $A_t$.

\par\medskip

После контрольной точки "прием(63)" \ переменной х5 присваивается
терм $t$ и находится информационный элемент (функция $f$ $X$
$\ldots$), определяющий иден\-ти\-фи\-ка\-цию $f$. Из этого
элемента извлекается пара х7, определяющая программ\-ное выражение
$R$ для значений функции. Первый элемент пары - символ "терм" \
либо "вхождение" \ либо "функподст", уточняющий способ получения
значе\-ния по х7. При необходимости предпринимается коррекция
связанных пере\-мен\-ных в $R$ - чтобы их номера были не меньше
номера первой не определен\-ной переменной программного блока.

\item $f$ - функциональная переменная, выделенная указателем
"вхождение" \ (кон\-троль\-ная точка "прием(45)"). В этом случае
теорема приема имеет под\-терм $f(x,s)$ (либо $f(s)$), где $s$
идентифицируется с произвольным подтермом терма, идентифицирующего
для $f(x,s)$. Находится информационный элемент (вхож\-дениетерма
$f$ $A$), у которого $A$ - программное выражение для вхождения
$s$. В соответствии с видом указанного подтерма, х1 имеет вид
$f(P,Q)$ либо $f(Q)$. Оно обозначает результат замены $s$ на $Q$ и
одновременную подстановку вместо всех вхождений переменной $x$,
расположенных вне $s$, терма $P$. Рассматрива\-ют\-ся различные
возможности идентификации $P$. Во всех случаях резуль\-тат
получается с помощью оператора "подстзамена" \ либо "Подстзамена";
если же $P$ отсутствует, то используется оператор "внутрзамена".

\par\medskip Перед контрольной точкой "прием(64)" \ переменной х7
переприсваивается терм, определяющий значения функциональной
переменной $f$.

\item Список $X$ аргументов функциональной переменной $f$,
согласно ее идентифи\-ка\-ции, совпадает с $t$. Тогда результатом
компиляции служит терм х7.

\item Список $X$ аргументов функциональной переменной $f$
одноэлементный и состоит из переменной $x$, идентифицированной с
помощью информационного элемен\-та (наборпеременных $x$ $P$).
Определяется программное выражение х11 для набо\-ра $t$ значений
аргументов, и находится результат подстановки х11 вместо $P$ в х7.

\item $t$ содержит переменную, идентифицированную по указателю
"унификация"; кон\-трольная точка "прием(44)". В этом случае
$f(t)$ определяется с по\-мо\-щью подстановки, определяемой
информационным эле\-мен\-том (унификация $\ldots$).

\item После контрольной точки "прием(65)" \ рассматривается ряд
подслучаев, в ко\-то\-рых результирующий терм строится как
подстановка в шаблон х7 вместо аргументов функциональной
переменной $f$ термов, определяемых выраже\-ни\-ем $t$. Прежде
всего, находится набор х8 последних термов, а также набор х9
аргументов $f$. Те позиции, на которых эти наборы совпадают,
отбрасы\-ва\-ют\-ся. Если набор х8 оказывается пуст, выдается
результат х7. Если наборы х8 и х9 одноэлементны, причем имеются
информационные элементы, позволяю\-щие сразу идентифицировать их
переменные, то находится указанная выше подстановка в х7. Иначе -
переход через "ветвь 2", где наборы х10, х11 программ\-ных
выражений для аргументов и подставляемых термов определяются с
по\-мо\-щью процедур "прогрвыражение" \ и "метаперевод". Затем
снова нахо\-дит\-ся подстановка. Особо рассмотрен крайне редкий
подслучай выделения терма х1 указателем приема "мультизамена".

\item После контрольной точки "прием(32)" \ рассматривается
случай, в котором пе\-ре\-менная $f$ выделена указателем
"заменатермов". По этому указателю, ссы\-ла\-ю\-ще\-муся на
идентифицируемое вхождение $v$ в теорему приема терма $f(A)$, был
создан информационный элемент (заменатермов $f$ $v$ $B$ $C$).
Здесь $B,C$ - программные выражения для идентифицирующего терма,
соответствую\-ще\-го $f(A)$, и для набора вхождений в этот
идентифицирующий терм терма, с которым идентифицировано $A$.
Результат компиляции $f(t)$ - терм, получен\-ный из $B$ заменой
всех вхождений набора $C$ на терм, определяемый по $t$.

\item Переменная $f$ выделена указателем "сммногочлен" \
(контрольная точка "при\-ем(33)"). Информационный элемент
(сммногочлен $f$ $\ldots$) определяет набор тер\-мов -
коэффициентов многочлена. Переменной х6 присваивается
про\-грамм\-ное выражение для $t$. Построение многочлена по набору
коэффициентов и выражению х6 выполняется процедурой
"сборкамногочлена" \ либо (в ком\-плек\-сном случае)
"Сборкамногочлена").

\item Переменная $f$ выделена указателем "функподст" \
(контрольная точка "при\-ем(46)"). Это означает, что в
идентифицируемой части теоремы выделен под\-терм $f(g(A)B)$ либо
$f(g(A))$, и в соответствующий ему идентифицирую\-щий терм $T$
переменная $g$ входит только как функциональная переменная. Тогда
выражения $f(t \ B)$ (соответственно, $f(t)$) обозначают термы,
получающиеся из $T$ заменой всех вхождений $g(\ldots)$ на $t$.

Извлекается информационный элемент (функподст $f$ $B$ $C$), у
которого $B$ - программное выражение для $T$; $C$ - программное
выражение для набора вхож\-де\-ний в $T$ функциональных переменных
$g(\ldots)$. Находится программное вы\-ра\-же\-ние х7 для $t$, и
далее предпринимается указанная выше замена вхождений.

\item Переменная $f$ выделена указателем "Бинарнаяоперация". Терм
$f(a,b)$ иден\-ти\-фицируется либо с термом вида $F(A,B)$, либо с
термом вида $G(F(A,B))$, где $F,G$ - логические символы. Порядок
расположения операндов $A,B$ по отно\-ше\-нию к $a,b$ -
произвольный. Переменная $f$ (как обычная переменная)
иден\-ти\-фи\-ци\-ру\-ется с логическим символом $F$.

Информационный элемент (Бинарнаяоперация $f$ $C_1$ $C_2$ $C_3$)
имеет следую\-щие компоненты: $C_1$ - программное выражение для
символа $F$; $C_2$ - программ\-ное выражение для символа $G$ (если
одноместной операции нет, то берется символ 0); $C_3$ -
программное выражение для индикатора перестановки операндов (1 -
есть перестановка, 0 - нет). х1 имеет вид $f(p,q)$. Находятся
программ\-ные выражения х7, х8 для $p$ и $q$. По ним и $F,G$, с
учетом индикатора переста\-нов\-ки, собирается программное
выражение х9 для результирующего терма.

\item Переменная $f$ выделена указателем "символ" \ либо
"симметрично" \ (контроль\-ная точка "прием(35)"). Эта переменная
идентифицируется с логическим сим\-во\-лом $s$, программное
выражение для которого определяется информацион\-ным элементом
(значение $f$ $\ldots$). Обозначение $f(t)$ понимается как терм
вида $s(A_1 \ldots A_n)$, где операнды $A_1, \ldots, A_n$
определяются по $t$. В случае указа\-те\-ля "симметрично" \
допускается идентификация без учета порядка операндов, но тогда
фактический порядок сохраняется в информационном элементе
(нов\-опе\-ранд $f$ $\ldots$), чтобы новые термы вида $f(t)$
создавались с сохранением этого порядка.

\item Переменная $f$ выделена указателем "типзначения". Это
означает, что тео\-ре\-ма имеет антецедентом кванторную
импликацию; консеквент ее имеет вид $f(s)$, и $f$ идентифицируется
с логическим символом - типом значения выраже\-ния $s$.
Программное выражение для этого символа сохраняется в
информацион\-ном элементе (значение $f$ $\ldots$). Далее терм
$f(t)$ компилируется так же, как в слу\-чае указателя "символ".

\end{enumerate}

\subsubsection{Заголовок "область" \ }

В тех чрезвычайно редких случаях, когда функциональная переменная
$f$ иден\-ти\-фи\-ци\-руется с явным указанием области значений
своих аргументов, предусмот\-ре\-на компиляция выражения
"область($f$)" \ (контрольная точка "прием(18)"). Если име\-ет\-ся
информационный элемент (область $f$ $\ldots$), то результат
извлекается из него. Ина\-че - переменной х6 присваивается
программное выражение для набора аргумен\-тов функции;
проверяется, что информационный элемент (функция $f$ $\ldots$)
име\-ет программное выражение для списка утверждений, задающих
область определе\-ния функции, и строится программное выражение х7
для представления области опре\-де\-ле\-ния в виде описателя
"класс($\ldots$)".

\subsubsection{Квантор либо описатель}

После контрольной точки "прием(19)" \ рассматривается случай,
когда заголовком х1 служит квантор или описатель.

Если имеется указатель приема "матрица", выделяющий х1, то
результатом ком\-пи\-ляции должно быть программное выражение для
прямоугольной матрицы, задан\-ной с помощью операции
"строки($\ldots$)" \ над набором наборов элементов. Этот
под\-слу\-чай рассматривается после контрольной точки "прием(56)".
Здесь х1 имеет вид "отображение($i$ $j$ и(принадлежит($i$ $\{m,
\ldots , n\}$)принадлежит($j$ $\{p, \ldots , q\}$)) $a(i,j)$)".
Находятся программные выражения х8,х9,х11,х12 для границ
диапазонов измене\-ния индексов. Чтобы получить программное
выражение х16, дающее текущий элемент матрицы $a(i,j)$, создается
вспомогательный программный блок х15.

Если указанный особый подслучай не имеет места, то переход через
"ветвь 2". Здесь переменной х4 присваивается связывающая приставка
квантора либо описа\-те\-ля. Проверяется, что все свободные
переменные х1, для которых не предусмот\-рен выбор
идентифицирующих их новых переменных, уже определены.

Сначала рассматривается особый подслучай, когда связывающая
приставка х4 состоит из единственной переменной $x$, выделенной
указателем "связпристав\-ка". Предполагается также, что х1 имеет
вид $\forall_x P(x)$, а переменная $P$ выделена указате\-лем
"импликация". Это - редко встречающийся случай компиляции приемов
выво\-да теорем. Результат х7 компиляции $P(x)$ определяет
вспомогательный терм ви\-да "то($A_0 \ A_1 \ldots A_n$)", где
$A_0$ - консеквент; $A_1, \ldots , A_n$ - антецеденты
результирую\-ще\-го квантора общности. Для получения этого
квантора применяется проце\-ду\-ра "квантимплик". Роль связывающей
приставки квантора играют все свободные пере\-мен\-ные его
подкванторных утверждений.

Если указанный подслучай не имеет места, то - переход через "ветвь
2".

Переменной х5 присваивается список программных выражений,
определяю\-щих фрагменты списка переменных связывающей приставки
результирующего кван\-то\-ра. Здесь учитывается возможность выбора
новых переменных, в том числе при наличии указателя приема
"связприставка". После составления списка х5 - пере\-ход через
"иначе 1".

Расположенные подряд в списке х5 выражения "набор($\ldots$)" \
склеиваются, и пе\-ре\-мен\-ной х6 присваивается итоговое
программное выражение для связывающей при\-став\-ки.

В случае квантора существования либо описателя "класс" \ находится
программ\-ное выражение х7 для подкванторного утверждения, и
определяется результи\-ру\-ю\-щее программное выражение х8.

В случае квантора общности сначала рассматривается ситуация,
возника\-ю\-щая при компиляции приемов вывода теорем. Здесь
консеквент х1 имеет вид функци\-о\-наль\-ной переменной $P(x)$,
выделенной указателем "импликация". Часть антеце\-ден\-тов
результирующего квантора общности здесь заданы непосредственно, а
часть - размещена внутри вспомогательного терма "то($\ldots$)" \
для $P(x)$. Чтобы полу\-чить объединенный список антецедентов,
используется процедура "новпосылки". Пос\-ле этого рассматривается
общий случай, в котором результат создается с помощью процедуры
"Импликация".

Наконец, в случае описателя "отображение" \ находятся программные
выраже\-ния х7, х8 для утверждения, задающего область определения,
а также выраже\-ния, задающего значение функции. Затем строится
результирующее выражение х9.

\subsubsection{Суффикс либо префикс}

Если х1 имеет вид "суффикс($a$ $b$)" \ либо "префикс($b$ $a$)",
причем удается найти про\-граммное выражение х6 для набора термов
$a$, то находится программное вы\-ра\-же\-ние х7 для терма $b$, и
строится результирующее выражение для терма вида "набор($\ldots$)"
\ (контрольная точка "прием(20)").

\subsubsection{Числитель либо знаменатель}

Если х1 имеет заголовок "числитель" \ либо "знаменатель", причем
имеется одно\-и\-мен\-ный информационный элемент для х1, то из
него извлекается ранее найден\-ное программное выражние для
численного значения $n$ числителя либо знаменателя х1. Оно
преобразуется в формат терма (контрольная точка "прием(21)").

\subsection{Общий случай компиляции неоднобуквенного терма}

После контрольной точки "прием(22)" \ располагается ветвь,
обрабатывающая об\-щий случай компиляции неоднобуквенного терма х1
(как и в предыдущем разде\-ле, имеется в виду компиляция без учета
нормализаторов). Предварительно ини\-ци\-али\-зируется нулем
накопитель результата х4.

Переменной х5 присваивается набор программных выражений для
корневых опе\-ран\-дов терма х1. Эти программные выражения
получены с помощью рекурсив\-ных обращений к процедуре
"метаперевод". В тех случаях, когда выражение имеет вид
"набор($s$)", где $s$ - логический символ, оно заменяется на
однобуквенный терм $s$. Происходит коррекция обозначений связанных
переменных в выражениях спи\-ска х5 - чтобы их номера были не
менее номера первой не используемой программ\-ной переменной.
Затем - переход через "ветвь 3".

Далее предпринимается цепь коррекций списка х5 с учетом
информацион\-ных элементов программного блока.

\subsubsection{Информационный элемент "учетзнака" \ }

После контрольной точки "прием(23)" \ рассматривается случай,
когда х1 - заменя\-ю\-щий терм приема, компилируемого с указателем
"знаксуммы", причем иденти\-фи\-ка\-ция происходит для части
операндов преобразуемого терма. В этой ситуации при компиляции
была введена переменная - модификатор, идентифицируемая с
не\-из\-ме\-ня\-е\-мым остатком операндов. Элементы списка х5,
соответствующие изменяе\-мым операндам, обрабатываются процедурой
"измзнака", обеспечивающей необходи\-мую коррекцию знака.

После контрольной точки "прием(30)" \ рассматривается аналогичный
случай - но при отсутствии модификатора и отсутствии применяемых к
х1 нормализа\-то\-ров. Здесь корректируется уже не набор х5, а
ранее сформированная с помо\-щью х5 заготовка результата х4.

\subsubsection{Ввод обозначений для больших подвыражений}

После контрольной точки "прием(24)" \ анализируется суммарная
длина программ\-ных выражений списка х5. Если она чрезмерно
велика, то для всех достаточно длинных выражений списка х5
вводятся вспомогательные переменные. Присвое\-ние значения такой
переменной регистрируется в компилируемой программе; номе\-ра
входящих в оставшиеся выражения списка х5 связанных переменных
сдвига\-ют\-ся так, чтобы они были больше номера новой переменной.

\subsubsection{Перестановки операндов}

Если имеется информационный элемент (сдвиг $\ldots$), указывающий,
что операн\-ды терма х1 должны быть подвергнуты циклической
перестановке, такой же, как не\-ко\-то\-рая предпринятая при
идентификации, то результат х4 строится с помощью обращения к
процедуре "сдвигнабора".

Аналогично, если имеется информационный элемент (модифсборка
$\ldots$), указы\-ва\-ю\-щий, что операнды терма х1 должны быть
переупорядочены так же, как при идентификации переупорядочивались
элементы некоторого набора (контрольная точ\-ка "прием(50)"), то
результат строится с помощью процедуры "модифсборка".

\par\medskip

Далее с помощью набора х5 программных выражений для корневых
опе\-ран\-дов терма х1 строится выражение "запись($\ldots$)" \ для
самого терма х1. Оно пере\-при\-сва\-и\-ва\-ет\-ся переменной х4.

\subsubsection{Информационные элементы "дробь" \ и "альтернатива" \ }

После контрольной точки "прием(25)" \ рассматривается случай
наличия ин\-фор\-ма\-ци\-онного элемента (дробь $\ldots$),
указывающего на необходимость перестановки кор\-не\-вых операндов
терма х1, если при идентификации имела место перестановка корневых
операндов некоторой другой двуместной операции. Тогда
результирующее вы\-ра\-же\-ние х4 - условное, проверяющее наличие
перестановки при идентификации. Перед формированием его
проверяется также наличие информационного элемента
(аль\-тер\-на\-ти\-ва $\ldots$), требующего изменения заголовка
терма х1, если при идентификации имело место изменение заголовка
некоторого другого терма. Соответственно кор\-рек\-ти\-руется
накопитель заголовка результата х7.

После контрольной точки "прием(26)" \ аналогичная коррекция
выполняется, если терм х1 выделен только указателем
"альтернатива".

\subsubsection{Информационный элемент "единица" \ }

После контрольной точки "прием(28)" \ рассматривается случай,
когда х1 имеет два корневых операнда, причем один из них, согласно
информационному элементу (еди\-ни\-ца $\ldots$), может обратиться
в единицу корневой операции терма х1. Здесь ре\-зуль\-ти\-ру\-ющее
выражение х4 строится так, чтобы не нужный единичный операнд
от\-бра\-сы\-вал\-ся.

\par\medskip

После перечисленных коррекций - откат к переходу "ветвь 1",
рас\-по\-ло\-жен\-но\-му непосредственно перед контрольной точкой
"прием(22)". Далее - цепочка пре\-об\-ра\-зо\-ва\-ний,
оптимизирующих результат компиляции х4.

\subsubsection{Оптимизация результата компиляции}

После контрольной точки "прием(31)" \ начинается цикл упрощающих
тождественных преобразований программного выражения х4. Здесь
рассматриваются следующие случаи (перечисление их ведется в
стандартном порядке - для каждого фрагмента программы переходы
просматриваются от конца к началу):

\begin{enumerate}

\item х4 имеет вид "запись($f$ унисборка($f$ $t$) $p$)", где $f$ -
ассоциативно - коммутатив\-ный символ, причем $t$ - набор $f$ -
членов, идентифицированный с перемен\-ной - модификатором (т.е. с
набором остаточных операндов, не участвующих в замене). Тогда х4
заменяется на "унисборка($f$ суффикс($t$ $p$))".

\par\medskip

Cимвол $f$ предполагается далее ассо\-ци\-а\-тив\-ным и
коммутативным.

\item х4 имеет вид "запись($f$ унисборка($f$
вычеркивание(набороперандов($A$)на\-бор(\\ под\-терм($B_1$)
$\ldots$ подтерм($B_n$)))$C_1 \ldots C_m$))". Каждое $B_i$ -
программное выра\-же\-ние для операнда вхождения,
задава\-е\-мо\-го программным выражением $A$. Здесь
рассматриваются следующие подслучаи:

\begin{enumerate}

\item $C_1, \ldots, C_m$ - подмножество списка "подтерм($B_1$)",
$\ldots$ , "подтерм($B_n$)", при\-чем разность этих списков
состоит из единственного выражения "под\-терм($D$)". Тогда х4
заменяется на "исключениеоперанда($A$ $D$)".

\item $m = 1$, $n = 2$. Тогда х4 заменяется на
"склейкаоперандов($A$ $B_1$ $B_2$ $C_1$)".

\item $m = n$; единственное выражение $C_i$, не равное никакому
"подтерм($B_j$)", есть $C$, а единственное выражение
"подтерм($B_j$)", не равное никакому $C_i$, есть "подтерм($B$)".
Тогда х4 заменяется на "заменаоперанда($A$ $B$ $C$)".

\end{enumerate}

\item х4 имеет вид "запись($f$ унисборка($f$
вычеркивание(набороперандов($A$)на\-бор($B_1\\ \ldots B_n$)))$C_1
\ldots C_m$)". Оно заменяется на "уни\-сборка($f$ конкатенация
(набор($C_1 \\ \ldots C_m$)вычеркивание
(набороперандов($A$)на\-бор($B_1 \ldots B_n$))))".

\item х4 имеет вид "запись($f$ унисборка($f$ $t$)$p$)" \ либо вид
"запись($f$ $p$ унисборка($f$ $t$))". Соответственно, оно
заменяется на "унисборка($f$ суффикс($t$ $p$))" \ либо
"уни\-сборка($f$ префикс($p$ $t$))".

\item х4 имеет вид "запись($f$ унисборка($f$ $t$)$p_1 \ldots
p_n$)"; $n > 1$. Оно заменяется на "сборка($f$ конкатенация($t$
набор($p_1 \ldots p_n$)))".

\item х4 имеет вид "запись($f$ $A_1 \ldots A_n$)", где хотя бы
один из операндов $A_i$ имеет вид "унисборка($t$)". Находится
список $t_1, \ldots , t_m$ всех таких $t$, а также набор $p_1,
\ldots , p_k$ остальных операндов $A_i$. х4 заменяется на
"унисборка($f$ конкатена\-ция($t_1 \ldots t_m$ набор($p_1 \ldots
p_k$)))".

\item х4 имеет вид "сборка($f$ конкатенация($A_1 \ldots A_{i-1}$
набор($B_1 \ldots B_{j-1}$ унисборка($f$ $C$) $B_{j+1} \ldots
B_m$) $A_{i+1} \ldots A_n$))". Тогда $C$ выносится в список
операндов $A_k$, т.е. х4 заменяется на "сборка($f$
конкатенация($A_1 \ldots A_{i-1}$ набор($B_1 \ldots B_{j-1}
B_{j+1} \ldots B_m$) $A_{i+1} \ldots A_n \ C$))". Учитываются
вырожденные случаи - возможность $m = 1$ и возможность получения
одноэлементной конкатенации; в последнем случае вместо заголовка
"сборка" \ используется "унисборка".

\item В х4 имеется вхождение подтерма "конкатенация($A_1 \ldots
A_n$)", являющееся опе\-ран\-дом для символа "сборка" \ либо
"унисборка". Некоторое $A_i$ имеет вид "вы\-чер\-кивание($B$
$A_j$)". Тогда $A_i,A_j$ заменяяются на $B$.

\end{enumerate}

Упрощающие преобразования других типов будут применяться к
операторам ком\-пилируемой программы при завершающем
редактировании.

\section{Предварительная обработка устано\-вок на нор\-ма\-ли\-за\-цию}

При компиляции теоремных термов используются информационные
элементы (бы\-стр\-преобр $\ldots$), заблаговременно создаваемые
процедурой "учетнормализаторов(х1 х2 х3 х4)". Входными данными
здесь служат: х1 - теорема приема; х2 - заголовок приема; х3 -
программный блок; х4 - описание приема. Обращения к процеду\-ре
"учетнормализаторов" \ разбросаны по различным фрагментам
компилятора так, что\-бы по мере идентификации переменных
происходило своевременное пополнение спи\-ска элементов
(быстрпреобр $\ldots$). Отсутствие этих элементов на момент
компиля\-ции терма приведет к игнорированию его нормализаторов.

Если среди нормализаторов приема имеется хотя бы один,
использующий список посылок, причем сам прием не относится к
пакетному нормализатору, то проверя\-ет\-ся наличие
информационного элемента (проверка $x$). Этот элемент ссылается на
программную переменную $x$, значением которой является пара
(выводимо $A$); $A$ - накопитель использованных приемом посылок.
Если такого элемента нет, то в компилируемую программу заносится
оператор, инициализирующий накопитель (вы\-во\-димо $\ldots$), и
указанный элемент создается. Одновременно инициализируется
на\-ко\-пи\-тель (коррекцияпосылок $A$) и вводится связанный с ним
информационный эле\-мент (коррекцияпосылок $\ldots$). Ссылки на
накопители использованных посылок будут передаваться компилятором
в комментарии нормализаторов. Наличие в коммен\-та\-ри\-ях
элемента (выводимо $\ldots$) является для многих нормализаторов
необходи\-мым условием выполнения ими своих преобразований.

Инициируется нулем индикатор отказа х5. Если ему будет присвоена
единица, то произойдет отказ от компиляции приема.

Определяющие группы нормализаторов приема термы
"быстрпреобр($\ldots$)" \ упо\-рядочиваются по возрастанию длин,
после чего начинается цикл их просмотра. х7 - текущий
просматриваемый терм "быстрпреобр($\ldots$)". Переменной х8
присваи\-ва\-ет\-ся обрабатываемый нормализаторами терм, а
переменной х9 - список применяемых к нему нормализаторов приема,
причем в случае пакетного нормализатора берет\-ся только его
заголовок. Переменной х10 присваивается список той же длины, что и
х9, образованный наборами указателей обращения к пакетным
нормализаторам. Для обращений к вспомогательным задачам в списке
х10 помещаются пустые наборы.

Просматриваются нормализаторы "посылки($\ldots$)" \ и
"удалениепосылок($\ldots$)", при\-ве\-денные в терме х7. По ним
создаются информационные элементы (посылки $\ldots$) и
(чисткапосылок $\ldots$), уточняющие список посылок, относительно
которого к терму х8 будут применяться нормализаторы. Затем -
переход через "ветвь 2".

Здесь проверяется отсутствие ранее созданного для обработки терма
х8 инфор\-ма\-ци\-он\-но\-го элемента (быстрпреобр $\ldots$).
Затем инициируются накопители х11 и х12 разрядов $A$ и $B$
создаваемого информационного элемента (быстрпреобр х8 х9 $A$ $B$
$C$). Напомним, что $A$ - список наборов программных выражений для
входных данных нормализаторов, за исключением первого входного
данного (т.е. выражения для нормализуемого терма); $B$ - список
наборов сопровождающих обращение к нор\-ма\-ли\-за\-тору
указателей "условие($\ldots$)", "вариант($\ldots$)",
"лимит($\ldots$)"; $C$ - изначально 0, а затем программное
выражение для результата обработки терма х8 нормализато\-ра\-ми.
Последнее будет определяться уже на этапе обращения к процедуре
"метаперевод".

Для заполнения накопителей х11 и х12 реализуется цикл синхронного
просмотра списков х9 и х11. В этом цикле х13 - текущая позиция
списка х9, х14 - текущая позиция списка х11. Если на позиции х13
расположено название пакетного нор\-ма\-ли\-за\-то\-ра, то
переменной х15 присваивается набор, задающий его формат; в случае
задачи берется набор ("списокпосылок", "коррекцияпосылок"), а в
случае перемен\-ной для варьируемого названия пакетного
нормализатора - набор ("списокпосы\-лок").

Если х15 оказалось равно 0, причем компилируется прием вывода
тео\-рем, а на пози\-ции х13 расположено название более чем
одноместного пакетного нормали\-за\-то\-ра, отличного от символов
"станд", "стандупорядочение", то второе и третье вход\-ные данные
обращения суть: список комментариев и блок вывода "икс(1)". Они
зано\-сят\-ся на позицию х14, и продолжение цикла просмотра
списков х9, х11.

Иначе - находится список х16 указателей обращения к нормализатору
для теку\-щей позиции х13. Из него извлекаются, если они там есть,
элементы "лимит($\ldots$)", "фильтр($\ldots$)",
"условие($\ldots$)", "вариант($\ldots$)", и регистрируются на
текущей пози\-ции накопителя х12. В последнем случае
рассматривается альтернативный пакет\-ный нормализатор х18, и
список х15 пополняется элементами набора, задающего фор\-мат этого
нормализатора. Далее программа разветвляется.

\subsection{Компиляция приема пакетного нормализатора}

Если компилируется прием пакетного нормализатора, то находятся
заголовок нор\-ма\-ли\-затора х16 и набор х17, определяющий его
формат.

Если нормализатор по вхождению х13 не имеет списка посылок, то
проверя\-ет\-ся, имеет ли он хотя бы список комментариев. В
последнем случае на позицию х14 заносится одноэлементный набор,
состоящий из программного выражения для списка комментариев
нормализатора х16. Иначе - на позиции х14 сохраняется
"пус\-тое\-слово".

Если же нормализатор по вхождению х13 имеет список посылок, то
инициируется накопитель х18 программного выражения для списка
комментариев обращения к нормализатору. Изначально в нем
содержится ссылка на список комментариев того нормализатора, чей
прием компилируется. Далее выполняются следующие коррек\-ции х18:

\begin{enumerate}

\item В х15 содержится указатель формата "разборслучаев". Если
нормализатор х16 имеет тот же заголовок, что и текущий
нормализатор, то список коммента\-ри\-ев х18 корректируется так,
чтобы в нем оказался элемент "подчинено". Это позволит различать
корневое обращение к нормализатору, выполняющему раз\-бор случаев,
и вспомогательные рекурсивные обращения, использующие для разбора
случаев структуру данных, созданную при корневом обращении. Если
же заголовок х16 отличается от заголовка текущего нормализатора,
то в ком\-пи\-ли\-ру\-е\-мую программу заносится оператор,
создающий структуру данных для разбора случаев. Эта структура
данных передается в список комментариев х18, откуда процедурой
"началоразбора" \ предварительно исключаются струк\-ту\-ры данных,
относящиеся к внешнему разбору случаев.

\item Текущий нормализатор имеет указатель обращения
"исключкоммент($\ldots$)", оп\-ре\-деляющий отбрасывание всех
начинающихся с заданных символов ком\-мен\-та\-риев того
нормализатора, чей прием реализуется. Тогда к х18 применя\-ет\-ся
процедура "исключкоммент", выполняющая данную расчистку.

\item Текущий нормализатор имеет указатель обращения одного из
видов: "замеча\-ние($\ldots$)", "при\-мечание($\ldots$)",
"удалениезамечания($\ldots$)". Этот указатель явно задает
присоединяемый либо удаляемый комментарий. Находится программное
выражение для комментария, и выполняется соответствующая коррекция
х18.

\item Если компилируемый прием имеет указатель (вывод $\ldots$), а
также если нор\-ма\-ли\-за\-тор, к которому он относится, не
является корневым и предусматри\-ва\-ет обработку комментария
(коррекцияпосылок $\ldots$), - предпринимается удале\-ние из х18
ссылки на "старый" \ накопитель (выводимо $\ldots$) и вводится
ссылка на новый такой накопитель. Для этого применяется процедура
"переучет".

\end{enumerate}

Далее вводится накопитель х19 программного выражения для списка
посы\-лок, используемого при обращении. Изначально берется ссылка
на список посылок ре\-али\-зу\-е\-мо\-го нормализатора. Для случая
нормализатора "нормили" \ список посы\-лок пополняется
утверждениями из контекста преобразуемого терма.

Наконец, на позицию х14 заносится пара (х19,х18) выражений для
списков посы\-лок и комментариев обращения к текущему
нормализатору х13.

\subsection{Компиляция приема, не относящегося к пакетному
нор\-ма\-ли\-за\-то\-ру}

В этом случае прежде всего определяется программное выражение х16
для спи\-ска посылок обращения (контрольная точка "прием(2)"). Для
этого применя\-ет\-ся процедура "посылки". Если имелся указатель
обращения "расширениепосылок", то х16 корректируется с помощью
одноименной процедуры - добавляются утвер\-жде\-ния, выводимость
которых из основных посылок устанавливается по коммен\-та\-рию
(коррекцияпосылок $\ldots$). Затем х16 регистрируется в конце
накопителя входных про\-грам\-мных выражений, размещенного на
текущей позиции х14.

После отката к переходу через "ветвь 1" переменная х16 снова
становится не определенной, а затем инициируется пустым словом уже
в качестве накопителя про\-грам\-мных выражений для наборов
комментариев компилируемого обращения к нор\-ма\-ли\-затору.

В случае обращения к нормализатору из приема пакетного анализатора
про\-ис\-хо\-дит переприсвоение х16 выражения для списка
комментариев анализатора, по\-пол\-нен\-ного элементом (выводимо
пустоеслово). В прочих случаях набор коммента\-ри\-ев полагается
состоящим из элемента (выводимо пустоеслово), а при нали\-чии
указателя "коррекцияпосылок" \ формата текущего нормализатора -
также элемен\-та (коррекцияпосылок пустоеслово).

Если компилируемый прием имел указатель
"удалениеусловия($\ldots$)" \ либо
"уда\-ле\-ни\-е\-посылки($\ldots$)", в котором оговаривалась
блокировка удаления утверждения, использованного как посылка при
нормализации заданных термов, то создается либо корректируется
информационный элемент (норм $\ldots$). В нем перечисляются
на\-ко\-пи\-те\-ли (выводимо $\ldots$), появление в которых
удаляемого утверждения означает отме\-ну удаления.

Если имеется указатель "неизвестные" \ формата текущего
нормализатора, то в х16 заносится программное выражение для
набора, либо состоящего из цели те\-ку\-щей задачи (неизвестные
$\ldots$), либо, если такой цели нет, пустого. При наличии
указателя формата "разборслучаев" \ в х16 включается программное
выражение для комментария (разборслучаев $\ldots$), организующего
разбор случаев текущим нор\-ма\-ли\-за\-то\-ром.

Далее х16 пополняется комментариями, определяемыми указателями
обраще\-ния к нормализатору "замечание($\ldots$)",
"комментарии($\ldots$)".

При обращении к нормализатору с переменным заголовком из приемов
выво\-да теоремы происходит регистрация комментария
"редуцирование".

Наконец, набор программных выражений для входных данных текущего
обра\-ще\-ния пополняется термом "унисборка(конкатенация х16)",
собирающим список ком\-мен\-та\-ри\-ев из перечисленных выше
фрагментов.

\section{Компиляция фильтров для приема скани\-ро\-ва\-ния за\-да\-чи}

При компиляции приема сканирования задачи обработка фильтров
производит\-ся процедурой "блокпроверок(х1 х2 х3 х4 х5)". Ее
входные данные таковы: х1 - теоре\-ма приема; х2 - заголовок
приема; х3 - описание приема; х4 - программный блок; х5 - узел
приема. Процедура обрабатывает все те фильтры приема, которые не
были учтены на предшествующих этапах компиляции, и вставляет их в
компилируе\-мую программу так, чтобы обеспечить возможно лучшее
отсечение бесполезных дейст\-вий при сканировании задачи. Выйти на
начальную точку программы "блокпрове\-рок" \ можно через пункт
оглавления программ "Формирование фильтров приема, активизируемого
при сканировании задачи".

\subsection{Учет уровней срабатывания приема}

Прежде всего, создается рабочая копия х6 описа\-ния приема,
которая будет изменять\-ся по мере обработки фильтров. Далее
переменной х7 присваивается вхождение первого фрагмента программы
текущего про\-грамм\-но\-го блока х4, а переменной х8 - терм
"условие(и($F_1 \ldots  F_n$))" \ из описания прие\-ма,
перечисляющий фильтры $F_1, \ldots, F_n$. Инициализируется нулем
заготовка х9 опе\-ра\-то\-ра, определяющего уров\-ни
сра\-ба\-ты\-ва\-ния приема. После кон\-троль\-ной точки
"прием(3)" вводится пустой на\-ко\-пи\-тель х10 этих уровней. Он
заполня\-ет\-ся всеми такими значениями $n$, которые встречаются в
подтермах фильтров, имеющих вид "уровень($\ldots \ n \ldots$)".
При этом неважно, является ли подтерм корневым или расположен
внутри фильтра. Значения $n$ упорядочиваются по возрастанию, и по
завершении просмотра (переход "иначе 5") переменной х9
переприсваивается опе\-ра\-тор "уровень($\ldots$)". Затем - откат
к переходу через "ветвь 4". Если список х10 был пуст и х9 осталось
равно 0, то компиляция приема отменяется.

\subsection{Компиляция префиксных фильтров приема}

После контрольной точки "прием(4)" \ происходит инициализация
списка х10 фильт\-ров, заносимых в начало программы приема (они
называются префиксными фильт\-рами). В список х10 заносятся:
оператор "стандарт(х2)", проверяющий, что после вхождения текущего
сканируемого символа идет открывающая скобка (кроме слу\-ча\-ев,
когда такой оператор заведомо не нужен); присвоенный переменной х9
опера\-тор "уровень($\ldots$)"; оператор "новый", блокирующий
повторное рассмотрение сим\-во\-ла при ненулевом отложенном уровне
сканирования. Далее составляется список х11 всех фильтров приема,
из которого вычеркиваются фильтры, учтенные на
предшест\-ву\-ю\-щих этапах компиляции - они зарегистрированы в
информационных элемен\-тах (комментарии $\ldots$). Предпринимается
просмотр всех фильтров списка х11, не содержащих символа
"результат" \ и не имеющих заголовка "уровень". Первые бу\-дут
обрабатываться после формирования приемом результирующего
(например, за\-ме\-ня\-ю\-ще\-го) терма; второй - уже учтен при
создании оператора х9.

Для текущего фильтра предпринимается цикл разборки его логической
кон\-ст\-рук\-ции на атомарные составляющие, из которых собирается
набор х13. Если в некото\-рый момент выясняется, что атомарная
составляющая не подлежит включению ее в префиксный фильтр (здесь
применяется справочник "начало"), то переход к очеред\-но\-му
элементу списка х11. Специально блокируется обработка фильтра
"цель($\ldots$)" \ до обработки фильтра "тип($\ldots$)". Проверка
наличия той или иной цели до выясне\-ния типа задачи может
привести к обрыву решения по некорректному обращению к оператору
ЛОСа - так как задачи на доказательство целей не имеют.

По завершении цикла разборки текущего фильтра, целью которого
является при\-ня\-тие решения о занесении его в префиксные
фильтры, выполняется обращение к процедуре "фильтр" \ и получение
программного выражения х15 для конъюнк\-ции операторов,
проверяющих истинность фильтра. Конъюнктивные члены х15
до\-бав\-ля\-ют\-ся к концу списка х10.

По мере обработки префиксных фильтров их позиции в списке х11
заменя\-ют\-ся нулями. Затем терм "условие($\ldots$)" \ в копии х6
описания приема заменяется на скорректированный, в котором
исключены уже обработанные фильтры. Нако\-нец, список операторов
х10 вставляется в начало первого фрагмента скомпилирован\-ной
программы, после первого оператора этого фрагмента.

\subsection{Определение результирующего терма}

В основном, компиляция фильтров, анализирующих результирующий терм
прие\-ма (заменяющий терм, выводимое утверждение и т.п.),
выполняется в рамках процеду\-ры "преобразователь", компилирующей
действия по преобразованию задачи. Однако, в двух специальных
случаях этот терм находится уже при обработке фильтров.

\subsubsection{Прием замены, имеющий фильтр "длина" \ }

Если компилируется прием замены, причем некоторый фильтр имеет
вхождение символа "длина", рассматриваемое как указание на
сравнение старого и нового тер\-мов (контрольная точка
"прием(5)"), то находится заменяющий терм х8 теоремы приема и
определяется программное выражение х9 для этого терма. Оно
ре\-гис\-три\-ру\-ет\-ся для дальнейшего использования в
информационном элементе (результат $\ldots$).

\subsubsection{Прием вывода, имеющий фильтр "контрольвывода" \ }

Если компилируется прием вывода, некоторый фильтр которого
содержит сим\-вол "контрольвывода", то должна выполняться проверка
того, что выводимое утвер\-жде\-ние не содержит выражений, ранее
отстуствовавших в задаче (контрольная точка "прием(6)"). Здесь
определяется программное выражение х7 для вы\-во\-ди\-мо\-го
ут\-вер\-жде\-ния, регистрируемое в информационном элементе
(результат $\ldots$).

\subsection{Основной цикл обработки фильтров}

После контрольной точки "прием(7)" \ происходит обработка
оставшихся фильт\-ров, кроме тех, которые содержат ссылку
"результат" \ на новый терм, вводимый прие\-мом. Переменной х7
сначала присваивается терм "условие($\ldots$)" \ из копии х6
описа\-ния приема; затем находится терм х9, полученный удалением
из х7 уже обработан\-ных либо содержащих "результат" \ фильтров, и
переменной х7 переприсваива\-ет\-ся значение х9.

Для тех теоремных переменных, которые расположены внутри подтермов
фильт\-ров, имеющих вид "программа($\ldots$)", рассматриваются
программные выражения $T$, определяющие их идентификацию. Если
встречается $T$, отличное от переменной, то для него вводится
вспомогательная программная переменная.

Находится список х8 фильтров, задаваемых термом х7. Его элементы
переупо\-ря\-до\-чи\-ва\-ют\-ся так, чтобы фильтры с заголовком
"конец" \ размещались в конце.

Последовательно просматриваются фильтры х9 списка х8. Из просмотра
ис\-клю\-ча\-ют\-ся фильтр "контрольодз", предполагающий анализ
результирующего терма при\-ема, а также технические разделители
",". Для обработки текущего фильтра при\-вле\-ка\-ет\-ся процедура
"фильтр" \ (она будет описана далее). Определяемая ею конъюнк\-ция
операторов, реализующих фильтр, разбирается на отдельные
конъюнктив\-ные члены, и каждый из них регистрируется в
компилируемой программе с помо\-щью процедуры "вставкафильтра".
Эта процедура и принимает решение о точке размеще\-ния фильтра в
компилируемой программе. Краткое описание ее будет приведе\-но
далее.

\subsection{Дополнительные фильтры для приема "связка"\ }

После контрольной точки "прием(8)" \ рассматривается случай
приемов, имею\-щих заголовок "связка" \ либо "существует". Такие
приемы выполняют устранение груп\-пы $X$ несущественных
неизвестных задачи, усматривая либо возможность замены утверждения
существования значений $X$, при которых истинны все содержащие их
условия задачи, на некоторое новое условие, либо истинность
данного утвержде\-ния существования. Переменной х8 присваивается
список программных выраже\-ний для переменных списка $X$. Затем
добавляются операторы, проверяющие следую\-щие условия: все
переменные списка $X$ суть несущественные неизвестные; они
различ\-ны; не участвующие в групповой замене условия задачи не
содержат переменных $X$.

\section{Процедура "фильтр"\ }

Для компиляции отдельного фильтра введена процедура "фильтр(х1 х2
х3 х4 х5)". Это - операторное выражение ЛОСа, которому передаются
следующие входные дан\-ные: х1 - теорема приема; х2 - заголовок
приема; х3 - описание приема; х4 - про\-грамм\-ный блок; х5 -
компилируемый подтерм фильтра. Значением выражения стано\-вит\-ся
оператор, реализующий проверку истинности подтерма х5. Если такой
опера\-тор создать не удалось, выдается значение 0.

Всю фактическую работу по компиляции фильтра выполняют справочники
"блок\-проверок" \ и "оператор", к которым обращается процедура
"фильтр". Логическим символом обращения является заголовок
подтерма х5.

Программа справочника "блокпроверок" \ получает при обращении к
ней те же входные данные х1 - х5, что и процедура "фильтр". Она
выдает в качестве резуль\-та\-та оператор для проверки фильтра х5.
Возможны особые случаи, когда выдается операторное выражение,
используемое во внешнем операторе фильтра, либо даже
вспомогательный программный блок (см. далее раздел, посвященный
фильтрам с заголовком "контекст"). Обычно процедура справочника
"блокпроверок" \ пред\-при\-ни\-мает сначала обращения к процедуре
"прогрвыражение" \ для получения оператор\-ных выражений, задающих
входные данные проверки, а затем строит с их помо\-щью проверочный
оператор.

Чтобы упростить подключение к компилятору новых типов фильтров,
был вве\-ден справочник "оператор". Он используется в тех случаях,
когда заголовок $S$ подтер\-ма х5 одновременно является заголовком
выполняющей проверку процедуры ЛОСа. Справочник получает в
качестве входного данного лишь символ обращения $S$ и выдает набор
указателей типов значения операндов процедуры $S$. По этому
набо\-ру типов процедура "фильтр" \ сама организует необходимые
обращения к опера\-то\-ру "прогрвыражение" \ и создает
результирующий оператор $S(\ldots)$. Обращение к справочнику
"оператор" \ происходит из процедуры "фильтр", если обращение к
спра\-воч\-нику "блокпроверок" \ оказалось безрезультатным.

Программы справочников "блокпроверок" \ и "оператор" \ практически
все не\-слож\-ны. Исключение здесь составляет лишь весьма большая
программа справоч\-ни\-ка "блокпроверок" \ на символе "контекст".
Ей будет посвящен далее специальный раз\-дел.

Если фильтр х5 имеет вид "определено($P$ $A_1 \ldots A_n$)", то
выполняющий про\-вер\-ку условия $P$ оператор должен размещаться в
программе после того, как будут идентифицированы все переменные
термов $A_1, \ldots , A_n$. Процедура "фильтр" \ на\-хо\-дит
оператор х6 для проверки $P$; составляет список х8 программных
выра\-же\-ний для $A_1, \ldots , A_n$, находит список х9
параметров этих выражений, и выдает в качест\-ве результата
вспомогательный терм "фикс(х6 х9)". Наличие в нем переменных
спи\-ска х9 приведет к тому, что процедура "вставкафильтра" \
начнет выбор позиции для фильтра в программе после точки, в
которой все эти переменные определятся. При этом заголовок "фикс"
\ и переменные х9 будут отброшены, а вставлен в про\-грам\-му
только сам оператор х6.

\section{Процедура "вставкафильтра"\ }

Обращение к процедуре имеет вид "вставкафильтра(х1 х2)", где х1 -
программный блок; х2 - вставляемый оператор фильтра.
Предполагается, что он не имеет выход\-ных переменных.

Если х2 имеет заголовок "истина", то никаких действий не
предприни\-ма\-ет\-ся. Если х2 имеет вид "конец($A$)", то оператор
фильтра $A$ заносится в конец компи\-ли\-ру\-е\-мой программы.

В остальных случаях определяется такая программная переменная х3,
что фильтр должен быть расположен в программе не раньше места, где
значение этой перемен\-ной становится определенной. Сначала х3
присваивается переменная с номером 6 - первая не определенная при
сканировании задачи. Если имеется информацион\-ный элемент
(вставкафильтра $X$), причем номер переменной $X$ больше номера
значе\-ния переменной х3, то х3 переприсваивается $X$. Для
пакетного оператора в начале программы ищется "точка
разветвления", до которой располагается общая часть всех приемов
пакета (например, у нормализаторов это оператор "повторение").
Если номер переменной - значения х3 не превосходит номеров
переменных, встреча\-ю\-щих\-ся до точки разветвления, то значение
х3 корректируется. Наконец, проверяется, не содержит ли
вставляемый фильтр свободной переменной, номер которой не мень\-ше
номера значения х3. Тогда выполняется еще одна коррекция х3.

Если фильтр имеет вид "фикс($A$ $B_1 \ldots B_n$)", то он
заменяется на $A$. Указание на размещение этого фильтра после
того, как определятся все свободные перемен\-ные термов $B_1,
\ldots, B_n$, уже учтено при выборе х3.

Далее начинается цикл просмотра операторов программы для выбора
места вста\-вки фильтра. Фрагменты программы просматриваются в том
порядке, как они рас\-по\-ло\-жены в программном блоке; внутри
каждого фрагмента операторы перечис\-ля\-ют\-ся слева направо. х4
- вхождение текущего фрагмента х5 в список фрагментов; х6 -
вхождение текущего оператора в фрагмент х5. Вставка будет
происходить пе\-ред оператором х6. Операторы "меткаперехода" \ и
"Обрыв" \ игнорируются. При обна\-ру\-же\-нии оператора перехода
просмотр фрагмента обрывается. Для текущего опера\-то\-ра $P$
проверяется выполнение хотя бы одного из условий:

\begin{enumerate}

\item Имеется свободная переменная $P$, номер которой не меньше
номера перемен\-ной х3.

\item Фильтр имеет вид "десчисло($A$)", х6 - последнее вхождение в
последний фраг\-мент, причем все свободные переменные терма $A$
встречались в предшест\-ву\-ю\-щих операторах.

\item Фильтр имеет единственную переменную $x$, являющуюся
свободной перемен\-ной предшествующего х6 оператора, причем в этом
фильтре используют\-ся только символы отношений и операций
"равно", "заголовок", "входит", "не", "унисборка", "параметры",
"списокпеременных", "символ".

\item Фильтр имеет вид "равно(суммавсех($\ldots$ операнд($\ldots$)
$\ldots$)$A$)", причем все его свободные переменные встречались в
предшествующих операторах.

\item Фильтр имеет вид "не(равно($x$ $y$))", причем оператор,
предшествующий х6, имеет переменные с номерами, не меньшими
номеров переменных $x,y$.

\end{enumerate}

Если ни одно из них не выполнено, то переход к очередному
вхождению х6. Иначе - продолжается анализ текущего вхождения с
точки зрения целесообраз\-нос\-ти вставки перед ним фильтра х2.
Заметим, что приведенные выше условия, начи\-ная со второго,
выделяли особые случаи "простых" \ фильтров, размещаемых
возмож\-но ближе к началу.

Далее идет цепь проверок различных условий, каждое из которых
означает не\-це\-ле\-сообразность вставки фильтра перед текущей
позицией х6. Выполнение любого из них влечет откат для перехода к
следующей текущей позиции х6. В особых случаях вместо этого
предпринимается сдвиг текущей позиции влево и продол\-же\-ние
обработки цепочки условий. Перечислим эти условия:

\begin{enumerate}

\item Фильтр содержит подтерм "числзначение($A$)", причем после х6
распо\-ло\-жен оператор "десчисло($A$)". Очевидно, попытка
получения десятичного числа по выражению $A$ до проверки того, что
это выражение является десятичной за\-писью числа, нежелательна.

\item После х6 имеется вхождение оператора "Текпосылка" \ либо
"текпосылка". Эти операторы применяются в пакетных анализаторах
для перечисления теку\-щих вхождений, и отрезок до них обычно
относится сразу ко многим приемам.

\item После х6 имеется оператор "символ($x$ $a$)", где $a$ -
логический символ либо символ переменной, причем фильтр содержит
подтерм "операнд($x$ $t$)". Отсе\-че\-ние по заголовку подтерма
$x$ дешевле, чем проверка условия, за\-тра\-ги\-ва\-ю\-ще\-го
операнды этого подтерма.

\item После х6 имеется оператор "равныетермы($\ldots$)", причем в
фильтре использу\-ет\-ся подтерм "десчисло($\ldots$)" \ или
"констдробь($\ldots$)".

\item После х6 имеется оператор "новый".

\item После х6 имеется оператор "повторение", либо
"контрольбуфера", либо дизъ\-юнк\-ция "или($A_1 \ldots A_n$)", у
которой $A_1$ - оператор присвоения, а сразу вслед за дизъюнкцией
расположено некоторое $A_i$. Все эти случаи относятся к
раз\-ме\-ще\-нию "точки разветвления" \ пакетного оператора после
текущей пози\-ции х6.

\item Либо существует общая свободная переменная оператора фильтра
и текуще\-го оператора, не определенная до реализации этого
оператора и имеющая но\-мер более 5, либо существует такая
свободная переменная фильтра, кото\-рая изменяется идущим после х6
оператором "замена($\ldots$)". В последнем случае исключение
делается для изменения переменной х2 приемом пакетного
нор\-ма\-ли\-за\-тора (коррекция списка посылок после срабатывания
приема). В обоих случаях номер переменной х3 увеличивается так,
чтобы он был больше номе\-ров переменных текущего оператора.

\item Фильтр имеет операторное выражение, выделяющее корневой
операнд либо подтерм с заданным номером от начала или от конца -
например, "второйопе\-ранд($x$)", причем после х6
рас\-по\-ла\-гается оператор "символ($x$ $\ldots$)" \ или
"за\-го\-ло\-вок($x$ $\ldots$)". Без уточнения того, какой символ
расположен на вхождении $x$, нельзя гарантировать существова\-ние
операнда с указанным в фильтре но\-ме\-ром.

\item Если фильтр имеет вид "десчисло($A$)", причем некоторый
предшествую\-щий текущему оператору оператор х8 имеет вхождение
подтерма "числзначе\-ние($A$)" \ либо
"числзначение(левыйкрай($A$))", то предпринимается откат текущей
пози\-ции х6 к позиции оператора х8. После этого - не возвращение
к циклу про\-смот\-ра вхождений х6, а переход через "ветвь 1" \
для продолжения обработки це\-поч\-ки условий.

\item Фильтр имеет вхождение подтерма "цель(х1 $\ldots$)", причем
некоторый рас\-по\-ло\-жен\-ный после текущего (включая его)
оператор имеет вхождение подтер\-ма "тип(х1 $\ldots$)", а
предшествующие текущему операторы не имели таких под\-тер\-мов.
Здесь х1 - переменная, обозначающая текущую задачу приема. До
установления ее типа нельзя обращаться к проверке наличия той или
иной цели, т.к. задача на доказательство целей не имеет, и
интерпретатор ЛОСа в указанном случае будет выдавать сообщение о
некорректном использова\-нии оператора.

\item Если оператор, предшествующий текущему, имеет заголовок
"уровень\-об\-ра\-ще\-ния", то происходит откат текущей позиции х6
к предыдущей - чтобы фильтр не портил установки на уровень
обращения к вспомогательной задаче. Далее - продолжение обработки
цепочки условий.

\item Если фильтр имеет вхождение подтерма "унисборка($A$ $t$)",
причем некото\-рый расположенный после х6 оператор $P$ проверяет
непустоту списка $t$, то он вы\-би\-ра\-ет\-ся в качестве
текущего, и далее - продолжение обработки цепочки усло\-вий. Если
$P$ был расположен в конце программы, то фильтр добавляется после
не\-го.

\end{enumerate}

После прохождения церез цепочку проверок решение о вставке фильтра
перед позицией х6 считается принятым. Далее просматриваются
условные выражения "ва\-ри\-ант($A$ $t_1$ $t_2$)", расположенные
после х6, у которых $A$ совпадает с фильтром или его отрицанием.
Такие условные выражения заменяются на соответствующий под\-терм
$t_1$ либо $t_2$.

Чтобы связанные переменные фильтра были отличны от ранее
определенных переменных, предпринимается его коррекция с помощью
процедуры "нормопера\-то\-ра". Проверяется отсутствие уже
имеющегося ранее позиции х6 оператора, со\-впа\-да\-ю\-ще\-го с
оператором фильтра. Затем предпринимается вставка фильтра
непо\-сред\-ст\-вен\-но перед х6.

\section{Компиляция фильтров и операторных выраже\-ний со
свя\-зан\-ны\-ми пе\-ре\-мен\-ны\-ми}

Как уже отмечалось выше, в языке фильтров ГЕНОЛОГа кванторы и
описатели вводятся без явного указания связанных переменных.

Например, квантор существования оформляется в виде фильтра
"контекст($A_1 \ldots \\ A_n$)", у которого связанными считаются
все переменные, не идентифициро\-ван\-ные вне этого фильтра.
Строго говоря, данная конструкция представляет собой нечто
большее, чем просто квантор существования - она может содержать в
списке $A_1, \ldots, \\ A_n$ указатели идентификации и другие
технические элементы, доопределяющие се\-ман\-ти\-ку фильтра и
способ его компиляции. Специального аналога квантора общ\-нос\-ти
для фильтров нет - он выражается через отрицание квантора
существования.

Кроме фильтра "контекст", принцип введения связанных переменных
"по умол\-ча\-нию" \ применяется и для встречающихся в фильтрах
операторных выра\-же\-ний. Перечислим основные типы таких
выражений:

\begin{enumerate}

\item "число($A_1 \ldots A_n$)" \ - количество си\-ту\-а\-ций,
удовлетворяющих условиям $A_1, \ldots,\\  A_n$;

\item "перечисление($A_1 \ldots A_n \ t$)" \ - набор значений
операторного выражения $t$ для ситуаций, в которых истинны $A_1,
\ldots , A_n$, с исключением повторных вхожде\-ний;

\item "выписка($A_1 \ldots A_n \ t$)" \ - то же, что предыдущее,
но без исключения повтор\-ных вхождений;

\item "суммавсех($A_1 \ldots A_n \ t$)" \ сумма числовых значений
операторного выражения $t$ для ситуаций, в которых истинны $A_1,
\ldots , A_n$;

\item "нод($A_1 \ldots A_n \ t$)" \ - наи\-боль\-ший общий
делитель значений операторного выра\-же\-ния $t$ для ситуаций, в
которых ис\-тин\-ны $A_1, \ldots, A_n$;

\item "нок($A_1 \ldots A_n \ t$)" \ - наи\-меньшее общее кратное
значений операторного выра\-же\-ния $t$ для ситуаций, в которых
ис\-тин\-ны $A_1, \ldots, A_n$;

\item "максимум($A_1 \ldots A_n \ t$)" \ - наибольшее значение
операторного выражения $t$ для ситуаций, в которых ис\-тин\-ны
$A_1, \ldots, A_n$;

\item "минимум($A_1 \ldots A_n \ t$)" \ - наименьшее значение
операторного выражения $t$ для ситуаций, в которых ис\-тин\-ны
$A_1, \ldots, A_n$;

\end{enumerate}

Здесь, как и выше, некоторые из термов $A_i$ могут
пред\-став\-лять собой указа\-те\-ли. Во всех перечисленных
случаях для компиляции применяется программа спра\-воч\-ни\-ка
"блокпроверок" \ на символе "контекст". Если заголовок
операторного вы\-ра\-же\-ния либо фильтра, имеющих связанные
переменные, отличен от символа "кон\-текст", то происходит
переадресация обращения программе символа "контекст". Так как
заголовок компилируемого терма при такой переадресации
сохраняется, то про\-грам\-ма "контекст" \ сможет впоследствии
учесть специфику конкретного обращения к ней. На\-йти начальную
точку данной программы можно через раздел "Формиро\-ва\-ние
филь\-тров "контекст($\ldots$)" \ " \ оглавления программ.

В начале программы определены следующие значения: х1 - теорема
приема; х2 - заголовок приема; х3 - описание приема; х4 -
программный блок; х5 - компили\-ру\-е\-мый терм $F(A_1 \ldots
A_n)$.

Переменной х6 присваивается набор корневых операндов $A_1, \ldots
, A_n$. Если ком\-пи\-ли\-ру\-ет\-ся программное выражение, то из
данного набора исключается послед\-ний элемент $A_n$ - он играет
особую роль и будет учитываться впоследствии.

Создаются списки х7 и х8, несущие информацию об идентифицирующих
тер\-мах $A_i$, имеющих, соответственно, вид "вид($t_1 \ t_2$)" \
либо "подтерм($t$)". х7 состоит из пар термов ($t_1$, $t_2$); х8 -
из термов $t$.

Переменной х9 присваивается список заголовков тех информационных
элемен\-тов, которые будут передаваться из текущего программного
блока х4 во вспомогательный программный блок х10, создаваемый для
компиляции терма х5. При компиля\-ции программного выражения будет
создаваться оператор, реализующий цикл обра\-бот\-ки накопителя
(текущей суммы, текущего списка, текущего максимума или
мини\-му\-ма и т.п.). В этих случаях первая неопределенная
программная переменная бло\-ка х10 берется на единицу большей -
чтобы пропустить переменную, выбранную в качестве накопителя.
Кроме элементов с заголовками из х9, в блок х10 перено\-сят\-ся
все элементы (быстрпреобр $\ldots$) и вводится ряд новых
элементов, позволяю\-щих компилятору учитывать специфику данного
программного блока. Напри\-мер, элемент "и" \ означает, что
программа должна состоять из единственного фрагмента - это
естественно потребовать, так как нужно будет брать конъюнкцию ее
опера\-то\-ров. Накопитель программы блока х10 состоит из
единственного пустого фраг\-мен\-та. Чтобы оператор
"вставкафильтра" \ мог регистрировать в программе блока х10
но\-вые операторы, создается информационный элемент
(вставкафильтра $X$), указы\-ва\-ю\-щий первую не определенную
переменную $X$ для начала этой программы.

После контрольной точки "прием(2)" \ начинается цикл обработки
иденти\-фи\-ци\-ру\-ю\-щих термов, размещенных в списке $A_1,
\ldots , A_n$ до первого из специальных
иден\-ти\-фи\-ци\-ру\-ю\-щих термов, имеющих заголовок "вид" \
либо "подтерм". Обычные иден\-ти\-фи\-ци\-ру\-ю\-щие термы,
расположенные после термов "вид", "подтерм", останут\-ся
необработанными, и будет выдан отказ от компиляции приема. Текущий
про\-смат\-ри\-ва\-емый терм $A_i$ присваивается переменной х12.

Подлежащие обработке идентифицирующие термы распознаются по
наличию не идентифицированной переменной, не расположенной внутри
фильтра "контекст($\ldots$)" \ или операторного выражения со
связанными переменными. Для обработки их при\-ме\-ня\-ет\-ся
процедура "оператор". Она сначала обращается к справочнику
"значение", а затем, как и в рассмотренной выше компиляции
"обычных" \ фильтров, приме\-ня\-ет справочник "оператор". Отличие
от компиляции фильтров состоит в наличии у обрабатываемого терма
выходных переменных. Справочник "значение" \ анало\-ги\-чен
рассматривавшемуся при компиляции фильтров справочнику
"блокпроверок", с поправкой на наличие выходных переменных.

При успешной обработке текущего идентифицирующего терма $A_i$ на
его место в списке х6 помещается 0. По окончании цикла обработки
идентифицирующих тер\-мов - откат к переходу через "ветвь 1".

Здесь происходит исключение из списка х6 всех нулей, возникших на
мес\-тах откомпилированных идентифицирующих термов, а также термов
"вид($\ldots$)" \ и "под\-терм($\ldots$)", которые уже учтены в
списках х7 и х8.

После контрольной точки "прием(3)" \ начинается подготовка
обработки в про\-грамм\-ном блоке х10 идентифицирующих термов
"вид($\ldots$)", "подтерм($\ldots$)". Рас\-смат\-ри\-вается набор
х7 пар ($t_1$ $t_2$), созданных по термам "вид($t_1$ $t_2$)". По
нему составля\-ет\-ся список х11 программных выражений для
корневых вхождений термов $t_1$, кото\-рые будут
идентифицироваться с $t_2$. Если для некоторого $t_1$ подходящее
программ\-ное выражение для вхождения не усматривается, но зато
имеется программное вы\-ра\-же\-ние $T$, определяющее набор
корневых операндов этого вхождения (в форма\-те термов), то в
список х11 на соответствующую позицию заносится 0, а в блоке х10
создается информационный элемент (набороперандов $V$ $T$); $V$ -
корневое вхожде\-ние $t_2$. После заполнения списка х11 - переход
через "иначе 1".

После контрольной точки "прием(4)" \ реализуется цикл определения
по ненуле\-вым элементам списка х11 установок на идентификацию.
Если идентификация для $t_2$ одношаговая (например, $t_2$ -
переменная, либо терм, для которого идентифика\-ция возможна с
помощью справочника "вид"), то в программу блока х10 сразу
зано\-сят\-ся выполняющие идентификацию операторы, а
соответствующий разряд спи\-ска х11 заменяется на 0. Иначе
определяется установка на идентификацию (операнд $\ldots$),
которая регистрируется на текущей позиции х13 списка х11 вместо
ранее занимав\-ше\-го ее программного выражения. При этом в
программу блока х10 заносится опера\-тор, анализирующий заголовок
идентифицирующего терма, а также оператор, вводя\-щий используемую
в установке (операнд $\ldots$) вспомогательную переменную для
корне\-во\-го вхождения. По окончании просмотра списка х11 -
переход через "иначе 1".

Из списка х11 исключаются нулевые элементы, и после контрольной
точки "при\-ем(5)" \ реализуется цикл пополнения его установками
на идентификацию для иден\-ти\-фицирующих термов "подтерм($t$)".
Переменной х12 присваивается текущий терм $t$ списка х8. Чтобы
информационный элемент (корень $\ldots$) внешнего программ\-но\-го
блока х4, формально перенесенный в блок х10, не вносил возможных
искажений в компиляцию, он удаляется. Далее, в зависимости от типа
терма $t$, рассматри\-ва\-ют\-ся следующие случаи:

\begin{enumerate}

\item $t$ имеет вхождение логического символа "теквхожд". Данное
вхождение рас\-смат\-ри\-вается как ссылка на корневое вхождение
$v$ идентифицируемого в при\-еме терма (например, заменяемого
терма в случае приема замены). Если оно размещено внутри
конструкции "внешсимвол($s$ теквхожд)", то в качестве точки
привязки при идентификации берется не вхождение $v$, а вхождение
той внешней операции $s$, операндом которой оно является. В
случае, когда внешняя операция отсутствует или имеет отличный от
$s$ заголовок, сохраняется вхождение $v$. По выбранной точке
привязки $V$ создается установка на идентификацию (опе\-ранд $V$
$\ldots$), регистрируемая в списке х11. Создается также
информацион\-ный элемент (подтерм $\ldots$) программного блока
х10, ссылающийся на корне\-вое вхождение терма $t$.

\item $t$ имеет вхождение выражения "теквхожд($A$)", где $A$ -
либо переменная, ли\-бо указатель "фикс($\ldots$)" \ вхождения в
теорему приема. В обоих случаях ана\-ли\-зи\-ру\-ет\-ся
окрестность вхождения, идентифицированного с $A$. Для этого, как и
выше, создаются установка (операнд $\ldots$) и информационный
элемент (под\-терм $\ldots$).

\end{enumerate}

По окончании цикла - откат к переходу через "ветвь 1". Здесь
начинается цикл учета указателей идентификации, имеющихся в списке
х6. Напомним, что этот список образован не обработанными на
текущий момент корневыми операндами $A_i$
ком\-пи\-ли\-ру\-е\-мо\-го фильтра. После контрольной точки
"прием(9)" \ переменной х12 при\-сва\-и\-ва\-ет\-ся список всех
термов, внутри которых выделены вхождения, упоминаемые в
установках списка х11.

После контрольной точки "прием(10)" \ предпринимается учет
указателей прие\-ма "отображение($\ldots$)", ссылающихся на
функциональные переменные термов спи\-ска х12 - для них в
программный блок х10 заносятся информационные элементы
(отображение $\ldots$). Затем - переход через "ветвь 2", где
начинается рассмотре\-ние указателей идентификации х13 списка х6:
Предусмотрено использование указа\-те\-лей с заголовками:
"отображение", "единица", "отрицание", "заменазнака",
"знаксум\-мы", "операнд", "циклупорядочение", "множество",
"дробь", "набороперандов", "ва\-риант". По ним создаются
соответствующие информационные элементы блока х10, а сами
указатели исключаются из списка х6. После обработки указателей -
откат к переходу через "ветвь 1".

Здесь происходит пополнение списка х11 установок на идентификацию
за счет фильтров и идентифицирующих термов "усм($\ldots$)",
содержащихся в списке х6. Да\-лее - переход через "ветвь 1".
Переменной х12 присваивается тот из идентифици\-ру\-е\-мых термов,
в котором расположено служебное слово "теквхожд"; если тако\-го
терма нет, то вместо него берется однобуквенный терм "0". Корневое
вхожде\-ние терма х12 будет передаваться процедуре "идентификатор"
\ в качестве первого операнда.

Переменной х13 присваиваются все оставшиеся термы списка х6,
имеющие слу\-жеб\-ный характер. Результат исключения их из х6
образован фильтрами; он при\-сва\-и\-ва\-ется переменной х14.
Наконец, вводится набор х15, полученный добавлением к списку х13
терма "условие($K$)" \ для конъюнкции $K$ фильтров из х14. Этот
набор будет передаваться процедуре "идентификатор" \ в качестве
заменителя описания приема. Из основного описания приема в него
переносятся элементы с заголов\-ка\-ми "символ", "комплексное",
"частнпроизв", "кортежпеременных".

Если компилируется выражение вида "идентификатор($\ldots$)",
возникающее при рассмотрении указателя приема
"контекст($\ldots$)", то создается информацион\-ный эле\-мент
(копия $\ldots$) основного программного блока х4, ссылающийся на
иден\-ти\-фи\-ци\-ру\-е\-мые части корневых операндов
"вид($\ldots$)", "подтерм($\ldots$)" \ данного выражения.

Среди фильтров списка х14 выбираются фильтры х16 с заголовком
"стандарт". Предпринимается попытка компиляции их относительно
программного блока х10. Опережающая обработка таких фильтров нужна
для предотвращения некоррект\-ных обращений к операторам,
предполагающим наличие вхождения символа с идущей после него
открывающей скобкой. Обработанные фильтры исключаются из спис\-ка
х14.

Наконец, после контрольной точки "прием(17)" \ происходит
обращение к про\-це\-ду\-ре "идентификатор" \ для обработки в
программном блоке х10 установок на иден\-ти\-фи\-ка\-цию,
накопленных в списке х11. Таким образом, оказываются учтены
иден\-ти\-фи\-ци\-ру\-ю\-щие термы "вид($\ldots$)",
"подтерм($\ldots$)" \ и "усм($\ldots$)". После этого
компилиру\-ют\-ся оставшиеся фильтры списка х14. Далее - переход
через "иначе 1".

Здесь компиляция разветвляется - в зависимости от заголовка
обрабатываемого терма х5. Как уже замечалось выше, процедура
справочника "блокпроверок" \ на логическом символе "контекст" \
используется для компиляции либо фильтра, либо операторного
выражения специального вида. После приведенной выше общей части
далее учитывается конкретная специфика компилируемого терма.

\begin{enumerate}

\item х5 имеет вид "и($A_1 \ldots A_n$)". Такой терм х5 вводится
при компиляции иден\-ти\-фи\-ци\-ру\-ющего терма вида
"или($\ldots$)". Заголовок "и" \ здесь играет роль служеб\-но\-го
символа. Результатом обработки является сам программный блок х10.
Эти программные блоки, полученные для различных дизъюнктивных
членов, будут далее использоваться программой справочника
"значение" \ на символе "или" \ при сборке результирующего
перечисляющего оператора. Соответственно, в данном случае выдается
ответ х10.

\item х5 имеет вид "идентификатор($A_1 \ldots A_n$)". Такой терм
х5 вводится при обработ\-ке указателя приема "контекст($\ldots$)",
обеспечивающего дополнительную иден\-ти\-фи\-кацию. Все
переменные, идентифицированные внутри вспомогатель\-но\-го блока
х10, будут далее использоваться в основном блоке х4.
Соответствен\-но, программа блока х10 присоединяется к программе
блока х4, и все обеспечи\-ва\-ю\-щие идентификацию информационные
элементы блока х10 передаются бло\-ку х4. В качестве ответа
выдается единица, сигнализирующая об успеш\-ном завершении
компиляции.

\item х5 имеет вид "примеч($A_1 \ldots A_n \ B$)". Такой терм
представляет собой указа\-тель приема, определяющий ввод серии
комментариев $B$ для значений перемен\-ных, порождаемых условиями
$A_1, \ldots, A_n$. Строится оператор х19, обеспечиваю\-щий на
текущем шаге перечисления наборов значений переменных ввод
необхо\-ди\-мо\-го комментария задачи; на основе программы блока
х10 и оператора х19 создается кванторная импликация х21,
реализующая цикл перечисления, и эта импликация регистрируется в
программе блока х4. В качестве ответа выда\-ет\-ся единица.

\item Остальные случаи, когда х5 не является фильтром
"контекст($\ldots$)", сгруп\-пи\-ро\-ва\-ны в общую ветвь. Она
начинается с создания по вспомогательному про\-грамм\-но\-му блоку
х10 оператора х16 вида "существует($x_1 \ldots x_m \ B$)". Здесь
$B$ - конъюнкция операторов программы блока х10; $x_1, \ldots,
x_m$ - все новые про\-грамм\-ные переменные, использованные в $B$.
Этот оператор - сугубо промежуточный; в зависимости от заголовка
терма х5, по нему будет строиться итоговое про\-грамм\-ное
выражение х17. Сначала переменной х17 присваивается 0. Затем
рассматриваются следующие подслучаи:

\begin{enumerate}

\item х5 имеет вид "число($A_1 \ldots A_n$)". Тогда х17
переприсваивается выраже\-ние "суммавсех($x_1 \ldots x_n \ B \
1$)".

\item х5 имеет вид "нок($A_1 \ldots A_n \ C$)" \ либо "нод($A_1
\ldots A_n \ C$)". Переменной х18 присваивается программное
выражение для численного значения $C$. Наи\-мень\-шее общее
кратное либо наибольший общий делитель вычисляются в цикле, с
использованием накопителя $N$, инициализируемого нулем. Роль этого
накопителя играет первая неопределенная программная перемен\-ная
блока х4. Оператор х19 обеспечивает пересчет накопителя на
очеред\-ном шаге цикла: если накопитель был равен 0, то ему
присваивается теку\-щее значение $C$, иначе - вычисляется нок либо
нод. В случае нахожде\-ния наибольшего общего делителя после
оператора х19 вставляется опера\-тор, обеспечивающий замену
нулевого значения $N$ на единицу.

\item х5 имеет вид "максимум($A_1 \ldots A_n \ C$)" \ либо
"минимум($A_1 \ldots A_n \ C$)". Слу\-чай аналогичен предыдущему,
но в цикле вычисляются максимум либо минимум.

\item В остальных случаях х5 имеет вид $F(A_1 \ldots A_n \ C)$ для
некоторого описа\-те\-ля $F$. Операторное выражение, вычисляющее
значение х5, строится с помощью того же самого символа описателя.
Если $C$ никак не помечено, то его значение вычисляется в формате
логического символа. Кроме того, оно может быть помещено под
служебным символом "терм" \ либо "транс\-ком\-мент" \ (для
компиляции комментария).

\end{enumerate}

\item х5 - фильтр "контекст($\ldots$)".

Если некоторое $A_i$ имело вид "буфер($C$ $D$)", то оно
сохраняется в списке х14 и не рассматривается в указанном выше
цикле синтеза операторов фильт\-ра по х14. Указатель
"буфер($\ldots$)" \ означает, что по мере перечисления значений
внутренних переменных компилируемого фильтра х5 должны вычисляться
зна\-че\-ния операторного выражения $D$. Эти значения передаются в
накопитель $N$ комментария ($C$ $N$), извлекаемого из контекста
срабатывания приема. Опе\-ра\-то\-ры, обеспечивающие указанные
действия, включаются в консеквент кван\-тор\-ной импликации х25,
перечисляющей допустимые значения переменных со\-глас\-но
программе блока х10. Если хотя бы однажды значение $D$ было
вычисле\-но, то индикатор $i$ существования требуемых значений
переменных изменяет\-ся на единицу. Оператор х26 для проверки
фильтра х5 после этого строится как "существует($i$ и(равно($i$
0)х25 равно($i$ 1)))".

В остальных случаях оператор фильтра строится путем навешивания
кван\-то\-ра существования на конъюнкцию операторов программы
блока х10.

\end{enumerate}

\section{Компиляция преобразующей части при\-ема ска\-ни\-ро\-ва\-ния
за\-да\-чи}

Для создания завершающей части программы приема сканирования
задачи, осу\-щест\-вля\-ющей основные преобразования приема,
служит процедура "преобразователь(х1 х2 х3 х4 х5)". Ей передаются
входные данные: х1 - теорема приема; х2 - заголо\-вок приема; х3 -
описание приема; х4 - программный блок; х5 - узел приема. Выйти на
начало программы этой процедуры можно через пункт "Формирование
преоб\-ра\-зу\-ю\-щей части приема, активизируемого при
сканировании задачи" \ оглавле\-ния программ.

\subsection{Предварительный учет указателей приема}

На первом этапе происходит просмотр и обработка тех указателей
приема, кото\-рые определяют действия, выполняемые до основного
преобразования приема. Рас\-смат\-ри\-ваются следующие указатели:

\begin{enumerate}

\item Указатель приема "контроль($P$ лимит($N$) $K$)". Должна
вводиться установка на откат к текущему состоянию задачи, если
через $N$ шагов работы интерпре\-та\-то\-ра ЛОСа не будет
выполнено условие $P$. $K$ - набор термов "замечание($\ldots$)",
определяющих комментарии $A$, которыми сопровождается сохраняемая
для отката версия текущего состояния задачи. Этот набор может быть
пустым. Заметим, что данный указатель используется в решателе
крайне редко.

Чтобы организовать слежение за выполнением условия $P$, прием
будет вво\-дить или пополнять ранее введенный комментарий к
посылкам задачи (контроль $A_1 \ A_2$). Здесь $A_1$ - число,
указывающее содержимое счетчика шагов, по до\-сти\-же\-нии
которого требуется перейти к анализу установок на откат,
хранящихся в наборе $A_2$. Каждая установка в наборе $A_2$
представляет собой набор ($B_1 \ldots B_5$). $B_1$ - номер шага
работы интерпретатора, по достижении которого следует
пред\-при\-нять анализ выполнения условия $P$, определяемого
данной установкой на от\-кат. $B_2$ - номер шага работы
интерпретатора, на котором была введена ус\-та\-нов\-ка; $B_3$ -
логический символ, по которому следует предпринять обращение к
справочнику "контроль", выполняющему проверку этого условия (откат
про\-ис\-хо\-дит при его нарушении); $B_4$ - тройка (номер узла
того приема, кото\-рый ввел установку - заголовок приема
справочника "контроль", обеспечи\-ва\-ю\-ще\-го проверку условия -
набор дополнительных входных данных). $B_5$ - исход\-ное состояние
текущей задачи, к которому выполняется откат.

Как видно из описания структуры установки, проверка условия $P$
обес\-пе\-чи\-ва\-ет\-ся специальным приемом справочника
"контроль". Этот сопровожда\-ю\-щий прием будет создаваться
рассматриваемой ветвью компилятора одновременно с основным
приемом. Справочник "контроль" \ имеет следующие входные дан\-ные:
х1-х5 - такие же, как в сканировании задачи, причем текущее
вхождение не выделено, т.е. х2-х4 равны 0; х6 - номер узла
основного приема; х7 - за\-го\-ло\-вок приема справочника
"контроль"; х8 - набор дополнительных входных данных. Текущий
символ обращения к справочнику - тот символ, за ко\-то\-рым
закреплен основной прием. Входные данные х6, х7 позволяют
программе справочника отсекать "чу\-жие" \ приемы при проверке
условия $P$. Необхо\-ди\-мая для отсечения информация содержится в
заголовке приема спра\-воч\-ни\-ка, имеющем вид "контроль($C_1$
$C_2$)", где $C_1$ - заголовок основного приема; $C_2$ - номер
указателя "контроль($\ldots$)" \ этого приема, по которому был
ском\-пи\-ли\-ро\-ван прием справочника.

Обработка указателя, присвоенного переменной х7, начинается после
кон\-троль\-ной точки "прием(65)". Переменная х6 имеет своим
значением номер теку\-ще\-го указателя "контроль($\ldots$)".
Переменной х8 присваивается фильтр $P$; х9 - число $N$; х10 -
список термов "замечание($\ldots$)"; х11 - список свободных
пере\-мен\-ных фильтра $P$.

После контрольной точки "прием(66)" \ вводится накопитель х12
программных выражений для дополнительных входных данных,
передаваемых справочнику. Эти входные данные суть результаты
идентификации свободных переменных фильтра $P$. Одновременно
вводится накопитель х13 информационных элементов, задающих
значения свободных переменных фильтра $P$ как элементы набора
дополнительных данных, передаваемого программе справочника. Набор
х13 будет включен во вспомогательный программный блок,
относительно которого компилируется указанная программа. По
окончании заполнения накопителей х12, х13 - откат к переходу через
"ветвь 3".

Для обработки термов "замечание($\ldots$)" \ вводятся накопители
х14, х15. Пер\-вый заполняется программными выражениями для
безусловных комментариев; вто\-рой - программными выражениями для
наборов комментариев, вводимых в зависимости от контекста. Каждый
такой набор - либо одноэлементный, либо пустой. По окончании цикла
обработки комментариев - переход через "ина\-че 1".

Создается программное выражение х16 для общего списка
комментариев, пе\-ре\-да\-ва\-емых сохраняемой задаче. Создается
программное выражение х20 для заголовка приема справочника
"контроль", и далее - программное выра\-же\-ние х21 для оператора
"установка($\ldots$)", обеспечивающего ввод установки на от\-кат.
Этот оператор регистрируется в компилируемой программе.

Наконец, предпринимается компиляция программы справочника
"конт\-роль", для чего используется вспомогательный программный
блок х22. Собст\-вен\-но синтез программы обеспечивается
процедурой "фильтр", обрабатывающей ус\-ло\-вие $P$. Здесь же
осуществляется запись этой программы в программ\-ном блоке.

\item Указатель приема "задачи($N$ $P$)". Этот указатель можно
использовать при отладке приема. Он обеспечивает сохранение ссылок
на те задачи, в кото\-рых прием сработал так, что было выполнено
условие $P$. Переменной х9 при\-сва\-и\-ва\-ет\-ся программное
выражение для оператора "учетзадачи($\ldots$)", сохраняю\-ще\-го
ссылку на прием в комментарии (учетзадачи $\ldots$) к посылкам
исходной за\-да\-чи. Чтобы отбирались только ситуации, в которых
выполнено условие $P$, находит\-ся оператор х11 проверки данного
условия, и в компилируемую про\-грам\-му заносится дизъюнкция
отрицания х11 с х9.

\item Указатель приема "биключ($\ldots$)" \ (контрольная точка
"прием(2)"). Он опреде\-ля\-ет проверку отсутствия задан\-но\-го
комментария задачи непосредственно пе\-ред выполнением
преобразо\-ва\-ний приема. Если комментария не было, то
про\-ис\-ходит автоматическая его регистрация.

Переменной х8 присваивается набор программных выражений для
раз\-ря\-дов комментария, следующих после его заголовка;
переменной х9 - набор, полу\-чен\-ный добавлением к началу набора
х8 переменной "х1" \ и заголовка коммента\-рия. Таким образом,
получается список программных выражений для вход\-ных данных
операторов, проверяющих отсутствие комментария либо вводящих его.
Если по информации, имеющейся в фильтрах приема, удается
определить тип текущей задачи, то указанные операторы адресуют
комментарий либо спи\-с\-ку общих комментариев задачи, либо
спи\-ску комментариев к посылкам. В противном случае обработка
комментария осуществляется условным опе\-ра\-то\-ром
"альтернатива($\ldots$)", предварительно анализирующим тип текущей
зада\-чи.

\item Указатель приема "примечпосылки($\ldots$)" \ (контрольная
точка "прием(3)"). Про\-ис\-хо\-дит ввод комментария к посылке
либо условию задачи, идентифи\-ци\-ро\-ван\-ным с заданным
антецедентом теоремы приема.

Переменной х9 присваивается набор программных выражений для
разрядов комментария, следующих после его заголовка; переменной
х11 - вхож\-де\-ние рассматриваемого антецедента теоремы приема.
Если усматривается, что речь идет о посылке задачи, переменной х12
присваивается 0, иначе - 1. Если точ\-ка привязки расположена в
выделенном антецеденте, то сразу создается опе\-ра\-тор,
регистрирующий комментарий к текущему терму задачи; его
вхож\-де\-ние в задачу известно - это "х3". Аналогичным образом
строится оператор, если вхождение в задачу терма,
идентифицированного с рассматриваемым анте\-це\-ден\-том, уже
определялось ранее и было сохранено в информационном эле\-мен\-те
(вхождениевзадачу $\ldots$). В остальных случаях для поиска
вхож\-де\-ния применяется оператор "посылка($\ldots$)" \ (при х12
= 0) либо "вхождениевзадачу($\ldots\\ $)".

\item Указатель приема "примечание($\ldots$)" \ (контрольная точка
"прием(4)"). Слу\-чай аналогичен предыдущему, но вводится
комментарий к новому либо пре\-об\-ра\-зу\-е\-мо\-му терму задачи.
Фактически здесь рассматривается только подслу\-чай приема замены,
причем в указателе отсутствует символ "результат". Прочие
подслучаи будут обрабатываться после компиляции основного
преобразо\-ва\-ния приема. Создается оператор, регистрирующий
комментарий в списке коммен\-та\-ри\-ев к преобразуемому терму
задачи. Отдельно рассматриваются случаи без\-ус\-лов\-но\-го и
условного ввода комментария.

\item Указатель приема "удалениезамечания($A$ \ $B$)" \
(контрольная точка "прием(5)"). Перед выполнением преобразования
приема, в случае истинности фильтров $B$, происходит удаление
комментариев, определяемых идентифицирующим тер\-мом $A$. Фильтры
могут отсутствовать; $A$ имеет вид "комментарий($\ldots$)" \ либо
"комментарийпосылки($\ldots$)".

Для обработки указателя создается вспомогательный программный блок
х8. Сначала относительно х8 компилируется идентифицирующий терм
$A$, затем - фильтры списка $B$. После этого создается кванторная
импликация, антеце\-ден\-ты которой суть все операторы программы
блока х8, а консеквент - опера\-тор, исключающий комментарий.

\item Указатель приема "новаяпосылка($x \ P(x) \ v$)" \ либо
"новоеусловие($x \ P(x) \ v$)" \ (контрольная точка "прием(6)").
Должно быть выполнено уменьшение ве\-сов посылок и условий $x$
текущей задачи, удовлетворяющих фильтру $P(x)$, до величины $v$.
Перед $x$ возможно размещение терма "условие($Q$)", указывающего
условие $Q$ на текущий контекст, при выполнении которого
выполняется данное действие.

Переменной х7 присваивается $x$; вводится вспомогательный
программный блок х8, соответствующий текущему шагу просмотра
посылок либо условий. В нем переменная $x$ является
идентифицированной. Находится результат х9 ком\-пи\-ля\-ции
фильтра $P(x)$ относительно блока х8. Строится вспомогательный
опе\-ра\-тор х10, обеспечивающий синхронный просмотр списка термов
задачи и списка их весов. По нему и оператору фильтра х9 создается
оператор х11, осущест\-вля\-ю\-щий просмотр допустимых термов
задачи и изменение их весов.

Если имеется фильтр $Q$, то находится результат х13 компиляции
его, после чего оператор х11 заменяется на дизъюнкцию отрицания
х13 и старой версии х11. Затем предпринимается регистрация х11 в
программе приема.

\item Указатель приема "замечание($\ldots$)" \ либо
"комментариипосылок($\ldots$)" \ (кон\-троль\-ная точка
"прием(7)"). Со\-от\-вет\-ст\-вен\-но, должен вводиться
комментарий к за\-да\-че либо к ее списку посылок. В данном пункте
рассматривается лишь под\-слу\-чай, когда указатель не содержит
символа "результат", причем либо прием не имеет заголовка "вывод",
либо фильтры приема также не содержат символа "результат", а
указатель не ссы\-ла\-ет\-ся на вхождение в консеквент теоремы
приема.

Действия аналогичны случаю указателя "примечание".

\item Указатель приема "изменение($A$ $B$)" \ (контрольная точка
"прием(8)"). Здесь $A$ - идентифицирующий терм
"ком\-мен\-та\-рий($\ldots$)", "комментарийпосылки($\ldots$)" \
либо "примечание($\ldots$)", с помо\-щью которого происходит
перечисление тре\-бу\-е\-мых комментариев. $B$ - на\-бор термов
"замена($i$ $T$)", где $i$ - номер изменяе\-мо\-го разряда
комментария (за\-го\-ло\-вок комментария имеет номер 0); $T$ -
оператор\-ное выражение, значе\-ни\-ем которого является
заменяющий объект. Кроме того, в $B$ могут содержать\-ся фильтры,
ограничивающие множество обрабатыва\-е\-мых комментариев.

Для обработки текущего шага просмотра комментариев вводится
вспо\-мо\-га\-тель\-ный программный блок х9. Сначала относительно
х9 компилируется иден\-ти\-фи\-ци\-ру\-ю\-щий терм $A$, затем -
содержащиеся в $B$ фильтры. Переменной х13 присваивается набор
программных выражений для заменяющих объектов $T$; переменной х15
- список операторов, выполняющих изменение разрядов. На\-ко\-нец,
создается кванторная импликация х17 для всего цикла просмотра
ком\-мен\-та\-ри\-ев.

\item Указатель приема "посылка($A$ $B$ $C$ $D$)" \ (контрольная
точка "прием(85)"). Здесь $A$ - терм вида "условие($Q$)",
определяющий фильтр $Q$, при истинности которого будет вводиться
допол\-ни\-тель\-ная посылка $C$ текущей задачи. $B$ - список
ут\-вер\-жде\-ний в "теорем\-ных" \ переменных, истинность которых
должна быть ус\-та\-нов\-ле\-на перед вво\-дом посылки; $D$ -
набор термов "примечание($\ldots$)", определя\-ю\-щих
сопровож\-да\-ю\-щие посылку комментарии.

Переменной х7 присваивается список корневых операндов указателя.
Из него выбираются: список х8, образованный термом $A$, если он
есть, и пустой в про\-тив\-ном случае, а также список х9,
образованный термами "примечание($\ldots$)". Оба эти списка
исключаются из х7. Теперь последний элемент списка х7 -
утверждение $C$. Оно присваивается переменной х10 и также
исключается из х7. В результате х7 будет состоять из проверяемых
перед занесением посыл\-ки утверждений "теоремного" \ уровня.
Находятся программное выражение х11 для $C$, а также список х12
программных выражений для сопровождающих $C$ комментариев. Затем -
переход через "иначе 4".

Если списки х7 и х8 пусты, то сразу вводится оператор,
присваивающий те\-ку\-щей неиспользуемой программной переменной
набор (вывод $\ldots$) и ре\-гист\-ри\-ру\-ю\-щий эту переменную в
информационном элементе (ключвывода $\ldots$). На\-бор (вывод
$\ldots$) будет впоследствии передаваться процедуре, реализующей
ос\-нов\-ное преобразование приема. Если хотя бы один из списков
х7, х8 непуст, то переход через "иначе 1". Здесь также
осуществляется создание и регист\-ра\-ция набора (вывод $\ldots$),
но позиции его пока "пустые". Вводится накопитель х14 операторов,
проверяющих истинность условий ввода посылки. Если имеется фильтр
$Q$, то сначала компилируется он. Затем рассматриваются элемен\-ты
списка х7. Для компиляции обработки их проверочными операторами
созда\-ет\-ся вспомогательный программный блок х17. Информация об
исполь\-зо\-ван\-ных при проверке утверждениях передается в набор
(вывод $\ldots$) и впослед\-ст\-вии будет учтена в комментариях к
новой посылке $C$. Обращения к прове\-роч\-ным операторам
заносятся под квантор существования, чтобы связать их выходные
переменные, и регистрируются в накопителе х14. Наконец,
соз\-да\-ет\-ся набор х15 операторов, заполняющих пустые позиции
набора (вывод $\ldots$). Чтобы эти операторы выполнялись при
истинности фильтров списка х14, стро\-ит\-ся дизъюнкция отрицаний
фильтров, после которых размещена конъ\-юнк\-ция операторов.

\item Указатель приема "вывод($A$ $B$ $C$)" \ (контрольная точка
"прием(57)"). В до\-пол\-не\-ние к основному преобразованию приема
осуществляется вывод следствия $B$, используемого для
сопровождения по о.д.з. $A$ - терм "условие($Q$)",
опре\-де\-ля\-ю\-щий условие, при котором происходит вывод. $C$ -
терм "эквивалентно($n_1 \ldots n_k$)", перечисляющий номера $n_i$
антецедентов теоремы, являющихся следст\-ви\-ями утверждения $B$ и
остальных антецедентов теоремы. Посылки, с которыми
иден\-ти\-фи\-ци\-ро\-ва\-ны такие антецеденты, после применения
приема удаляются, если только они не нужны для сопровождения по
о.д.з. Термы $A$, $C$ могут от\-сут\-ство\-вать.

Сначала переменной х7 присваивается список всех корневых операндов
ука\-за\-те\-ля. Если имеется фильтр $Q$, то переменной х8
присваивается программ\-ное выражение для проверяющего оператора,
а терм $A$ из списка х7 удаляется. Затем - переход через "ветвь
2", где переменной х9 присваивается программ\-ное выражение для
новой посылки $B$. Переменной х11 присваивается 0; если имеется
терм $C$, то ей переприсваивается программное выражение для
на\-бо\-ра посылок, идентифицированных с указанными в $C$
антецедентами. Перемен\-ной х12 присваивается набор программных
выражений для наборов по\-сы\-лок, использованных при срабатывании
приема. Находится программная перемен\-ная для накопителя
(коррекцияпосылок $\ldots$); если этого накопителя в про\-грам\-ме
приема еще не было, то он вводится. Далее создается оператор х15 -
обращение к процедуре "учетвывода", которая будет регистрировать в
на\-ко\-пи\-те\-ле (коррекцияпосылок $\ldots$) информацию о
выводимости антецедентов. Эта информация впоследствии будет учтена
процедурой, выполняющей ос\-нов\-ное преобразование приема. При
наличии фильтра $Q$ в компилируемой про\-грам\-ме регистрируется
не сам оператор х15, а дизъюнкция "или(не(х8)х15)".

\item Указатель приема "вводтерма($i$)" \ (контрольная точка
"прием(39)"). $i$ - й ан\-те\-це\-дент теоремы приема имеет вид
"равно($A$ $x$)" \ и используется для ввода обозначения $x$
известного выражения $A$. При выполнении приема опреде\-ля\-е\-мое
данным антецедентом равенство заносится в список посылок задачи и
снабжается комментарием "ориентацияравенства", блокирующим
переста\-нов\-ку частей.

Находятся программные выражения х11, х12 для $x,A$; по ним
строится про\-грамм\-ное выражение х13 для равенства. Находится
также программное вы\-ра\-же\-ние х14 для $x$ в формате
переменной. В компилируемую программу зано\-сят\-ся операторы,
выполняющие регистрацию новой посылки х13, снабжение ее
коментарием "ориентацияравенства", а также ввод общего комментария
за\-да\-чи (вспомпараметр $x$).

\item Указатель приема "вспомнеизв($x_1 \ldots x_n$)" \
(контрольная точка "прием(59)").\\ Вводятся новые переменные $x_1,
\ldots , x_n$, которые становятся новыми несущест\-вен\-ны\-ми
неизвестными задачи на описание (т.е. регистируются в цели
(па\-ра\-мет\-ры $\ldots$)). Переменной х7 присваивается список
программных выражений для этих переменных, и в компилируемую
программу вводятся операторы "вспом\-неизв", регистрирующие
переменные в целях (неизвестные $\ldots$), (параметры $\ldots$).

\item Указатели "удалениепосылки($A$ $B$ $C$)",
"удалениеусловия($A$ $B$ $C$)" \ (контроль\-ная точка
"прием(10)"). Если существует посылка (условие) $C$ текущей
задачи, причем выполнены дополнительные ограничения, определяемые
термом $A$ вида "условие($Q$)", и $C$ не было использовано при
нормализации надтермов термов $T_1, \ldots, T_n$, перечисленных в
терме $B$ вида "нормализатор($T_1 \ldots T_n$)", то после
выполнения основного действия приема проверяется, используется ли
$C$ для сопровождения по о.д.з., и если не используется, то
удаляется. Термы $A$, $B$ могут отсутствовать.

Если уже имелся информационный элемент (удалениепосылки $x$) либо,
со\-от\-вет\-ст\-вен\-но, (удалениеусловия $x$), у которого $x$ -
программная переменная, ис\-поль\-зу\-е\-мая как накопитель списка
удаляемых посылок (условий), то перемен\-ной х7 присваивается $x$.
Иначе - такой элемент вводится, после чего значение х7 меняется
указанным образом. Затем - переход через "ветвь 2".

Здесь компиляция разветвляется. Сначала рассматривается случай,
когда терм $A$ имеется, и обработка его фильтра предполагает
использование прове\-роч\-ных операторов. Вводится вспомогательный
программный блок х9, относящийся к текущему шагу цикла просмотра
посылок (условий). Если $C$ есть простая либо функциональная
переменная, то переход через "иначе 2", где терм $C$ будет
определен с помощью процедуры "прогрвыражение". Иначе - он
иден\-ти\-фи\-ци\-ру\-ет\-ся с помощью обращения к процедуре
"идентификатор". В остальном оба случая аналогичны, поэтому
рассмотрим здесь лишь второй из них. Переменной х11 присваивается
связывающая приставка для кванторной импликации, ко\-то\-рая будет
выполнять цикл просмотра посылок (условий). Далее - переход через
"ветвь 3". Здесь создается еще один вспомогательный программный
блок х12 для компиляции фильтра $Q$. Ему передается информационный
элемент (внешконтроль $y$), где $y$ - накопитель использованных
при проверке фильт\-ра $Q$ утверждений. Затем определяется
результат х14 компиляции фильтра $Q$ и строится кванторная
импликация х15, реализующая цикл просмотра и отбо\-ра удаляемых
посылок (условий). Отбираемые утверждения регистрируются в
накопителе х7. Если утверждение было использовано для установления
ис\-тин\-нос\-ти $Q$, то оно не отбирается. Наконец, создается
кванторная импликация х16, в которой инициализируется накопитель
$y$, выполняется обработка $Q$, и далее реализуется оператор х15.
Она и заносится в компилируемую программу.

Случай, когда терм $A$ либо отсутствует, либо его обработка не
требует про\-ве\-роч\-ных операторов, аналогичен, но проще - не
нужен накопитель $y$. Заметим, что учет терма $B$ и собственно
удаление посылок (условий) будут выполнять\-ся впоследствии -
здесь лишь заполняется накопитель х7.

\end{enumerate}

\subsection{Компиляция основного действия приема}

После контрольной точки "прием(11)" \ начинается компиляция
основного пре\-об\-ра\-зо\-ва\-ния приема. В зависимости от
заголовка приема, она выполняется различ\-ны\-ми ветвями
программы.

\subsubsection{Прием замены}

Подслучай рассматривается после контрольной точки "прием(12)".
Переменной х6 присваивается вхождение консеквента теоремы приема
(если теорема не является кванторной импликацией, то - вхождение
корня теоремы). Проверяется, что по дан\-но\-му вхождению
расположено равенство либо эквивалентность. Переменной х7
при\-сва\-и\-ва\-ется заменяющий терм теоремы. Инициализируется
нулем накопитель х8 про\-граммного выражения для заменяющего
терма. Переменной х9 присваивается про\-граммное выражение для
вхождения корня заменяемого терма. Далее для ком\-пи\-ля\-ции
заменяющего терма рассматриваются следующие подслучаи:

\begin{enumerate}

\item Имеется информационный элемент (результат $x$), содержащий
программ\-ную переменную $x$ для заменяющего терма, который уже
был ранее откомпили\-ро\-ван. Тогда х8 заменяется на терм $x$
(контрольная точка "прием(14)").

\item Имеется информационный элемент (набор $A$ $B$), у которого
$A$ - вхождение в заменяемую часть теоремы
коммутативно-ассоциативной операции, рас\-фор\-ми\-руемой при
выполнении приема с указателем "набор(первыйтерм)". $B$ -
про\-грамм\-ное выражение для вхождения $A$. По вхождению $A$
расположен терм вида $f(a b)$; заменяющий терм х7 имеет вид
$g(t(a)t(b))$. Здесь $a,b$ - переменные. После контрольной точки
"прием(21)" \ переменной х11 присваивается символ коммутативно-
ассоциативной операции $g$; программной переменной х12 -
тео\-ремная переменная $a$; переменной х14 - терм $t(a)$.
Создается вспомогатель\-ный программный блок х15, относящийся к
шагу цикла просмотра опе\-ран\-дов идентифицированного с $A$
расформируемого вхождения. Для этого шага определяется программное
выражение х16, значением которого служит те\-ку\-щий терм $t(a)$.
Далее строится выражение х18 для всего списка термов $t(a)$,
возникающих в цикле. Если при компиляции была введена
переменная-мо\-ди\-фи\-ка\-тор, идентифицируемая с остатком
операндов заменяемого терма, то х18 пополняется этими операндами.
Наконец, х8 заменяется на выра\-же\-ние "сборка(х11 х18)".
Дополнительно учитываются указатели нормализации для х7.

\item Заменяемый и заменяющий термы имеют своим заголовком одну и
ту же ком\-му\-та\-тив\-но-ассоциативную операцию $f$ (контрольная
точка "прием(22)"). Если заменяющий терм получается добавлением к
операндам заменяемого тер\-ма единственного нового операнда $A$,
то находится программное выражение х15 для $A$. Список корневых
операндов заменяемого терма равен "набор\-опе\-ран\-дов(х9)"; к
нему присоединяется х15, и строится программное выражение х16 для
заменяющего терма. Если заменяющий терм отличается от
заменяе\-мо\-го только единственным операндом, то корректируются
х9 и х7: новые версии заменяемого и заменяющего терма связываются
только с этим операндом. В этом случае х8 пока не определяется;
после коррекции предпринимается откат для продолжения сравнения
заменяемого и заменяющего термов.

\item Общий случай (контрольная точка "прием(24)"). Здесь
программное вы\-ра\-же\-ние для заменяющего терма находится с
помощью процедуры "метаперевод".

\end{enumerate}

После получения программного выражения х8 для заменяющего терма
пред\-при\-ни\-ма\-ет\-ся цепочка коррекций этого выражения:

\begin{enumerate}

\item Учитывается информационный элемент (корни $\ldots$),
хранящий программ\-ное выражение для остатка корневых операндов
при идентификации коммутативно-ассоциативной операции с указателем
"развертка" \ (см. фрагмент, содержа\-щий контрольную точку
"прием(24)").

\item Учитывается информационный элемент (заменагруппы $\ldots$),
хранящий про\-гра\-мм\-ные выражения для остаточных наборов слева
и справа от заменяемой части - если корневая операция
ассоциативна, но не коммутативна.

\item Учитывается указатель приема "кванторнаясвертка" \
(контрольная точка "при\-ем(26)"). В этом случае квантор -
заголовок заменяемого терма - иден\-ти\-фи\-ци\-ру\-ется с
возможными преобразованиями перехода к противоположному кван\-тору
и группировки части подкванторных утверждений под
вспомога\-тель\-ный квантор.

Переменной х10 присваивается вхождение заменяемого квантора. Если
этот квантор является квантором общности, то х8 переприсваивается
выраже\-ние для отрицания заменяющего утверждения теоремы. Таким
образом, х8 ста\-но\-вит\-ся отриентированным на случай
идентификации х10 с квантором су\-щест\-во\-вания. Впрочем, это
лишь промежуточное выражение - настоящий заменяю\-щий терм
определяется далее с помощью обращения к процедуре
"квантор\-ная\-сверт\-ка($\ldots$)", учитывающей указанные выше
преобразования.

\item Учитывается указатель приема "дробь" \ (контрольная точка
"прием(27)"). В этом случае при идентификации возможна
перестановка операндов заме\-ня\-е\-мо\-го терма, и такая же
перестановка делается для операндов заменяющего тер\-ма.

По информационному элементу (корень $\ldots$) определяется
программное вы\-ра\-же\-ние для вхождения, идентифицированного с
заменяемой частью теоремы; по информационному элементу (операнд
$\ldots$) - программное выражение для вхождения,
идентифицированного с первым операндом заменяющей части. Эта
информация позволяет распознать наличие перестановки операндов;
со\-от\-вет\-ст\-венно корректируется х8.

\end{enumerate}

После контрольной точки "прием(89)" \ происходит учет указателя
приема "при\-меч($A$ $K$)". Здесь должна вводиться серия
комментариев задачи, возникающих при перечислении значений
переменных согласно списку $A$ идентифицирующих термов, фильтров и
указателей. Терм $K$ вида "замечание($\ldots$)" \ определяет
текущий ком\-мен\-та\-рий. Для создания операторов, реализующих
эти действия, используется об\-ра\-ще\-ние к справочнику
"блокпроверок" \ на логическом символе "контекст" \ (см. выше).

\par\medskip

После контрольной точки "прием(83)" \ происходит учет указателя
"новыенеиз\-вест\-ные($X$)". $X$ - список новых неизвестных
текущей задачи, вводимых приемом.

Вводятся два накопителя: х11 - для отдельных переменных,
идентифициро\-ван\-ных с элементами списка $X$; х12 - для групп
таких переменных. Создается программ\-ное выражение х15 для
итогового списка новых неизвестных; регистрация их в зада\-че
выполняется оператором "учетнеизвестных($\ldots$)".

\par\medskip

После контрольной точки "прием(80)" \ проверяется наличие фильтров
приема (а также указателей "задачи($\ldots$)"), содержащих
логический символ "результат". Если они есть, то вводится
программная переменная х10 для заменяющего терма х8, и создается
информационный элемент (результат х10). Он позволит переходить от
служебного символа "результат" \ к выражению для заменяющего
терма.

После контрольной точки "прием(28)" \ происходит обработка серии
фильт\-ров приема, содержащих символ "результат" \ (ранее они не
рассматривались). Действия здесь совершенно аналогичны тем,
которые осуществлялись в основном цикле об\-ра\-бот\-ки фильтров,
однако служебный символ "результат" \ на этом этапе уже досту\-пен
для компиляции.

Аналогичным образом, после контрольной точки "прием(81)" \
обрабаты\-ва\-ют\-ся содержащие символ "результат" \ указатели
приема "задачи($\ldots$)".

После контрольной точки "прием(78)" \ рассматриваются указатели
приема "ак\-тив($N$ $p$)". Должно выполняться уменьшение до уровня
$p$ весов посылок и усло\-вий, идентифицированных с антецедентами,
номера которых образуют список $N$. Программные выражения для
таких посылок и условий находятся через ин\-фор\-ма\-ци\-он\-ные
элементы (антецедент $\ldots$) либо непосредственно с помощью
проце\-ду\-ры "метаперевод". Далее в компилируемую программу
заносится оператор "актив($\ldots$)", локализующий в текущей
задаче посылку либо условие и уменьшающий ее вес.

\par\medskip

После контрольной точки "прием(29)" \ начинается формирование
программ\-но\-го выражения для набора $R$ информационных
элементов, передаваемых опера\-то\-ру "заменавхождения" \ (т.е.
входной переменной х6 этого оператора). Сначала
оп\-ре\-де\-ля\-ется список х10 программных выражений для групп
утверждений, исполь\-зо\-ван\-ных приемом при обосновании
корректности замены. Инициализируется пустым сло\-вом накопитель
х11 программных выражений для информационных элементов набора $R$
(в нижеследующем перечислении, говоря о перенесении в список х11
различных информационных элементов, подразумеваем программные
выражения для этих эле\-мен\-тов). Заполнение накопителя х11
выполняется следующим образом:

\begin{enumerate}

\item Создаются информационные элементы для ссылки на прием и для
ссылки на использованные приемом утверждения контекста замены
(контрольная точ\-ка "прием(30)").

\item Создается информационный элемент (примечание $\ldots$), в
котором перечис\-ля\-ют\-ся комментарии, сопровождающие изменяемый
терм задачи (контроль\-ная точка "прием(31)"). Напомним, что
накопитель таких комментариев для ука\-за\-те\-лей приема
"примечание($\ldots$)", не содержащих логического символа
"ре\-зуль\-тат", уже был введен на предшествующих этапах
компиляции, и зарегист\-ри\-ро\-ван в информационном элементе
программного блока (примечание $\ldots$). Здесь выполняется
компиляция оставшихся указателей "примечание($\ldots$)" \ и
пере\-да\-ча объединенного списка накопителю х11.

\item Указатель приема "нормализация" \ передается в список х11
непосредст\-вен\-но (контрольная точка "прием(9)"). Он включает
механизмы дополнительной стан\-дартизации надтермов заменяемого
терма, предусмотренные в процедуре "за\-ме\-навхождения".

\item Указатель приема "обозначения($\ldots$)", перечисляющий
введенные приемом пе\-ре\-мен\-ные, требующие регистрации в цели
(обозначения $\ldots$), порождает од\-но\-и\-мен\-ный
информационный накопителя х11 (контрольная точка "прием(18)").

\item Указатель приема "установка($A$ $B$)", определяющий
пополнение цели ($A$ $\ldots$) текущей задачи элементом $B$,
порождает одноименный информационный эле\-мент для х11
(контрольная точка "прием(15)").

\item Указатели приема "норм", "вычерк", "внешвывод" \ передаются
в список х11; два последних символа при этом изменяются на символы
"свертка" \ и "но\-вая\-по\-сылка".

\item Указатель приема "титр($\ldots$)", обеспечивающий создание
поясняющих сра\-ба\-ты\-ва\-ния приема текстов, компилируется
процедурой "транститр" \ в инфор\-ма\-ци\-он\-ный элемент списка
х11 (контрольная точка "прием(17)").

\item Указатель приема "выводусловия($\ldots$)", необходимый для
создания сопро\-вож\-да\-ю\-щего замену дополнительного условия
текущей задачи на описание, по\-рож\-дает одноименный
информационный элемент для х11 (контрольная точ\-ка "прием(76)").

\item Указатели приема "сопровождение", "стандследствие" \
передаются в список х11 непосредственно (контрольные точки
"прием(62)", "прием(16)").

\item Указатель приема "контрольнормализации($\ldots$)",
определяющий ис\-клю\-че\-ние из буфера результатов обращений к
заданному нормализатору всех результатов, содержащих заданный
подтерм, порождает одноименный информационный эле\-мент для х11.

\item Происходит передача в х11 накопителей (удалениепосылки
$\ldots$), (удале\-ние\-ус\-ловия $\ldots$), ранее созданных в
программном блоке (контрольная точка "прием(\\ 38)").

\item Информационный элемент программного блока (норм $\ldots$),
необходимый для блокировки удаления посылок, использованных
приемом при нормализа\-ции термов, порождает одноименный элемент
для х11.

\item Извлекаемый из информационного элемента (коррекцияпосылок
$A$) накопи\-тель $A$, также имеющий вид (коррекцияпосылок
$\ldots$), передается в список х11 (контрольная точка
"прием(40)").

\item Извлекаемый из информационного элемент (ключвывода $\ldots$)
накопитель (вы\-вод $\ldots$), определяющий вывод сопровождающего
утверждения, переносится в список х11 (контрольная точка
"прием(86)").

\item Если вхождение х9 заменяемого подтерма в процессе компиляции
было изме\-не\-но по сравнению с вхождением, указанным в
информационном элементе (ко\-рень $\ldots$), то последний
передается в список х11 (контрольная точка "прием(91)").

\item Далее находится программное выражение для списка
информационных эле\-мен\-тов, перечисленных в х11, которое
переприсваивается переменной х11. После этого пополнение данного
списка продолжается в новом формате: каждый раз вводится
дополнительный операнд терма х11 вида "набор($\ldots$)".

\item Указатели приема "замечание($\ldots$)" \ и
"комментариипосылок($\ldots$)", не обра\-бо\-тан\-ные ранее из-за
того, что они содержали символ "результат", порож\-да\-ют
одноименные информационные элементы для накопителя х11
(кон\-троль\-ная точка "прием(41)").

\item Указатель приема "Замечание($\ldots$)", используемый для
передачи коммента\-ри\-ев вспомогательной задаче, вводимой
оператором "попытказамены", порож\-да\-ет одноименный
информационный элемент.

\end{enumerate}

После того, как определено х11, учитывается указатель приема
"стоп" \ (кон\-троль\-ная точка "прием(25)". По нему вводится
оператор "трассировка(стоп 0)", обес\-пе\-чи\-ва\-ю\-щий выход в
отладчик ЛОСа перед применением приема.

\par\medskip

Собственно формирование обращения к оператору, выполняющему
замену, на\-чи\-на\-ет\-ся с контрольной точки "прием(42)".
Переменным х12 и х13 присваива\-ют\-ся программные переменные для
второй и третьей компонент координаты вхожде\-ния заменяемого
терма в задачу. Обычно это переменные "х3" \ и "х4". Однако, в
ряде случаев точка привязки приема замены может быть выбрана не в
заменя\-е\-мой части теоремы, а в ее антецеденте. Тогда
информационный элемент (переходник $\ldots$) сохраняет вторую и
третью компоненты координат вхождения заменяемого терма, и они
переприсваиваются переменным х12, х13. Затем - переход через
"ветвь 1".

Сначала рассматривается один особый случай - наличие у приема
указате\-ля "дизъюнктчлен($\ldots$)" \ (контрольная точка
"прием(47)"). Напомним, что этот ука\-за\-тель выделяет
антецеденты вида $A = B$, помеченные также указателем
"иден\-ти\-фи\-ка\-тор". При обработке антецедента находится
множество дизъюнктивных чле\-нов идентифицирующей части $A$,
которые последовательно идентифицируются с идентифицируемой частью
$B$. Прием осуществляет эквивалентную замену, при\-чем заменяющий
терм строится как дизъюнкция заменяющих термов, созданных
со\-гла\-сно теореме приема для отдельных подслучаев указанного
перечисления вариан\-тов идентификации. В процессе компиляции по
указателю был создан информа\-ци\-он\-ный элемент программного
блока (дизъюнктчлен $A_1$ $A_2$ $A_3$ $A_4$), у которого $A_1$ -
на\-бор вхождений выделенных антецедентов; $A_2$ - программная
переменная для нако\-пи\-те\-ля дизъюнктивных членов заменяющего
терма; $A_3$ - метка отката при об\-ры\-ве идентификации; $A_4$ -
набор меток отката для продолжения перечислений
иден\-ти\-фи\-ци\-ру\-е\-мых дизъюнктивных членов, имеющий ту же
длину, что и набор $A_1$.

Информационный элемент (дизъюнктчлен $\ldots$) присваивается
переменной х14. Переменной х15 присваивается номер последней из
меток отката, упомянутых в наборе $A_4$. После определения версии
заменяющего терма для текущего подслучая и регистрации ее в
накопителе $A_2$ продолжение перечисления будет обеспечи\-вать\-ся
откатом по метке х15. Фрагмент программы $P$, выполняющий действия
по завер\-ше\-нии перечисления, сохранен в информационном элементе
(блокпрограммы 1 $P$). Переменной х17 присваивается программное
выражение для итогового заменяю\-ще\-го терма - дизъюнкции
утверждений накопителя $A_2$, после чего к концу фраг\-мен\-та $P$
добавляется оператор "заменавхождения", выполняющий замену (либо
опера\-тор "попытказамены", относящий ее к вспомогательной
задаче), а также опера\-тор "пересмотр". Заметим, что содержимые
набора х11 для всех подслучаев объе\-ди\-ня\-ют\-ся в специальном
накопителе (программная переменная, номер которой на единицу
больше номера переменной $A_2$, и итоговый список передается
про\-це\-ду\-ре, выполняющей замену.

\par\medskip

Наконец, в "общем" \ случае строится оператор х14, выполняющий
замену. Если прием имеет указатель "попытказамены", то замена
будет выполняться не в теку\-щей задаче, а в ее вспомогательной
копии. Для этого используется оператор
"по\-пыт\-ка\-за\-ме\-ны($\ldots$)". Если вспомогательная задача
решается, то ответ на нее пере\-да\-ет\-ся исходной задаче через
комментарий (ответ $\ldots$). В противном случае опера\-тор
"попытказамены($\ldots$)" \ оказывается ложным, и процесс решения
текущей за\-да\-чи продолжается. При отсутствии указателя
"попытказамены" \ создается об\-ра\-ще\-ние к оператору
"заменавхождения($\ldots$)". Сразу заметим, что использование
указа\-те\-ля "попытказамены" \ в решателе - исключительная
редкость. При создании опера\-то\-ра х14 учитывается также
указатель "корень", используемый в ситуациях, когда заменяемая
часть теоремы вырождена и представляет собой обычную или
функ\-ци\-о\-наль\-ную переменную, иден\-ти\-фи\-ци\-ру\-емую с
условием текущей задачи на пре\-об\-ра\-зо\-ва\-ние.

Если программное выражение для заменяющего терма имеет вид
"заменаопе\-ран\-да($v$ $w$ $t$)", причем $v$ - выражение для
заменяемого вхождения, то х14 модифици\-ру\-ет\-ся так, чтобы
новым вхождением заменяемого терма было $w$, а заменяющим тер\-мом
- $t$. Затем - откат к переходу через "ветвь 1".

После контрольной точки "прием(43)" \ обрабатывается, если он
есть, фильтр "кон\-трольодз". Этот фильтр требует, чтобы все
подвыражения заменяющего терма име\-ли истинные в контексте замены
ограничения на о.д.з. Для проверки в про\-грам\-му вставляется
обращение к оператору "контрольодз($\ldots$)".

После контрольной точки "прием(44)" \ учитывается указатель приема
"замена\-вхож\-де\-ний". Этот указатель требует проведение
одновременной замены в задаче всех вхождений заменяемого терма на
заменяющий. Фактически замена будет затраги\-вать лишь те
вхождения, в контексте которых имеются все утверждения,
исполь\-зо\-ван\-ные для обоснования корректности данного
перехода. Для учета указате\-ля обращение к оператору
"заменавхождения" \ заменяется обращением к оператору
"за\-менавхождений".

Теперь оператор х14 заносится в программу. Если имелся указатель
приема "вни\-мание", определяющий уменьшение до 0 весов всех
условий и посылок, содержа\-щих заданный подтерм, то после х14
размещается обращение к оператору "внима\-ние($\ldots$)" \
(контрольная точка "прием(45)"). Компиляцию завершает добавление
оператора "пе\-ресмотр".

\subsubsection{Прием вывода}

Подслучай рассматривается после контрольной точки "прием(48)".
Прием име\-ет заголовок "вывод" \ (добавление новой посылки) либо
"выводусловия" \ (добавле\-ние нового условия). Прежде всего,
находится программное выражение х6 для добав\-ля\-е\-мо\-го
утверждения. Однако, фактически ссылки на новое утверждение будут
делать\-ся не через х6, а через инициализируемую далее нулем
переменную х7. Если уже имелся информационный элемент (результат
$T$), то далее программное выраже\-ние х6 игнорируется, а х7
присваивается выражение $T$. Если прием имеет заголо\-вок
"выводусловия", то х7 переприсваивается х6. Если же прием имеет
заголо\-вок "вывод", то для х6 предварительно вводится
вспомогательное обозначение - новая программная переменная,
которая и переприсваивается переменной х7.

Если информационного элемента (результат $\ldots$) еще не было, то
он вво\-дит\-ся. После этого реализуется цикл обработки оставшихся
фильтров приема, содер\-жа\-щих символ "результат". По окончании
цикла - откат к переходу через "ветвь 3".

После контрольной точки "прием(88)" \ переменной х8 присваивается
список про\-грамм\-ных выражений для информационных элементов
(выводимо $A$), перечис\-ля\-ю\-щих подгруппы $A$ утверждений,
использованных приемом. В этот же набор вклю\-ча\-ют\-ся выражения
для элементов (задача $\ldots$), ссылающихся на использо\-ван\-ные
приемом вспомогательные задачи. Переменной х9
при\-сва\-и\-ва\-ет\-ся дополняющий х8 набор - пустой либо
одноэлементный, содержащий про\-грамм\-ное выражение для
эле\-мен\-та (выводимо $\ldots$).

После контрольной точки "прием(49)" \ выполняется учет указателей
приема "при\-мечание($\ldots$)". Вводится накопитель х10
программных выражений для безуслов\-ных комментариев; условные
комментарии регистрируются в накопителе, на который ссылается
информационный элемент программного блока (примечание $\ldots$).
По за\-вер\-шении цикла заполнения этих накопителей - переход
через "ветвь 2", где пе\-ре\-мен\-ной х11 присваивается
программное выражение для объединенного списка
ком\-мен\-та\-ри\-ев. К списку х8 добавляется элемент (примечание
х11), который впоследст\-вии будет передан реализующей вывод
процедуре. Затем - откат к переходу через "ветвь 1".

Вводится накопитель х11 информационных элементов, передаваемых
реали\-зу\-ю\-ще\-му вывод оператору. В него включаются списки х8,
х9, и заносится ссылка (при\-ем $\ldots$) на текущий прием. Далее
выполняются следующие действия, связанные с уче\-том указателей
приема:

\begin{enumerate}

\item Учет указателя "прообраз($i$ посылки($A_1 \ldots A_n$)
вывод($B_1 \ldots B_m$))" \ (кон\-троль\-ная точка "прием(50)").
Прием регистрирует в текущей задаче информацию о том, что
идентифицированное с $i$-м антецедентом утверждение задачи
яв\-ля\-ет\-ся следствием консеквента, прочих использованных при
выводе утвержде\-ний, а также дополнительных следствий $B_1,
\ldots , B_m$, выводимых после установле\-ния истинности с помощью
проверочных операторов утверждений $A_1, \ldots , A_n$.

Переменной х15 присваивается вхождение рассматриваемого
антецедента в тео\-ре\-му приема; переменной х17 - программное
выражение для этого анте\-це\-ден\-та. Далее в х11 заносится
программное выражение для элемента (прообраз $C$ $D$). $C$ -
посылка, идентифицированная с рассматриваемым антецедентом. Если
$D$ не равно 0, то оператор "вывод" \ должен будет ввести
комментарий (прооб\-раз $C$ $R$), где $R$ - объединение
утверждений списка $D$, остальных использо\-ван\-ных посылок и
нового утверждения; $C$ является следствием $R$. При построе\-нии
программного выражения для элемента (прообраз $\ldots$) сначала
отдель\-но рассматривается простейший случай $m = n = 0$. Затем -
переход через "ина\-че 3", где переменной х18 присваивается
выражение для заготовки элемен\-та (прообраз $C$ $D$). Если $n =
0$, то $D$ полагается равным символу "пустоесло\-во", иначе - 0.
Если $n > 0$, то компилируется оператор, проверяющий истин\-ность
всех $A_1, \ldots A_n$, и в случае положительного результата
изменяющий $D$ на список использованных для проверки утверждений.
Если $m>0$, то компили\-ру\-ют\-ся операторы, осуществляющие вывод
дополнительных следствий $B_1, \ldots, B_m$, проверяя отличие $D$
от 0, а также оператор, регистрирующий эти следствия в списке $D$.
Затем программное выражение х18 заносится в список х11.

\item Учет указателей "вспомпараметр($\ldots$)",
"новыйсимвол($\ldots$)", "вспом\-не\-из\-вест\-ная($\ldots$)" \
(контрольная точка "прием(70)").

Указатель "вспомпараметр($x$ $V$)" \ позволяет вводить новый
вспомога\-тель\-ный параметр $x$ задачи на исследование, имеющей
цель "известно". Утверждения с $x$, вхождения которых в теорему
задаются указателями списка $V$, перено\-сят\-ся в список посылок
внешней задачи на описание.

Указатель "новыйсимвол($x$ $V$)" \ аналогичен предыдущему, но
новая перемен\-ная $x$ становится неизвестной задачи на
исследование.

Указатель "вспомнеизвестная($x$)" \ означает, что вводимая приемом
новая пере\-мен\-ная $x$ становится вспомогательной неизвестной
как текущей задачи на ис\-сле\-до\-ва\-ние, имеющей цель
"известно", так и внешней задачи на описание.

Вспомогательные параметры задачи считаются известными и
регистриру\-ют\-ся в комментарии (вспомпараметр $\ldots$).
Включение их в ответ внешней задачи на описание блокируется.
Вспомогательные неизвестные регистрируются в ком\-мен\-та\-рии
(вспомнеизвестная $\ldots$). Найденные значения их не включаются в
ответ внешней задачи на описание.

Во всех перечисленных случаях переменной х17 присваивается
программ\-ное выражение для $x$. Далее в накопитель х11 заносится
программное выражение для набора ($Q$ $x$ $T$) либо (случай
"вспомнеизвестная") набора ($Q$ $x$). Здесь $Q$ - заголовок
указателя; $T$ - терм "набор($\ldots$)", перечисляющий
утвержде\-ния, адресуемые списку посылок внешней задачи.

\item Учет указателей, задающих новые элементы чертежа
(контрольная точка "при\-ем(23)"). В х11 заносится программное
выражение для набора (геомре\-дак\-тор набор($A_1 \ldots A_n$)),
где $A_i$ - программные выражения, определяющие дан\-ные
указатели.

\item Учет указателя "титр($\ldots$)", определяющего выдачу
сопровождающих сра\-ба\-ты\-ва\-ние приема пояснений. В х11
заносится информационный элемент, опреде\-ля\-е\-мый процедурой
"транститр".

\item Указатель приема "внешзнак", блокирующий уменьшение веса
условия зада\-чи на преобразование, переносится в набор х11.

\item Указатель приема "стоп" \ инициирует ввод в компилируемую
программу опе\-ра\-то\-ра "трассировка(стоп 0)" \ для выхода в
отладчик ЛОСа.

\item Учет указателя "коррекцияодз" \ (контрольная точка
"прием(51)"). Точка при\-вяз\-ки приема определяется указателем
"контрольвывода($A$)", а выводимое ут\-вер\-жде\-ние нужно для
восстановления сопровождения терма $A$ по о.д.з. Что\-бы
зарегистрировать его конъюнктивные члены в комментариях
"сопровожде\-ние", в компилируемую программу вставляется обращение
к процедуре "коррек\-ция\-одз($\ldots$)".

\item Учет информационных элементов программного блока
(удалениепосылки $\ldots$), (удалениеусловия $\ldots$). По ним
создаются одноименные элементы набора х11.

\item Учет указателя приема "новыенеизвестные" \ (контрольная
точка "прием(69)"). Новые переменные регистрируются в списке
неизвестных задачи с помо\-щью добавляемого к компилируемой
программе оператора "учетнеизвестных($\ldots$)".

\item Учет указателя приема "примеч" \ (контрольная точка
"прием(92)"). Так же, как это делалось для приемов замены.

\item Учет указателей "замечание($\ldots$)",
"комментариипосылок($\ldots$)", не содер\-жа\-щих символа
"результат". В компилируемую программу вводятся операторы,
со\-з\-да\-ю\-щие соответствующие комментарии.

\end{enumerate}

Если в компилируемую программу уже были введены вспомогательные
опера\-то\-ры "вывод($\ldots$)", изменяющие задачу, то к набору
х11 присоединяется логичес\-кий символ "выход", необходимый для
предотвращения отката в случае отказа от выполнения основного
вывода приема. Тогда, по достижении завершающего про\-грам\-му
приема оператора "пересмотр", произойдет повторный анализ текущей
си\-ту\-а\-ции.

Наконец, программной переменной х12 присваивается выполняющий
основ\-ное действие приема оператор "вывод($\ldots$)" \ либо
"выводусловия($\ldots$)". После контроль\-ной точки "прием(33)" \
он заносится в компилируемую программу.

После контрольной точки "прием(52)" \ рассматривается указатель
приема "вни\-ма\-ние" \ - по нему создается оператор, обнуливающий
веса посылок и условий, со\-дер\-жа\-щих заданный терм.

После контрольной точки "прием(63)" \ рассматривается указатель
приема "най\-де\-но($X$)" \ - по нему создается оператор,
исключающий переменные списка $X$ из чис\-ла неизвестных текущей
задачи.

После контрольной точки "прием(77)" \ рассматривается указатель
приема "актив" \ - по нему создается оператор, уменьшающий вес
заданного утверждения задачи до заданной величины.

Наконец, программа завершается добавлением оператора "контроль" \
(если в х11 был занесен символ "выход", то задача могла остаться
неизмененной, и тогда откат к началу цикла сканирования не нужен)
либо "пересмотр".

\subsubsection{Приемы "подборзначений", "существует" \ }

Подслучай рассматривается после контрольной точки "прием(53)".
Напомним, что прием "подборзначений" \ предпринимает попытку
неэквивалентной замены условия или группы условий задачи на
описание, имеющей цель "пример". Эти условия идентифицируются с
консеквентом теоремы и заменяется на группу антецеден\-тов,
выделенных указателями "подборзначений($\ldots$)". Фактически
замена выполня\-ет\-ся во вспомогательной задаче; если ее решить
не удается, то продолжается решение текущей задачи. Прием
"существует" \ представляет собой версию приема
"под\-бор\-зна\-че\-ний", в которой замене подлежит группа всех
условий, содержащих задан\-ные несущественные неизвестные.
Консеквент теоремы приема здесь имеет вид кван\-то\-ра
существования по переменным, идентифицируемым с такими
неизвестными.

Переменной х6 присваивается список антецедентов теоремы приема;
пере\-мен\-ной х7 - подмножество антецедентов, выделенных
указателями "подборзначений($\ldots$)". Находится программное
выражение х8 для конъюнкции утверждений списка х7.
Инициализируется накопитель х13 программных выражений для
инфор\-ма\-ци\-он\-ных элементов, передаваемых процедуре,
выполняющей основное действие приема. В него помещаются: ссылка на
прием и информация об использованных приемом по\-сыл\-ках;
информация для выдачи поясняющего срабатывание приема текста;
информация о комментариях, передаваемых вспомогательной задаче.
Если заменяется единст\-вен\-ное условие, применяется процедура
"попыткаспуска($\ldots$)", иначе - проце\-ду\-ра
"Попыткаспуска($\ldots$)".

\subsubsection{Приемы групповой замены и прием "параметризация" \ }

Подслучай рассматривается после контрольной точки "прием(54)".
Приемы груп\-по\-вой замены имеют заголовки "заменатермов",
"заменаусловия" \ и "связка". Со\-от\-вет\-ственно, происходят
замены следующих типов: замена группы посылок; замена группы
условий; замена всех условий, содержащих заданные несущественные
не\-из\-вест\-ные, сопровождаемая исключением этих неизвестных. В
первых двух слу\-ча\-ях преобразования эквивалентные; во втором -
заменяющее утверждение эквива\-лент\-но существованию значений
исключаемых неизвестных, при которых заменяе\-мые условия истинны.

Прием "параметризация" \ основан на эквивалентности $\forall_x(
A_1 \ \$ \ldots \ \& \ A_n \rightarrow (B \leftrightarrow
\exists_y(B_1 \ \& \ldots \ \& \ B_m)))$, дающей параметрическое
описание для одного либо несколь\-ких условий $B$ задачи на
описание. Он вводит вспомогательную задачу, полу\-ча\-е\-мую
заменой данных условий на конъюнктивные члены $B_1, \ldots , B_m)$
параметри\-чес\-ко\-го описания и присоединением параметров
описания $y$ к списку неизвестных. По окончании решения
вспомогательной задачи на ее ответ навешивается кван\-тор
существования по параметрам, и выдается результат упрощения
получен\-но\-го утверждения. Заметим, что прием "связка" \ имеет
теорему такого же вида, но у него квантор существования расположен
в левой части эквивалентности, $y$ - спи\-сок исключаемых
несущественных неизвестных, а $B_1, \ldots, B_m$ - все условия
зада\-чи, их содержащие. В случае приемов групповой замены
основное действие реали\-зу\-ет\-ся процедурой "заменагруппы"; в
случае приема "параметризация" \ - процеду\-рой
"попыткапараметризации".

Переменной х6 присваивается вхождение консеквента теоремы - он
имеет вид эквива\-лент\-нос\-ти. Переменной х7 присваивается
заменяющий терм этой экви\-ва\-лент\-нос\-ти. Если прием имеет
указатель "новыенеизвестные" \ (контрольная точка "при\-ем(93)"),
то для регистрации перечисляемых в нем переменных как новых
не\-из\-вест\-ных текущей задачи в компилируемую программу
вводится обращение к опе\-ра\-то\-ру "учетнеизвестных".
Инициализируется накопитель х11 программных выражений для
информационных элементов, которые будут передаваться процедуре,
реализу\-ю\-щей основное действие приема. В него заносятся ссылка
на прием и информация об утверждениях, использованных при
срабатывании приема. Далее х11 пополняется в зависимости от
следующих указателей приема:

\begin{enumerate}

\item Указатель "примечание" \ порождает одноименный
информационный элемент в х11, определяющий комментарии, которыми
снабжаются заменяющие утверж\-де\-ния;

\item Указатель "удалениеусловия" \ передает в х11 информацию о
сопровожда\-ю\-щем основное действие удалении условий;

\item Указатель "новыйсимвол" \ передает в х11 информацию о новых
пере\-мен\-ных, вводимых приемом и требующих учета во внешней
задаче на описание (в этом случае текущая задача - на
исследование);

\item Указатель "титр" \ передает в х11 информацию о поясняющем
сраба\-ты\-ва\-ние приема тексте;

\item Информационный элемент программного блока "ключвывода" \
передает в х11 информацию о выводе сопровождающих утверждений;

\end{enumerate}

По окончании этих действий (контрольная точка "прием(84)")
компиляция раз\-вет\-вля\-ет\-ся. Здесь рассматриваются два
случая:

\begin{enumerate}

\item Случай приема групповй замены. Находится программное
выражение х12 для заменяющего терма. Если прием имел указатель
"примеч($\ldots$)", то он об\-ра\-ба\-ты\-ва\-ет\-ся так же, как и
выше, порождая операторы, вводящие необхо\-ди\-мые комментарии.
Переменной х13 присваивается программное выражение для набора
заменяемых термов задачи. Если программное выражение х12 для
за\-ме\-ня\-ю\-ще\-го терма содержит оператор "облвхожд($\ldots$)"
\ (при задании спис\-ков посылок пакетных операторов или
вспомогательных задач), то он преобра\-зу\-ет\-ся в оператор
"Облвхожд($\ldots$)" \ - для исключения из посылок заменяе\-мых
утверждений. Такая же замена предпринимается для остальных
вхож\-де\-ний оператора "облвхожд" \ в компилируемую программу.
Лишь после это\-го добавляются завершающие программу приема
операторы "заменагруппы($\ldots$)" \ и "пересмотр".

\item Случай приема параметризации. Проверяется, что заменяющая
часть теоре\-мы приема имеет своим заголовком квантор
существования. Программной пере\-мен\-ной х12 присваивается
связывающая приставка этого квантора (т.е. спи\-сок параметров). В
компилируемую программу вставляются операторы, вы\-би\-ра\-ю\-щие
для теоремных переменных списка х12 новые переменные, не
ис\-поль\-зо\-ван\-ные в контексте срабатывания приема.
Программные переменные для этих переменных накапливаются в списке
х14. Переменной х15 присваивается набор программных выражений для
утверждений, образующих параметрическое опи\-са\-ние. Переменной
х16 присваивается набор программных выражений для за\-меняемых
условий. Наконец, переменной х17 присваивается обращение к
про\-це\-ду\-ре "попыткапараметризации". Это обращение и оператор
"ответ" \ зано\-сят\-ся в компилируемую программу.

\end{enumerate}

\subsubsection{Прием ввода либо исключения комментариев}

Подслучай рассматривается после контрольной точки "прием(55)".
Прием име\-ет заголовок "замечание". Компиляция действий с
комментариями к данному мо\-мен\-ту уже выполнена - она вынесена в
предварительный цикл обработки указа\-те\-лей приема. Поэтому
обрабатываются лишь остаточные указатели "найдено", "актив",
"пересмотр". Эти действия аналогичны рассмотренным выше. При
отсутвии ука\-за\-те\-лей "новоеусловие", "новаяпосылка",
"внимание", "пересмотр" \ программу прие\-ма завершает не оператор
"пересмотр", а оператор "продолжение", так как измене\-ны были
только комментарии.

\subsubsection{Прием "замещениеусловий" \ }

Подслучай рассматривается после контрольной точки "прием(56)".
Теорема прие\-ма имеет вид "замещениеусловий($A$)" \ и определяет
вид $A$ посылки текущей зада\-чи на исследование. Действие приема
состоит в добавлении этой посылки к списку условий внешней задачи
на описание. При этом предпринимается попытка усмот\-реть те
"старые" \ условия задачи на описание, которые после добавления
$A$ становят\-ся избыточными - как следствия $A$, прочих условий и
некоторых сопровождающих $A$ посылок, тоже переносимых в условия
внешней задачи. Избыточные условия уда\-ля\-ют\-ся. Все эти
преобразования выполняются процедурой "замещениеусловий".

В компилируемую программу заносятся операторы: проверяющий, что
иден\-ти\-фи\-ци\-ро\-ван\-ная с $A$ посылка еще не
рассматривалась данным приемом; вводящий комментарий для
блокировки повторного рассмотрения приемом этой посылки;
про\-ве\-ряющий, что посылка не входит в список условий внешней
задачи; реализую\-щий обращение к процедуре "замещениеусловий".
Если прием имеет указатель "обрыв\-за\-дачи", то в безусловном
случае далее помещается оператор "ответ", иницииру\-ю\-щий
возвращение к внешней задаче, а в условном - программа для
проверки содержа\-ще\-го\-ся в указателе фильтра, и далее -
оператор "ответ". При отстутствии указа\-те\-ля "обрывзадачи" \
программа приема завершается оператором "продолжение".

\subsubsection{Прием "обозначение" \ }

Подслучай рассматривается после контрольной точки "прием(58)".
Теорема прие\-ма имеет вид "равно($x$ $A$)". Прием вводит
вспомогательную неизвестную $x$ для выражения $A$, усмотренного в
условии задачи на описание. Все вхождения этого выражения в
условия заменяются на $x$; вводится комментарий (вспомпараметр
$x$), и заносится новое условие $x=A$. Оно сопровождается
комментариями, блоки\-ру\-ю\-щи\-ми обратную замену $A$ на $x$.
Приемы такого типа применяются при реше\-нии задач,
подготавливающих компилятору ГЕНОЛОГа схему вычислений.
Компиля\-тор вставляет в программу приема обращение к процедуре
"обозначение", выполня\-ю\-щей перечисленные выше действия, после
которого размещает оператор "пересмотр".

\subsubsection{Прием "результат" \ }

Подслучай рассматривается после контрольной точки "прием(61)".
Теорема прие\-ма имеет вид "результат($A$)". Если усматривается,
что условие текущей задачи на преобразование имеет вид $A$, причем
истинны фильтры приема, то происходит не\-мед\-лен\-ная выдача
условия задачи в качестве ответа. Так как все проверки к
дан\-но\-му моменту компиляции уже обеспечены, то остается только
ввести завершающий оператор "ответ($\ldots$)".

\subsubsection{Прием "свертка" \ }

Подслучай рассматривается после контрольной точки "прием(32)".
Теорема прие\-ма - кванторная импликация, консеквент которой сам
является кванторной имплика\-ци\-ей $K$. Предпринимается попытка
решить задачу на доказательство путем идентифи\-ка\-ции ее условия
с консеквентом $K$, а части посылок - с антецедентами $K$.
Прие\-мы такого типа используются при доказательстве по индукции.
К текущему моменту компиляции уже проведены идентификация и
выполнены все проверки антецедентов теоремы. Таким образом,
истинность доказываемого утверждения приемом уже
ус\-та\-нов\-ле\-на, и перед выдачей ответа "истина" \ необходимо
учесть информацию об использованных посылках. Это обеспечивается
обращением к процедуре "учет\-сверт\-ки". Предварительно
заполняется накопитель х7 программных выражений для ссыл\-ки на
прием и информационных элементов (выводимо $\ldots$).

\subsubsection{Прием "выразимо" \ }

Подслучай рассматривается после контрольной точки "прием(82)".
Прием исполь\-зу\-ет\-ся в задачах на описание, составляющих схему
вычислений для после\-ду\-ю\-щей обработки ее компилятором
ГЕНОЛОГа. Он усматривает выразимость неко\-то\-рых переменных
через исходные данные задачи такими стандартными средствами,
ко\-то\-рые, в принципе, позволяют вычислить эти переменные
(например, построить таб\-ли\-цу значений функции по
дифференциальному уравнению и начальным значениям). Информация о
выразимости регистрируется в комментариях задачи процедурой
"вы\-ра\-зимо($\ldots$)". Если установлена выразимость в указанном
смысле всех неизвест\-ных задачи, вводится цель "программа",
определяющая этап технической обработки ус\-ловий перед
компиляцией. Так, в указанном выше примере, будет выполнен
пере\-ход от дифференциальных уравнений к соответствующим
конечно-разностным.

Вводятся накопители х10, х11 единичных переменных и списков
перемен\-ных, выделенных в приеме указателем "выразимо". После их
заполнения создается об\-ра\-ще\-ние к процедуре "выразимо".

\section{Завершающая обработка программы}

Завершающая обработка программы выполняется двумя последовательно
при\-ме\-ня\-е\-мы\-ми процедурами - "вставкафрагментов" \ и
"завершениепрограммы". Обраще\-ние к первой из них имеет вид
"вставкафрагментов(х1)", где х1 - программный блок. Здесь
происходит извлечение из информационных элементов (блокпрограммы
$\ldots$) фрагментов программы, созданных в процессе компиляции,
но пока не за\-ре\-гист\-ри\-ро\-ван\-ных в накопителе программ
блока х1, и занесение этих фрагментов в данный накопитель.
Обращение ко второй имеет вид "завершениепрограммы(х1 х2 х3 х4
х5)". Здесь х1 - пара ($K$ $F$), содержащая набор $F$ фрагментов
программы приема, и некоторый набор $K$ сопровождающих
комментариев (такую пару называем на этапе редактирования
программы программным модулем); х2 - логический символ, за которым
закреплен компилируемый прием; х3 - номер узла теоремы этого
приема; х4 - заголовок приема; х5 - описание приема.
Предпринимается пополнение фрагмен\-тов программы и завершающее их
редактирование. Последнее заключается в после\-до\-ва\-тель\-ных
эквивалентных упрощающих преобразованиях программы. Заме\-тим, что
в действительности процедура "завершениепрограммы" \ почти сразу
обраща\-ет\-ся к описываемой ниже процедуре "редакцияпрограммы",
которая и выполня\-ет основную часть работы.

\subsection{Процедура "вставкафрагментов"\ }

Происходит просмотр списка фрагментов программы в программном
блоке х1; х2 - текущая позиция этого списка. Для текущего
фрагмента х3 выполняется про\-смотр его операторов; х4 - текущая
позиция оператора х5. Если оператор имеет вид "1($A$ $n$)" \ либо
"2($n$)", то он представляет собой ссылку на фрагмент программы
$P$, сохраненный в информационном элементе (блокпрограммы $n$ $P$)
программного бло\-ка х1. Фрагмент $P$ заносится в конец
просматриваемого списка фрагментов про\-грамм\-но\-го блока х1;
текущий оператор заменяется в первом случае на два опе\-ра\-то\-ра
- $A$, "иначе($k$)", а во втором случае - на один оператор "ветвь
($k$)". Здесь $k$ - номер фрагмента $P$ в просматриваемом списке.
Увеличивается на единицу счет\-чик фрагментов программного блока
х1. Затем - откат к повторному просмотру спи\-ска фрагментов. Если
при просмотре никаких изменений программы не произошло, то выход
из процедуры.

\subsection{Процедура "завершениепрограммы"\ }

Эта процедура выполняет одно-единственное преобразование, после
чего обраща\-ет\-ся к процедуре "редакцияпрограммы".
Преобразование связано с достаточно ред\-ким случаем компиляции
приема нормализатора, работающего в режиме раз\-бо\-ра случаев.
Примером такого нормализатора может служить оператор "нормпредел",
вычисляющий пределы.

Переменной х6 присваивается заголовок нормализатора и проверяется,
что в опи\-са\-нии его формата имеется элемент "разборслучаев".
Если программа приема дан\-но\-го нормализатора имеет оператор
"равно($x$ $P$)", где $P$ - рекурсивное обращение к тому же самому
нормализатору х6, то результатом обращения может оказаться терм
$T$ вида "разборслучаев($\ldots$)", указывающий на необходимость
немедленного раз\-бо\-ра случаев. В этой ситуации нужно,
во-первых, вернуться по цепочке рекурсивных обращений к корневому
обращению и, во-вторых, откатиться для него к той точке в начале
программы, где организуется разбор подслучаев согласно $T$.
Поэтому вы\-пол\-ня\-ет\-ся просмотр программы с целью поиска
указанных операторов "равно($x$ $P$)". Для найденного такого
оператора после него в программу вставляются опера\-то\-ры
"не(заголовок($x$ разборслучаев))", "иначе($n$)",
"метка(про\-дол\-же\-ние)". Здесь $n$ - но\-мер, на единицу
больший числа фрагментов программы; оператор
"метка(про\-дол\-же\-ние)" \ является указателем на возможность
продолжения в данной точке выде\-ле\-ния общего начала двух
склеиваемых программ приемов (если таковое понадобится), несмотря
на наличие оператора перехода "иначе($n$)". Затем к концу списка
фраг\-мен\-тов программы присоединяются: фрагмент с операторами
"входит(под\-чи\-не\-но х3)", "иначе($n+1$)", "ответ($x$)", а
также фрагмент с операторами "замена(х6 0)", "подслучаи(х1 х2 х3
$x$)", "переходпометке(1)". Первый из них решает задачу вы\-хо\-да
из промежуточной точки цепи рекурсивных обращений; второй -
регистри\-ру\-ет информацию о разборе случаев в комментариях
нормализатора и органи\-зу\-ет откат к точке инициализации разбора
случаев согласно измененным коммента\-ри\-ям, уменьшая
предварительно до нуля текущий уровень сканирования х6.

\subsection{Процедура "редакцияпрограммы"\ }

Обращение к процедуре имеет вид "редакцияпрограммы(х1 х2)". Здесь
х1 - на\-бор комментариев к списку х2 фрагментов редактируемой
программы. При компиля\-ции приема сканирования задачи в список х1
передается единственный коммента\-рий (заголовок $A$) с заголовком
компилируемого приема. Другие возможные коммен\-та\-рии -
(связприставка $A$) со списком $A$ программных переменных, которые
необхо\-ди\-мо сохранить при редактировании, и (переменная $x$),
где $x$ - программная переменная, встречающаяся в операторах,
вставляемых в начальный отрезок программы после редактирования.
Они блокируют действия, связанные с изменением номеров
ука\-зан\-ных в них программных переменных.

Процедура "редакцияпрограммы" \ сравнительно сложна, и для выхода
в раз\-лич\-ные ее точки удобно использовать ветвь "Завершающая
обработка программы", "Завершающее редактирование программы" \
оглавления программ.

\subsubsection{Исключение псевдооператоров "переходпометке",
"мет\-ка\-пе\-ре\-хода" \ }

При компиляции в программу могли заноситься псевдооператоры
"меткаперехода($n$ $x$)", "переходпометке($n$)". Второй из них
задает откат к первому, причем $x$ явля\-ет\-ся первой программной
переменной, не определенной после отката. Эта ситуация, впрочем,
случается сравнительно редко, так как обычно программа приема
имеет линейную структуру. Чтобы программа на ЛОСе фактически могла
реа\-ли\-зо\-вать откат, нужно заменить псевдооператоры
"переходпометке" \ на соответствующие опе\-ра\-торы "продолжение",
"обрыв", "сброс($i$)", а псевдооператоры "меткапере\-хо\-да" \
удалить. С этой целью реализуется цикл просмотра фрагментов х4
про\-грамм\-но\-го модуля х2, а для текущего фрагмента - просмотр
операторов х6. Как только обнаруживается оператор
"переходпометке($n$)", символьный номер перехода $n$
при\-сва\-и\-ва\-ет\-ся переменной х7 и начинается просмотр
цепочки надфрагментов теку\-ще\-го фрагмента программы. При этом
заполняется накопитель х8 пар (вхож\-де\-ние надфрагмента в список
фрагментов - вхождение последнего оператора этого
над\-фраг\-мен\-та, из которого достижим оператор х6).

В некоторый момент должен встретиться псевдооператор х12 вида
"меткапере\-хо\-да($n$ $x$)", обозначающий точку отката. Тогда
инициализируется нулем счетчик х14 числа перечисляющих операторов
на пути от точки отката до х6 (контрольная точ\-ка "прием(3)"), и
начинается цикл просмотра операторов данного пути.
По\-сле\-до\-ва\-тель\-но просматриваются вхождения х15 пар
накопителя х8. Переменной х16 присваивается вхождение начального
оператора отрезка пути в фрагменте пары х15, переменной х17 -
вхождение последнего оператора этого отрезка. Переменная х18
перечисляет вхождения от х16 до х17 (не включая х17). Если
встречается опе\-ра\-тор "Обрыв", то из х14 вычитается единица,
так как выполнение его приводит к отбрасыванию последнего
перечисления. Если встречается перечисляющий опе\-ра\-тор, то х14
увеличивается на 1. Заметим, что при определении типа
опе\-ра\-то\-ра используется первая не определенная перед его
выполнением программная пе\-ре\-мен\-ная х13, которая
инициализируется по "меткаперехода($n$ $x$)" \ и
корректи\-ру\-ет\-ся при продвижении вдоль пути. Если оператор
заведомо не перечисляющий, то х14 не изменяется. Компилятор
избегает вводить в программу операторы, работающие в смешанном
режиме (проверка - перечисление). Это, однако, может произойти для
операторов вида "альтернатива($A$ равно($y$ $t$) $B$)", где $y$ -
первая не опреде\-лен\-ная переменная, $B$ - перечисляющий
оператор. Тогда компилятор заменяет обычное при\-сво\-е\-ние
"равно" \ на перечисляющее присвоение "Равно", переводя таким
обра\-зом оператор в разряд перечисляющих. В прочих случаях,
встретившись с операто\-ром смешанного типа, компилятор выходит в
отладчик ЛОСа на фрагмент аварий\-но\-го прерывания "повторение
трассировка(стоп 0) продолжение".

По окончании просмотра пути (контрольная точка "прием(5)")
предпринима\-ет\-ся изменение оператора х6 на "продолжение" \ в
случае х14 = 0; "обрыв" \ в случае х14 = 1, и "сброс(х14)" в
прочих случаях.

Далее цикл поиска псевдооператоров х6 вида
"переходпометке($\ldots$)" \ продол\-жа\-ет\-ся. По его завершении
(контрольная точка "прием(6)") реализуется цикл исклю\-че\-ния из
программы псевдооператоров "меткаперехода($\ldots$)".

\subsubsection{Удаление повторного оператора}

Вообще говоря, в одном и том же фрагменте программы могут
встречаться оди\-на\-ко\-вые операторы. Если между ними
встречается хотя бы один перечисляю\-щий оператор, то возможен
откат, после которого значения входных переменных вто\-ро\-го
оператора окажутся иными, чем они были у первого. Однако, если
одина\-ко\-вые операторы встречаются сразу друг за другом, то один
из них может быть удален. Это и делается ветвью, расположенной
после контрольной точки "прием(7)". Здесь х5 - повторное вхождение
оператора; х7 - его предыдущее вхождение. После уда\-ле\-ния
оператора указатель текущего вхождения в измененный фрагмент
прог\-рам\-мы корректируется так, чтобы просмотр был продолжен с
той же точки.

\subsubsection{Использование справочника "редакцияпрограммы" \ }

Многие действия по упрощению программы вынесены в приемы
справочника "ре\-дак\-цияпрограммы". При обращении к нему
определены следующие переменные: х1 - набор комментариев к списку
х2 фрагментов редактируемой программы; х3 - теку\-щее вхождение в
х2; х4 - текущее вхождение в фрагмент х3; х5 - оператор по
вхож\-де\-нию х4; х6 - вхождение текущего логического символа в х5
(он является сим\-во\-лом обращения к справочнику); х7 - первая не
определенная перед выполне\-ни\-ем оператора х5 программная
переменная. Если прием справочника изменяет про\-грам\-му, то
результатом обращения служит пара (новое текущее вхождение
фрагмента - новое текущее вхождение оператора), определяющая
точку, с которой следует про\-дол\-жать просмотр программы.

Значением переменной х3 служит вхождение текущего фрагмента х5
про\-грам\-мы в список фрагментов; х4 - индикатор изменения
фрагмента, изначально ус\-та\-нав\-ли\-ва\-е\-мый на 0. х6 -
вхождение текущего оператора х8 в х5; х7 - первая не определенная
перед выполнением этого оператора программная переменная. Если
обращение к справочнику дает ненулевой результат, то х4 заменяется
на 1. После полного просмотра программы проверяется, равно ли х4
единице. Если равно, то цикл просмотра повторяется.

В качестве примера приведем несколько приемов справочника
"редакцияпро\-грам\-мы":

\begin{enumerate}

\item Символ обращения к справочнику - "символ" \ (см. фрагмент
программы сим\-во\-ла "символ", начинающийся с оператора
"обращение(редакцияпро\-грам\-мы)"). Если текущий оператор имеет
вид "символ(левыйкрай($A$)$B$)", то он заменя\-ет\-ся на
"заголовок($A$ $B$)"; если он имеет вид
"символ(первыйоперанд($A$)$B$)", то заменяется на
"первыйсимвол($A$ $B$)", и т.п.

\item Символ обращения к справочнику - "операнд". Если текущий
оператор - кор\-не\-вой и имеет вид "операнд($A$ $x$)", где $x$ -
не определенная перед обращением к оператору переменная, то
находятся все достижимые из него операторы, содер\-жа\-щие $x$.
Составляется список х9 ссылок на эти операторы; каждая ссыл\-ка
есть пара (вхождение фрагмента - вхождение оператора в фрагмент).
Если список х9 пуст, либо состоит из ссылки на оператор
"не(равно($x$ $B$))", при\-чем в последнем случае усматривается,
что по вхождению $A$ расположен бо\-лее чем одноместный символ, то
текущий оператор избыточен - он опреде\-ля\-ет не используемую
переменную $x$. Поэтому реализуется удаление оператора. Оно
сопровождается уменьшением на единицу номеров переменных,
следующих пос\-ле $x$, во всех операторах, достижимых из
удаленного. Так как удаленный опе\-ра\-тор - перечисляющий, то
необходима также коррекция величин отката в достижимых из него
операторах "обрыв", "сброс($\ldots$)". Первая коррекция
вы\-пол\-ня\-ет\-ся процедурой "сдвигпеременных"; вторая -
процедурой "коррек\-ция\-от\-ка\-тов". Обе эти процедуры часто
используются в других приемах справоч\-ни\-ка, а также в самой
программе "редакцияпрограммы".

\item Символ обращения к справочнику - "вариант". Если текущее
операторное вы\-ра\-же\-ние имеет вид "вариант($A$ $t_1$ $t_2$)",
причем оператор $A$ либо его отрица\-ние встречались в программе
до текущего оператора, то выражение заменяется, соответственно, на
$t_1$ либо $t_2$. Чтобы данное преобразование было корректным,
необходима проверка сохранения значений переменных оператора $A$
на отрезке от вхождения его (либо его отрицания) в программу до
текущего оператора. Эти значения могли измениться при откатах либо
после выполнения опера\-то\-ра "замена". Проверку сохранения
значений выполняет процедура "сохрзначений", которая тоже
достаточно часто используется при преобразованиях программы.

\end{enumerate}

Не приводя здесь сколь-нибудь полного перечня приемов справочника
"редак\-ция\-прог\-раммы", которых насчитываются многие десятки,
ограничимся перечисле\-ни\-ем тех логических символов, для которых
имеются эти приемы: "не", "и", "или", "длялюбого", "существует",
"альтернатива", "вариант", "выч", "Выч", "кон\-ка\-те\-на\-ция",
"позиция", "символ", "переменная", "подчинено", "операнд",
"левыйкрай", "суффикс", "сборка", "пересекаются", "запись",
"пересечениесписков", "заголовок", "плюс", "вычитание", "подтерм",
"равно", "входит", "параметры", "набороперан\-дов", "истина",
"ложь", "известно", "унисборка", "длинанабора", "числзначе\-ние",
"возведениевстепень", "наборчленов", "точкипрямой", "Наборчленов".

\subsubsection{Ввод вспомогательных переменных для повторяющихся
программных вы\-ра\-жений}

Первоначальная версия программы приема обычно содержит множество
повто\-ря\-ю\-щих\-ся вхождений одинаковых программных выражений.
Естественно вычис\-лить значение такого выражения один раз,
присвоить его вспомогательной программ\-ной переменной, и
обращаться к ней во всех последующих случаях. Заметим, что такое
преобразование влияет на объем оптимизируемых программ наиболее
существенным об\-ра\-зом. При этом, одна\-ко, необходимо
отслеживать возможность изменения зна\-че\-ния выражения при
отка\-тах, переприсвоениях значений переменным и изме\-не\-ни\-ях
структур данных. Во всех сколь-нибудь подозрительных случаях
такого ро\-да компилятор должен избегать за\-мен выражения на
ранее вычисленное его значение. Приводимые ниже средства контроля
допустимости ввода вспомогательного обо\-зна\-че\-ния имеют, в
общем, эвристический характер, достаточный для "типовых" \
про\-грамм, создаваемых текущей версией компилятора. По мере
развития компиля\-то\-ра здесь, безусловно, понадобятся
существенные дополнения.

Просмотр программы для выделения повторяющихся подвыражений
начина\-ет\-ся после контрольной точки "прием(10)".
Инициализируется пустым словом накопи\-тель х3, в который будут
заноситься пары ($s$ $A$), где $s$ - логический символ, $A$ -
набор пар ($t$ $B$). Здесь $t$ - программное выражение, имеющее
заголовок $s$; $B$ - набор пар (вхождение фрагмента программы -
вхождение оператора в фрагмент), адресую\-щих содержащие $t$
операторы. Переменной х4 присваивается список логических
симво\-лов, операнды которых заведомо можно не рассматривать
(например, из-за того, что они суть не операторные выражения, а
операторы). Далее начинается цикл просмот\-ра. Переменная х5
указывает вхождение текущего фрагмента х6; х7 - вхожде\-ние
текущего оператора х8. Оператор "ответ" \ и оператор, следующий за
опера\-то\-ром "заменавхождения", не рассматриваются. Блокируется
также рассмотрение на\-ко\-пи\-те\-лей (выводимо $\ldots$)
использованных приемом утверждений. Далее переменная х9 пробегает
вхождения в текущий оператор х8 неоднобуквенных подтермов,
игно\-ри\-руя операнды символов набора х4, а также те операнды
выражений "перечисление($\ldots$)", "выписка($\ldots$)",
"вариант($\ldots$)", на которых расположены операторы.
Пропуска\-ют\-ся случаи присвоения переменной набора, который
впоследствии может быть изменен.

Если текущая позиция х9 не отвергается, то для нее выполняется
переход че\-рез "ветвь 6". Здесь проверяется, что текущий подтерм
не имеет переменных, связан\-ных внешними кванторами и
описателями. Переменной х10 присваивается его заголовок, и
происходит предварительное отсечение подтермов по заголовку. Далее
пред\-при\-ни\-ма\-ет\-ся попытка найти в х3 пару, начинающуюся с
х10. Если такой пары нет, то она заносится в х3 - для текущего
подтерма, и просмотр подтермов продолжа\-ет\-ся. Иначе найденная
пара ($s$ $A$) становится значением переменной х11. Переменной х12
присваивается текущий подтерм, и предприниается попытка найти в
$A$ пару, начинающуюся с х12. Если ее нет, то она регистрируется в
$A$, и просмотр подтер\-мов продолжается. Иначе начинается
просмотр пар х14, ссылающихся на ранее най\-ден\-ные вхождения в
программу подтерма х12. Если этот просмотр будет доведен до конца,
и вспомогательная переменная для х12 не возникнет, то переход
через "ина\-че 3", где в $A$ будет занесена очередная ссылка на
подтерм, и просмотр про\-грам\-мы продолжится.

Рассмотрение пары х14 начинается с проверки того, что она задает
вхождение опера\-то\-ра $P$, из которого достижим текущий оператор
х8. После контрольной точки "прием(12)" \ находится первая не
определенная перед выполнением $P$ программ\-ная переменная х15.
Находится список х16 свободных переменных программ\-ного выражения
х12 и проверяется, что все они к моменту выполнения $P$ уже
опре\-де\-ле\-ны. Если в х12 встречаются операторы "известно",
"неизвестная" \ либо опера\-тор\-ное выражение "неизвестные",
применение которых в случае задачи на доказательст\-во
некорректно, то проверяется наличие в программе оператора,
определяю\-ще\-го отличие типа задачи от "доказать". При
отсутствии такого оператора создание вспо\-мо\-га\-тель\-ного
обозначения может вывести подтерм х12 за рамки той области, где
его использование корректно. Далее - переход через "ветвь 4".

Если в х12 имеется подвыражение с заголовком "первыйоперанд",
"пер\-вый\-терм", и т.п., то нужны гарантии того, что операнд
соответствующего вхождения $v$ с нуж\-ным номером существует -
иначе произойдет остановка программы по некоррект\-но\-му
обращению. В этом случае проверяется, не расположено ли текущее
вхождение х9 либо одно из ранее встречавшихся вхождений
выделяемого подтерма внутри вы\-ра\-же\-ния "вариант($U$
$\ldots$)", где условие $U$ проверяет наличие по вхождению $v$
задан\-но\-го символа. Тогда ввод вспомогательного обозначения
блокируется, так как может вывести х12 из того контекста, где
имелись гарантии корректного обращения. В благоприятном случае -
переход через "ветвь 1".

Если в х12 входит подвыражение "списокпосылок($\ldots$)", причем
некоторый пред\-шест\-ву\-ющий текущему оператор изменял список
посылок, то ввод обозначения бло\-ки\-ру\-ется. Иначе - переход
через "ветвь 1".

Особого контроля требует склейка повторяющихся выражений
"выч($\ldots$)". Их значениями служат представления чисел в
машинном формате, а для ускорения вычислений предусмотрена
возможность изменять значения чисел, сохраняя ссылку на них. Это
делается оператором "Выч(изменение $\ldots$)" \, причем оператор
"Выч(про\-грам\-ма $\ldots$)" \ тоже может вызвать аналогичные
изменения. Находится список х17 переменных - левых частей
присвоений, в правую часть которых входит х12, и вы\-пол\-ня\-ется
проверка наличия операторов, изменяющих хотя бы одну из
перемен\-ных данного списка. В подозрительных случаях склейка
блокируется, иначе - переход через "ветвь 1".

После контрольной точки "прием(14)" \ расположена последняя
проверка до\-пу\-сти\-мо\-сти ввода вспомогательного обозначения.
Устанавливается отсутствие выпол\-ня\-е\-мо\-го после $P$
оператора, либо изменяющего набор, пересекающийся по своим
параметрам с х12 (кроме переменных х1,х2,х3 для приемов
сканирования задачи), либо изменяющего значение входящей в х12
переменной (кроме х2, х3 для прие\-мов нормализаторов).

После контрольной точки "прием(15)" \ начинается изменение
программы. Пред\-при\-ни\-мается увеличение на единицу номеров
всех программных переменных, на\-чи\-ная с переменной х15, в
операторах, достижимых после оператора $P$. Таким обра\-зом,
переменная х15 высвобождается для использования ее как обозначения
выраже\-ния х12. При сдвиге номеров, выполняемом процедурой
"сдвигпеременных", особо учитывается случай оператора "замена",
первым операндом которого служит не переменная, а ее номер. После
контрольной точки "прием(16)" \ выполняется кор\-рек\-ция
операторов накопителя повторных вхождений х3, заключающаяся в
таком же сдвиге их переменных. После контрольной точки "прием(17)"
\ выполняется ана\-ло\-гич\-ный сдвиг в выражении х12 номеров
связанных переменных, которые (в отли\-чие от свободных) могут
быть не меньше х15.

Переменной х17 присваивается оператор "равно(х15 х12)", который
будет ис\-поль\-зо\-ван для нахождения значения х12. Затем
(контрольная точка "прием(18)") реализуется цикл просмотра всех
операторов, достижимых из $P$, и замены в них вхождений подтермов
х12 на переменную х15. Накопитель х18 заполняется трой\-ка\-ми
(вхождение фрагмента программы - вхождение оператора в фрагмент -
ста\-рая (до замены на х15) версия этого оператора). После
контрольной точки "прием(19)" \ выполняется аналогичное
преобразование достижимых из $P$ операторов в на\-ко\-пи\-те\-ле
х3.

После контрольной точки "прием(20)" \ анализируется оператор,
предшест\-ву\-ю\-щий $P$. Если он представлял собой точку выхода в
отладчик ЛОСа, то место встав\-ки оператора х17 выбирается перед
ним. Переменной х19 присваивается фраг\-мент программы, полученный
вставкой х17 в фрагмент оператора $P$; переменной х20 - вхождение
в х19 вставленного оператора. После контрольной точки "прием(21)"
\ выполняется коррекция ссылок из х3 на вхождения операторов в
изме\-нен\-ный фраг\-мент. Корректируются также значения х6, х7
для продолжения просмотра про\-грам\-мы после ее преобразования.
Наконец, после контрольной точки "прием(22)" \ ста\-рая версия
фрагмента оператора $P$ заменяется на х19. После этого накопитель
х3 пополняется вхождениями в правую часть оператора присвоения
х17, и откат к продолжению просмотра программы.

\subsubsection{Сдвиг операторов присвоения к концу программы}

Важной частью оптимизации программы по быстродействию является
пере\-ме\-ще\-ние операторов присвоения, не выполняющих какой-либо
работы по проверке условий на текущий контекст, ближе к концу
программы приема. Возможно, в этом случае данный оператор вообще
не нужно будет выполнять - если перед ним окажется отсекающий
текущую ситуацию проверочный оператор. В основном, операторы
"чис\-того" \ присвоения обеспечивают создание новых термов
(например, заменя\-ю\-ще\-го терма). Часто они содержат обращения
к нормализаторам и вспомогательным за\-да\-чам, вследствие чего
достаточно трудоемки.

Началом данного цикла обработки программы служит контрольная точка
"при\-ем(23)". Переменная х3 пробегает вхождения фрагментов в их
список; х4 - текущий фрагмент; х5 - вхождение текущего оператора
х6 в х4. Для распознавания оператора "чистого" \ присвоения, т.е.
такого, который всегда истинен и лишь определяет зна\-че\-ния
своих выходных переменных, служит справочник "новаяпеременная".
Фак\-ти\-чес\-ки приемы его созданы пока лишь для символов
"равно", "альтернатива" \ и "операнд", но их хватает для обработки
сколь-нибудь трудоемких операторов при\-сво\-е\-ния, создаваемых
текущей версией компилятора. Справочник выдает набор х7
переменных, значения которых определяются оператором.

Если прием имеет заголовок "знач" \ (т.е. относится к техническому
анализа\-то\-ру), то проверяется, не расположен ли оператор х6
раньше дизъюнкции, перечис\-ляю\-щей уровни сканирования. В этом
случае - переход к следующему оператору. Иначе - переход через
"ветвь 3".

Проверяется отсутствие в х6 подоператора "титрбуф($\ldots$)" \ -
если он есть, то сво\-бо\-да перемещений оператора ограничена
необходимостью перемещать в связке с ним сопровождающие обращения
к "титрбуф". После контрольной точки "прием(25)" \ создается пара
х8 индикаторов, которые будут корректироваться при анализе
опе\-ра\-то\-ров, следующих после х6. Единичное значение первого
из них указывает, что был пройден оператор, не являющийся
оператором "чистого" \ присвоения. Перене\-се\-ние имеет смысл
лишь в случае, если был пройден хотя бы один такой опера\-тор.
Единичное значение второго означает, что уже был предпринят анализ
возможности перенесения х6 через перечисляющий оператор.

Инициализируются переменные х9 и х10, которые будут указывать
текущий опе\-ра\-тор при поиске новой позиции оператора х6. х9 -
вхождение текущего фраг\-мен\-та просмотра; х10 - вхождение
текущего оператора. Находится первая не определен\-ная перед
выполнением оператора х10 программная переменная х11. Откат к
оператору "ветвь 1", расположенному после контрольной точки
"прием(26)", означает ко\-нец цикла продвижения точки (х9,х10)
вдоль программы. Для текущего оператора х12 по вхождению х10
выполняются последовательно следующие действия:

\begin{enumerate}

\item Если х12 имеет заголовок, принадлежащий списку
"трассировка", "ина\-че", "Обрыв", "уровеньобращения",
заменавхождения", "ответ", "повторение", "по\-пытказамены",
"рас\-ширениепосылок", "заменавхожений", "лимит", то об\-рыв
просмотра;

\item Если после х12 расположен оператор "иначе", то также обрыв
просмотра;

\item Если х6 имеет вид "равно($x$ $t$)", а х12 - вид
"обл($\ldots$)", т.е. перечисляет ут\-вер\-жде\-ния $U$ некоторого
контекста, причем после этого перечисления встре\-ча\-ет\-ся
проверочный оператор "равныетермы($x$ $\ldots$)", то при
перенесении х6 за х12 нужно будет многократ\-но повторно вычислять
$t$ для каждого $U$, чтобы выполнить проверку условия
"равныетермы($\ldots$)". Поэтому лучше оставить х6 "за скобками" \
и оборвать просмотр;

\item Если х12 имеет вид "ветвь $N$", а после него идет оператор
"продолже\-ние", то для продолжения просмотра линейной цепочки
операторов выпол\-ня\-ет\-ся переход к фрагменту $N$ (контрольная
точка "прием(27)");

\item Если х12 содержит переменные списка х7, определенные
оператором х6, то обрыв просмотра;

\item Если х12 содержит символ "изменение", либо подтерм
"Выч(запись $\ldots$)", либо подоператор "замена($\ldots$)",
изменяющий значение переменной терма х6, то об\-рыв просмотра.

\item Если оператор х12 определяет значение какой-то новой
переменной х13, которое впоследствии может быть изменено
оператором х16, причем оператор х6 - пе\-ре\-числяющий, и между
операторами х12, х16 используются определяемые им переменные, то
обрыв просмотра (контрольная точка "прием(38)").

\item Если оператор х12 - перечисляющий и второй индикатор пары х8
еще не ра\-вен 1, то проверяется, что далее нет операторов,
изменяющих переменные из х6 либо встречающиеся в х6 наборы, после
чего данный индикатор ус\-та\-нав\-ли\-ва\-ет\-ся на 1. При
неудаче - обрыв просмотра.

\item Выполняется сдвиг текущей позиции на единицу вправо.
Корректируется пер\-вая не определенная программная переменная
х11. Если усматривается, что оператор х12 был не "чисто" \
присваивающим, то первый индикатор пары х8 устанавливается на 1.
Затем - откат к продолжению просмотра (оператор "по\-вторение" \
после контрольной точки "прием(26)").

\end{enumerate}

По завершении просмотра - переход через оператор "ветвь 1" \ после
точки "при\-ем(26)". Проверяется, что вхождение х10, перед которым
предполагается раз\-мес\-тить оператор х6, не расположено сразу за
вхождением х5 этого оператора. Проверя\-ет\-ся, что первый
индикатор пары х8 равен 1. Проверяется, что если сразу после х6
фрагмент обрывается и продолжается через "ветвь" \ фрагментом х9,
то х10 не является вхождением первого оператора фрагмента х9.
После этого оконча\-тель\-но принимается решение о перенесении х6
на новое место (контрольная точка "при\-ем(29)"). Находятся первая
и последняя (по номерам) переменные х12, х13 списка х7 выходных
переменных оператора х6. Переменной х14 присваивается длина списка
х7 (номера переменных в нем идут подряд). Во всех операторах,
достижимых из х10, номера их переменных, начиная с переменной х11
(первой не определенной пе\-ред выполнением оператора х10),
увеличиваются на х14 - чтобы высвободить место для выходных
переменных оператора х6, которые после перенесения его должны
начинаться с х11. Затем предпринимается еще один цикл просмотра
этих же опе\-ра\-то\-ров (контрольная точка "прием(31)", и номера
всех переменных списка х7 выход\-ных переменных оператора х6
увеличиваются на разность х11 и х12. В резуль\-та\-те диапазон
переменных х7 сдвигается так, что начинается с переменной х11.
После перехода через "иначе 1" \ - находится результат х17
аналогичной пере\-нуме\-ра\-ции выходных переменных самого
оператора х6. Теперь можно во всех опера\-то\-рах, достижимых из
оператора х6 (пока находящегося на старой позиции) умень\-шить на
х14 номера переменных, идущих строго после переменной х13, и таким
обра\-зом устранить пробел, возникающий при перенесении.

Наконец, происходит вставка оператора х17 на позицию перед х10 и
ис\-клю\-че\-ние позиции х5 текущего фрагмента х4. Затем
корректируются значения х3, х4 и х5 (последнее устанавливается
перед позицией, с которой был перенесен оператор), и откат к
продолжению просмотра программы (см. оператор "повторение" \ в
фраг\-мен\-те с контрольной точкой "прием(23)".

\subsubsection{Цикл исключения избыточных присвоений одной
переменной зна\-че\-ния другой переменной}

После контрольной точки "прием(33)" \ выполняется просмотр
программы и по\-иск операторов вида "равно($x$ $y$)", где $x$ -
еще не определенная программная переменная; $y$ - уже определенная
переменная. Если такой оператор х6 найден, то
просматри\-ва\-ют\-ся все достижимые из него операторы $P$, в
которых переменная $x$ либо используется, либо изменяется. Если
между х6 и $P$ не могло произойти изменение значений $x,y$, то в
операторе $P$ вхождения переменной $x$ заменяются на $y$. Если не
было найдено ни одного оператора $P$, не удовлетворяющего
указанному условию, то оператор х6 исключается. Затем выполняется
уменьшение на единицу в операторах, достижи\-мых из точки
удаления, номеров всех переменных, начиная с переменной $x$.

\subsubsection{Повторный цикл обращений к справочнику
"редакцияпрограммы" \ }

После контрольной точки "прием(34)" \ реализуется повторный цикл
обращений к справочнику "редакцияпрограммы", такой же, как и
первый цикл.

\subsubsection{Повторный цикл смещения операторов "чистого" \
присвоения}

После контрольной точки "прием(36)" \ реализуеся повторный цикл
смещения к концу программы операторов "чистого" \ присвоения,
такой же, как и первый цикл.

\subsubsection{Цикл исключения повторяющихся операторов}

После контрольной точки "прием(37)" \ располагается цикл
исключения избыточ\-ных повторных операторов. В отличие от
приведенного выше цикла исключения повторяющихся операторов, здесь
не обязательно операторы должны идти непо\-сред\-ст\-вен\-но друг
после друга. Для проверки того, что между двумя
последователь\-ны\-ми вхождениями одного и того же оператора
значения переменных оператора не изменялись, используется
процедура "сохрзначений".

\subsubsection{Цикл обращений к справочнику "перестановка" \ для
перемещения опе\-ра\-то\-ров программы}

После контрольной точки "прием(35)" \ выполняется цикл просмотра
программы с обращениями для каждого оператора к справочнику
"перестановка". Этот спра\-воч\-ник служит, чтобы в некоторых
(достаточно редких) случаях переместить опера\-тор или группу
операторов на другое место, не изменяя резуль\-та\-та действий
програм\-мы.

\par\medskip

По завершении перечисленных преобразований выдается результат
редак\-ти\-ро\-ва\-ния программы.

\section{Запись программы приема в блок про\-грамм}

Для записи программы приема в блок программ используется процедура
"запись\-при\-ема(х1 х2 х3 х4)". Здесь х1 - логический символ, в
программу которого встав\-ля\-ет\-ся программа приема; х2 - тройка
($f$, $n$, $c$), где $f$ - логический символ, за кото\-рым
закреплен прием; $n$ - номер узла теоремы приема; $c$ -
программное выра\-же\-ние, значением которого является заголовок
приема. х3 - набор фрагментов про\-грам\-мы откомпилированного
приема; х4 - ссылка на узел приема. Кроме вклю\-че\-ния фрагментов
х3 в программу символа х1, процедура создает ссылку на
про\-грам\-му приема из его узла х4. Выйти на начало программы
"записьприема" \ можно че\-рез пункт "Процедура регистрации
программы приема в блоке программ" \ оглавле\-ния программ.

\subsection{Ввод ограничителя склейки программ}

При вставке программы приема в программу символа х1 будет
происходить срав\-не\-ние некоторой "старой" \ ветви программы с
вставляемой ветвью, для выделения возможно более длинного общего
линейного начала обеих ветвей. Как правило, в это начало не должны
попадать операторы, содержащие изменяемые при откатах
пе\-ре\-менные. Поэтому предпринимается просмотр фрагментов х3 для
составле\-ния списка х6 всех переменных, значения которых могут
изменяться при откатах. Из данного списка исключается часть
заведомо изменяемых переменных, которые могут выноситься в общую
часть. Например, в программе нормализатора таковыми яв\-ля\-ют\-ся
переменные х1, х2. Значениями их служат преобразуемый терм и
список посылок. После срабатывания приема данные переменные могут
измениться, однако это не накладывает никаких ограничений на
склейку начальных отрезков про\-грамм различных приемов.

После составления списка х6 - переход через "ветвь 3". Здесь
выполняется про\-смотр программы вплоть до первого оператора,
содержащего переменную списка х6. Перед ним вставляется фиктивный
оператор "фикс". Он отсутствует в "ста\-рых" \ фрагментах
программы, так что вынесение его в общую часть программ
невоз\-мож\-но - этот оператор становится ограничителем допустимой
области склейки. В дальнейшем, уже при непосредственной записи
фрагмента в блок программ про\-це\-ду\-рой "записьпрограммы",
ограничители "фикс" \ отбрасываются.

После вставки ограничителя "фикс" \ - откат к переходу через
"ветвь 2".

\subsection{Разрезание больших фрагментов}

Если фрагмент программы очень большой, то он разрезается на части
- хотя бы для того, чтобы фрагменты программ целиком отображались
на экране. Анализ разме\-ров фрагментов осуществляется после
контрольной точки "прием(2)". Предвари\-тель\-но переменной х7
присваивается число фрагментов программы приема. Для теку\-ще\-го
фрагмента х9 находится сумма х10 длин всех его операторов. Если
она больше 280, то фрагмент считается подлежащим разрезанию на
части. Находится список х11 длин операторов фрагмента х9. Он
просматривается синхронно со списком х9 опера\-то\-ров фрагмента,
и на каждом шаге определяется сумма х12 длин всех операторов,
предшествующих текущему. Если она больше 260, а текущий оператор
не явля\-ет\-ся оператором перехода "иначе", то все операторы,
расположенные до текущего (не включая его) выносятся в фрагмент
х16; операторы начиная с текущего - в фраг\-мент х15. К концу
фрагмента х16 добавляются операторы "ветвь х7", "продолже\-ние";
фрагмент х9 заменяется на х16, а фрагмент х15 добавляется к концу
спи\-ска фрагментов. Значение х7 увеличивается на единицу, и откат
к повторному про\-смот\-ру списка фрагментов.

\par\medskip

По завершении цикла разрезаний фрагментов инициализируется нулем
на\-ко\-пи\-тель х6, в который будут заноситься несколько первых
операторов программы при\-ема, используемые в терминале "прием" \
узла приема для ускорения поиска вет\-ви программы приема.

\subsection{Инициализация программы логического символа}

Если логический символ х1 вообще не использовался в блоке программ
либо имел вырожденную программу, состоящую из единственного
оператора "продолже\-ние", то переход через "иначе 2" \ к
контрольной точке "прием(3)". В этом случае вся программа символа
х1 будет переопределена по списку х3 фрагментов
от\-ком\-пи\-ли\-ро\-ван\-ного приема. Предварительно в первый
фрагмент данного списка вклю\-ча\-ет\-ся ссылка на прием -
фиктивный оператор "контрольприема($f$ $n$ $c$)". Значе\-ни\-я\-ми
операндов служат, соответственно, логический символ, за которым
закреплен прием, номер узла приема, и заголовок приема. Данный
оператор обычно игнори\-ру\-ет\-ся интерпретатором ЛОСа, хотя в
специальном режиме его программа мо\-жет выполняться как обычная
программа. Такой режим позволяет, например, ана\-ли\-зи\-ро\-вать
частоту попаданий на начальные отрезки программы заданного приема
и суммарной трудоемкости, приходящейся на эту программу. В случае
приема ска\-ни\-ро\-вания задачи, распознаваемого по первому
оператору "ре\-шить", вставка в про\-грам\-му оператора
"контрольприема" \ предпринимается после оператора
"уро\-вень($\ldots$)". Иначе - он вставляется перед вторым
оператором программы. В первом случае на\-ко\-пи\-тель х6
заполняется цепочкой операторов, обрывающейся на операторе
"уро\-вень" \ (включая его); во втором - полагается состоящим из
единственного первого опе\-ра\-то\-ра первого фрагмента.
Собственно запись программы х3 в блок программ вместо ста\-рой
версии программы символа х1 осуществляется процедурой
"записьпрограммы(х1 0 х3 $\ldots$)". После записи - откат к
контрольной точке "прием(10)", где создается логический терминал
"прием" \ узла приема (см. ниже).

\subsection{Случай приема сканирования задачи}

После контрольной точки "прием(4)" \ в данном и всех оставшихся
случаях па\-ра (х7,х8) оказывается ссылкой на корень программы
символа х1; х9 - первым опе\-ра\-то\-ром первого фрагмента новой
программы.

\par\medskip

Начиная с контрольной точки "прием(5)" \ рассматривается случай
програм\-мы приема сканирования задачи. Она распознается по
заголов\-ку "решить" \ опера\-то\-ра х9. Находится корневой
фрагмент х10 программы символа х1.

Если первый оператор фрагмента х10 отличен от "решить" \ (см.
контроль\-ную точку "прием(11)"), то ветвь программы символа х1,
используемая при скани\-ро\-ва\-нии задачи, еще не создана. В этом
случае после оператора "решить" \ в первый фрагмент $F$ новой
программы х3 вставляется оператор "иначе(х7 х8)", ссылаю\-щий\-ся
на корневой фрагмент х10 старой программы символа х1. После
опера\-то\-ра "уровень($\ldots$)" \ в тот же фрагмент $F$
вставляется фиктивный оператор "кон\-т\-роль\-при\-ема($\ldots$)".
Старая программа символа х1 отключается от каталога программ, но
сохраняется в блоке программ. После этого выполняется обращение к
процеду\-ре "записьпрограммы" \ для регистрации набора фрагментов
х3 в качестве новой программы символа х1. Наличие ссылки "иначе(х7
х8)" \ из х3 на старую ветвь при\-водит к тому, что эта ветвь
снова становится подключенной к программе сим\-вола х1. Далее -
откат к созданию логического терминала "прием".

Если же первый оператор фрагмента х10 есть оператор "решить", то
пе\-ре\-ход через "иначе 4". Здесь переменной х11 присваивается
первый фрагмент новой про\-грам\-мы х3. Проверяется, что фрагменты
х10 и х11 одновременно имеют либо не имеют оператора
"стандарт(х2)". Это означает, что в задачах один и тот же
ло\-ги\-чес\-кий символ не следует использовать как в виде символа
операции или отношения, так и в виде константы. В противном случае
приемы, точкой привязки которых бу\-дет служить данный символ,
должны относиться к какому-либо одному из ука\-зан\-ных вариантов.
Определяется оператор х12 фрагмента х11, идущий сразу же пос\-ле
первых одного либо двух операторов "решить", "стандарт(х2)",
"равно(х2 х3)" \ (такой оператор используется, если х1 - тип
задачи) и проверяется, что он имеет вид "уровень($a_1 \ldots
a_n$)". Переменной х13 присваи\-ва\-ет\-ся набор термов $a_1,
\ldots, a_n$ - уров\-ней срабатывания приема.

\subsubsection{Выбор точки присоединения новой программы}

Чтобы определить точку присоединения новой программы к уже
имеющейся вет\-ви программ приемов сканирования задачи,
выполняется просмотр "главного ствола" \ последней. Он начинается
с контрольной точки "прием(14)". Предварительно соз\-да\-ет\-ся
буфер просмотра х14, куда будут заноситься ссылки ($B_1$ $B_2$
$B_3$ $B_4$ $B_5$) на подлежащие рассмотрению фрагменты программы
 символа х1. Здесь $B_1$ - набор номеров переходов в пути,
ведущем от корня программы символа х1 к фрагменту; $B_2$ - ссылка
на фрагмент; $B_3$ - ссылка на его надфрагмент (в корневом случае
- 0); $B_4$ - такая позиция в корне\-вом фрагменте новой
про\-грам\-мы, что все предшест\-ву\-ю\-щие ей операторы уже
отож\-дест\-вле\-ны с операторами старой программы, вдоль
кото\-рых имело место перемещение к фрагменту $B_2$; $B_5$ -
ин\-ди\-ка\-тор оператора "уровень($\ldots$)", пройденного при
пере\-ме\-ще\-нии от корня про\-грам\-мы символа х1 к $B_2$.
Данный ин\-ди\-ка\-тор равен 0, если оператор "уровень" \ еще не
встречался; равен 1, если его на\-бор уровней строго ши\-ре, чем
$a_1, \ldots, a_n$, и равен 2, если эти наборы совпадают.
Сна\-ча\-ла в х14 нахо\-дит\-ся ссылка на корневой фрагмент
программы. Кроме накопителя х14, инициали\-зи\-ру\-ет\-ся нулем
также накопитель х15 ссылки на фрагмент, отобранный в качестве
точки присоединения. Ему будет присвоен набор ($C_1 \ldots C_7$),
где $C_1,C_2,C_3$ такие же, как $B_1,B_2,B_3$ у набора из х14;
$C_4$ - сам отобранный фрагмент; $C_5$ - теку\-щая позиция в нем,
$C_6$ - текущая позиция в корневом фрагменте новой программы;
$C_7$ - такое же, как $B_5$. Операторы до $C_5,C_6$ в "старой" \ и
"новой" \ программах пред\-став\-ля\-ют собой их общую начальную
часть.

После контрольной точки "прием(17)" \ вводится накопитель х16
наборов ($D_1$ $D_2$ $D_3$ $D_4$) ссылок на первые вхождения
операторов "уровень($u_1 \ldots u_m$)" \ в про\-смот\-рен\-ные
фрагменты программы символа х1. $D_1$ - путь к фрагменту от корня
про\-грам\-мы; $D_2$ - ссылка на фрагмент; $D_3$ - ссылка на
внешний фрагмент либо 0; $D_4$ - набор ($a$ $u_1 \ldots u_m$).
Здесь $a$ равно 0 тогда и только тогда, когда после оператора
"уровень" \ не идет оператор "иначе", а до него в данном фрагменте
не было операторов пере\-хо\-да. При занесении очередного набора в
накопитель х16 его последний разряд $D_4$ сначала равен символу
"пустоеслово", и лишь в процессе просмотра фрагмента заменяется на
указанное выше значение.

Переменной х10, которой до этого был присвоен корневой фрагмент
про\-грам\-мы символа х1, переприсваивается 0. В цикле просмотра
ее значением будет текущая позиция корневого фрагмента новой
программы, сравниваемая с очередной пози\-ци\-ей "старой" \
программы. Далее расположен оператор "повторение". При откате к
нему находится первый элемент х17 буфера х14, здесь же исключаемый
из бу\-фе\-ра. Переменной х18 присваивается фрагмент, на который
ссылается набор х17; х10 - исходная позиция в корневом фрагменте
новой программы для дальней\-ше\-го сравнения старой и новой
программ; х12 - сначала переприсваивается 0, а затем эта
переменная будет хранить индикатор внешнего оператора
"уровень($\ldots$)" \ (см. вы\-ше $B_5$); х9 переприсваивается 0,
который после перехода через оператор "контроль\-при\-ема" \
заменяется на 1. Переменной х19 присваивается исходная позиция в
фраг\-мен\-те х18 для дальнейшего сравнения старой и новой
программ. Находится число х20 операторов перехода, предшествующих
в фрагменте х18 позиции х19. Оно будет корректироваться по мере
перемещения х19 вглубь фрагмента, причем х21 со\-хра\-нит исходное
значение.

Далее размещается оператор "повторение", откаты к которому будут
проис\-хо\-дить после каждого сдвига позиций х19, х10 в "старом" \
и "новом" \ сравнива\-е\-мых фрагментах программы. На очередном
шаге сравнения операторов рассматри\-ва\-ют\-ся следующие
подслучаи:

\begin{enumerate}

\item На позиции х19 расположен оператор перехода "ветвь($m$)" \
(контрольная точ\-ка "прием(15)").

Если еще не был пройден оператор "контрольприема", то счетчик х20
числа операторов перехода увеличивается на 1; в накопитель х14
заносится ссылка на тот фрагмент $F$, к которому ведет данная
"ветвь". Если фрагмент х18 упомянут в последнем наборе накопителя
х16, пройденная "ветвь" \ - первая в нем с начала просмотра, а
индикатор х12 внешнего оператора "уровень" \ равен 0, то ссылка на
$F$ регистрируется также в х16. После этого позиция х19 сдвигается
на еди\-ни\-цу вправо (х10 сохраняется), и откат к повторному
сравнению позиций.

Если оператор "контрольприема" \ уже был пройден, то после
контрольной точ\-ки "прием(41)" \ анализируется частный случай -
на позициях х19 и х10 на\-хо\-дят\-ся операторы "ветвь", а после
них - завершающие фрагменты опе\-ра\-то\-ры "продолжение". Тогда
организуется переход к просмотру фрагментов $F_1$, $F_2$,
продолжающих "старый" \ и "новый" \ фрагменты. Из "старого" \ в
начало $F_1$ переносится оператор "контрольприема". Накопитель х14
сбрасывается; пе\-ре\-мен\-ной х17 переприсваивается набор
аналогичного формата, ссылающийся на $F_1$; позиции х19 и х10
переустанавливаются на левые края фрагментов $F_1$ и $F_2$, причем
отбрасывается первый фрагмент списка х3, так что $F_2$
стано\-вит\-ся его началом. Номера ссылок в х3 уменьшаются на
единицу; в накопитель х15 заносится ссылка на левый край набора
$F_1$, и откат к повторному сравне\-нию позиций.

Если указанный частный случай не имел места, то после контрольной
точ\-ки "прием(18)" \ проверяется, что оператор "уровень" \ уже
был пройден. Если это так, причем накопитель х15 либо не
инициализирован, либо текущая пози\-ция х10 расположена правее
укаазанной в х15, то в качестве новой версии точ\-ки присоединения
программы берется текущая версия. Здесь происходит откат к точке
извлечения из х14 очередного элемента.

\item На позиции х19 расположен оператор "уровень($u_1 \ldots
u_m$)" \ (контрольная точ\-ка "прием(19)"). Переменной х22
присваивается набор $(u_1 \ldots u_m)$. Если теку\-щий фрагмент
представлен в накопителе х16 набором х23, причем послед\-ний
разряд этого набора еще не изменялся (т.е. равен символу
"пустоеслово"), то он заменяется на ($a$ $u_1 \ldots u_m$). Если
до х19 встреча\-лись операторы перехода, ли\-бо непосредственно
после х19 расположен оператор "иначе", то $a$ равно 1, иначе - 0.

Если список х13 уровней срабатывания нового приема включается в
х22, то при строгом включении индикатору х12 присваивается 1, а
при совпадении - 2. Позиция х19 сдвигается на единицу вправо; если
на позиции х10 был разме\-щен оператор "уровень", то она тоже
сдвигается на единицу вправо. Затем - откат к повторному сравнению
позиций.

Если список х13 не включается в х22, причем первый элемент списка
х22 меньше первого элемента списка х13, а непосредственно за х19
идет опера\-тор "иначе $n$", то в накопитель х14 заносится ссылка
на фрагмент $n$. Если фраг\-мент х18 упомянут в последнем наборе
накопителя х16, левее х19 нет операторов перехода, а индикатор х12
внешнего оператора "уровень" \ равен 0, то ссылка на $n$
регистрируется также в х16.

Далее, если х13 не включалось в х22, проверяется отличие
индикатора х12 от 0. Если при этом накопитель выбранного фрагмента
х15 равен 0, либо х10 расположено правее указанной в нем позиции,
либо если эти позиции совпа\-да\-ют, но х12 равно 2, а
соответствующее значение из х15 равно 1, то происхо\-дит
переприсвоение накопителю х15 ссылки на текущий фрагмент х18.
Затем - откат к рассмотрению очередного фрагмента из накопителя
х14.

\item На позиции х19 расположен оператор "метка($\ldots$)" \ либо
"контрольпри\-ема($\ldots$)". В последнем случае индикатор х9
прохождения оператора "контрольприема" \ заменяется на 1. В обоих
случаях х19 сдвигается на единицу вправо, и откат к повторному
сравнению позиций.

\item На позиции х19 расположен оператор "менее($u$ х5)", где $u$
меньше наимень\-ше\-го из уровней срабатывания нового приема.
Тогда х19 сдвигается на едини\-цу вправо, и откат к повторному
сравнению позиций.

\item На позиции х19 расположен оператор "иначе $n$". Если
оператор "контроль\-при\-ема" \ еще не пройден, причем на позиции
х10 нет оператора "иначе", то позиция х19 сдвигается на единицу
вправо, и откат к повторному сравнению позиций. В прочих случаях -
переход через "иначе 2". Если индикатор х12 пройденного оператора
"уровень" \ отличен от 0, то предпринимается сравне\-ние точки для
вставки новой программы, отобранной в накопителе х15, с текущей
точкой - так же, как и выше. Предварительно оператор, находящийся
слева от позиции х10, сравнивается с оператором, находящимся слева
от "иначе". Если они совпадают, то х10 сдвигается на единицу влево
- так как при подклю\-че\-нии программы данный оператор "иначе" \
пройден не будет. Далее - откат к рассмотрению очередного элемента
накопителя х14.

\item На позициях х19 и х10 расположены одинаковые операторы,
заголовки кото\-рых отличны от символов "лимит",
"заменавхождения", и которые не содержат переменных, изменяемых
последующими операторами новой программы. Если позиции х10, х19 -
не концевые в своих фрагментах, то обе они сдвигаются на единицу
вправо, и откат к повторному их сравнению. Иначе - при
прой\-ден\-ном операторе "уровень" \ накопитель х15
переустанавливается на текущий вари\-ант точки подключения
программы; в обоих случаях далее выполняется откат к рассмотрению
очередного элемента накопителя х14.

\item Оператор "контрольприема" \ еще не пройден, но оператор
"уровень" \ уже прой\-ден. На позициях х19 и х10 расположены
операторы х22 и х23 с одина\-ко\-вы\-ми заголовками, причем
непосредственно усматривается, что оба оператора - чисто
проверочные и одновременно истинны быть не могут (контрольная
точ\-ка "прием(31)"). Если после х19 идет оператор перехода "иначе
$n$", то в х14 заносится набор, соответствующий фрагменту $n$, и
откат к рассмотрению х14. Иначе - проверяется, пройден ли оператор
"уровень", и если пройден, то х15 переустанавливается на текущую
точку.

\item Остаточный случай - проверяется, пройден ли оператор
"уровень". Если прой\-ден, то выполняется выбор между старой
версией точки присоединения х15 и новой, определяемой текущими
значениями х19, х10. В любом случае далее - откат к выбору
очередного элемента списка х14.

\end{enumerate}

\subsubsection{Вставка новой программы начиная с выбранной точки}

После того, как список х14 исчерпан, происходит переход через
оператор "иначе 1" \ перед контрольной точкой "прием(13)". Если
накопитель точки вставки х15 от\-ли\-чен от 0, то реализуется
вставка новой программы, иначе - переход к описы\-ва\-е\-мо\-му
ниже циклу повторного выбора точки вставки. Заметим, что после
выбора точки вставки могут быть отброшены несколько первых
фрагментов новой программы х3 - если они полностью совпали с
пройденной частью старой программы.

После контрольной точки "прием(40)" \ анализируется оператор
старой про\-грам\-мы, предшествующий точке вставки. Если он имеет
вид "ветвь $n$", т.е. в этой точ\-ке уже была вставлена какая-то
ветвь, то выполняется продвижение вглубь програм\-мы: находится
первый оператор фрагмента $n$; если он имеет вид "ветвь $m$", то
осуществляется переход к $m$, и т.д. При каждом переходе набор х15
корректи\-ру\-ет\-ся согласно данному продвижению. По окончании
продвижения - откат к пе\-ре\-хо\-ду через "ветвь 2".

После контрольной точки "прием(34)" \ переменной х17 присваивается
отобран\-ный для вставки фрагмент; переменной х18 - та его
позиция, перед которой нуж\-но выполнить вставку. Переменной х19
присваивается заголовок оператора пере\-хо\-да, через который
будет подключаться ветвь новой программы. Сначала он
полага\-ет\-ся равным символу "ветвь".

После контрольной точки "прием(35)" \ происходит сравнение
оператора х20, рас\-положенного на позиции х18, с тем оператором
х21 новой программы, который бу\-дет начинать вставляемую ветвь.
Если усматривается, что оба оператора - чисто проверочные и
одновременно истинными быть не могут, то заголовок х19
опера\-то\-ра перехода изменяется на "иначе", а позиция х18
сдвигается на единицу вправо. Да\-лее - откат к переходу через
"ветвь 2".

Если обнаруживается, что оператор "контрольприема" \ в фрагменте
х17 рас\-по\-лагается до точки вставки, то он переносится на
позицию, непосредственно пред\-шест\-ву\-ющую позиции х18, и
выбирается в качестве новой точки вставки. Затем - откат к
переходу через "ветвь 1".

После контрольной точки "прием(37)" \ находится набор х20
операторов пер\-во\-го фрагмента новой программы, начинающихся с
указанной в х15 текущей пози\-ции (предшествующие операторы были
идентифицированы с операторами старой программы). В начале набора
х20 вводится оператор "контрольприема($\ldots$)", ссы\-ла\-ющийся
на новый прием. Если указанный в наборе х15 индикатор
прохожде\-ния оператора "уровень" \ отличен от 2, то
предшествующие операторы "уровень" \ имели более широкий список
допустимых уровней, чем нужно новому приему. В этом случае к
началу набора х20 добавляется также "собственный" \ оператор
"уровень($\ldots$)" \ но\-во\-го приема. Далее начало списка х3
вставляемых фрагментов заменяется на х20. Номера переходов в
фрагментах списка х3 увеличиваются на 1, а к началу списка
присоединяется фрагмент х17, в котором перед позицией х18 вставлен
опера\-тор перехода к фрагменту х20. Для замены старой ветви
фрагмента х17 на новую, оп\-ре\-де\-ля\-емую списком х3,
применяется процедура "записьпрограммы". Создается спи\-сок х6
нескольких первых операторов программы (начиная с корня программы
сим\-во\-ла х1), который будет далее использован в логическом
терминале "прием" \ узла при\-ема. Наконец, \ с помощью процедуры
"коррекцияссылок" \ предпринимается изменение пред\-шествующих
точке вставки пар операторов "уровень($u_1 \ldots u_n$)", "иначе
$m$", если их список уровней пересекается со списком х13 уровней
нового приема. Каждая та\-кая пара заменяется на "ветвь $m$",
"уровень($u_1 \ldots u_n$)". Затем - откат к контрольной точке
"прием(10)" \ для создания терминала "прием".

\subsubsection{Повторный цикл выбора точки присоединения}

В описанном выше цикле просмотра фрагментов программы символа х1
точка при\-со\-еди\-нения создавалась лишь после прохождения через
оператор "уровень". Если такой ситуации не возникло, то
реализуется еще один цикл просмотра фрагмен\-тов (контрольная
точка "прием(38)"). Так как уровни срабатывания нового при\-ема
существенно отличны от уровней срабатывания приемов, ранее
зарегистриро\-ван\-ных в программе символа х1, то здесь уже не
будет предприниматься попытка выделения общей начальной части
программ. Анализироваться будут только имеющиеся в ста\-рой
программе операторы "уровень", так как вставку новой ветви
придется делать около одного из них - либо через оператор "ветвь",
идущий перед оператором "уро\-вень", либо через оператор "иначе",
идущей непосредственно после "уровня".

Выполняется просмотр наборов х18 накопителя х16, в которых
представ\-ле\-ны первые вхождения операторов "уровень($u_1 \ldots
u_m$)" \ в фрагменты программы символа х1, достижимые без
прохождения через прочие операторы "уровень".

Такие фрагменты относятся к части программы, которую будем
называть ее "главным стволом". Фактически в х16 представлена лишь
часть главного ствола - переходы через "иначе" \ после операторов
"уровень", наименьшее значение кото\-рых оказывалось больше
наименьшего уровня нового приема, блокировались. Некото\-рые
фрагменты "главного ствола" \ могут начинаться с оператора
"менее($U$ х5)", отсекающего случаи, в которых текущий уровень не
превосходит значения $U$. За исключением этих ускорителей
(вставляемых, как указано ниже), в начале фраг\-мента глав\-но\-го
ствола расположен либо оператор "ветвь", после которого идет
опе\-ратор "уровень", либо оператор "уровень", после которого
может идти "ина\-че". Списки уровней при прохождении главного
ствола упорядочены по их первым эле\-ментам.

Просмотр списка х16 ведется в направлении от конца к началу.
Находится тот набор, у кото\-ро\-го $u_1$ не больше наименьшего
уровня срабатывания нового при\-ема. Переменной х19 присваивается
фрагмент, содержащий данный оператор "уровень". Далее
рас\-смат\-ри\-ваются два случая:

\begin{enumerate}

\item х18 является концевым оператором на главном стволе - перед
ним не идет "ветвь", и после него не идет "иначе" \ (контрольная
точка "прием(49)"). Если наборы уров\-ней оператора х18 и нового
приема не пересекаются, причем до х18 не было оператора "менее($u$
х5)", у которого $u$ не меньше наименьшего уровня
сра\-ба\-ты\-ва\-ния нового приема, то после х18 размещается
оператор "иначе(2)", в противном случае - перед х18 вставляется
оператор "ветвь(2)". После такой коррекции фрагмента х19 - откат к
переходу через "ветвь 3".

Здесь в первый фрагмент новой программы сразу после его оператора
"уро\-вень" \ вставляется оператор "контрольприема". Номера ссылок
внутри списка фрагментов х3 увеличиваются на 1; к началу списка
добавляется фраг\-мент х19, и процедура "записьпрограммы" \
заменяет старую ветвь фрагмента х19 на ветвь, определенную списком
х3. Как и выше, доопределяется х6, применя\-ет\-ся процедура
"коррекцияссылок", и откат к контрольной точке "прием(10)".

\item Оператор х18 не является концевым на главном стволе - либо
перед ним идет оператор "ветвь($n$)", либо после него - оператор
"иначе($n$)". Находится вхож\-де\-ние х20 данного оператора
перехода х21. Вводится накопитель х22 типа того оператора
перехода, который будет использован для продолжения глав\-но\-го
ствола после первого фрагмента вставляемой программы. Изначально
он ус\-та\-нав\-ли\-вается на символ "ветвь". Для уточнения
значения х22 начинает\-ся просмотр главного ствола, идущего от
фрагмента $n$; переменная х23 использу\-ет\-ся как текущий список
операторов перехода к подлежащим рассмотре\-нию фрагментам. Если
при просмотре встречается оператор "уровень($\ldots$)", значе\-ния
которого пересекаются с уровнями нового приема, то просмотр
обрывается и значение х22 сохраняется. При этом, если оператор
"уровень($U_1 \ldots U_m$)" \ фраг\-мента $n$ имел значение $U_1$
большим, чем в списке х13, то в начале данного фрагмента
вставляется ускоряющий фильтр "менее($U_1 - 1$ \ х5)". Если же
цикл просмотра завершился и пересечений с х13 не обнаружилось, то
х22 заменя\-ет\-ся на "иначе". Далее - откат к переходу через
"ветвь 1".

Если после оператора х18 идет "иначе $n$", причем его уровни
пересекаются с х13, то оператор "иначе $n$" \ переносится влево от
х18 и заменяется на "ветвь 2". После оператора $Q$ вида "уровень"
\ первого фрагмента программы х3 вставля\-ет\-ся оператор
"контрольприема". Если х22 - "ветвь", то перед $Q$ помеща\-ет\-ся
оператор "ветвь $n$", в противном случае после него - "иначе $n$".
Если связанный с х18 оператор перехода еще не был заменен в
фрагменте х19 на "ветвь 2", то он заменяется на "иначе 2" \ либо
"ветвь 2", с сохранением своего заголовка. Измененный указанным
образом фрагмент х19 присоединяется к началу спи\-ска х3. Номера
всех переходов в х3 до этого были увеличены на 1.
Преобразо\-ва\-ния завершаются стандартным образом - применяется
процедура "записьпро\-грам\-мы", переопределяется х6, и
применяется процедура "коррекцияссылок".

\end{enumerate}

\subsubsection{Переопределение корневого фрагмента программы символа х1}

Если уровни срабатывания нового приема меньше уровней срабатывания
ранее за\-ре\-гис\-три\-рованных приемов, то даже на повторном
цикле точка вставки выбрана не будет. Этот случай рассматривается
после контрольной точки "прием(50)". Нахо\-дит\-ся корневой
фрагмент х17 программы символа х1. В качестве нового корне\-во\-го
фрагмента будет выбран первый фрагмент $F$ списка х3.

Берется отрезок х19 фрагмента х17, полученный отбрасыванием
нескольких пер\-вых операторов, образующих стандартное начало
ветви приемов сканирования за\-да\-чи. Чтобы определить тип
оператора перехода от $F$ к х19, вводится накопи\-тель х22.
Сначала ему присваивается символ "ветвь"; затем предпринимается
про\-смотр главного ствола ветви фрагмента х17. Если хотя бы один
из операторов "уро\-вень" \ этого главного ствола пересекается по
своим значениям с набором х13, то сим\-вол "ветвь" \ сохраняется;
в противном случае переменной х22 переприсваивается сим\-вол
"иначе". Если в отброшенном начале фрагмента х17 имелся оператор
пере\-хо\-да "иначе", то он переносится в фрагмент $F$.
Предполагается, что это "иначе" \ идет после оператора "решить". В
зависимости от типа х22, в фрагмент $F$ перед или пос\-ле
оператора "уровень" \ вставляется оператор перехода к последнему
фрагменту спи\-ска х3, которым становится фрагмент х19. В $F$
вставляется оператор "контрольпри\-ема", и реализуется обращение к
процедуре "записьпрограммы". Переопределяется х6, и откат к
контрольной точке "прием(10)".

\subsubsection{Создание логического терминала "прием" \ }

После контрольной точки "прием(10)" \ предпринимается регистрация
ссылки на про\-грамму из узла приема. Эта ссылка хранится в
логическом терминале "прием". Она состоит из названия символа х1,
за которым расположены несколько первых операторов программы -
хотя бы для того, чтобы сориентироваться вдоль главно\-го ствола
при поиске программы приема. Начальная точка программы
распознается по оператору "контрольприема($\ldots$)".

Старая версия терминала "прием" \ удаляется; формируется новая
версия х7. Из нее удаляются все операторы, идущие после оператора
"уровень". Если остает\-ся чрезмерно длинный список операторов, то
он укорачивается. Наконец, создается новый терминал "прием" \ с
содержимым х7. Затем реализуется оператор "прог\-файл(\\
компонента $\ldots$)". Он исключает все фрагменты только что
измененной програм\-мы символа х1 из зоны программ, ибо в ней
остались старые версии фрагмен\-тов. Это гарантирует немедленное
переключение интерпретатора ЛОСа на выполне\-ние измененной
программы.

Заметим, что откаты к описанной процедуре создания терминала
"прием" \ пред\-принимаются не только для приемов сканирования
задачи, но и для всех про\-чих типов приемов.

\subsection{Случай приема проверочного оператора, синтезато\-ра,
либо па\-кета продукций}

Если новая программа не начиналась с оператора "решить", и таким
образом не относилась к приему сканирования задачи, то выполняется
переход к контроль\-ной точке "прием(6)". Здесь компиляция
разветвляется. В данном подразделе рассмот\-рим случай, когда
первый оператор х9 новой программы имеет вид "программа", причем
заголовок приема начинается с одного из символов "быстрпроверка",
"кон\-трольбуфера", "см", "значение", "знач", "продукция",
"спуск". Таким образом, был откомпилирован прием проверочного
оператора, синтезатора либо вычислитель\-но\-го пакета продукций
(контрольная точка "прием(33)").

Переменной х10 присваивается корневой фрагмент программы символа
х1; пе\-ре\-менная х11 инициализируется нулем.

Если фрагмент х10 начинается с оператора "решить", после которого
распо\-ло\-жен оператор перехода "иначе $n$", то переменной х11
присваивается набор, сохраняющий исходные значения переменных х1,
х7, х8, х10. Переменной х1 переприсваива\-ет\-ся пара (х7,х8) -
ссылка на надфрагмент фрагмента $n$; (х7,х8) становится ссылкой на
$n$, а переменной х10 переприсваивается сам фрагмент $n$.

Если фрагмент х10 начинается с оператора "решить", после которого
не идет оператор перехода "иначе", то такой переход создается, и
через него подключа\-ет\-ся новая программа х3. Для этого в первый
фрагмент списка х3 вставляется оператор "контрольприема"; в
фрагмент х10 после оператора "решить" \ вставляется оператор
"иначе 2"; номера всех ссылок в фрагментах списка х3 увеличиваются
на 1; в нача\-ле списка х3 присоединяется фрагмент х10, и
предпринимается обращение к про\-це\-ду\-ре "записьпрограммы".

Если фрагмент х10 не начинается с оператора "программа", то на его
место будет вставлен начальный фрагмент $F$ списка х3. При этом от
$F$ через оператор "иначе", размещаемый сразу после оператора
"программа", будет создан переход к вет\-ви фрагмента х10. Для
этого выполняются следующие преобразования: в фрагмент $F$
вводится оператор "иначе(х7 х8)"; в него же вставляется оператор
"контрольпри\-ема". Если компилируется прием вычислительного
пакета продукций, имеющего в своем формате элемент "истина" \ (при
отсутствии срабатываний продукций значе\-ние оператора считается
истинным), то в начало фрагмента $F$ вставляется ссылка "ветвь" \
на новый фрагмент "выход", добавляемый к концу списка х3. Ссылка
из программы символа х1 на ветвь фрагмента х10 исключается, но сам
фрагмент со\-хра\-ня\-ется в блоке программ. Наконец, выполняется
обращение к процедуре "записьпро\-грам\-мы", причем входные данные
определяются с помощью набора х11.

После контрольной точки "прием(39)" \ рассматривается случай,
когда фраг\-мент х10, как и первый фрагмент новой программы,
начинается с оператора "программа". Здесь, как и для программ
приемов сканирования задачи, будет предпри\-нят поиск общей
начальной части "старой" \ и "новой" \ программ. Инициализируется
на\-бор х12 ссылок на фрагменты, образующие путь от корня
программы символа х1 к текущему фрагменту; последний соответствует
началу набора х12. Значе\-ни\-ем переменной х13 будет текущая
позиция текущего фрагмента х10; значением пе\-ре\-мен\-ной х14 -
теку\-щая позиция текущего фрагмента новой программы.
Инициали\-зи\-ру\-ет\-ся нулем вспо\-мо\-гательная переменная х15.
Единичное ее значение будет озна\-чать, что первый фрагмент новой
программы пройден целиком, и текущая позиция х14 относится к
одному из последующих фрагментов.

Далее размещен оператор "повторение", откаты к которому происходят
при пе\-ре\-хо\-де к очередной паре сравниваемых операторов х16,
х17, расположенных на по\-зи\-ци\-ях х13, х14. Если компилируется
прием вычислительного пакета продук\-ций, имеющего указатель
"истина" \ в своем формате, то выполняется переход через
опе\-ра\-тор "ветвь" \ в начале "старой" \ программы.

Если оператор х16 имеет вид "ветвь $n$", то проверяется выполнение
сле\-ду\-ю\-щих условий:

\begin{enumerate}

\item Оператор х17 не имеет заголовка "ветвь";

\item Справа от х17 не расположен оператор "иначе";

\item Оператор $P$, идущий непосредственно после х16 (с пропуском
возможного опе\-ра\-тора "контрольприема"), либо совпадает с х17,
либо, как и оператор х17, является чисто проверочным и
несовместным с х17. В последнем случае после х17 не идет "иначе".

\end{enumerate}

Если хотя бы одно из условий нарушено, то для дальнейшего
сравнения с новой программой выбирается фрагмент $n$.
Переопределяются х12, х13, х10, и откат к оче\-ред\-но\-му циклу
сравнения пары операторов.

Если же все условия выполнены, то х13 сдвигается на единицу
вправо, а ве\-ли\-чи\-ны откатов в новой программе корректируются
так, чтобы прохождение через дополнительную "ветвь" \ не изменило
ее функционирования.

Далее рассматривается случай, в котором операторы х16 и х17
заведомо не мо\-гут быть истинными одновременно, причем после
оператора х16 расположен опера\-тор "иначе $n$", а после х17 не
идет оператор "иначе". Тогда выполняется переход к фрагменту $n$,
переприсваивается переменной х10. х13 переустанав\-ли\-ва\-ет\-ся
на начало этого фрагмента; если оператор х17 представляет собой
отрица\-ние оператора х16, то позиция х14 смещается на единицу
вправо. Затем откат к повторному сравнению операторов.

Если предыдущая ситуация не имеет места, то переход через "ветвь
2". Здесь рассматривается случай, в котором либо операторы х16,
х17 совпадают и после х17 не идет "иначе", либо оператор х16 имеет
вид "контрольприема($\ldots$)" ,а после него идет оператор $P$,
совпадающий с х17, не имеющий заголовка "ветвь" \ и не
сопровож\-да\-е\-мый оператором "иначе". В последнем случае
операторы $P$ и х16 меняются в наборе х10 местами. Если х14 -
последняя позиция в текущем фрагменте новой программы, то
процедура "записьприема" \ обрывается - новая программа совпала с
уже имею\-щей\-ся. Иначе х13 и х14 сдвигаются на одну позицию
вправо; если после сдвига х13 указывает на оператор "иначе", то
выполняется еще один сдвиг х13 вправо. Затем - откат к повторному
сравнению операторов.

Если предыдущая ситуация не имела места, то переход через "иначе
1" \ к фраг\-менту с контрольной точкой "прием(43)". Ветвь,
расположенная после этой кон\-троль\-ной точки, связана с циклом
преобразований старой и новой программ, на\-прав\-ленных на
получение возможно более длинного общего их начала.
Использу\-ют\-ся преобразования двух типов. Первый тип -
перемещение вглубь программы чисто проверочного оператора, после
которого (или которых) продолжается общая часть двух программ.
Второй тип связан с появлением в одной из программ опера\-то\-ра
"равно($x$ $t$)", вводящего вспомогательное обозначение $x$ при
усмотрении повторя\-ю\-ще\-го\-ся вхождения выражения $t$. Если
после такого оператора идет некоторый опера\-тор $P$, а в другой
программе вспомогательное обозначение для $t$ не было введено и
идет оператор $Q$, совпадающий с $P$ после переобозначения в нем
$t$ на $x$, то можно преобразовать другую программу, вводя
обозначение $x$ и удлиняя таким образом общее начало двух
программ. Указанные действия можно выполнять и для случая группы
вспомогательных обозначений. Мы не будем подробно рассматривать
ветвь контрольной точки "прием(43)", ввиду ее громоздкости.
Заметим только, что воз\-ник\-ла она из-за необходимости
оптимизировать структуру вычислительных паке\-тов, программируемых
на ГЕНОЛОГе.

Для продолжения действий по сравнению операторов х16, х17
выполняем пе\-ре\-ход через "ветвь 1" \ перед контрольной точкой
"прием(43)".

Если оператор х16 имеет заголовок "контрольприема", после него
идет оператор "ветвь $n$", и далее - оператор "продолжение", то
проверяется, верно ли, что х17 имеет вид "ветвь $m$" \ и после х17
расположен оператор "продолжение". В такой ситуации, во-первых,
оператор "контрольприема" \ переносится из фрагмента х10 в начало
фрагмента $n$, и, во-вторых, выполняется переход к началам
фрагментов $n$, $m$ для дальнейшего сравнения операторов. Значение
индикатора х15 изменяется на 1.

Если оператор х16 имеет заголовок "контрольприема" \ и относится к
приему с заголовком "уровень", то ветвь фрагмента х10 осуществляет
увеличение на единицу текущего уровня в вычислительном пакете
продукций. Если после х16 идет опе\-ра\-тор $P$ вида "ветвь $n$",
то сам пакет продукций пока пустой - после $P$ расположена не
программа какой-либо продукции, а единственный оператор
"продолжение". В этом случае предпринимается преобразование
фрагмента $P$ - вместо оператора "продол\-же\-ние" \ помещается
оператор "контрольприема" \ для нового приема, и далее сле\-ду\-ет
начальный фрагмент его программы. Оператор х16 переносится в
фрагмент $n$. В данном случае переопределяется х6, и откат к
созданию терминала "прием".

В отсутствии предыдущей ситуации анализируется совместность
оператора х17 и оператора х19, совпадающего с х16 либо, если
заголовком х16 служит символ "контрольприема", расположенного от
него справа. Если эти операторы - чисто проверочные и несовместны,
то проверяется, что после них не идут операторы "ина\-че".
Оператор "контрольприема", если он был, переносится вправо от х19.
После х19 вставляется оператор "иначе 2". Затем преобразуется
первый фрагмент списка х3. Отбрасывается его начальный отрезок,
предшествующий х17. Если х17 - отрица\-ние х19, то отбрасывается и
х17. В фрагмент вставляется ссылка "контрольприема" \ на новый
прием. Номера всех переходов в фрагментах списка х3 увеличиваются
на 1; к началу списка х3 присоединяется модифицированный фрагмент
х10, и выполня\-ет\-ся обращение к процедуре "записьпрограммы".
Затем - откат к созданию терми\-на\-ла "прием".

Наконец, рассматривается случай, в котором дальнейшее продвижение
вглубь старой и новой программ при сравнении операторов
невозможно. Тогда перед по\-зи\-цией х13 фрагмента х10 старой
программы помещается оператор "ветвь 2", а предшествующие х14
операторы первого фрагмента новой программы отбра\-сы\-ва\-ют\-ся.
В начало этого фрагмента вставляется оператор "контрольприема";
но\-ме\-ра всех переходов в фрагментах списка х3 увеличиваются на
1; к началу спи\-ска х3 добавляется модифицированный фрагмент х10,
и предпринимается обраще\-ние к процедуре "записьпрограммы". После
того, как произошла регистрация но\-вой ветви в блоке программ,
нужно проконтролировать откаты в старой про\-грам\-ме, доходившие
хотя бы до вставленного оператора "ветвь". Увеличение этих
отка\-тов на единицу выполняется процедурой "сдвиготкатов". Затем
- переход к созда\-нию терминала "прием".

\subsection{Случай приема нормализатора либо анализатора}

В случае приемов нормализаторов и анализаторов начальный отрезок
про\-грам\-мы имеет специальную организацию, несколько усложняющую
процедуру вставки новых ветвей. Это происходит из-за того, что
нормализаторы и анализаторы работают в режиме итеративных
преобразований. После каждого срабатывания приема
ре\-али\-зу\-ет\-ся откат к заданной точке программы - оператору
"повторение", откуда начи\-на\-ет\-ся новый цикл поиска приема.
Для изменения текущего уровня сканиро\-ва\-ния либо выхода из
пакета по исчерпании уровней служит специальная вставка. Пере\-ход
к ней через "ветвь" \ расположен непосредственно после оператора
"повто\-ре\-ние". Программы новых приемов должны вставляться таким
образом, чтобы их ответвление от старой программы происходило
после прохождения указанного опе\-ра\-тора "ветвь".

Началом рассмотрения программы служит контрольная точка
"прием(7)". Пред\-ва\-ри\-тель\-но инициализируются переменные х10
и х11. Первая из них будет хра\-нить ссылку на фрагмент программы
символа х1, предшествующий текущему; вторая - на текущий фрагмент.
Сначала переменной х10 присваивается символ х1.

Далее располагается оператор "повторение", откаты к которому будут
про\-ис\-хо\-дить при продвижении вдоль главного ствола программы
символа х1. Здесь рас\-смат\-ри\-ва\-ют\-ся только начальные
операторы, т.е. "решить"; "программа"; "обращение($N$)". Если
найден фрагмент, начальный оператор которого совпадает с начальным
опе\-ра\-то\-ром х9 новой программы, то переход через "иначе 2".
Если весь главный ствол пройден до конца и совпадение не найдено,
рассматривается последний фраг\-мент главного ствола. У него после
первого оператора $P$ не идет "иначе", и вся но\-вая ветвь
подключается через "иначе", вставляемое после $P$.

Если найдено совпадение начальных операторов, то инициализируется
цикл вы\-де\-ле\-ния общего начального отрезка старой и новой
программ (контрольная точ\-ка "прием(51)"). Инициализируется
пустым словом накопитель х13, который бу\-дет нужен для коррекций
величин откатов в новой ветви программы. В х13 бу\-дут сохраняться
такие вхождения $v$ в фрагменты новой программы, что величи\-ны
отката в операторах, обеспечивающих откаты до $v$, требуют
увеличения на еди\-ни\-цу. Пополнение х13 будет происходить при
переходах через операторы "ветвь" \ ста\-рой программы.

Инициализируется накопитель х14 ссылок на фрагменты, образующие
путь от корня найденной ветви программы символа х1 к текущему
фрагменту (ссылка на него размещается в начале набора х14).
Переменной х12 присвоен текущий фраг\-мент старой программы; х15 -
текущее вхождение в него; х16 - текущее вхожде\-ние в текущий
фрагмент новой программы. Переменная х17 служит индикатором
ухо\-да от первого фрагмента списка х3 вглубь этого списка.

После контрольной точки "прием(9)" \ расположен оператор
"повторение" \ для откатов при переходе к очередной паре
сравниваемых позиций. Переменным х18 и х19 присваиваются,
соответственно, оператор старой и новой программ,
находя\-щи\-е\-ся на этих позициях.

Далее идет ряд действий, идентичных описанным в предыдущем
разделе. Во-первых, анализируется переход через оператор х18 вида
"ветвь $n$". Во-вторых, рас\-смат\-ривается случай, в котором
операторы х18 и х19 заведомо не мо\-гут быть ис\-тин\-ны\-ми
одновременно, причем после оператора х18 расположен опера\-тор
"иначе $n$", а после х19 не идет оператор "иначе". После перехода
через "ветвь 2" \ рассматрива\-ет\-ся случай, в котором либо
операторы х18, х19 совпадают и после х19 не идет "иначе", либо
оператор х18 имеет вид "контрольприема($\ldots$)" ,а после него
идет оператор $P$, совпадающий с х19, не имеющий заголовка "ветвь"
\ и не сопровож\-да\-е\-мый опера\-то\-ром "иначе".

После перехода через "иначе 1" \ начинаются отличия от предыдущего
раз\-де\-ла. Прежде всего, рассматривается случай, когда операторы
х18, х19 совпа\-да\-ют, после них расположены операторы "иначе", а
вслед за ними - одинаковые опера\-то\-ры "метка(продолжение)".
Последние вводятся для того, чтобы указать на возмож\-ность
пропуска операторов "иначе" \ при склейке начальных отрезков
старой и но\-вой программы. Соответственно, предпринимается
смещение позиций х15 и х16 на две единицы вправо, и откат к началу
сравнения очередной пары операторов.

Если операторы х18 и х19 различны, причем х18 имеет вид
"контрольпри\-ема", а после него идет оператор $P$, совпадающий с
х19, то рассматривается слу\-чай сле\-до\-ва\-ния за $P$ оператора
"иначе". Если этот оператор расположен на отрез\-ке програм\-мы,
предшествующем основному ее циклу, либо, аналогично
предыду\-ще\-му случаю, после х19 тоже идет "иначе", и вслед за
каждым "иначе" \ размеща\-ют\-ся опера\-то\-ры
"метка(продолжение)", то происходит сдвиг позиций х15, х16
впра\-во, сопровож\-да\-е\-мый перенесением вправо от текущей
позиции оператора "контроль\-при\-ема".

Далее снова выполняются действия, аналогичные описанным в
предыдущем раз\-де\-ле. Если удается усмотреть, что операторы х18
и х19 - чисто проверочные и не\-сов\-мест\-ны, причем после них не
идут операторы "иначе", то новая ветвь подключа\-ет\-ся через
"иначе", вставляемое после оператора х18. Учитывается сдвиг
опера\-то\-ра "контрольприема".

Если оператор х18 имеет заголовок "контрольприема", причем
относится к приему $P$ с заголовком "окончание" \ либо
"внешвывод", то пакетный нормализатор либо анализатор, прием
которого компилируется, пока пустой, а прием $P$ представ\-ля\-ет
собой переключатель уровней данного пакета. Здесь возникает
ситуация, аналогич\-ная случаю приема с заголовком "уровень" \ из
предыдущего раздела: вместо опе\-ра\-то\-ра "продолжение",
размещенного после оператора "ветвь $n$", подключается на\-ча\-ло
новой программы, а х18 переносится в начало фрагмента $n$.

Если после операторов х18 и х19 идут "переносы" \ - пары
операторов "ветвь", "продолжение", то предпринимается переход к
начальным операторам следующих фрагментов. При этом индикатор х17
устанавливается на 1.

Наконец, при невозможности продолжить выделение общего начального
отрезка двух программ выполняется подключение достижимой из х19
ветви новой про\-грам\-мы через оператор "ветвь", вставляемый
перед оператором х18.

 \section{Развитие компилятора ГЕ\-НО\-ЛО\-Га}

В этом разделе мы приведем описание системы используемых на
практике средств для развития ГЕНОЛОГа и его компилятора,
проиллюстрировав их рядом уп\-раж\-не\-ний.

 Как уже подчеркивалось, в процессе обучения решателя неизбежно
возника\-ют ситуации, требующие пополнения ГЕНОЛОГа, и, как
следствие, расширения его компилятора. Это обусловлено тем, что
ГЕНОЛОГ - не просто еще один язык про\-грам\-ми\-рования, а своего
рода коллекция способов алгоритмизации теоретичес\-ких знаний,
пополняемая по мере освоения новых разделов в той степени, в какой
этим разделам присуща своя "логико-алгоритмическая" \ специфика.
Основной запас вы\-ра\-зи\-тельных возможностей ГЕНОЛОГа, видимо,
стабилизировался, и в большин\-ст\-ве случаев оказывается вполне
достаточным. Тем не менее, вряд ли этот запас сейчас следует
считать исчерпывающим. По крайней мере, возникающие время от
времени принципиально новые направления в обучении логической
системы (например, эф\-фек\-тивная компиляция обычных вычислений с
теоремного уровня; автомати\-за\-ция развития базы теорем и т.п.)
вызывают определенные "всплески" \ активности, свя\-зан\-ной с
развитием ГЕНОЛОГа и его компилятора. Видимо, постепенно все
боль\-шее число процедур, пока реализованных на ЛОСа, будут
переводиться на ГЕНОЛОГ. Этот переход представляется естественным
для любых процедур "продукцион\-но\-го" \ типа, распадающихся на
независимо применяемые "правила" \ или "приемы", а большинство
сколь-нибудь крупных программ ЛОСа (включая даже про\-грам\-мы
интерфейсов) именно таковы.

Принцип развития ГЕНОЛОГа "по мере надобности", конечно, приводит
к тому, что нынешняя его версия выглядит достаточно бессистемной.
Иногда даже бли\-жай\-шие вариации на тему какого - либо веденного
в язык элемента отсутствуют просто потому, что обучающий материал,
по той или иной случайности, не предо\-ста\-вил повода для их
рассмотрения. Такие пробелы могут обнаружиться лишь
впослед\-ст\-вии, и тот, кто с ними столкнется, должен будет не
только создать новые прие\-мы решателя, но и пополнить компилятор
всем необходимым для их обработки. С другой стороны, строгое
следование при развитии как решателя, так и ГЕНО\-ЛО\-Га принципу
"бритвы Оккама" \ позволяет отсекать множество действительно
не\-нуж\-ных возможностей, которые попали бы в систему при ее
развитии по принципу "из об\-щих соображений". Выяснение подлинных
причин избыточности таких возможнос\-тей - дело будущих
исследований.

Несмотря на значительный объем компилятора ГЕНОЛОГа, процесс
попол\-не\-ния его не столь сложен, как это могло бы показаться. В
действительности это мог бы делать даже новичок, имеющий лишь
общее представление об архитек\-ту\-ре компилятора и знакомый с
ЛОСом. Предварительное детальное изучение при\-ве\-ден\-но\-го
выше (кстати, не очень полного) материала о компиляторе вовсе не
обяза\-тель\-но. Для анализа работы компилятора в конкретных
случаях следует использовать отладчик ЛОСа. Основные блоки
компилятора суть "базы" \ независимых прие\-мов, так что
достаточно добавить в такую базу еще один прием или найти с
помощью отладчика старый прием и модифицировать его. Пополнение
языка фильтров прие\-мов вообще не требует анализа компилятора с
помощью отладчика, так как обра\-бот\-ка фильтров вынесена в
специальные справочники.

\subsection{Поиск в программе компилятора}

Начнем с рассмотрения наиболее простой и естественной задачи -
поиска некото\-ро\-го места в программе компилятора, например, для
вставки какой-либо новой процеду\-ры или установки прерывания
отладчика ЛОСа при выходе на это место. Прежде всего, еще раз
напомним общую схему действий компилятора при обработке приемов
различных типов.

\subsubsection{Основные этапы компиляции приемов}

\begin{enumerate}

\item Прием сканирования задачи. Происходит обращение к
справочнику "новыйпри\-ем" \ на логическом символе - заголовке
типа приема. Это справочник пере\-адре\-су\-ет компиляцию
процедуре "продукция". Она выполняет следующие дейст\-вия:

\begin{enumerate}

\item При необходимости модифицируется теорема приема и его
описание. В частности, здесь применяется процедура "развязка";

\item Выбирается точка привязки в теореме (процедура
"точкапривязки");

\item Создается программный блок для накопления фрагментов
создава\-е\-мой программы. По указателям приема вводятся
информационные эле\-мен\-ты программного блока. Создается набор
установок на идентификацию;

\item Для создания идентифицирующей части программы приема
пред\-при\-ни\-ма\-ет\-ся обращение к процедуре "идентификатор";

\item Для компиляции фильтров приема и вставки их в программу
пред\-при\-ни\-мается обращение к процедуре "блокпроверок";

\item Для компиляции преобразований текущего контекста,
выполняемых при\-емом, предпринимается обращение к процедуре
"преобразователь";

\item Для вставки в программу фрагментов, временно сохраненных в
ин\-фор\-ма\-ци\-он\-ных элементах программного блока, применяется
процедура "вста\-вкафрагментов";

\item Для завершающей оптимизации программы применяется процедура
"за\-вер\-ше\-ниепрограммы";

\item Для вставки программы приема в блок программ (т.е. в файлы
системы) используется процедура "записьприема".

\end{enumerate}

\item Прием пакетного нормализатора. Происходит обращение к
справочнику "но\-выйприем" \ на логическом символе "замена".
Дальнейшие действия реали\-зу\-ют\-ся непосредственно программой
этого справочника:

\begin{enumerate}

\item При необходимости модифицируются теорема приема и его
описание;

\item Еще до создания программного блока вводится начальный
фрагмент про\-грам\-мы. Если пакет допускает преобразование
подтермов, то в него вво\-дит\-ся перечисляющий оператор,
выделяющий текущий подтерм. Иначе текущий подтерм жестко
фиксирован и совпадает со всем термом. При необходимости создаются
операторы, контролирующие заголовок за\-ме\-ня\-е\-мо\-го
подтерма. Для нормализаторов точкой привязки всегда служит
кор\-не\-вое вхождение этого подтерма.

\item Дальше компиляция разветвляется в зависимости от типа приема
нор\-ма\-ли\-за\-то\-ра. Случаи приемов "замена(спускоперандов
$\ldots$)", "замена(лекс\-упо\-ря\-дочение $\ldots$)" \ почти
вырожденные. Основная ветвь - приемы "за\-ме\-на(первыйтерм
$\ldots$)", "замена(второйтерм $\ldots$)";

\item Создается программный блок, в который заносится уже
имеющийся на\-чаль\-ный отрезок программы. Вводятся информационные
элементы этого блока и установки на идентификацию;

\item Отдельно рассматривается сравнительно редкий случай приемов
раз\-груп\-пи\-ровки, имеющих указатель "набор(первыйтерм)";

\item Для основного случая предпринимается обращение к процедуре
"иден\-ти\-фи\-ка\-тор", создающей идентифицирующую часть
программы;

\item С помощью процедуры "фильтр" \ компилируются фильтры приема.
Встав\-ка их в программу выполняется процедурой "вставкафильтра";

\item Находится программное выражение для заменяющего терма
приема. Для этого используется процедура "метаперевод";

\item Компилируются вспомогательные действия, предваряющие замену,
и далее в программу заносится оператор, реализующий замену;

\item Завершающая обработка программы выполняется процедурами
"встав\-ка\-фраг\-ментов" \ и "завершениепрограммы". Для вставки
новой программы в блок программ используется процедура
"записьприема".

\end{enumerate}

\item Прием проверочного оператора. Происходит обращение к
справочнику "но\-выйпри\-ем" \ на логическом символе "спуск".
Программа этого справочника вы\-полняет следующие действия:

\begin{enumerate}

\item При необходимости модифицируются теорема приема и его
описание;

\item Еще до создания программного блока вводится начальный
отрезок про\-граммы, в котором анализируются заголовки входных
термов;

\item Создаются заготовка набора ифнормационных элементов
про\-грамм\-но\-го блока и набор установок на идентификацию;

\item Вводится программный блок и пополняется список его
информаци\-он\-ных элементов;

\item Предпринимается обращение к процедуре "идентификатор",
создаю\-щей идентифицирующую часть программы;

\item Компилируются и вставляются фильтры приема;

\item Компилируются операторы, осуществляющие учет применения
приема и выдающие результат;

\item Программа оптимизируется и регистрируется в блоке программ -
так же, как в предыдущих случаях.

\end{enumerate}

\item Прием пакетного синтезатора. Происходит обращение к
справочнику "но\-вый\-при\-ем" \ на логическом символе "значение".
Последовательность обработки при\-ема дословно воспроизводит
случай проверочных операторов.

\item Прием пакетного анализатора. Происходит обращение к
справочнику "но\-вый\-прием" \ на логическом символе "внутрвывод".
Предпринимается, если это не\-об\-ходимо, модификация теоремы
приема и его описания. Выбирается точ\-ка привязки - по корневому
вхождению непосредственно идентифицируемого ан\-те\-це\-дента с
наиболее редким заголовком. Затем - стандартная
по\-сле\-до\-ва\-тель\-ность действий: ввод программного блока и
списка установок на иденти\-фи\-ка\-цию; обращение к процедуре
"идентификатор"; обработка фильтров; созда\-ние операторов,
осуществляющих вывод нового утверждения либо преобра\-зо\-ва\-ние
старого; оптимизация программы и регистрация ее в блоке программ.

\item Продукция вычислительного пакета. Происходит обращение к
справочнику "но\-выйприем" \ на логическом символе "продукция".
Компиляция здесь зависит от типа вычислительного пакета. Однако,
основную ее часть по-прежнему вы\-пол\-няет процедура
"идентификатор", так как вычисления определяются про\-грам\-мно
реализуемыми антецедентами теоремы, а консеквент лишь
указы\-ва\-ет способ регистрации результатов вычислений в текущих
структурах данных.

\item Приемы специальных процедур. Некоторые вспомогательные
процедуры так\-же реализованы на ГЕНОЛОГе. Например, программа
"рислинии", обеспечи\-ва\-ю\-щая сканирование технических структур
данных рисунка. Компиляция ее приемов осуществляется справочником
"новыйприем" \ на логическом симво\-ле "рисунок". Основную работу
здесь выполняет процедура "идентифи\-ка\-тор"; все антецеденты
теоремы приема полагаются программно реализуемыми. По аналогии с
этим можно вводить и процедуры компиляции других про\-грамм
"продукционного" \ типа.

\item Приемы справочников. Все они компилируются процедурами
справочника "но\-выйприем" \ на логических символах - заголовках
их названий.

\end{enumerate}

\subsubsection{Основные блоки компилятора}

Как видно из приведенного выше перечисления типовых циклов
компиляции, в них используются почти одни и те же блоки. Создание
циклов компиляции для прие\-мов новых типов, при наличии своего
рода "конструктора" \ из стандартных бло\-ков различного
назначения и различных размеров, обычно не требует слишком
боль\-шо\-го времени. Полезно будет перечислить здесь компоненты
этого "конструкто\-ра", начиная с наиболее крупных его блоков:

\begin{enumerate}

\item Процедура "точкапривязки". Выполняет выбор точки привязки
для прие\-мов сканирования задачи;

\item Процедура "идентификатор". Создает идентифицирующую часть
програм\-мы приема;

\item Процедура "учетоперанда". Создает операторы, учитывающие
заголо\-вок только что идентифицированного вхождения, и создает
установки для продолжения идентификации "вглубь" \ этого
вхождения. Фиксирует иден\-тификацию вхождения в информационных
элементах программного блока. Обычно обращение к этой процедуре
завершает прием процедуры "иден\-ти\-фикатор".

\item Процедура "учетнормализаторов". Подготавливает
информационные эле\-мен\-ты программного блока, необходимые для
учета обращений к нор\-ма\-ли\-заторам.

\item Процедура "метаперевод". Находит программное выражение для
терма "те\-о\-рем\-ного" \ уровня.

\item Процедура "прогрвыражение". Находит программное выражение
ЛОСа для объекта, заданного операторным выражением языка фильтров
приема.

\item Процедура "блокпроверок". Компилирует фильтры приема
сканирования за\-да\-чи;

\item Процедура "фильтр". Компилирует отдельный фильтр;

\item Процедура "вставкафильтра". Осуществляет вставку
реализующего фильтр оператора в компилируемую программу.

\item Процедура "преобразователь". Компилирует преобразующую часть
про\-грам\-мы приема сканирования задачи.

\item Процедура "вставкафрагментов". Завершает процесс создания
чернового спи\-ска фрагментов новой программы, вставляя в него
вспомогательные фраг\-мен\-ты, сохраненные в информационных
элементах программного блока.

\item Процедура "завершениепрограммы". Устраняет из программы
вспомога\-тель\-ные метки и выполняет ее завершающую оптимизацию.

\item Процедура "записьприема". Регистрирует программу приема в
блоке прог\-рамм.

\end{enumerate}

\subsubsection{Вспомогательные блоки компилятора}

Перечислим используемые на различных этапах компиляции
вспомогательные бло\-ки компилятора.

\begin{enumerate}

\item Модификация теоремы приема и его описания - процедура
"развязка". Эта процедура введена специально для геометрических
приемов.

\item Подготовка списка установок на идентификацию. Применяется
процедура "см\-ан\-тецеденты", создающая список установок на
обработку антецедентов тео\-ре\-мы приема.

\item Процедура "посылки". Определяет программное выражение для
спи\-ска посылок, относительно которых прием выполняет проверку
истин\-нос\-ти антецедентов.

\item Процедура "текпеременные". Определяет программное выражение
для спи\-ска всех встречающихся в контексте применения приема
переменных.

\item Процедура "количествооперандов". Вставляет в программу
проверку равенст\-ва числа операндов идентифицируемой и
идентифицирующей операций.

\item Процедура "вхождениепосылки". Находит программное выражение
для вхож\-де\-ния в задачу посылки или условия, идентифицированных
с заданным ан\-те\-це\-дентом теоремы приема.

\item Процедура "транскоммент". Определяет набор программных
выражений для разрядов комментария, вводимого приемом (с
отброшенным заголовком ком\-мен\-тария).

\item Процедура "нормоператора". Переобозначает связанные
переменные опера\-то\-ра так, чтобы они были не меньше заданной
программной переменной. Предот\-вра\-щает использование в качестве
связанных переменных оператора тех пере\-мен\-ных, которые уже
были определены.

\item Процедура "оператор". Выполняет компиляцию идентифицирующего
тер\-ма, используемого в фильтрах приема.

\item Процедура "значениепеременной". Находит список всех
информационных эле\-мен\-тов программного блока, определяющих
идентификацию (в том или ином формате) заданной переменной.

\item Процедура "символвхождения". Вставляет в компилируемую
программу опе\-ра\-тор, анализирующий символ по идентифицируемому
вхождению с учетом указателей приема.

\item Процедура "остатокоперандов". Создает информационный элемент
программ\-но\-го блока (набороперандов $\ldots$), задающий текущий
остаток неиденти\-фи\-ци\-ро\-ванных операндов (в формате термов)
ассоциативно-коммутативной опера\-ции.

\item Процедура "новоператор". Добавляет один или группу
операторов к концу последнего фрагмента программы рассматриваемого
программного блока.

\item Процедуры "прогинф", "прогинфы". Заносят, соответственно,
один или груп\-пу информационных элементов в программный блок.

\item Процедура "транститр". Определяет программное выражение для
одного из информационных наборов, организующих текст-формульное
пояснение сра\-ба\-ты\-вания приема.

\item Процедура "удалениеприема". Удаляет программу приема в блоке
программ, а также ссылку на эту программу из узла приема (т.е.
логический терми\-нал "прием").

\end{enumerate}

\subsubsection{Справочники компилятора}

Многие вспомогательные процедуры компилятора вынесены в
справочники. Пере\-чис\-лим основные из них.

\begin{enumerate}

\item Справочник "блокпроверок". Обеспечивает компиляцию фильтров
приема. Ло\-ги\-ческий символ обращения к справочнику - заголовок
фильтра. Наибо\-лее крупная процедура этого справочника
обрабатывает фильтры "контекст($A_1 \ldots \\ A_n$)"; она была
подробно рассмотрена в приведенном выше техническом описа\-нии
компилятора. Сначала здесь обрабатываются идентифицирующие тер\-мы
$A_i$; затем - указатели "вид", "подтерм", "усм" \ (с помощью
процедуры "иден\-ти\-фи\-катор"); затем - фильтры $A_i$. Остальные
процедуры - как правило, весь\-ма простые.

\item Справочник "прогрвыражение". Обеспечивает компиляцию
операторных вы\-ра\-же\-ний, используемых в фильтрах приемов.
Обработка выражений с заголов\-ка\-ми "число", "суммавсех",
"выписка", "перечисление", "нод", "нок", "макси\-мум", "минимум" \
переадресуется процедуре "контекст" \ справочника
"блок\-про\-верок". Программы прочих символов для данного
справочника обычно неве\-ли\-ки.

\item Справочник "значение". Обеспечивает компиляцию
идентифицирующего терма языка фильтров, имеющего заданный
заголовок.

\item  Справочник "оператор". Уточняет формат какой-либо уже
созданной про\-грам\-мы ЛОСа, чтобы компилятор мог непосредственно
использовать ее при опре\-де\-ле\-нии истинности фильтра приема,
реализации идентифицирующего тер\-ма или нахождения значения
оператор\-но\-го выражения языка фильтров. В этих случаях
обращение к программе в описа\-нии приема идентично обращению к
ней на ЛОСе. Фактически, справоч\-ник дублирует возможности
справочни\-ков "блокпроверок", "прогрвыражение" \ и "значение"; он
введен для упрощения процедуры пополнения языка фильт\-ров.

\item Справочник "вычисл". Используется для получения списка
указателей спосо\-бов обработки программно релизуемых утверждений
и выражений теорем\-но\-го уровня, имеющих заданный логический
символ. Приемы этого справоч\-ни\-ка создаются непосредственно на
ГЕНОЛОГе.

\item Справочник "редакцияпрограммы". Используется для завершающей
оп\-ти\-ми\-за\-ции результата компиляции.

\par\medskip

Для различных целей при компиляции используются следующие простые
спра\-воч\-ники, реализованные на ГЕНОЛОГе:

\par\medskip

\item Справочник "легковидеть". Определяет заголовок и формат
проверочного опе\-ра\-то\-ра для обработки утверждений заданного
вида.

\item Справочник "проверка". Определяет заголовок и формат
усиленного про\-ве\-роч\-но\-го оператора для обработки
утверждений заданного вида.

\item Справочник "нормализатор". Определяет заголовок
нормализатора общей стан\-дар\-ти\-зации выражений с заданным
заголовком.

\item Справочник "быстрпреобр". Определяет формат пакетного
нормализатора с заданным заголовком.

\item Справочник "синтезатор". Определяет формат пакетного
синтезатора с за\-дан\-ным заголовком.

\item Справочник "значения". Определяет список названий пакетных
синтеза\-то\-ров, используемых для обработки утверждений,
содержащих заданный ключе\-вой логический символ.

\item Справочник "анализатор". Определяет формат пакетного
анализатора с за\-дан\-ным заголовком.

\item Справочник "очевидно". По названию проверочного оператора
определяет вид утверждения, подлежащего проверке.

\item Справочник "ключоператора". По названию пакетного оператора
определя\-ет символ, за которым в базе приемов закреплен этот
оператор. Напри\-мер, для пакетного нормализатора общей
стандартизации выражений с задан\-ным заголовком определяет этот
заголовок.

\item Справочник "блок". По названию пакетного оператора фильтра
определяет его формат.

\item Справочник "усм". По названию идентифицирующего оператора
опреде\-ля\-ет его формат.

\item Справочник "См". Определяет список названий идентифицирующих
опе\-ра\-то\-ров, используемых для обработки утверждений,
содержащих заданный клю\-че\-вой символ.

\item Справочник "титр". По названию пакетного оператора
определяет коммен\-та\-рий, используемый при организации
поясняющего текста, сопровождаю\-ще\-го обращение к этому
оператору.

\item Справочник "программа". По названию вычислительного пакета
ГЕНО\-ЛО\-Га определяет его формат.

\item Справочник "единица". Определяет "единичное" \ значение
заданной дву\-мест\-ной операции и указывает номер ее операнда.
Используется компилятором при обработке указателей идентификации
"единица".

\item Справочник "заменазнака". Определяет список указателей
возможного вы\-не\-се\-ния обобщенного знака (одноместной
операции) из-под заданной двумест\-ной операции. Учитывается
возможность перехода при вынесении от одной одноместной опера\-ции
к другой.

\item Справочник "отрицание". Распознает операции, обратные к
самим себе.

\item Справочник "коммутативно". Распознает коммутативные операции
и сим\-мет\-рич\-ные отношения.

\item Справочник "ассоциативно". Распознает ассоциативные
операции.

\item Справочник "схемаоперандов". Определяет схему возможных
перестановок опе\-рандов для логических символов со специальной
симметрией (в случае ком\-му\-та\-тивных символов не
используется).

\item Справочник "вид". Указывает на специальный оператор,
используемый для идентификации терма $t(x)$ с единственной
переменной. Пока используется лишь при идентификации степенных
выражений.

\item Справочник "пересечениесписков". Указывает на специальную
процедуру, ис\-поль\-зуемую для выделения общей части наборов
операндов двух операций, имеющих заданный ассоциативно -
коммутативный заголовок. Применяет\-ся для вещественного и
комплексного умножений.

\end{enumerate}

\subsubsection{Упражнения}

В предлагаемых ниже упражнениях нужно найти через оглавление
программ раз\-лич\-ные точки компилятора. Если в оглавлении
программ точка не указана явно, для ее поиска следует войти в
смежные с ней явно обозначенные точки и попро\-бо\-вать проследить
цепь операторов программы вплоть до искомой точки. Можно также
применять просмотр всех вхождений заданного подтерма в заданную
ветвь программы (см. интерфейс редактора программ; клавиша F4). В
частности, если нужно найти какую-либо контрольную точку
"прием($N$)", то после нажатия клавиши F4 терм "прием($N$)" \
набирается в окне диалога и нажимается Enter. Заметим, что цифры
номера $N$ набираются раздельно, через вставляемые между ними
пробелы.

\begin{enumerate}

\item Найти точку обращения к процедуре "идентификатор" \ при
компиляции при\-е\-ма сканирования задачи;

\item Найти начало цикла просмотра установок на идентификацию в
процедуре "иден\-ти\-фикатор";

\item Найти начальную точку непосредственной идентификации
кванторов в про\-це\-ду\-ре "иден\-ти\-фи\-катор";

\item Найти точку процедуры "идентификатор", в которой
рассматривается не ком\-му\-тативная и не ассоциативная операция,
имеющая не более 4 операндов.

\item Найти в процедуре "идентификатор" \ место, где создается
оператор для пере\-хо\-да от уже идентифицированного вхождения к
еще не идентифициро\-ван\-ной его внешней операции.

\item Найти в процедуре "идентификатор" \ начальную точку
обработки ассоциатив\-ной и коммутативной операции.

\item Найти в процедуре "идентификатор" \ точку создания
оператора, перечис\-ля\-ю\-ще\-го утверждения текущего контекста
для их непосредственной иден\-ти\-фи\-ка\-ции.

\item Найти в процедуре "идентификатор" \ точку, где определяется
необходимый для обработки антецедента проверочный оператор.

\item Найти в процедуре "идентификатор" \ точки создания
операторов, реализую\-щих обращения к пакетным синтезаторам.

\item Найти точку вставки нового информационного элемента
(быстрпреобр $\ldots$) в программный блок.

\item Найти в процедуре "метаперевод" \ точку ввода новой
переменной согласно ука\-за\-телям приема.

\item Найти в процедуре "метаперевод" \ точку, где происходит
предварительная ком\-пи\-ляция терма без учета указателей его
нормализации. Найти точки, в кото\-рых определяются операторные
выражения для результатов применения пакет\-но\-го нормализатора
или вспомогательной задачи.

\item Найти точку определения программного выражения для
заменяющего тер\-ма приема сканирования задачи.

\item Найти точку вставки обращения к оператору вывода новой
посылки или ново\-го условия.

\item Найти точки обработки оператором "прогрвыражение" \
функциональной пере\-мен\-ной; указателя вхождения в теорему;
обычной переменной.

\item Найти точку обращения к процедуре "идентификатор" \ в
процедуре "контекст" \ справочника "блокпроверок".

\item Найти точку обработки фильтров при компиляции приема
проверочного опе\-ра\-то\-ра, нормализатора и синтезатора.

\item Найти начальные точки первого и второго циклов обращений к
справоч\-ни\-ку "редакцияпрограммы" \ при оптимизации результата
компиляции.

\item Найти начальный оператор "повторение" \ цикла сравнения
начальных отрез\-ков старой и новой программ при регистрации
результата компиляции прие\-ма сканирования задачи в блоке
программ.

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Входим в оглавление программ; выбираем раздел "Компилятор
ГЕНОЛОГа" \ и в нем - подраздел "Приемы сканирования задачи".
Находим пункт "Обраще\-ния к процедурам ИДЕНТИФИКАТОР и
БЛОКПРОВЕРОК" \ и нажимаем "кур\-сор вправо". Возникает фрагмент
программы с выделенной голубым цве\-том контрольной точкой
"прием(28)". Следующий оператор - искомое обраще\-ние к процедуре
"идентификатор". Заметим, что процедура "идентификатор", так или
иначе, применяется при компиляции практически любых
невырож\-ден\-ных приемов - как сканирования задачи, так и
пакетных операторов. Поэ\-то\-му ее начальная точку (а вовсе не
различные точки обращений к ней) удоб\-но выбирать в качестве
отправной точки при трассировке работы компиля\-то\-ра. Найдите
эту начальную точку через оглавление ГЕНОЛОГа.

\item В разделе "Компилятор ГЕНОЛОГа" \ выбираем пункт
"Формирование иден\-тифицирующей процедуры", и далее - пункт "Цикл
просмотра установок на идентификацию". После нажатия "курсор
вправо" \ попадаем на контроль\-ную точку "прием(13)", после
которой расположен оператор "входит(х9 х2)". Здесь х2 - список
установок на идентификацию; х9 - текущая установка,
извлека\-е\-мая из списка. Заметим, что точкой отката после
обработки очередной уста\-нов\-ки является оператор "повторение" \
в надфрагменте данного фраг\-мен\-та (см. контрольную точку
"прием(9)"). От него, после выполнения некото\-рых корректирующих
программный блок действий, компилятор снова достигает оператора
"входит(х9 х2)". После этого оператора располагается "главный
ст\-вол" \ классификатора установок по их заголовкам. Его пункты
достижимы из подраздела "Типы установок на идентификацию". Текущий
уровень х7 при\-ме\-ня\-емых приемов компиляции для каждого типа
установок анализи\-ру\-ет\-ся отдельно; иногда здесь возникают
свои линейные цепочки классификации прие\-мов компиляции по уровню
х7.

\item В подразделе "Формирование идентифицирующей процедуры" \
выбираем под\-раз\-дел "Типы установок на идентификацию". Так как
речь идет о непосред\-ст\-вен\-ной идентификации квантора, то
выбираем далее подраздел "Установка на идентификацию
(ОПЕРАНД...)". Кванторы, безусловно, относятся к не
ком\-му\-та\-тивным и не асоциативным символам - выбираем
соответствующий подраз\-дел. В нем находим пункт "Идентификация
кванторов". Так как этот пункт - не концевой (после номера идет
круглая скобка), то входим в его подраздел и выбираем пункт
"Исходная точка". Нажимая клавишу "курсор вправо", по\-па\-даем на
контрольную точку "прием(45)". Она имеет голубой цвет, т.е.
вклю\-чен режим выделения операторов просматриваемой программы.
Чтобы выйти из него, нажимаем клавишу "о" \ - голубой цвет
пропадает, и можно переме\-щать\-ся по фрагментам программы с
помощью клавиш курсоров. Для возвращения в исходный пункт
оглавления программ из любой точки просмотра про\-грам\-мы
достаточно нажать клавиши "о" \ и "End".

Заметим, что хотя выше и было приведено сравнительно подробное
описа\-ние того, как работает компилятор при идентификации
кванторов, на практике в этом и других случаях проще пользоваться
трассировкой работы компилято\-ра, чтобы на конкретном примере
понять логику его действий. Технику та\-кой трассировки опишем
ниже.

\item Аналогично предыдущему, находим раздел "Типы установок на
идентифи\-ка\-цию"; в нем - подраздел "Установка (ОПЕРАНД...)",
затем - "Не коммута\-тив\-ный и не ассоциативный символ", и
наконец - "Расмотрение набора операн\-дов, если его длина не более
4". После выхода на контрольную точку "прием(22)" \ замечаем, что
переменной х12 присваивается список вхождений операндов
те\-ку\-щей операции х10. Переходя через "ветвь 1", обнаруживаем
оператор "дли\-на\-менее(х12 5)". Только после него и начинается
искомая ветвь программы. Наличие этой ветви объясняется
возможностью использования для ссылок на операнды специальных
одноместных выражений "первыйоперанд", "второйопе\-ранд",
"предпоследоперанд", "последнийоперанд".


\item Перейдя в раздел "Установка на идентификацию (ОПЕРАНД...)",
находим его подраздел "Идентификация в направлении к корню терма".
Такая иденти\-фи\-ка\-ция реализуется, если точка привязки была
выбрана в глубине иденти\-фи\-ци\-ру\-е\-мо\-го терма. Так как
надоперация текущего вхождения определя\-ет\-ся однозначно, то для
наискорейшего отсечения выгодно сначала перемещаться от точки
привязки к корню, проверяя совпадение встречаемых на этом пути
логических символов с символами, указанными в теореме приема.
Переходим в выбранный подраздел, и далее - в программу через пункт
"Исходная точка". Здесь обнаруживаем оператор "операнд(х11 х10)",
присваивающий перемен\-ной х11 вхождение надоперации текущего
операнда х10.

\item Аналогично предыдущему, но выбираем подраздел "Коммутативный
и ассо\-ци\-а\-тив\-ный символ". Попадаем на контрольную точку
"прием(63)". После нее начинается цепочка ветвей, соответствующих
различным текущим уровням х7. Идентификация операндов
ассоциативной и коммутативной операции может привести к
значительному перебору; поэтому делается все возможное, чтобы его
сократить за счет первоочередной идентификации однозначно
распоз\-на\-ва\-е\-мых операндов. Приемы компилятора сгруппированы
в четыре ветви - для идентификации переменных (уровень х7 = 1);
для идентификации одиночных операндов, выделяемых своими
заголовками (уровни х7 = 2 и х7 = 5); для идентификации операции,
выделенной указателем "развертка" \ (уровень 6); для особых
случаев идентификации (например, по пересечению групп операндов
нескольких операций). Последняя ветвь рассматривается начиная с х7
= 4.

\item Установка на непосредственную идентификацию антецедента
имеет вид (корень $v$), где $v$ - вхождение этого антецедента.
Поэтому выбираем в разделе "Типы установок на идентификацию" \
подраздел "Установка на идентификацию (КО\-РЕНЬ...)". В нем
выбираем пункт "х12 - заготовка оператора, перечисляющего
подлежащие идентификации термы". После контрольной точки
"прием(116)" \ находим оператор "равно(х12 0)", который
инициализирует накопитель х12. Далее, в зависимости от типа
приема, для перечисления подлежащих иден\-ти\-фи\-ка\-ции с $v$
утверждений будут использоваться различные источники.
Про\-смат\-риваем операторы "замена(х12 $\ldots$)",
переприсваивающие переменной х12 реализующий перечисление
оператор. Например, в том же фрагменте ниже находим переприсвоение
переменной х12 оператора "ключ(конец(х13)х11 на\-ча\-ло(х3))".
Здесь "конец(х13)" \ - программное выражение для списка посы\-лок
пакетного оператора, х11 - заголовок идентифицируемого
антецедента, "на\-ча\-ло(х3)" \ - первая не определенная
программная переменная, которой при\-сва\-и\-ва\-ют\-ся
перечисляемые утверждения.

\item Для обработки антецедента проверочным оператором
используется уста\-нов\-ка на идентификацию (извлекается $v$), где
$v$ - вхождение этого антецеден\-та. Соответственно, находим в
разделе "Типы установок на идентифика\-цию" \ подраздел "Установка
на идентификацию (ИЗВЛЕКАЕТСЯ...)". В нем вы\-би\-ра\-ем пункт
"Исходная точка". После контрольной точки "прием(119)" \ ищем
обращения к справочнику "легковидеть" \ либо "проверка", которые и
опре\-де\-ля\-ют подходящий проверочный оператор (во втором случае
- усиленный). Переходя через "ветвь 2", обнаруживаем в новом
фрагменте такой опера\-тор - "равно(х15 справка($\ldots$))". Он
присваивает переменной х15 тройку (заголо\-вок проверочного
оператора - набор вхождений в шаблоне проверяемого
утверж\-де\-ния, соответствующих входным данным - число уровней
срабатывания про\-ве\-роч\-но\-го оператора).

\item Аналогично предыдущему, но входим в подраздел "Установка на
идентифи\-ка\-цию (ЗНАЧЕНИЯ...)". Здесь нам нужно найти не точку
определения назва\-ния синтезатора, а точку формирования оператора
для обращения к этому синтезатору. Выбираем подразделы "Обращение
не из пакетных синтеза\-то\-ра либо проверочного оператора" \ и
"Обращение из пакетного синтезатора либо проверочного оператора".
В них, соответственно, находим пункты "х33 - об\-ра\-ще\-ние к
пакетному синтезатору" \ и "х35 - обращение к пакетному
синтезатору".

\item Информационные элементы (быстрпреобр $\ldots$) создаются для
компиляции обра\-ще\-ний к нормализаторам. Поэтому в разделе
"Компилятор ГЕНОЛОГа" \ вы\-би\-ра\-ем подраздел "Процедура
предварительной обработки установок на нор\-ма\-ли\-зацию". Здесь
можно выбрать либо пункт "Исходная точка", либо пункт "Цикл
просмотра установок на нормализацию", который, очевидно, должен
предшествовать вводу элемента (быстрпреобр $\ldots$). Перейдя в
программу ком\-пи\-ля\-то\-ра и восстановив нажатием клавиши "о" \
обычный режим ее про\-смот\-ра, далее пытаемся найти оператор,
содержащий символ "быстрпреобр". Для этого включаем поиск -
нажимаем F4; вводим текстовым редактором слово "быстрпреобр",
нажимаем Enter, и далее продолжаем нажимать на F4 для перехода к
очередному вхождению в программу данного слова. После
нес\-коль\-ких нажатий обнаруживаем оператор "равно(х13
набор(быстрпреобр $\ldots$))", со\-здающий требуемый
информационный элемент.

\item В разделе "Компилятор ГЕНОЛОГа" \ выбираем подраздел
"Формирование про\-граммного выражения для заданного теоремного
терма". Входим в него, и да\-лее выбираем подраздел "Однобуквенный
терм" \ (т.к. обрабатываем перемен\-ную). В нем переходим к
подразделу "Случай переменной", и далее к пункту "Ввод новой
переменной $\ldots$".

\item В разделе "Формирование программного выражения для заданного
теоремного терма" \ выбираем подраздел "Учет нормализаторов".
Переходя в программу через пункт "Исходная точка", ищем
рекурсивное обращение к процедуре "ме\-та\-перевод" \ при
заблокированной обработке нормализаторов. Переходя через "ветвь
2", "ветвь 1", находим такое обращение: "равно(х6 метаперевод(х1
х5))". Переменная х6 здесь оказывается равна программному
выражению, опре\-де\-ля\-ю\-ще\-му искомый терм до применения
нормализаторов. Далее идет цикл учета нормализаторов - пакетных
операторов либо вспомогательных задач, в кото\-ром значение х6
последовательно модифицируется. Выйти на точку примене\-ния
пакетного нормализатора можно через пункт "Обработка
нормализато\-ра". Оператор "равно(х10 сборка($\ldots$))" \
формирует обращение к нормализа\-то\-ру для обработки текущей
версии х6. После ряда дальнейших модифика\-ций (учет заданных в
приеме опций обращения к нормализатору) значение х10
переприсваивается переменной х6. Аналогично, на точку применения
вспо\-мо\-га\-тель\-ной задачи попадаем через пункт "Обработка при
помощи вспомогатель\-ной задачи". Собственно обращения к задаче -
через процедуры "вспомописа\-ние", "преобразование", - создаются в
глубине данной ветви. Их можно найти либо прямым ее просмотром,
либо через F4.

\item В разделе "Компилятор ГЕНОЛОГа" \ выбираем подраздел
"Формирование пре\-образующей части приема, активизируемого при
сканировании задачи". Да\-лее переходим в подраздел "Классификация
приемов по заголовкам". Так как речь идет о заменяющем терме,
выбираем подраздел "Приемы замены". Здесь находим подраздел
"Определение заменяющего терма", и далее выбираем пункт
"Формирование прогр. выражения для заменяющего терма - общий
случай". Программное выражение х8 для заменяющего терма
определяется опера\-то\-ром "замена(х8 метаперевод(х7 х4))".

\item Аналогично предыдущему, переходим в раздел "Классификация
приемов по заголовкам", но теперь выбираем подраздел "Приемы
вывода - в посылках либо условиях". Далее переходим в программу
через пункт "Формирова\-ние обращения к оператору вывода".
Анализируя окрестность контрольной точки "прием(33)", замечаем,
что оператор вывода присвоен переменной х12, а ре\-гистрация его в
компилируемой программе выполняется оператором "нов\-опе\-ратор(х4
х12)".

\item В разделе "Компилятор ГЕНОЛОГа" \ выбираем подраздел
"Процедура ПРО\-ГРВЫРАЖЕНИЕ"; в нем - подраздел "Общий случай".
Переходим в про\-грам\-му компилятора через пункт "Функциональная
переменная". Контроль\-ной точке "прием(21)" \ предшествует
оператор "равно(х5 значение)", распознаю\-щий в обрабатываемом
терме функциональную переменную по его заголовку х5. Аналогично,
через пункт "Переменная" \ выходим на начальную точку
обра\-бот\-ки обычной переменной. Чтобы найти точку обработки
указателя вхождения в теорему, вспоминаем, что этот указатель
представляет собой терм вида "фикс(\\ $\ldots$)". Поэтому
переходим в подраздел "Служебные слова" \ и выбираем пункт "фикс".

\item Выбираем в разделе "Компилятор ГЕНОЛОГа" \ подраздел
"Формирование фи\-ль\-тров КОНТЕКСТ(...)", и в нем - пункт
"Обращение к оператору ИДЕН\-ТИ\-ФИ\-КА\-ТОР".

\item Начинаем во всех случаях с раздела "Компилятор ГЕНОЛОГа". В
случае про\-ве\-рочного оператора переходим в подраздел "Приемы
проверочных опера\-то\-ров" \ и находим пункт "Учет фильтров
приема". После контрольной точки "прием(14)" \ располагается
оператор "ключ(х6 условие х18)", извлекающий терм "условие(и($A_1
\ldots A_n$))" \ с фильтрами $A_1, \ldots , A_n$ из описания
приема х6. Ана\-ло\-гично поступаем в случае приемов синтезаторов.
Для нормализаторов пере\-хо\-дим в подраздел "Приемы
нормализаторов", затем - в подраздел "Клас\-си\-фи\-ка\-ция
приемов по заголовкам", далее - "Приемы ПЕРВЫЙТЕРМ, ВТОРОЙ\-ТЕРМ,
ЗАМЕЧАНИЕ". Наконец, переходим в программу через пункт "Учет
фильтров приема".

\item Переходим в подраздел "Завершающая обработка программы".
Затем - в под\-раз\-дел "Завершающее редактирование программы".
Здесь находятся некон\-це\-вые пункты "Цикл обращений к
справочнику "редакцияпрограммы" \ " \ и "Пов\-торный цикл
обращений к справочнику "редакцияпрограммы" \ ".

\item Последовательно проходим подразедлы "Процедура регистрации
про\-грам\-мы приема в блоке программ", "Регистрация программы
приема сканирова\-ния задачи", "Цикл просмотра фрагментов в блоке
программ". Здесь выбираем пункт "Начало цикла сравнения операторов
нового и старого фрагмента $\ldots$". После контрольной точки
"прием(16)" \ и до контрольной точки "прием(15)" \ находим
требуемый оператор "повторение". Видно, что прежде всего
ана\-ли\-зи\-ру\-ет\-ся случай, когда на текущей позиции старого
фрагмента располо\-жен оператор "ветвь".

\end{enumerate}

\subsection{Трассировка процесса компиляции}

\subsubsection{Общая схема трассировки}

Если новый прием по каким-либо причинам не компилируется, то для
выяс\-не\-ния этих причин применяется трассировка процесса
компиляции. Она же помогает ра\-зо\-браться с причинами
неправильной компиляции приема, выявляемой в процессе его
применения или при просмотре программы сразу после компиляции. Так
как априори точка отказа или ошибки компилятора неизвестна,
применяются повтор\-ные перезапуски процесса трассировки с
локализацией этой точки путем деления на части интервала,
определяемого счетчиком шагов интерпретатора ЛОСа.

Для запуска компилятора в режиме трассировки нужно нажать клавишу
Ctr-F5 из просмотра описания приема. Предварительно рекомендуется
нажать End, пе\-ре\-во\-дящее в главное меню, и вернуться в
просмотр приема, нажав "г" \ и "курсор вправо". Эти действия
необходимы для получения на счетчике шагов работы
интерпре\-та\-то\-ра ЛОСа фиксированного значения, сохраняющегося
при перезапусках трасси\-ров\-ки. После нажатия клавиши появляется
оглавление программ - тот его раз\-дел, который был сохранен при
последнем использовании данного оглавления. Вооб\-ще говоря, этот
раздел не обязан относиться к компилятору. Поэтому нужно выйти в
корневое меню оглавления программ, найти подраздел "Компилятор
ГЕНОЛОГа" \ и  войти в него. Дальнейшие действия зависят от типа
компилируемого приема. Прие\-мы сканирования задачи и приемы
пакетных операторов требуют, в качестве основ\-но\-го этапа
компиляции, обращения к процедуре "идентификатор". Отказ от
компи\-ля\-ции до этого обращения возникает крайне редко. Поэтому,
если нет основа\-ний локализовать отказ компилятора каким-то более
определенным местом, трасси\-ров\-ку обычно начинаем с исходной
точки процедуры "идентификатор". Нахо\-дим в оглавлении программ
пункт ("Формирование идентифицирующей процедуры" \ - "Начало
идентификации $\ldots$")и нажимаем клавишу "курсор вправо". Это
нажа\-тие запускает компилятор, причем при обращении к процедуре
"идентификатор" \ про\-ис\-хо\-дит выход в отладчик ЛОСа после
контрольной точки "прием(1)".

Заметим теперь, что в правом верхнем углу экрана находится запись
"шаг № $N$". Она определяет текущий шаг $N$ работы интерпретатора
ЛОСа. Так как точка отказа или ошибки компилятора неизвестна, для
ее локализации приходится исполь\-зо\-вать счетчик шагов - обычным
методом "деления отрезка". Выбираем некоторый но\-мер $M$, больший
$N$; нажимаем клавишу "ш"; вводим число $M$, и нажимаем "Enter" \
для завершения редактирования этого числа. Повторное нажатие
"Enter" \ приведет к кадру отладчика, соответствующему указанному
шагу.

Увеличивать шаг следует осторожно, так как компилятор работает
быстро, и можно проскочить точку отказа или ошибки. Если это, все
же, произошло, нужно повторно запустить трассировку по изложенной
выше схеме, разделив отрезок от $N$ до $M$ на несколько частей и
выходя в кадры отладчика в конце каждой части. Чтобы исходный
номер $N$ при повторном запуске был в точности повторен,
предва\-ри\-тель\-но необходимо нажатием клавиши "End" \ из
просмотра описания приема выйти в главное меню, а затем нажатием
клавиш "г", "курсор вправо"\ вернуться в про\-смотр приема.
Рекомендуемый шаг от $N$ до $M$ при первом запуске - не более
20000. Дальше можно предпринять экстраполяцию по числу оставшихся
необрабо\-тан\-ны\-ми установок на идентификацию (список х2).
Лучше сделать несколько шагов с ма\-лым приращением, чем сразу
выполнить презапуск.

Если номер $M$ был выбран удачно и компилятор еще не завершил
своей ра\-бо\-ты, то анализируется наличие ошибки в созданной
части программы. Набор фрагмен\-тов программы - последний элемент
текущего программного блока. Обычно этот блок легко распознается
по кадру программы компилятора - к нему обраща\-ют\-ся операторы
"новоператор", "прогинф", и т.д. Для программы "идентифи\-ка\-тор"
\ программный блок является значением переменной х3. Заметим, что
в процес\-се компиляции нумерация программных переменных
создаваемой программы мо\-жет сильно отличаться от той нумерации,
которая появится после завершающей опти\-ми\-за\-ции этой
программы. Если ошибка в компилируемой программе уже имеется, то
нужно выпол\-нить перезапуск трассировки, и т.п. Если
обрабатывается не ошибка, а отказ компиля\-то\-ра, то просто
выбирается очередное значение $M_1 > M$, и пред\-при\-ни\-ма\-ется
но\-вый шаг трассировки). В тех случаях, когда отрезок, на котором
локализуется от\-каз или ошибка, уже достаточно мал (сотни шагов
интерпретатора), можно выпол\-нять трассировку непосредственно,
введя пошаговый режим нажа\-ти\-ем клавиши "2" \ и далее используя
"Enter" \ для смены кадра.

Если априори есть основания считать, что ошибка или отказ
компилятора про\-изо\-шли в некотором конкретном его блоке, то
началом трассировки можно выбрать начало этого блока, определив
его через оглавление программ. Затем реализуется уже описанная
выше схема деления отрезка, кроме, разумеется, случаев, когда на
искомую точку попадаем сразу через оглавление программ. Некоторые
програм\-мы компилятора не подключены к оглавлению программ
(например, какие-ли\-бо небольшие процедуры справочников). Если
возникает необходимость посмотреть на действия компилятора внутри
таких программ, в них через редактор ЛОСа встав\-ля\-ет\-ся
контрольная точка "трассировка(стоп 0)", после чего запускается
про\-цесс компиляции.

\subsubsection{Упражнения}

Чтобы проиллюстрировать технику трассировки компилятора, разберем
нес\-коль\-ко простых упражнений. В основном, здесь будет
выполняться поиск точки про\-грам\-мы компилятора, создающей те
или иные операторы программы приема. Поэ\-то\-му упражнение будет
начинаться с поиска в программе приема операторов,
соот\-вет\-ст\-ву\-ю\-щих различным элементам описания приема.
Следует помнить, что запуск компилятора означает немедленное
удаление старой версии программы приема. По окончании трассировки
процесса компиляции, если она не была доведена до кон\-ца и
программа приема не восстановилась, следует восстанавливать ее
нажатием F5.

\begin{enumerate}

\item В разделе базы приемов "Элементарная алгебра, Дробь,
Устранение кубичес\-кой иррациональности в знаменателе" \ выбрать
прием с подвыражением $a^2-ab+b^2$. Найти в программе этого приема
оператор, реализующий фильтр "контекст(\\ вид(х1
умножение($\ldots$)))". Найти оператор, реализующий проверку
первого ан\-те\-це\-дента. С помощью трассировки процесса
компиляции определить мо\-мен\-ты создания этих операторов.

\item В разделе базы приемов "Элементарная геометрия, Фигуры,
Треугольник, Рав\-нобедренный треугольник, Высота равнобедренного
треугольника, опущен\-ная на его основание, $\ldots$", выбрать
прием, срабатывающий на уровнях 3 и 8. Най\-ти в его программе
оператор, реализующий второй антецедент теоремы. С помощью
трассировки процесса компиляции определить момент создания это\-го
оператора.

\item В разделе базы приемов "Элементарная алгебра, Тригонометрия,
Синус, Нор\-мализатор общей стандартизации НОРМСИНУС, Формулы
приведения" \ вы\-брать последний прием (нажимая "курсор вниз",
пока не будет достиг\-ну\-та концевая точка). В программе этого
приема найти оператор, создающий за\-ме\-ня\-ющий терм. Определить
момент его компиляции.

\item В разделе базы приемов "Элементарная геометрия,
Разныестороны, Про\-ве\-рочный оператор РАЗНЫЕСТОРОНЫ, Учет
биссектрисы угла" \ выбрать пер\-вый прием (нажимая "курсор вверх"
\ до крайней точки). В программе приема найти операторы,
обрабатывающие второй и третий антецеденты. Оп\-ре\-делить моменты
компиляции этих операторов и уточнить, какой из них к какому
антецеденту относится.

\item В разделе базы приемов "Математический анализ, Предел,
Нормализатор НОР\-МПРЕДЕЛ, Предел произведения, Правило Лопиталя"
\ имеется единственный прием. Найти в его программе оператор,
реализующий фильтр "меньше(число(\\ комментарий(х8)заголовок(х8
частнпроизв))2)". Определить момент ком\-пи\-ля\-ции этого
оператора "в целом", а также момент компиляции его
иденти\-фи\-ци\-ру\-ющего терма "комментарий(х8)".

\item В разделе базы приемов "Аналитическая геометрия, Уравнение
плоскости в пространстве, Включение прямой в плоскость" \ найти
первый прием. Опреде\-лить момент компиляции, на котором
учитывается указатель "подстановка($\ldots$ х15 0)".

\item В разделе базы приемов "Элементарная алгебра, Неравенства,
Меньшеили\-рав\-но, Синтезатор НИЖНЯЯОЦЕНКА, Квадратный трехчлен"
\ имеется единст\-вен\-ный прием. Найти в программе этого приема
оператор, осуществляю\-щий идентификацию выражения $x^2$.
Определить момент его компиляции.

\item В разделе базы приемов "Элементарная геометрия, Угол,
Анализатор УГЛЫ ($\ldots$), Сумма острых углов прямоугольного
треугольника" \ выбрать первый при\-ем. Найти в программе приема
оператор, определяющий выражение для угла $ACB$. Найти оператор,
выполняющий вывод следствий. Определить мо\-мен\-ты компиляции
этих операторов.

\item В разделе базы приемов "Математический анализ, Общие
свойства число\-вых функций, Исследование функций, Экстремумы
функции на множестве, Опре\-де\-ление множества точек, где
производная не определена либо не найдена" \ выбрать первый прием.
Найти в его программе операторы, реализующие тре\-тий антецедент.
Определить момент компиляции этих операторов.

\item В разделе базы приемов "Теория множеств, Функции, Образ,
Кванторная све\-рт\-ка в условие непересечения с образом" \
имеется единственный прием. Изме\-нить его описание, добавив
указатель "отображение(х6)". Убедиться, что после этого прием не
компилируется. С помощью трассировки найти точку отказа и
объяснить отказ. Восстановить исходный вид приема и
откомпилировать его.

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Находим описание требуемого приема. В третьем окне имеется
фильтр "кон\-текст(вид(х1 умножение $\ldots$))". Чтобы понять, что
он означает, последова\-тель\-но выделяем его подтермы курсором
мыши. Нажатие левой кнопки мыши при\-во\-дит к появлению
многоцветной указки, выделяющей подтерм; после этого нажатие
правой кнопки дает прорисовку в нижней части экрана пояснений к
выделенному подтерму. Если места внизу недостаточно, перед
анализом фильт\-ра убираем с экрана какое-либо "лишнее" \ окно. В
данном примере придется убрать первое окно, нажав Ctr-F1. После
этого нетрудно выяснить, что фильтр требует наличие у выражения
$a$ множителя, имеющего вид степени, знамена\-тель показателя
которой кратен 3, а основание содержит сумму. Для поиска
реализующего фильтр оператора нажимаем "Home" \ и попадаем в
редактор ЛОСа. Здесь удобно перейти в режим просмотра операторов,
нажав клави\-шу "о". С помощью клавиш "курсор вправо - влево" \
перемещаем выделенную голубым фоном область, просматривая
находящиеся на ней операторы. Так как фильтр сравнительно велик,
короткие операторы можно пропускать сразу. Первый встретившийся
"большой" \ оператор имеет вид "существует(х17 х18 $\ldots$)". Нет
необходимости вычитывать его во всех подробностях (хотя с
помо\-щью многоцветной указки это не так уж и сложно). Достаточно
таких косвенных признаков, как появление внутри оператора
упоминаемого в фильтре симво\-ла "алгебрвхождение", а также
символов "степень" \ и "дробь".

Теперь возвращаемся в базу приемов (клавиши "о", "End") и
переходим к следующему пункту упражнения - поиску оператора,
реализующего проверку первого антецедента теоремы. Антецедент
указывает на отличие от 0 неко\-то\-рого выражения. Согласно
указателю "блокпроверок(1 6)", он обрабаты\-ва\-ет\-ся проверочным
оператором. Этот проверочный оператор легко запомнить - он
называется "усмне0" \ и размещен в пункте "Цифры" \ раздела
"Элементар\-ная алгебра". Поэтому, переходя обратно в программу,
ищем оператор "усмне0($\ldots$)". В первом фрагменте программы
приема его не оказывается. Поэтому, перейдя через "ветвь 2",
начинаем просмотр следующего фрагмента. Напоминаем, что для смены
фрагментов нужно выйти из режима выделения операторов
на\-жа\-ти\-ем "о". В новом фрагменте обнаруживаем искомый
оператор "усмне0(х7 х12 пустоеслово х25)".

Следующий пункт упражнения - начать трассировку процесса
компиляции для поиска моментов создания найденных операторов.
Здесь можно рассмот\-реть две возможности - либо применить метод
"деления отрезка" \ с начальной точ\-ки процедуры "идентификатор",
либо, имея некоторое представление о после\-до\-ва\-тель\-ности
действий компилятора, локализовать точку создания операторов по
оглавлению программ. Проиллюстрируем обе эти возможности, так как
первая из них важна для отладки отказов компилятора.

Нажимаем Ctr-F5 и попадаем в оглавление программ. Переходим к его
кор\-не\-во\-му меню, нажимая необходимое число раз "курсор
влево". Затем выбира\-ем пункт ("Компилятор ГЕНОЛОГа",
"Формирование идентифицирующей про\-це\-дуры", Начало
идентификации $\ldots$). Однако, таким образом мы лишь
зафик\-си\-ро\-ва\-ли в оглавлении программ ту точку, с которой
будем стартовать при перезапусках трассировки для очередного
деления отрезка. Чтобы стандарти\-зи\-ро\-вать показания счетчика
шагов интерпретатора ЛОСа, теперь вернемся в главное меню двойным
нажатием клавиши "End". Затем нажимаем "г", "кур\-сор вправо",
"Ctr-F5". В результате снова окажемся на пункте "Начало
иден\-ти\-фи\-кации $\ldots$", но теперь уже нажимаем "курсор
вправо" \ для начала трассиров\-ки.

На экране возникает кадр отладчика ЛОСа, соответствующий начальной
точ\-ке программы "идентификатор". В правом верхнем углу
расположена запись "шаг № 128636" \ (из-за развития системы, при
выполнении упражнения здесь может оказаться другая константа).

Можно проконтролировать текущее содержимое накопителя программы.
Так как программный блок является значением переменной х3, для
просмотра его нажимаем клавиши "К", "3" \ и "Enter". Возникает
четверка объектов, из кото\-рой нас будет интересовать последний
объект - список фрагментов компили\-ру\-е\-мой программы. Выбираем
клавишей "курсор вниз" \ четвертый пункт и нажимаем "курсор
вправо". Возникает одноэлементный набор, состоящий из
единственного пока фрагмента. Его единственный оператор обозначен
буквой "т" \ (терм). Для просмотра этого оператора снова нажимаем
"курсор вправо". Видно, что оператор имеет вид "решить".

Далее попробуем перейти к шагу с номером 150000. Нажимаем "ш",
вво\-дим число 150000, и нажимаем "Enter" \ дважды. Снова
появляется кадр отлад\-чи\-ка ЛОСа в некоторой точке программы
"идентификатор". Просматриваем первый фрагмент компилируемой
программы так же, как на исходном шаге. Заметим, что отладчик
будет пытаться прорисовать операторы формульным редак\-то\-ром.
Чтобы перейти к их "нормальному" \ виду, нажимаем "с". Просмотр
опера\-то\-ров (их уже больше двух десятков) показывает, что
нужные нам операторы пока не возникли.

Переходим к шагу с номером 170000. Здесь появляется кадр отладчика
на про\-грам\-ме "учетнормализаторов". Нажатием "PageUp" \
возвращаемся к програм\-ме "иденитификатор" \ и снова анализируем
накопитель компилируемой про\-грам\-мы. В нем обнаруживаем
оператор "усмне0(подтерм(х9)облвхожд(х2 х3 х4 х1)пустоеслово
х27)". Очевидно, это второй из наших искомых операто\-ров, причем
пока он имеет вид, отличающийся от того вида, который принимает
после оптимизации программы. Для более точной локализации момента
по\-яв\-ле\-ния данного оператора выполняем несколько перезапусков
трассировки с делением на части отрезка от 150000 до 170000.
Возвращение в главное ме\-ню обеспечиваем несколькими нажатиями
"Esc".

Локализация момента приводит к обнаружению того, что после шага
167060 искомый оператор создается и присваивается сначала
переменной х21. Чтобы определить, в какой области программы
компилятора находится это присво\-е\-ние, нажимаем клавишу "б" \ и
переходим в оглавление программ. Оказывает\-ся, это пункт
"Установка на идентификацию ИЗВЛЕКАЕТСЯ" \ - "Обраще\-ние к
проверочному оператору" \ - "Исходная точка". Продолжая
трасси\-ров\-ку в режиме "по шагам" \ (переходя к очередному шагу
нажатием Enter), вскоро\-сти оказываемся на контрольной точке
"прием(2 1)", после которой опера\-тор "новоператор(х3 х22)" \
регистрирует в программе оператор "усмне0($\ldots$)". Заметим, что
на последнем отрезке он прошел некоторую обработку и был
переприсвоен переменной х22.

Продолжаем поиск момента появления в программе оператора,
реализующего фильтр. Устанавливя выход в отладчик ЛОСа на шаге
300000, Обнаруживаем, что к этому шагу процедура "идентификатор" \
уже выполнена и реализуется процедура "блокпроверок". Заметим, что
собственно кадр отладчика относится к выполнению некоторых
вспомогательных действий последней процедуры, и для выхода на ее
кадр нужно 4 раза нажать клавишу "Page Up". В процедуре
"блокпроверок" \ программный блок является значением переменной
х4. Про\-сма\-тривая его накопитель, обнаруживаем, что оператора
для рассматриваемого фильтра пока не создано.

В принципе, можно было бы продолжить выбор точек прерывания
"нау\-гад" \ и таким образом локализовать искомый момент. Однако,
так как фильтры приемов сканирования задачи компилируются именно
процедурой "блок\-про\-ве\-рок", можно последующую трассировку
привязать к логике программы этой процедуры. Легко заметить, что
текущий выполняемый оператор проце\-ду\-ры "блокпроверок" \ имеет
вид "равно(х10 фильтр($\ldots$))". Таким образом, во-первых, стоит
проверить, какой именно фильтр сейчас компилируется; если
ока\-жет\-ся, что не тот, который нам нужен, то можно ввести
установку на преры\-ва\-ния при последующих обращениях к оператору
"равно(х10 $\ldots$)" \ и таким обра\-зом определить момент
обработки нужного фильтра. Чтобы найти, какое входное данное
оператора "фильтр" \ представляет собой обрабатываемый фильтр,
мож\-но просмотреть последовательно все его входные данные. Первые
перемен\-ные х1-х4, скорее всего, воспроизводят внешние входные
данные проце\-ду\-ры "блокпроверок", поэтому начинаем сразу с
переменной х9. Нажимая кла\-ви\-ши "х", "9", "Enter", получаем на
экране значение переменной х9. Этим значе\-ни\-ем оказался именно
наш фильтр. Если бы оператор "фильтр" \ имел сво\-ими входными
программными выражениями не переменные, то для просмотра их
значений пришлось бы сначала спуститься из программы
"блокпроверок" \ в программу "фильтр" \ нажатием "Page Down", и
далее анализировать зна\-че\-ния первых программных переменных уже
в этом кадре. Наконец, для уточне\-ния номера нужного входного
операнда процедуры "фильтр" \ можно было бы нажать F2, ввести
название этой процедуры и посмотреть ее описание.

Чтобы определить результат компиляции фильтра, переходим в кадр,
со\-от\-вет\-ствующий процедуре "блокпроверок", нажимаем клавишу
"2" \ для задания режима пооператорной трассировки в этом кадре, и
нажимаем "Enter". Тогда появляется кадр, соответствующий
завершению выполнения оператора "рав\-но(х10 $\ldots$)". Вызывая
на экран значение переменной х10, получаем опре\-де\-лен\-ный
компилятором оператор для проверки фильтра. Продолжая
трас\-си\-ров\-ку дальше, замечаем, что переменной х11
присваивается набор конъюнк\-тив\-ных членов оператора х10 (так
как он не имел заголовка "и", то набор получа\-ет\-ся
одноэлементный). Наконец, кванторная импликация "длялюбого(х12
ес\-ли входит(х12 х11) не(заголовок(х12 истина)) то
вставкафильтра(х4 х12))" \ ре\-гис\-трирует фильтр в программе.
Если это представляет интерес, можно войти в трассировку процедуры
"вставкафильтра" \ и определить, как выбирается точ\-ка его
вставки.

В заключение заметим, что найти в программе компилятора точки
соз\-да\-ния указанных операторов можно было бы сразу, используя
оглавление программ. Начнем с оператора, реализующего фильтр.
Нажимаем Ctr-F5 из просмот\-ра описания приема и выбираем раздел
оглавления "Компилятор ГЕНОЛОГа" \ - "Формирование фильтров
приема, активизируемого при сканировании зада\-чи". В этом разделе
нам интересен пункт "Формирование и вставка в програм\-му
оставшихся фильтров из описания приема", так как рассматриваемый
фильтр явно не относится к числу простейших фильтров, вставляемых
в программу приема до начала идентификации. Выбирая данный пункт и
нажимая "курсор вправо", попадаем в кадр отладчика ЛОСа на
контрольную точку "прием(7)" \ процедуры "блокпроверок". Продолжая
пооператорную трассировку нажа\-ти\-я\-ми "Enter", вскоре приходим
к уже знакомому оператору "равно(х10 фильтр(х1 х2 х3 х4 х9))".
Проверяем значение х9. Это - не наш фильтр. Поэтому
уста\-нав\-ли\-ва\-ем режим трассировки с прерываниями перед
обращением к найденному оператору: нажимаем клавишу "курсор вниз",
перемещаем голубой фон к нуж\-но\-му оператору, и начинаем
нажимать "Enter", пока значение переменной х9 не станет равно
нашему фильтру. Это происходит уже на следующем шаге.

Заметим, что при выделении голубым фоном оператора в первый раз
лучше нажимать Ctr-Enter а для повторных выходов - Enter. Иначе
установка на прерывание при обращении к оператору будет утеряна
после выхода из теку\-щей реализуемой процедуры.

Чтобы найти момент создания оператора, реализующего проверку
первого ан\-те\-цедента, после нажатия Ctr-F5 переходим к пункту
"Формирование иден\-ти\-фи\-цирующей процедуры" \ - "Типы
установок на идентификацию" \ - "Установ\-ка на идентификацию
ИЗВЛЕКАЕТСЯ" \ - "Обращение к проверочному опера\-то\-ру" \ -
"Исходная точка". Нажимаем "курсор вправо", и попадаем на
контроль\-ную точку "прием(132)" процедуры "идентификатор".
Анализируем теку\-щую установку на идентифкацию х9 - она имеет вид
(извлекается $v$), где $v$ - вхожде\-ние нужного нам антецедента.
Поэтому продолжаем пооператорную трас\-си\-ров\-ку нажатиями
"Enter". Реализуется цикл просмотра антецедента и обраще\-ний к
справочнику "легковидеть" \ для определения нужно проверочного
оператора. Этот цикл продолжается, пока не будет найдено ненулевое
значение х14 наз\-ва\-ния оператора. Чтобы ускорить трассировку, в
момент появления на экра\-не оператора "не(равно(х14 0))" \ вводим
установку на прерывание после его реализации. Например, выделяем
голубым фоном оператор "ключ(х5 усло\-вие х15)" \ и нажимаем
"Ctr-Enter". Заметим, что выделение голубым фоном опера\-то\-ра
"ветвь 1" \ и нажатие "Ctr-Enter" \ сразу перевело бы нас в
соответству\-ю\-щий подфрагмент и отсекло трассировку теку\-ще\-го
фрагмента. Дальнейшую трас\-си\-ровку до момента вставки оператора
в программу можно было бы вести "по шагам", или же сразу выйти
через оглавление программ на пункт "Встав\-ка обращения к
проверочному оператору". В последнем случае нажимаем сначала
"Ctr-г" \ для возвращения из отладчика ЛОСа в оглавление программ.
Затем выбираем указанный пункт оглавления и снова нажимаем "курсор
вправо". Это приводит к продолжению компиляции и выходу в отладчик
ЛОСа на мо\-мент вставки (контрольная точка "прием(2 1)").

В заключение возвращаемся к просмотру приема и компилируем его
нажа\-ти\-ем клавиши F5.

\item Начиная с этого упражнения, будем искать точку создания
нужных операто\-ров непосредственно по оглавлению программ, без
использования техники "деления отрезка". Второй антецедент теоремы
данного приема - условие перпенди\-ку\-ляр\-ности прямых $BD$ и
$AC$. Переходя в программу, обнаруживаем в ней опера\-тор
"перпендикуляры". Выделяя его левой кнопкой мыши и нажимая затем
правую кнопку, просматриваем описание данного оператора. Он
перечисля\-ет усматриваемые из посылок задачи перпендикуляры к
заданной прямой. Види\-мо, это и есть искомый оператор. Чтобы
определить момент его создания, бу\-дем использовать оглавление
программ. Замечаем, что второй антецедент теоре\-мы выделен
указателем "усм", т.е. подходящий идентифицирующий оператор для
его обработки (в данном случае - "перпендикуляры") определяется
компиля\-то\-ром с помощью справочника "усм".

Для входа в трассировку работы компилятора нажимаем Ctr-F5.
Появля\-ет\-ся оглавление программ. В нем последовательно проходим
разделы "Компиля\-тор ГЕНОЛОГа", "Формирование идентифицирующей
процедуры", "Типы ус\-та\-новок на идентификацию", "Установка на
идентификацию (УСМ...)". В пос\-лед\-нем разделе обнаруживаем
пункт "х36 - обращение к идентифициру\-ю\-ще\-му оператору".
Видимо, в этом пункте и создаются операторы для обра\-бот\-ки
выделенных указателем "усм" \ антецедентов. Выделяем пункт и
нажи\-ма\-ем клавишу "курсор вправо". Появляется контрольная точка
"прием(197)", пос\-ле которой расположен оператор "равно(х36
сборка(х15 х34))". Нажимая на "Enter", выполняем этот оператор и
выводим на экран значение х36. Здесь луч\-ше предварительно
перейти от формульного к скобочному режиму про\-смот\-ра, нажав
клавишу "с". Значением х36 оказывается другой
идентифици\-ру\-ю\-щий оператор, имеющий заголовок "общаяпрямая".
Поэтому выделяем голубым фо\-ном оператор "не(равно(х25 0))",
расположенный после "равно(х36 $\ldots$)" , и начинаем просмотр
последующих результатов формирования значения х36, пе\-реходя к
очередной версии нажатием клавиши "Enter". На втором шаге
по\-лу\-чаем искомый оператор "перпендикуляры($\ldots$)".

\item Переходя в программу приема, ищем в конце ее оператор,
переприсваива\-ю\-щий новое значение переменной х1 (текущему
обрабатываемому терму). Это значение - х21. Выше находим оператор
"равно(х21 нормкосинус($\ldots$))". Воз\-вра\-щаемся в просмотр
описания приема и нажимаем Ctr-F5. Последователь\-но проходим
разделы "Компилятор ГЕНОЛОГа", "Приемы нормализа\-то\-ров",
"Классификация приемов по заголовкам", "Приемы ПЕРВЫЙТЕРМ,
ВТО\-РОЙТЕРМ, ЗАМЕЧАНИЕ". В последнем разделе выделяем пункт
"Фор\-ми\-ро\-вание заменяющего терма" \ и нажимаем "курсор
вправо". Нажимаем "Enter" \ для выполнения оператора "равно(х20
метаперевод(х19 х18))". Выводим на экран значение х20 - это
оказывается программное выражение "нормкосинус(\\ $\ldots$)".
Однако, от момента получения данного программного выражения до
момента вставки его в программу выполняется много других действий.
Чтобы сразу попасть на точку вставки, возвращаемся (Ctr-г) в
оглавление про\-грамм, выбираем пункт "Оператор замены - общий
случай" \ и нажимаем "курсор впра\-во". Здесь, после нескольких
шагов трассировки, приходим к операторам "рав\-но(х24 $\ldots$)",
"новоператор(х18 суффикс(х24 $\ldots$))", регистрирующим в
ком\-пи\-ли\-руемой программе выполняющие замену операторы.

\item Два оператора "точкалуча($\ldots$)" \ в программе приема,
очевидно, соответ\-ст\-ву\-ют второму и третьему антецедентам
теоремы. Эти антецеденты выделе\-ны указателем "усм". Точку их
создания находим через оглавление программ так же, как в уже
рассмотренном выше геометрическом приеме. Таким обра\-зом,
попадаем в окно отладчика ЛОСа перед оператором "равно(х36
сборка(х15 х34))". При первом выходе на этот оператор значением
х15 служит сим\-вол "точкапрямой". Пропуская несколько аналогичных
попаданий в это место, на\-конец получаем х15 = "точкалуча". Чтобы
определить, какой именно анте\-це\-дент компилируется,
рассматриваем установку на идентификацию х9. Она имеет вид (усм
$v$), где $v$ - вхождение второго антецедента. Таким образом,
порядок расположения операторов "точкалуча" \ в программе приема
совпал с порядком соответствующих антецедентов. Напомним, что
связь между тео\-рем\-ны\-ми и программными переменными можно
также определить непосредствен\-но при трассировке процесса
решения задачи, если заблаговременно пере\-ком\-пи\-ли\-ровать
нужный прием нажатием клавиши F6.

\item Фильтр "меньше(число(комментарий(х8)заголовок(х8
частнпроизв))2)" \ дол\-жен порождать оператор вида
"меньше($\ldots$)", содержащий символ "частнпроизв". В начальной
части программы обнаруживаем оператор "меньше(сум\-мавсех(х8
и(входит(х8 х3) заголовок(х8 частнпроизв ))1)2)". Так как х3 -
спи\-сок ком\-мен\-та\-риев нормализатора, то он действительно
реализует рассматриваемый фильтр. Заметим, что фильтр не содержал
каких-либо подлежащих иденти\-фи\-ка\-ции переменных, и
естественно было искать его именно в начале програм\-мы. Для
поиска точки компиляции фильтра нажимаем Ctr-F5 и выбираем в
оглавлении программ пункт "Компилятор ГЕНОЛОГа" \ - "Приемы
нор\-ма\-ли\-за\-то\-ров" \ - "Классификация приемов по
заголовкам" \ - "Приемы ПЕРВЫЙТЕРМ, ВТОРОЙТЕРМ, ЗАМЕЧАНИЕ" \ -
"Учет фильтров приема". Нажимаем "кур\-сор вправо" \ и продолжаем
пооператорную трассировку до выхода на опера\-тор "равно(х22
фильтр($\ldots$))". Здесь смотрим, какой именно фильтр х21
ком\-пи\-ли\-ру\-ется. Пока это не наш фильтр. Поэтому выделяем
голубым фоном оператор, предшествующий оператору "равно(х22
$\ldots$)", и продолжаем нажимать "Enter", пока значением
переменной х21 не станет нужный фильтр. Когда это наконец
происходит, можно войти в трассировку действий оператора "фильтр",
сменив на несколько тактов режим с пооператорного на пошаговый
(клавиша "1"). Однако, здесь предстоит длинная цепь трассировки.
Поэтому лучше че\-рез оглавление программ сразу выйти на начало
программы, обрабатыва\-ю\-щей фильтры "контекст" \ (операторное
выражение "число" \ будет переадресо\-ва\-но этой программе).
Выбираем раздел "Формирование фильтров КОНТЕКСТ" \ и в нем - пункт
"Обработка идентифицирующих термов". Снова возвращаемся в
трассировку, и продолжаем ее до появляения оператора
"оператор($\ldots$)", ко\-то\-рый и будет обрабатывать текущий
идентифицирующий терм х12. Убежда\-ем\-ся, что значением х12
является терм "комментарий(х8)". Далее можно было бы войти в
трассировку действий процедуры "оператор($\ldots$)". Однако, нам
извес\-тен заголовок идентифицирующего терма, и видно, что он
будет обраба\-ты\-вать\-ся с помощью справочника "значение".
Поэтому вводим установку на пре\-ры\-ва\-ние при обращении к
программе символа "комментарий" \ - нажимаем "л", набираем слово
"комментарий" \ и дважды нажимаем "Enter". Появляется кадр начала
программы "комментарий". Далее нажатием клавиши "2" \ вводим
по\-опе\-ра\-торную трассировку - иначе каждое следующее нажатие
"Enter" \ будет означать переход к следующему моменту выхода на
начало данной програм\-мы. Доходим до момента создания оператора
х9 вида "входит(х30 х3)", регист\-ри\-ру\-емого в программном
блоке х4. Этот оператор и выполняет перечис\-ле\-ние комментариев
нормализатора.

\item Указатель "подстановка($\ldots$ х15 0)" \ определяет
возможность отсутствия явно\-го вхождения члена $px$ в уравнение
плоскости; при этом $p$ будет идентифи\-ци\-ро\-вать\-ся с 0.
Таким образом, нам нужно найти момент создания компиля\-то\-ром
оператора, идентифицирующего значение х15 (т.е. $p$). Нажимаем
Ctr-F5 и последовательно проходим разделы оглавления "Компилятор
ГЕНОЛО\-Га", "Формирование идентифицирующей процедуры", "Типы
установок на иденти\-фи\-ка\-цию", "Установка на идентификацию
ОПЕРАНД". Так как выражение $px$ в теореме приема является
операндом коммутативной и ассоциативной опе\-ра\-ции "плюс", то
далее входим в раздел "Коммутативный и ассоциатив\-ный символ".
Отбрасывая очевидно непригодный случай просмотра операндов -
переменных, входим в подраздел "Общий цикл просмотра операндов".
Здесь обнаруживаем пункт "Учет указателя ПОДСТАНОВКА", выбираем
его и на\-жи\-маем "курсор вправо". Оказываемся перед оператором
"биключ(левпо\-зи\-ция(х3 1)подстановка х11 х12)". Если продолжить
трассировку нажатием "Enter", то произойдет откат - мы еще не
дошли до компиляции вхождения $px$. Поэтому поступаем более
осторожно - нажимаем "ф" \ для прориовки на экране всего
фрагмента, выделяем голубым фоном оператор, следующий за
"би\-ключ(\\ $\ldots$)", и нажимаем "Ctr-Enter". Проверяем, что
значением х11 является вхожде\-ние слагаемого $px$. Затем
переходим в пооператорную трассировку (нажи\-ма\-ем клавишу "2") и
продолжаем ее. Здесь происходит сложная обработка - по хо\-ду дела
выполняются вспомогательное обращение к процедуре
"идентифика\-тор" \ для нового программного блока х20; обращение к
процедуре "сжатиефильт\-ра", и лишь затем оператором
"новоператор(х3 сборка(и суффикс(х17 х25)))" \ в программе
регистрируется результат компиляции. Выполняем указанный
опе\-ратор, вызываем на экран текущую программу блока х3, и
находим в ней последний, только что созданный, оператор. Видно,
что он сначала инициирует нулем значение $p$ (программная
переменная х34), после чего просматри\-ва\-ет слагаемые и пытается
идентифицировать их с $px$. При удаче значение х34 изменяется.
Переменная х35, инициированная нулем, сохраняет при этом
вхож\-дение слагаемого, идентифицированного с $px$. Это нужно,
чтобы далее его уже не рассматривать.

\item Степенные выражения с константным натуральным показателем
степени иден\-ти\-фицируются с помощью вспомогательных операторов
"выделениестепе\-ни", "Выделениестепени". Переходя в программу
приема, находим такой опера\-тор - "выделениестепени(х15 2 х2 х3
х16 х17)". Возвращаемся в просмотр приема и нажимаем Ctr-F5. Если
попытаться найти точку идентификации степенно\-го выражения в
подразделе, связанном с рассмотрением не коммутативных и не
ассоциативных символов, то окажется, что компилятор вообще не
попадает в этот подраздел. Это происходит из-за того, что
идентифицирующий терм может не иметь заголовка "степень" \
(например, представлять собой число\-вую константу), и
идентификацию его приходится выполнять там, где
анали\-зи\-ру\-ют\-ся заголовки идентифицированных вхождений, т.е.
в процедуре УЧЕТОПЕ\-РАНДА. Поэтому, войдя в раздел "Формирование
идентифицирующей про\-це\-дуры", переходим к подразделу "Процедура
УЧЕТОПЕРАНДА". В нем об\-на\-ру\-живаем пункт "Идентификация с
применением справочника ВИД". На\-пом\-ним, что справочник "вид" \
создавался специально для идентификации вы\-ра\-же\-ний типа
степенных. Если не знать этого, то пришлось бы следить за
обращениями к процедуре "учетоперанда" \ в ее начальной точке.
Выходим в кадр отладчика на указанном выше пункте. Нажимаем "ф" \
для про\-смот\-ра всего фрагмента программы. Несколько далее
обнаруживаем обращение к спра\-вочнику "вид". Выделяем голубым
фоном оператор, следующий после опе\-ра\-то\-ра "не(равно(х12
0))", и нажимаем "Ctr-Enter". Проверяем, что значе\-ни\-ем
переменной х1 (только что идентифицированное вхождение в теорему)
является вхождение терма $x^2$. Нажимая далее "Enter", продолжаем
трасси\-ров\-ку до оператора "равно(х15 $\ldots$)", присваивающего
переменной х15 опе\-ра\-тор "выделениестепени($\ldots$)".

\item В теореме приема встречаются два угла - $ABC$ и $ACB$. Чтобы
различить их, замечаем, что в выводимом утверждении имеется
равенство для второго и не имеется равенства для первого. Переходя
в программу приема, анализи\-ру\-ем программные выражения для
частей выводимого утверждения. Обнаружива\-ем выражение
"запись(равно х20 $\ldots$)", а несколько выше - оператор
"равно(х20 нормугол(запись(угол $\ldots$)))". Отсюда заключаем,
что х20 и есть угол $ACB$. Оператор, выводящий следствия в
пакетном анализаторе, легко найти по его заголовку "внутрвывод".
Чтобы определить момент формирования опера\-тор\-но\-го выражения
для угла $ACB$, находим в оглавлении программ подраз\-дел
"Компилятор ГЕНОЛОГа", "Приемы анализаторов", "Формирование
вы\-во\-ди\-мого утверждения", и входим в кадр отладчика.
Оказываемся непосредствен\-но перед обращением к процедуре
"метаперевод". Нажимаем "1" \ для входа в пошаговую трассировку и
нажимаем "Enter". Оказываемся на первом опера\-то\-ре процедуры
"метаперевод". Выводим на экран обрабатываемое утверж\-де\-ние х1.
В нем нам нужно выделить момент обработки подтерма "угол($ACB$)".
Нажимаем "ф" \ для просмотра всего фрагмента и выделяем оператор
"обра\-ще\-ние(0)" \ голубым цветом. Нажимаем "Ctr-Enter", и далее
последова\-тель\-но нажимаем "Enter" \ до тех пор, пока в качестве
значения х1 не получаем "угол(\\ $ACB$)". Теперь можно проследить
все необходимые подробности компиляции данного выражения. Для
выхода на точку создания оператора, выполняюще\-го вывод
следствия, возвращаемся в оглавление программ (Ctr-г) и
выби\-ра\-ем пункт "Вставка оператора "внутрвывод($\ldots$)" \ ".

\item Третий антецедент теоремы приема выделен указателем
"развертка". Его об\-ра\-бот\-ка состоит в поиске среди
утверждений текущего контекста подмножест\-ва термов
"Частнпроизв($f$ $i$ $h(i)$)"; $i$ последовательно принимает
значения от 1 до $m$. Константа $m$ идентифицируется до обработки
этого антецедента. Перехо\-дим в программу приема и ищем в ней
символ "Частнпроизв". Он обнаруживается в операторе "длялюбого(х24
если Номера(1 х21 х24)то $\ldots$)". Анализируя работу оператора,
замечаем, что накопитель х23 заполняется найденными термами
"Частнпроизв($\ldots$)", а накопитель х22 - их подтермами $h(i)$.
Оба эти накопи\-те\-ля инициализируются пустыми словами
непосредственно перед оператором.

Возвращаемся в просмотр приема, нажимаем Ctr-F5 и входим в
подраз\-дел "Формирование иден\-ти\-фицирующей процедуры", "Типы
установок на иден\-ти\-фикацию". Так как утверждения
"Частнпроизв($\ldots$)" \ ищутся непосредственно в текущем
контексте, выбираем далее подраздел "Установка на
идентифи\-ка\-цию КОРЕНЬ". В нем выбираем подраздел "Учет
указателя РАЗВЕРТКА". Так как длина $m$ идентифицируемого списка
утверждений известна (из теоре\-мы приема видно, что она может
быть идентифицирована как длина связыва\-ю\-щей приставки $x$), то
выбираем подраздел "Длина набора известна". Найденный в программе
приема оператор "длялюбого(х24 $\ldots$)" \ предпринимал для
теку\-ще\-го значения $i$ (кодируемого переменной х24) просмотр
утверждений контек\-ста и идентификацию их с
"Частнпроизв($\ldots$)". Очевидно, для получения груп\-пы
операторов, реализующих данную идентификацию, необходимо обращение
к процедуре ИДЕНТИФИКАТОР на вспомогательном программном блоке.
По\-э\-тому выбираем концевой пункт "Обращение к процедуре
ИДЕНТИФИКАТОР" \ и нажимаем "курсор вправо". Для входа в
пооператорную трассировку нажи\-ма\-ем "2", и далее продолжаем ее
нажатиями "Enter" \ до момента присво\-е\-ния переменной х29
оператора "существует($\ldots$)". Выводим его на экран и
заме\-ча\-ем, что оператор реализует поиск идентифицирующего терма
для теку\-ще\-го значения $i$. Продолжаем трассировку, пока
переменной х31 не будет присво\-ен итоговый оператор
"длялюбого(х19 если Номера($\ldots$))". После оптимиза\-ции
программы нумерация переменных изменится, и он совпадет с
операто\-ром, который выше был найден в программе.

\item В четвертом окне приема (в дополнение к старому его
содержимому) наби\-ра\-ем терм "отображение(х6)". Это означает,
что выражение $f(x)$ будет иденти\-фи\-ци\-роваться с произвольным
термом, не обязательно имеющим заголо\-вок "значение". Далее
нажимаем "Enter" \ и F3. Однако, снизу появляется крас\-ная черта,
означающая отказ от компиляции. В этой ситуации иногда удается
угадать причину отказа или хотя бы локализовать его, не прибегая к
описан\-ной выше процедуре "деления отрезка". В нашем примере
видно, что заменяе\-мая (правая) часть теоремы приема вполне
стандартна, и каких-либо труднос\-тей с использованием здесь
указателя "отображение(х6)" \ не ожидается. Вероятно, они появятся
уже после формирования идентифицирующей части приема и даже после
учета его фильтров (последние никак не связаны с х6). Нажима\-ем
Ctr-F5, находим в оглавлении программ, например, начало процедуры
ИДЕН\-ТИ\-ФИКАТОР, и переходим от него к кадру отладчика ЛОСа.
Нажимаем PageUp для перехода в окно внешней процедуры "продукция".
Здесь нажи\-ма\-ем "2" \ и переходим к пооператорной трассировке.
После первого нажатия "Enter" \ успешно проходим процедуру
"идентификатор" \ и оказываемся перед проце\-ду\-рой
"блокпроверок", учитывающей фильтры приема. Снова нажимаем
"Enter", и снова процедура оказывается успешно завершенной. Теперь
можно было бы установить прерывание при обращении к процедуре
"метаперевод" \ и анали\-зи\-ро\-вать процесс формирования
программного выражения для заменяю\-ще\-го терма. Однако, в этом
терме наиболее сомнительное место - вхождение переменной $f$ (т.е.
х6), и можно сразу обратиться к нему через оглавление программ.
Нажимаем "Ctr-г" и входим в подраздел "Формирование
про\-грамм\-ного выражения для заданного теоремного терма",
"Однобуквенный терм", "Случай переменной", и выбираем для
возвращения в отладчик ЛОСа пункт "Исходная точка". Проверяем
значение х1 - сначала оно равно $b$. Для повтор\-но\-го выхода на
этот пункт выделяем голубым фоном контрольную точку "при\-ем(7)" \
и нажимаем Ctr-Enter. Снова проверяем значение х1 - теперь уже оно
равно $f$. Нажимаем "2" \ для перехода в пооператорную
трассировку, и про\-дол\-жаем ее до тех пор, пока компилятор,
исчерпав средства для идентифи\-ка\-ции $f$, не выдает отказ
оператором "стоп". В заключение возвращаемся к опи\-са\-нию приема
и восстанавливаем его исходный вид нажатием "Б".

\end{enumerate}

\subsection{Пополнение языка новыми элементами}

\subsubsection{Использование справочников ГЕНОЛОГа}

Для тех типов элементов описания приема, которые сравнительно
часто приходит\-ся пополнять, введены специальные справочники.
Создание нового элемента языка здесь сводится к регистрации его в
соответствующем help-оглавлении и написа\-нии про\-грам\-мы
нужного справочника, обеспечивающей компиляцию этого элемента.
Ино\-гда приходится создавать вспомогательную процедуру ЛОСа,
обращение к которой заносится в компилируемую программу.

Начнем с наиболее типичного случая - ввода нового типа фильтра или
иден\-ти\-фи\-ци\-ру\-ющего терма языка фильтров. Для этого служат
упоминавшиеся выше справочники "блокпроверок", "зна\-чение" \ и
"оператор". Во всех сомнительных слу\-чаях рекомендуется
действовать по аналогии с фильтрами, уже имеющимися в си\-сте\-ме,
анализируя содержимое от\-но\-ся\-щихся к ним программ. Они
однотипны, и обучиться самостоятельному созда\-нию новых элементов
языка фильтров приемов можно достаточно быстро.

Например, пусть нужно ввести в язык фильтров ГЕНОЛОГа возможность
про\-ве\-рять некоторое условие $P(x_1 \ldots x_n)$ для ранее
идентифицированных объектов $x_1, \ldots ,\\ x_n$. Если это
условие может быть реализовано каким-то единственным, и притом не
очень сложным, оператором ЛОСа, то лучше воспользоваться
справочником "блок\-проверок".

Прежде всего, выбираем для обозначения условия $P$ какой-либо еще
не ис\-поль\-зованный в языке фильтров логический символ $s$. Для
этого из просмот\-ра про\-из\-воль\-ного приема нажимаем Ctr-у,
переводящее в оглавление типов фильтров и идентифицирующих термов.
Затем нажимаем Ctr-л и получаем доступ к просмот\-ру всех еще не
использованных в данном оглавлении символов (можно перелисты\-вать
страницы с помощью PageUp-PageDn). Выбираем подходящее название
$s$, воз\-вра\-ща\-емся в оглавление, находим в нем подходящую
точку, и вводим новый кон\-це\-вой пункт. В нем размещаем текст,
поясняющий смысл условия $P(\ldots )$. Затем нажима\-ем "курсор
вправо", "Enter", и в окне текстового редактора набираем шаблон
фильт\-ра $s(x_1 \ldots x_n)$, вводя его в тех же переменных $x_1,
\ldots, x_n$, которые использовались в поясняющем тексте. По
завершении редактирования нажимаем "Enter".

Далее возвращаемся в главное меню и входим в редактор ЛОСа для
симво\-ла $s$. Перемещаясь вдоль главного ствола программы символа
$s$, выбираем место для вставки обращения к справочнику
"блокпроверок". Например, подключаем такое обращение в конце
главного ствола. Вводим первые два оператора
"обращение(блок\-проверок) метка(икс(6))". Затем, используя
операторное выражение "прогрвы\-ра\-же\-ние", определяем
программные выражения $X_1, \ldots, X_n$ для аргументов $x_1,
\ldots, x_n$ в тех форматах, которые нужны при проверке условия
$P$. Используя эти программ\-ные выражения, формируем терм $T$,
значением которого служит оператор ЛОСа, проверяющий истинность
условия $P(x_1 \ldots x_n)$. Завершаем программу операто\-ром
"ответ($T$)".

Если проверка условия $P$ достаточно сложна, то для нее вводим
специаль\-ную процедуру ЛОСа. Вводим для названия этой процедуры
новый логический символ $s$ (раздел "Ресурсы и установки" \
главного меню). Регистрируем выбранное назва\-ние в оглавлении
типов фильтров и идентифицирующих термов, как и выше. Входим в
программу символа $s$ (пока пустую). Нажимаем F3, "Enter" \ и
регистрируем описа\-ние оператора $s(x_1 \ldots x_n)$. Затем
возвращаемся в редатор ЛОСа, нажимаем "р", и приступаем к набору
программы оператора $s$. По завершении ее ввода, не выходя из
ветви символа $s$, подключаем фрагмент справочника "оператор". Он
имеет вид "обращение(оператор) ответ(набор($a_1 \ldots a_n$))",
где $a_1, \ldots, a_n$ - указатели формата входных значений $x_1,
\ldots x_n$ только что созданного оператора $s$. Типы указателей
формата перечислены в справочной информации символа "оператор".
Сразу пос\-ле этих действий фильтр $s(x_1 \ldots x_n)$ можно
использовать в приемах. Заметим, что при использовании справочника
"оператор" \ регистрация названия $s$ в оглавлении ти\-пов
фильтров и идентифицирующих термов не обязательна - по умолчанию
редак\-тор ГЕНОЛОГа будет выдавать первый абзац справочной
информации символа $s$.

Новые идентифицирующие термы вводятся в язык фильтров аналогичным
об\-ра\-зом. Если оператор ЛОСа, реализующий перечисление для
рассматриваемого иден\-ти\-фицирующего терма, сравнительно
несложен, то применяется справочник "зна\-чение". Это делается
аналогично тому, как выше применялся справочник
"блок\-про\-верок". Если же перечисление требует программирования
специальной вспо\-мо\-га\-тельной процедуры, то снова применяется
справочник "оператор". Как и ранее, он выдает набор указателей
типов, но уже для объединенного списка входных и выходных
переменных. В последнем случае указатель имеет вид "выход($a_i$),
где $a_i$ - тип значения.

Для операторных выражений языка фильтров снова имеем две
возможнос\-ти. Если для получения значения выражения можно
использовать какое-либо срав\-ни\-тель\-но несложное программное
выражение ЛОСа, то применяется справочник "про\-гр\-выражение".
При написании его программы следует учитывать указанный в
об\-ра\-ще\-нии к справочнику требуемый формат результата. Если же
вычисление зна\-че\-ния требует написания вспомогательной
процедуры ЛОСа, то такая проце\-ду\-ра создается, и применяется
справочник "оператор". К концу набора указателей ти\-пов входных
данных, выдаваемому этим справочником на названии новой
процеду\-ры, добавляется указатель типа значения вычисляемого ею
выражения.

Реже возникает необходимость вводить новые типы идентифицирующих
опе\-ра\-то\-ров. Они применяются, в основном, в планиметрии.
Однако, в будущем мо\-гут возникнуть и другие разделы базы
приемов, требующие интенсивного использо\-ва\-ния таких
операторов. Идентифицирующий оператор используется для быст\-рой
проверки или идентификации каких-либо условий, сводящихся к
имеющимся в те\-ку\-щем контексте с помощью двух-трех несложных
логических шагов. Чтобы провер\-ка была действительно быстрой,
операторы реализуются непосрественно на ЛОСе, хотя представляют
собой, по существу микро-пакеты продукций. Как уже говори\-лось
выше, идентифицирующие операторы используют дополнительные
источ\-ни\-ки ускорения - специальные адресные структуры над
списком утверждений и выраже\-ний задачи, а также буферы,
сохраняющие результаты нескольких последних об\-ра\-ще\-ний к
оператору. Подробнее разобраться с их устройством лучше на
каком-либо конкретном примере самостоятельно (можно выбрать для
этого оператор "точки\-пря\-мой"). Чтобы ввести в компилятор
возможность использования нового иденти\-фи\-ци\-ру\-ю\-ще\-го
оператора, нужно проделать следующее:

\begin{enumerate}

\item Выбрать название процедуры, реализующей оператор, и написать
на ЛОСе ее программу;

\item Связать новую процедуру с обработкой определенной группы
утвержде\-ний (антецедентов теоремы приема) при помощи нового
приема справочника "усм". Этот прием реализуется на ГЕНОЛОГе.
Подробности о формате его тео\-ре\-мы можно найти в справочной
информации о символе "усм".

\item Выделить какой-либо логический символ, встречающийся среди
обрабаты\-ва\-е\-мых процедурой антецедентов, в качестве
"ключевого", и связать его с на\-зва\-ни\-ем процедуры, введя
прием справочника "См". Подробности об этом спра\-воч\-ни\-ке - в
информации символа "См". Теорема приема его - та же, что для
справочника "усм".

\end{enumerate}

Для компиляции программно реализуемых антецедентов теоремы приема
исполь\-зу\-ют\-ся вспомогательные процедуры ЛОСа, связываемые с
антецедентами при по\-мо\-щи логических шаблонов. Эта связь
определяется приемами справочника "вы\-числ". Подробности легко
найти в справочной информации символа "вычисл". Справоч\-ник
обеспечивает связь с логическими конструкциями процедур ЛОСа,
реализующих как операторы, так и операторные выражения. Таким
образом, пополнение языка здесь совсем несложно - выбирается
название новой процедуры, она реализуется на ЛО\-Се, и создается
связывающий ее с компилятором прием справочника "вычисл".

\subsubsection{Упражнения}

Приведем несколько простых упражнений на ввод новых программ
перечислен\-ных выше справочников ГЕНОЛОГа.

\begin{enumerate}

\item Ввести фильтр "простэквивалентность(х1)", означающий, что х1
- кванторная импликация с элементарными антецедентами и
эквивалентностью элемен\-тар\-ных утверждений в консеквенте.
Использовать уже имеющийся одноимен\-ный оператор ЛОСа.

\item Ввести фильтр для проверки того, что заданное вхождение в
утвержде\-ние расположено только под внешними символами "и",
"или", "существует", либо в консеквенте под символом "длялюбого".
Выбрать новое название для этого свойства вхождения, написать
программу проверки его на ЛОСе, и вос\-поль\-зо\-вать\-ся
справочником "оператор".

\item Ввести идентифицирующий терм "разделы(х1 х2)", где х2
перечисляет наз\-ва\-ния всех надразделов, к которым относится
логический символ х1.

\item Ввести операторное выражение "внутрзаголовок(х1)", значением
которого слу\-жит заголовок первой неодноместной операции терма
х1, встречающейся при перемещении от его корня.

\item Обеспечить возможность использовать в программно реализуемых
антецеден\-тах выражение $n!$ для машинного формата "целое со
знаком".

\end{enumerate}

\subsubsection{Указания}

\begin{enumerate}

\item Прежде всего, входим в оглавление языка фильтров ГЕНОЛОГа.
Для это\-го просматриваем какой-либо прием и нажимаем "Ctr-у".
Выбираем раз\-дел "Характеристики терма", вводим в конце этого
раздела новый концевой пункт и сопровождаем его текстом "Терм х1
представляет собой простую экви\-ва\-лентность". Нажимаем "курсор
вправо", "Enter" \ и вводим текстовым ре\-дак\-то\-ром под
горизонтальной чертой текст "простэквивалентность(х1)". Снова
нажимаем "Enter", затем - "курсор влево" \ и "End". Еще раз
нажимая "End", возвращаемся в главное меню. Из него входим в
программу символа "прост\-эк\-вивалентность", переходим через
"иначе 1" \ и входим в редактирование те\-ку\-щего фрагмента
нажатием "р". После оператора "обращение(арность)" \ вста\-вляем
оператор "иначе 1" \ и нажимаем "Enter". В пустом окне,
предназна\-чен\-ном для нового фрагмента, вводим первые операторы
программы спра\-воч\-ни\-ка "блокпроверок" \ -
"обращение(блокпроверок)", "метка(икс(6))". Чтобы уточнить формат
обращения к справочнику, нажимаем, не выходя из тексто\-во\-го
редактора, клавишу F4, и набираем название справочника -
"блокпрове\-рок". Нажимаем "Enter", и из появляющегося на экране
текста находим, что при обращении к справочнику текущий
обрабатываемый фильтр "простэк\-ви\-ва\-лентность($t$)" \ является
значением переменной х5. Так как нам нужно про\-грамм\-ное
выражение для $t$, возвращаемся в редактирование программы
(на\-при\-мер, нажатием клавиши пробела) и набираем оператор
"равно(х6 прогр\-вы\-ра\-жение(х1 первыйтерм(х5)набор(терм)х4))".
Чтобы уточнить формат обра\-ще\-ния к процедуре "прогрвыражение",
предварительно можно опять вос\-поль\-зо\-ваться F4. Для проверки
того, что не получен отказ, вставляем опера\-тор "не(равно(х6
0))". Наконец, добавляем оператор
"ответ(запись(прост\-эк\-ви\-ва\-лентность х6))".

\item В этом примере введем новый оператор ЛОСа, который будет
проверять ука\-зан\-ное условие. Назовем его, например,
"позитивноевхождение(х1)". Созда\-ем через подраздел "Ресурсы и
установки" \ главного меню новый логичес\-кий символ
"позитивноевхождение". Входим в просмотр его программы (пока
пус\-той), нажимаем F3 и набираем описание формата обращения к
оператору "по\-зи\-тивноевхождение(х1)". После названия оператора
ставим точку, далее - объ\-яс\-няем, что обозначает входная
переменная х1 (вхождение в терм), и при ка\-ком условии оператор
истинен. Создав таким образом необходимую справоч\-ную информацию,
возвращаемся в просмотр программы, нажимаем "р" \ и соз\-да\-ем
первые операторы - "программа", "метка(икс(2))". Требуемое условие
легко выразить одним оператором ЛОСа - "длялюбого(х2 если
подчинено(х1 х2) то или(символ(х2 и)символ(х2 или)символ(х2
существует) и(символ(х2 длялю\-бо\-го)подчинено(х1
последнийоперанд(х2)))))". После него размещаем
заклю\-чи\-тель\-ный оператор "выход". Прежде чем завершить
создание фрагмента на\-жа\-тием клавиши "Enter", помещаем после
оператора "программа" \ опера\-тор "иначе 1". Тогда, после
завершения фрагмента, появится пустое окно тексто\-во\-го
редактора для ввода следующего фрагмента. Здесь размещаем
про\-грам\-му справочника "оператор", которая позволит компилятору
воспользо\-вать\-ся только что созданной процедурой. Эта программа
состоит всего из двух опе\-ра\-то\-ров - "обращение(оператор)",
"ответ(набор(вхождение))".

\item По справочной информации символа "разделы" \ находим, что
процедура ЛО\-Са, выполняющая требуемое перечисление, уже
существует. Так как справоч\-ник "оператор" \ для нее еще не
создан, вводим программу этого справочника. Она имеет вид:
"обращение(оператор)" \ "ответ(набор(переменная
выход(пере\-мен\-ная)))". Заметим, что здесь указатель
"переменная" \ относится одновре\-мен\-но и к переменной, и к
логическому символу.

\item Хотя процедура "внутрзаголовок(х1 х2 х3)" \ уже имеется,
воспользоваться в нашем примере справочником "оператор" \ не
удастся, ибо эта процедура ре\-али\-зу\-ет не операторное
выражение ЛОСа, а оператор. Поэтому вводим про\-грам\-му
справочника "прогрвыражение" \ для символа "внутрзаголовок".
Снача\-ла набираем операторы "обращение(прогрвыражение)",
"метка(икс(5))". Добав\-ля\-ем к ним оператор, определяющий
программное выражение для вхожде\-ния х1: "равно(х5
прогрвыражение(х1 первыйтерм(х2)набор(вхождение)х4))". Проверяем,
что это выражение найдено: "не(равно(х5 0))". Заносим в
ком\-пи\-ли\-руемую программу обращение к процедуре
"внутрзаголовок": "новоператор(х4 запись(внутрзаголовок х5
начало(х4) плюссимв (начало(х4)1)))". Запоминаем программную
переменную "плюссимв(начало(х4)1)", которой присвоен тре\-бу\-емый
"внутренний заголовок" \ - "равно(х6 плюссимв(начало(х4)1))".
Сдви\-га\-ем указатель первой неиспользованной программной
переменной блока х4: "из\-ме\-нение(левыйкрай(х4)
плюссимв(начало(х4)1))". Наконец, выдаем резуль\-тат -
"ответ(набор(х6))".

\item Сначала нужно написать на ЛОСе процедуру для вычисления
факториала в формате "целое со знаком". Так как для символа
"факториал" \ нет программы операторного выражения, то этот же
символ можно использовать в качестве названия новой процедуры.
Далее на ГЕНОЛОГе создаем прием справочни\-ка "вычисл" \ по
теореме "вычисл(факториал факториал(х1) вход(х1 целое)
вы\-ход(целое) факториал(х1))".

\end{enumerate}

 \begin{center}
 {\Large\bf ЛИТЕРАТУРА}
 \end{center}
\begin{enumerate}

 \item А.Черч. Введение в математическую логику. Том 1. М.: ИЛ,
1960, с.484.

 \item С.К.Клини. Введение в метаматематику. М.: ИЛ,
1957. 526с.

 \item С.К.Клини. Математическая логика. М.: Мир, 1973,
480с.

 \item Ч.Чень, Р.Ли. Математическая логика и автоматическое
доказательство теорем. М.: Мир, 1983, 360 с.

 \item Э.Мендельсон. Введение в математическую логику. М.: Наука, 1971,
с.320.

 \item Г.Метакидес, А Нероуд. Принципы логики и логического
программирования. М.: Факториал, 1998, 288с.

 \item И.Братко. Программирование на языке Пролог для искусственного
интеллекта. М.: Мир, 1990, 560 с.

 \item Дж.Малпас. Реляционный язык Пролог и его применение. М.: Наука,
1990, 464 с.

 \item Э.Хант. Искусственный интеллект. М.: Мир, 1978, 558с.

 \item Ж.-Л. Лорьер. Системы искусственного интеллекта. М.: Мир, 1991,
568с.

 \item E.A.Bender. Mathematical methods in artificial intelligence. Los
Alamitos, IEEE, Comp.Society Press, 1996, 638p.

 \item Д. Пойа. Математика и правдоподобные рассуждения. М.: Наука, 1975,
463с.

 \item Д. Пойа. Математическое открытие. М.: Наука, 1976, 448с.

 \item Лавров И.А., Максимова Л.Л., Задачи по теории множеств,
 математи\-чес\-кой логике и теории алгоритмов, М., "Наука", 1975, 232
 с.

 \item Антонов Н.П., Выгодский М.Я., Никитин В.В., Санкин А.И..
 Сборник задач по элементарной математике, М., "Наука", 1964, 528
 с.

 \item Вавилов В.В., Мельников И.И., Олехник С.Н., Пасиченко П.И.
 Задачи по ма\-те\-ма\-тике. Алгебра. М., "Наука", 1988, 431 с.

 \item Вавилов В.В., Мельников И.И., Олехник С.Н., Пасиченко П.И.
 Задачи по ма\-те\-матике. Уравнения и неравенства. М., "Наука", 1988,
 237 с.

 \item Потапов М.К., Олехник С.Н., Нестеренко Ю.В. Конкурсные
 задачи по мате\-ма\-ти\-ке. М., "Наука", 1992, 478 с.

 \item Сканави М.И. Сборник задач по математике. М., "Высшая школа",
 1988, 431 с.

 \item Ваховский Е.Б., Рывкин А.А. Задачи по элементарной
 математике. М., "Наука", 1971, 360 с.

 \item Лидский В.Б., Овсянников Л.В., Тулайков А.Н., Шабунин М.И.,
   Федосов Б.В. Задачи по элементарной математике. М., 1973, 415
   с.

 \item Сергеев И.Н. Математика. Задачи с ответами и решениями. М.,
 "Высшая шко\-ла", 2003, 336 с.

 \item Шарыгин И.Ф. Геометрия, 9-11 классы. М., "Дрофа", 1997, 396 с.

 \item Шарыгин И.Ф., Гордин Р.К. Сборник задач по геометрии. М.,
 Астрель, 2001, 396 с.

 \item Демидович Б.П. Сборник задач и упражнений по
 математическому ана\-ли\-зу. М., "Наука", 1969, 544 с.

 \item Виноградова И.А., Олехник С.Н., Садовничий В.А. Задачи и
 упражнения по математическому анализу. т.1. М., "Высшая школа", 2000,
 722 с.

 \item Моденов П.С., Пархоменко А.С. Сборник задач по
 аналитической геометрии. М., "Наука", 1976, 384 с.

 \item Филиппов А.Ф. Сборник задач по дифференциальным уравнениям.
 М., "Нау\-ка", 1965, 100 с.

 \item Вентцель Е.С., Овчаров Л.А. Задачи и упражнения по теории
 вероят\-нос\-тей. М., "Высшая школа", 2000, 364 с.

 \item Пантелеев А.В., Якимова А.С. Теория функций комплексного
 переменного и операционное исчисление в примерах и задачах. М.,
 "Высшая школа", 2001, 445 с.

 \item Черноуцан А.И. Физика. Задачи с ответами и решениями.  М.,
 Книжный дом "Университет", 2001, 335.

 \item Подколзин А.С. Об организации баз знаний, ориентированных
 на автоматическое решение задач. "Дискретная математика", 1990,
 т.2., вып.1., с. 13-30.

 \item Подколзин А.С. Система автоматического решения задач по
 элементарной алгебре. "Дискретная математика", 1994, т.6.,
 вып.4., с. 35-57.

 \item Подколзин А.С. Компьютерный решатель математических задач.
 ДАН РФ, 1994, т.335, № 4.

 \item Подколзин А.С. Компьютерное моделирование процессов решения
 математических задач. Изд-во ЦПИ при мех.-мат. факультете МГУ,
 2001. 235 с.

\end{enumerate}



\end{document}
