Содержание к диссертации
Введение
ГЛАВА 1. Конструктная технология программирования 7
1. Процедурное программирование в ДССП. Общая характеристика конструктной технологии 7
2. Описание ДССП 8
3. Конструкты и конструктная технология программирования 12
ГЛАВА 2. Конструктная реализация булевой алгебры 19
1. Общая характеристика компьютерной системы, реализующей булеву алгебру 19
2. Булева алгебра , 19
3. Совокупностная интерпретация булевой алгебры 25
4. Общая характеристика конструктов типа «булево выражение» 27
5. Конструкты ДК- и КД-шкала битных слов . 29
а) Кодирование булевых выражений конструктами ДК- и КД-шкала 29
б) Стек ДК- и КД-шкал 35
6. Конструкты К- и Д-шкала тритных слов и К/Д-цепь 38
7. Система манипулирования булевыми выражениями 46
ГЛАВА 3. Примеры использования конструктов типа «булево выражение» 49
1. Процедура выявления взаимосвязи, заданной булевым выражением 49
2. Выявление отношений между двумя выражениями 51
3. Решение булевых уравнений 55
а) Метод Буля-Порецкого 55
б) Уточнение метода Буля-Порецкого 57
в) Примеры применения уточненного метода 62
г) Компьютерная процедура решения систем булевых уравнений 65
д) Вычисление решения булева уравнения в виде рекурсивного определения искомого термина 67
4. Минимизация булевых выражений 68
Заключение 71
Литература
- Конструкты и конструктная технология программирования
- Общая характеристика конструктов типа «булево выражение»
- Выявление отношений между двумя выражениями
- Компьютерная процедура решения систем булевых уравнений
Введение к работе
В современных языках программирования реализованы операции над переменными и константами булевского типа, т. е. принимающими значения 0 и 1 («да» и «нет», «true» и «false»). Булевские выражения используются, например, для задания условий в условных операторах и операторах цикла. Возможность автоматического вычисления значений булевских выражений позволяет говорить о том, что в настоящее время на компьютерах реализована «булева арифметика».
Практический интерес представляет реализация на компьютере булевой алгебры, т. е. символьных преобразований булевых выражений. Применение в данной области существующего программного обеспечения (таких систем, как Maple, Mathematica, Reduce, MathCAD и др.) в большинстве случаев затруднено, так как предоставляемый им инструментарий ориентирован на решение задач математического анализа (например, упрощение дробно-рациональных функций, символьное интегрирование и дифференцирование, решение уравнений), но, как правило, не позволяет производить алгебраические преобразования логических выражений. Булевы выражения в таких системах, также как и в обычных языках программирования, могут вычисляться и использоваться для организации ветвлений и циклов.
Автоматизация анализа логических выражений и получения логического вывода обычно требует либо обращения к специализированным программным средствам — интерактивным системам поиска доказательств, языкам логического программирования, либо разработки и создания специального программного инструментария для решения конкретной задачи. При этом используемые алгоритмы и методы решения аналитических задач нацелены на автоматизацию исследования алгебраических моделей
посредством процедур применения правил вывода и поиска вывода в различных
логических исчислениях, а также на поиск наборов логических переменных, удовлетворяющих исходным условиям задачи.
Проблема логического вывода, неоднократно изучавшаяся математиками, может быть решена и иными средствами, нежели те, которые являются основой современных алгоритмов. Так, Дж. Буль, трактовавший логические выражения как выражения алгебры классов, свел задачу логического вывода к решению систем булевых уравнений [25]. Его метод решения уравнений, развитый и усовершенствованный в дальнейшем Э. Шредером, У. Джевонсом и П.С. Порецким [1, 25, 27] позволяет получать исчерпывающую характеристику ситуации, заданной системой уравнений.
К сожалению, в современных программных системах этот подход практически не используется. Задача решения логических уравнений понимается как задача поиска наборов переменных, удовлетворяющих данному уравнению [39], смысловая же информация, содержащаяся в уравнении, остается невостребованной.
Цель настоящей работы — создание компьютерной системы, реализующей булеву алгебру. Такая система предоставляет программный инструментарий для автоматического преобразования булевых выражений, а также позволяет создавать произвольные процедуры алгебраических преобразований булевых выражений, в частности и такие, применение которых затруднено в других программных системах. Например, в системе реализованы конъюнкция и дизъюнкция двух булевых выражений, а также дополнение и инверсия выражения. На основе указанных процедур в качестве примера реализован метод Буля-Порецкого решения систем булевых уравнений [6].
В настоящей работе реализация компьютерной алгебры достигнута путем кодирования выражений высокоуровневыми типами данных и программирования процедур манипулирования выражениями в закодированном виде. Созданы процедуры перевода булева выражения из строки символов во
внутреннее представление и обратно; все преобразования выражений производятся с кодами выражений.
Компьютеризация булевой алгебры осуществлена на языке диалоговой системы структурированного программирования ДССП [13]. При этом использовано имеющееся в ДССП конструктиве программирование, предоставляющее пользователю возможность создавать высокоуровневые типы данных - конструкты.
Конструкт как тип данных характеризуется форматом памяти и базисным набором процедур, интерпретирующих принимаемое им значение. Формат определяет структуру, информационную емкость и способы доступа к памяти конструкта, а набор интерпретирующих процедур устанавливает истолкование конструкта. Например, конструкт «целое без знака» определен на основе формата «вектор битов» посредством соответствующего базисного набора интерпретирующих процедур - арифметических операций. На основе этого же формата можно создать конструкт «строка символов», введя другой базисный набор интерпретирующих процедур.
Экземпляр конструкта определенного типа обладает собственной памятью, и реализует действия над значением, хранимым в этой памяти посредством базисного набора интерпретирующих процедур конструкта.
Компьютеризация булевой алгебры сведена к разработке конструкта «булево выражение» с базисным набором процедур алгебраического преобразования выражений. Конструктное программирование и система ДССП, в которой оно реализовано, описаны в первой главе настоящей работы, кодирующие булевы выражения конструкты - во второй главе.
На основе созданных процедур эффективно реализуются программы решения задач булевой алгебры. В качестве примеров разработаны программы решения булевых уравнений [6], выявления отношений между выражениями, минимизации булевых выражений [8]. Их характеристика дана в третьей главе.
Конструкты и конструктная технология программирования
Компьютерная система манипулирования булевыми выражениями реализована в диалоговой системе структурированного программирования ДССП [13] с использованием так называемой конструктной технологии программирования [14]. На примере созданных процедур эта сравнительно недавно появившаяся технология была успешно протестирована на практике. Всякая непримитивная ДССП-процедура представляет собой цепочку вложенных в нее процедур. Каждая вложенная процедура либо в свою очередь также представляет собой цепочку вложенных процедур, либо является примитивом — одной из имеющихся в системе простейших процедур. Таким образом, определение любой процедуры имеет иерархическую структуру, — каждая входящая в нее процедура задается одним и тем же способом, определение в целом должно быть доведено до примитивов. Этот принятый в ДССП бесскобочный (безблочный) стиль программирования, называемый процедурным, значительно облегчает работу программиста, а процедуры, построенные в соответствии с ним, оказываются понятными для человека, легко поддаются проверке, исправлению и модификации. Этот стиль в точности соответствует введенному Эдгаром Дейкстрой структурированному программированию: процесс вычисления разбивается на этапы, причем число поддействий должно быть достаточно мало, а их результаты сформулированы достаточно точно [33, стр. 29]. Примечательно то, что в ДССП процедурность не является обособленно предоставляемой возможностью. Напротив, это неотъемлемое свойство системы: при конструировании процедур в ДССП, невозможно обойти этот способ, и для того, чтобы разработать хорошо структурированную программу, не нужно прилагать специальные усилия - требуемая структура программы складывается естественным образом. Вместе с тем изначально ДССП не предоставляла аналогичных инструментов для структурирования и интерпретации данных. Данные в ДССП, как и в машинных языках низкого уровня, рассматривались как линейные последовательности ячеек памяти. Интерпретация значения, содержащегося в таком сегменте памяти, полностью возлагалась на составителя соответствующей прикладной программы. Иначе говоря, в ДССП отсутствовал механизм типов данных.
Дальнейшее развитие ДССП пошло по пути создания инструментария для структурирования данных: появилось понятие форматов [18], а затем конструктов и конструктного программирования [14], полученного посредством применения дейкстровского метода структурирования к данным. Центральным понятием в ДССП является программно эмулируемый ДССП-процессор, выполняющий подаваемые на его вход процедуры. Имена процедур - это слова, т. е. последовательности литер, разделяемых пробелами или символами "конец строки". ДССП-процессор располагает словарем известных ему имен процедур. Если поданное на вход процессора слово имеется в словаре, то инициируется выполнение соответствующей процедуры, а по завершении процессор сообщает о готовности принять новое слово. Если поступившее слово в словаре отсутствует, то выдается сообщение "Не знаю поступившее слово ". Последовательность слов на входе ДССП-процессора, вводимых с терминала или из файла, называется входным потоком. Изначально в словаре содержится базисный набор слов, соответствующих примитивам, из которых последовательно конструируются все остальные процедуры. Все конструируемые (непримитивные) ДССП-процедуры пополняют собой словарь и в дальнейшем могут выполняться ДССП-процессором, а также использоваться для определения новых процедур наравне с примитивами. В соответствии с принятым в ДССП принципом процедурное, выполнение всех поданных на вход ДССП-процессора процедур осуществляется единообразно: процессор находит поступивший символ в словаре и воспринимает сопоставленный этому символу адрес-указатель хранящегося в памяти кода процедуры как команду выполнить указанный код. Для примитивных процедур этим кодом оказывается цепочка машинных команд, т. е. команд, непосредственно выполняемых компьютером, а для процедур определенных на языке ДССП, код тела представляет собой цепочку адресов-указателей, а в конце — адрес-указатель, завершающей выполнение тела-цепочки.
Декларирование процедур в ДССП осуществляется посредством вызова процедуры-префикса ":". Слово, следующее за словом ":" интерпретируется как имя объявляемой процедуры и заносится в словарь, все последующие слова составляют тело определения процедуры, которое всегда заканчивается словом ";" - командой ДССП-процессору завершить декларирование процедуры. Определение каждой процедуры сопровождается комментариями -текстом, в квадратных скобках. В комментарии, предваряющем оперделение кратко охарактеризованы производимые процедурой действия, а комментарии в теле процедуры поясняют, какими данными обмениваются процедуры, составляющие данную. Принятый в ДССП стиль программирования подразумевает наличие комментариев обязательным. Конструкт определяется форматом принимаемых им значений и набором интерпретирующих эти значения базисных операций. В свою очередь формат характеризуется информационной емкостью, структурой и процедурами доступа. Примером формата может послужить л-битный вектор, задаваемый линейной структурой, информационной емкостью п бит и способом доступа к элементам вектора - по индексу. Отформатированное таким образом значение допускает различные интерпретации. Например, значение может трактоваться как целое без знака, как строка символов, как конъюнкция булевых переменных (терминов) и т. д. Заданием интерпретации достигается конкретизация формата и исчерпывающее определение конструкта. Так конструкт «целое без знака» содержит в числе процедур интерпретации процедуру суммирования значений, конструкт «строка символов» - процедуру конкатенации строк, а конструкт «булева конъюнкция терминов» — побитные инверсию, конъюнкцию и дизъюнкцию значений л-компоиентных векторов.
Общая характеристика конструктов типа «булево выражение»
Булева алгебра может интерпретироваться как иерархия совокупностей терминов и конструируемых из них выражений, которые в свою очередь также представляют собой совокупности терминов. Совокупность — это перечень попарно различимых, однозначно распознаваемых объектов, возможно упорядоченный. Наиболее простыми в булевой алгебре являются л-терминные четкие совокупности. При рассмотрении л-терминного универсума такая совокупность представляет собой перечень всех п терминов, с явным указанием, принадлежит данный термин совокупности, либо нет. Термины, не принадлежащие (антипринадлежащие) совокупности, входят в перечень инвертированными. Например, при «=3 xyz является четкой совокупностью, содержащей вес три термина, xy z - совокупность, содержащая термины х и у, и не содержащая термин г. Над четкими совокупностями определены операции пересечения, объединения и инверсии. Объединение двух совокупностей представляет собой совокупность, содержащую только термины, принадлежащие хотя бы одной их этих совокупностей. Например, x y z [J xy z - xy z. Пересечение двух совокупностей содержит только те термины, которые принадлежат обеим исходным совокупностям. Например: xy z \) xy z = xy z . Инверсия совокупности содержит только те термины, которые не входят в инвертируемую совокупность, и не содержит термины, которые в нее входят. Например, (xy z) = x yz . Необходимо различать конъюнктивные и дизъюнктивные совокупности. Четким конъюнктивным л-терминным совокупностям соответствуют индивидные конъюнкции, дизъюнктивным — предполные дизъюнкции. В булевой алгебре имеются также неиндивидные (элементарные) конъюнкции и непредполные (элементарные) дизъюнкции, которые интерпретируются как нечеткие совокупности терминов, конъюнктивные или дизъюнктивные. Умолчание термина в элементарной конъюнкции или дизъюнкции означает, что его принадлежность соответствующей совокупности не фиксирована. Например, конъюнктивная совокупность xz содержит термин х, не содержит термин 2, а принадлежность термина у ни утверждается, ни исключается. Второй уровень иерархии совокупностей в булевой алгебре составляют четкие совокупности совокупностей первого уровня, т. е. элементарных конъюнкций либо дизъюнкций, в частности, индивидных конъюнкций либо предполных дизъюнкций. Над такими совокупностями аналогичным образом определены теоретико-множественные опреации объединения, пересечения и инверсии. Произвольное булево выражение представимо дизъюнкцией элементарных конъюнкций - ДНФ, в частности, дизъюнкцией индивидных конъюнкций - СДНФ. Последняя представляет собой четкую дизъюнктивную подсовокупность полной совокупности вещей, различимых по и терминам-критериям. Двойственные, конъюнктивные нормальные формы представляют собой конъюнктивные совокупности элементарных дизъюнкций (КНФ), в частности, четкие конъюнктивные совокупности предполных дизъюнкций (СКНФ). То, что СДНФ и СКНФ булевых выражений представляет собой четкие совокупности своих членов, радикально упрощает реализацию алгебры выражений в совершенных нормальных формах (СНФ-выражений). Булево отрицание СНФ-выражения реализуется инверсией совокупности членов этого выражения. Конъюнкция и дизъюнкция двух выражений в СДНФ реализуется как соответственно пересечение и объединение дизъюнктивных совокупностей членов этих выражений. Конъюнкции и дизъюнкции выражений в СКНФ соответствуют объединению и пересечению конъюнктивных совокупностей членов этих СКНФ.
Благодаря структурной простоте и непосредственному представлению сущности булевых выражений, шкапы оказываются удобными для программируемого манипулирования: операции отрицания, конъюнкции и дизъюнкции над булевыми выражениями реализуются как совокупностные операции инверсии, пересечения и объединения соответствующих шкал, причем инверсия равнозначна булеву отрицанию отображенного шкалой выражения, пересечение — конъюнкции, объединение - дизъюнкции выражений [3]. В свою очередь эти три операции представляют собой побитные отрицание, конъюнкцию, дизъюнкцию над векторами битов, т. е. являются элементарными компьютерными операциями. Булевы выражения, вводимые пользователем в виде строк символов, преобразуются во внутреннее представление и подвергаются предписанной обработке, а затем автоматически производится обратное преобразование полученных результатов к общепринятому в алгебре виду.
Для манипулирования выражениями в несовершенных нормальных формах созданы конструкты К- и Д-гикалы тритов, позволяющие кодировать нечеткие совокупности (неиндивидные конъюнкции, непредполные дизъюнкции терминов), и К/Д-цепь этих шкал, моделирующая несовершенные КНФ и ДНФ [9]. Базисный набор интерпретирующих процедур конструкта К/Д-цепь отличается от базисного набора процедур конструктов КД- и ДК-шкала наличием процедур склеивания и поглощения терминов имеющих смысл только в алгебре несовершенных нормальных форм. Совершенные ДНФ и КНФ выражений также представляют собой четкие совокупности: первая является дизъюнктивной совокупностью индивидных конъюнкций, вторая - конъюнктивной совокупностью предполных дизъюнкций. Конструкты ДК- и КД-шкала отображают СДНФ или СКНФ посредством индексирования битов 2"-битного вектора значениями соответственно К-шкал либо Д-шкал, т. е. индивидными конъюнкциями либо предполными дизъюнкциями.
Выявление отношений между двумя выражениями
Булево выражение задает определенную взаимосвязь между входящими в него терминами [1, стр. 51]. Само по себе выражение ни дано, ни исключено, оно является функцией данности терминов. Факт его данности или исключенности требуется сообщать особо, например, при помощи слов «дано», «имеет место», «исключено» или специальных знаков, заменяющих эти слова. Среди булевых выражений, рассматриваемых в некотором универсуме, бывают такие, которые всегда даны (общезначимые), и такие которые всегда исключены. Безусловная данность выражения е обозначается как е = 1, безусловная исключенность: е 0. Вопрос о том, является ли выражение общезначимым, подробно изучен в булевой алгебре [23]. Рассмотрим выражения, которые не являются ни всегда данными, ни всегда исключенными, и выясним, каким образом можно установить необходимые и достаточные условия их данности (исключенности). Наиболее подходящими для этого оказываются нормальные формы булевых выражений. Выражение в ДНФ представляет собой дизъюнкцию конъюнкций терминов и является данным тогда, когда дана хотя бы одна из них. Как отмечалось выше, данности одной из конъюнкций ДНФ достаточно для данности всего выражения, и любая конъюнкция, входящая в ДНФ, является достаточным условием выполнимости ДНФ в целом. Несовместность е и g говорит о том, что е является частью дополнения g до универсума или наоборот. Более сильное отношение между двумя выражениями - комплементарность, когда два выражения противоположны по булеву отрицанию, между ними нет ничего третьего. Например, выражение А = ху v х у и выражение е = х у v ху комплементарны: выражение е является полным дополнением выражения h до универсума: е= - h. Установить комплементарность двух несовместных выражений нетрудно: если уже известно, что конъюнкция двух выражений равна нулю, и при этом еще равна нулю конъюнкция их отрицаний, то эти выражения комплементарны. Так для выражений е и A: eh = 0, - е - А = 0, т.е. е v А = 1. Еще один пример отношения между двумя выражениями -несоисключенностъ. Два выражения несоисключимы, когда они не могут быть одновременно исключенными. Таковы, например, выражения е - х у v ху и /= х v у , поскольку - е = ху v х у , - f-x y и - е- / - (ху v х у ) Уу = 0.
Легко заметить, что все указанные отношения выявляются посредством применения простых операций — конъюнкции, дизъюнкции и отрицания. В наборах базисных процедур охарактеризованных выше конструктов типа «булево выражение» имеются все необходимые для выявления отношений процедуры. На их основе реализована процедура OTNS, способная выявлять перечисленные выше и некоторые другие отношения булевых выражений. Поскольку при выявлении отношений не используются сокращенные ДНФ и КНФ, процедура выявления отношений применяется к выражениям, представленым более компактными ДК-шкалами.
Джон Буль высказывал о предмете математической логики такое мнение: «Наиболее общая проблема логики может быть сформулирована так: задано логическое уравнение, содержащее символы ху у, z, w. Требуется найти логически интерпретируемое выражение для выяснения отношения класса, обозначенного через w, к классам, обозначенным через x,y,zn т.д.» [«Законы мысли», стр. 87, цитировано по [24, стр. 325]]. Решение булевых уравнений и сегодня справедливо считать одной из главных задач булевой алгебры, на эту тему были проведены многочисленные исследования [34-42]. Значительные результаты в теории логических уравнений были достигнуты самим Булем, а также его ближайшими последователями - У.Джевонсом, Э.Шредером и в особенности русским ученым П.С.Порецким [25].
Далее следует разложение правой части этого равенства относительно терминов у, г,... и перевод полученного таким образом выражения с дробно-рациональными коэффициентами по предписанным Булем правилам в «чисто логическое» выражение с коэффициентами О, I, и, где и - символ неопределенности. Несмотря на то, что эта процедура доставляет правдоподобные результаты, она квалифицируется обычно как сомнительная ввиду недостаточной обоснованности применяемых правил и смешанности количественных и качественных отношений [25]. Радикальное усовершенствование булевой системы осуществил Джевонс. Он устранил операции вычитания и деления, операцию сложения заменил неразделительной дизъюнкцией и ввел в качестве независимой одноместной операции дополнение до универсума, т. е. отрицание термина [24]. С учетом умножения-конъюнкции получился базисный набор операций алгебры качеств - булевой алгебры в ее современном виде. Порецким дано истолкование перечисленных решений как отношений, связывающих упомянутые в них классы. Например, решение Шредера интерпретируется так: «Класс А включает в себя класс х, в который включен класс Л В ». Вместе с тем Порецкий обнаружил, что ни одно из данных решений при подстановке в исходное уравнение не обращает это уравнение в тождество. В случае «полного» решения подстановка приводит к исключению из уравнения того термина, относительно которого оно решено. Но исключение терминов можно производить более просто, в частности способами Буля и Порецкого [25].
Компьютерная процедура решения систем булевых уравнений
В современных языках программирования реализованы операции над переменными и константами булевского типа, т. е. принимающими значения 0 и 1 («да» и «нет», «true» и «false»). Булевские выражения используются, например, для задания условий в условных операторах и операторах цикла. Возможность автоматического вычисления значений булевских выражений позволяет говорить о том, что в настоящее время на компьютерах реализована «булева арифметика». Практический интерес представляет реализация на компьютере булевой алгебры, т. е. символьных преобразований булевых выражений. Применение в данной области существующего программного обеспечения (таких систем, как Maple, Mathematica, Reduce, MathCAD и др.) в большинстве случаев затруднено, так как предоставляемый им инструментарий ориентирован на решение задач математического анализа (например, упрощение дробно-рациональных функций, символьное интегрирование и дифференцирование, решение уравнений), но, как правило, не позволяет производить алгебраические преобразования логических выражений. Булевы выражения в таких системах, также как и в обычных языках программирования, могут вычисляться и использоваться для организации ветвлений и циклов.
Автоматизация анализа логических выражений и получения логического вывода обычно требует либо обращения к специализированным программным средствам — интерактивным системам поиска доказательств, языкам логического программирования, либо разработки и создания специального программного инструментария для решения конкретной задачи. При этом используемые алгоритмы и методы решения аналитических задач нацелены на автоматизацию исследования алгебраических моделей посредством процедур применения правил вывода и поиска вывода в различных логических исчислениях, а также на поиск наборов логических переменных, удовлетворяющих исходным условиям задачи. Проблема логического вывода, неоднократно изучавшаяся математиками, может быть решена и иными средствами, нежели те, которые являются основой современных алгоритмов. Так, Дж. Буль, трактовавший логические выражения как выражения алгебры классов, свел задачу логического вывода к решению систем булевых уравнений [25]. Его метод решения уравнений, развитый и усовершенствованный в дальнейшем Э. Шредером, У. Джевонсом и П.С. Порецким [1, 25, 27] позволяет получать исчерпывающую характеристику ситуации, заданной системой уравнений. К сожалению, в современных программных системах этот подход практически не используется. Задача решения логических уравнений понимается как задача поиска наборов переменных, удовлетворяющих данному уравнению [39], смысловая же информация, содержащаяся в уравнении, остается невостребованной.
Цель настоящей работы — создание компьютерной системы, реализующей булеву алгебру. Такая система предоставляет программный инструментарий для автоматического преобразования булевых выражений, а также позволяет создавать произвольные процедуры алгебраических преобразований булевых выражений, в частности и такие, применение которых затруднено в других программных системах. Например, в системе реализованы конъюнкция и дизъюнкция двух булевых выражений, а также дополнение и инверсия выражения. На основе указанных процедур в качестве примера реализован метод Буля-Порецкого решения систем булевых уравнений [6]. В настоящей работе реализация компьютерной алгебры достигнута путем кодирования выражений высокоуровневыми типами данных и программирования процедур манипулирования выражениями в закодированном виде. Созданы процедуры перевода булева выражения из строки символов во внутреннее представление и обратно; все преобразования выражений производятся с кодами выражений. Компьютеризация булевой алгебры осуществлена на языке диалоговой системы структурированного программирования ДССП [13]. При этом использовано имеющееся в ДССП конструктиве программирование, предоставляющее пользователю возможность создавать высокоуровневые типы данных - конструкты. Конструкт как тип данных характеризуется форматом памяти и базисным набором процедур, интерпретирующих принимаемое им значение. Формат определяет структуру, информационную емкость и способы доступа к памяти конструкта, а набор интерпретирующих процедур устанавливает истолкование конструкта. Например, конструкт «целое без знака» определен на основе формата «вектор битов» посредством соответствующего базисного набора интерпретирующих процедур - арифметических операций. На основе этого же формата можно создать конструкт «строка символов», введя другой базисный набор интерпретирующих процедур.