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

Об автоматизированной спецификации, верификации и синтезе управляющих программ реального времени на базе логического и алгебраического подходов Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
144
69
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Тюгашев А. А.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Об автоматизированной спецификации, верификации и синтезе управляющих программ реального времени на базе логического и алгебраического подходов»

Тюгашев А.А. ОБ АВТОМАТИЗИРОВАННОЙ СПЕЦИФИКАЦИИ, ВЕРИФИКАЦИИ И СИНТЕЗЕ УПРАВЛЯЮЩИХ ПРОГРАММ РЕАЛЬНОГО ВРЕМЕНИ НА БАЗЕ ЛОГИЧЕСКОГО И АЛГЕБРАИЧЕСКОГО ПОДХОДОВ

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

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

Согласно российским и международным стандартам (ИСО 9126, ГОСТ 28195-89), качество программной системы характеризуется рядом базовых показателей, в числе которых такие важнейшие, как:

- корректность, то есть соответствие программы спецификации;

- надежность (отсутствие ошибок, восстанавливаемость и др.);

- эффективность (в том числе временная эффективность);

-сопровождаемость (в том числе удобство проведения анализа и простота внесения изменений).

При использовании формальных методов доказательства свойств программ рассуждения обычно проводятся следующим образом. Сначала формулируется на некотором языке спецификация программы. Что само по себе является отдельной проблемой. Используемый язык должен:

обладать полнотой и достаточной выразительной силой для записи всех функциональных требований и ограничений, накладываемых на программу;

быть непротиворечивым;

позволять записывать значимые свойства программ лаконично и удобно;

быть понятным и удобным для человека.

Далее, в рамках подхода Model Checking, для проведения верификации программа заменяется некоторой отражающей её поведение в интересующих нас аспектах (семантику) моделью, и доказывается или опровергается методами формального логического вывода наличие тех или иных свойств. Возможен также и другой подход, когда каждый из операторов (базовых конструктов) программы характеризуется на языке так называемых пред- и постусловий (см. работы Флойда, Хоара и др. [6, 9]), а также описывается

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

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

Рассмотрению перечисленных вопросов применительно к специальной области управляющих алгоритмов реального времени, посвящена настоящая статья.

Логический подход к спецификации, верификации и синтезу программ

Исторически использовать математическую логику для описания программ впервые предложил Х.Б. Керри. В 1952 году им был сделан доклад «логика программных композиций», идеи которого опередили свое время, по крайней мере, на 25 лет. В середине 1960-х годов практически одновременно появился ряд пионерских работ в области описания условий, которым должна удовлетворять программа. В.М. Глушков в 1965 г. предложил алгоритмические алгебры [8], ставшие прообразом появившихся позднее динамических логик, Ф. Энгелер в 1967 г. - использование языков с бесконечно длинными формулами, чтобы выражать множество возможностей, возникающих при различных исполнениях программы. Но наиболее популярными стали языки алгоритмических логик, которые были изобретены практически одновременно Р.У. Флойдом (1967 г.), С.А.Р. Хоаром (1969 г.), и учеными польской логической школы (А. Сальвицкий и др., 1970 г.). В рамках данного направления как программа, так и отдельный оператор рассматриваются с точки зрения так называемых пред- и постусловий, так, запись {U} S {B} читается как высказывание, что до исполнения программы (оператора) S истинно условие U, а после исполнения - условие B.

В 1968 г. Э. Бишоп отметил, что если пользоваться не классической логикой и математикой, а конструктивной, то в принципе возможна цепочка чисто формальных преобразований: постановка задачи

(спецификация) ^ конструктивное доказательство (извлечение программы) ^ программа.

В процессе развития области использования логик для анализа свойств программ выяснилось, что в этой области более применимы специальные логики (модальные, временные), нежели классическое исчисление предикатов. Так, к примеру, каждое состояние программы, возникающее в процессе ее исполнения, аналогично «возможному миру» семантики неклассических логик; граф операционно-логической истории программы [7] определяет переходы между этими мирами. Модальности «необходимости» и «возможности» значительно расширяют язык описания свойств программ, делают его более выразительным и богатым. Первое упоминание об использовании временных операторов для верификации программ, появилось у Р. Бурсталла (1974 г.), и касалось последовательных программ, однако наиболее интенсивное развитие

данное направление получило позднее применительно к параллельным программам.

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

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

ческими характеристиками управляемых процессов временные рамки, такие системы принято относить к так называемым «жёстким» системам реального времени, поскольку в случае сбоя в управлении последствия могут быть катастрофическими.

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

Выполняя формальные спецификации и наблюдая за поведением описываемой системы, можно проверить, реализуют ли спецификации предполагаемые функциональные требования, или нет. Например, можно проверить, не возникают ли определенные нежелательные последовательности событий при некоторых критических обстоятельствах. Таким образом, как бы производится тестирование на ранней фазе процесса разработки. К сожалению, традиционная временная логика [4] плохо подходит для описания свойств систем управления реального времени. Неадекватность классической временной логики проблемам спецификации систем реального времени основана на том факте, что ее операторы обеспечивают только качественное представление времени, таким образом, обеспечивая способы выражения таких свойств, как предшествование, возможность или постоянство во времени. Только наличие оператора «следующий момент времени» приближает временную логику к количественному представлению времени: например, с его применением

можно постулировать, что данное свойство будет сохраняться на протяжении k «тиков» (тактов) времени, начиная с текущего момента.

Другой подход описывается интервальной логикой, которая предоставляет 'прерывающийся' оператор для конкатенации интервалов и разрешает мгновенное описание последовательностей событий и свойств, сохраняющихся в различимых, смежных интервалах. Интервальная логика страдает, однако, от тех же самых ограничений, что и классическая временная логика, начиная с ее особенностей представления количественных временных ограничений времени в конечном счете основано на операторе «следующего момента времени» линейной временной логики (Linear Temporal Logic, LTL).

Впоследствии временные логики были развиты такими авторами, как Бернстейн и Хартер, Морценти, и др. Ими были сформулированы метрическая временная логика (Metric Temporal Logic), временная интервальная логика реального времени (Real-Time Temporal Interval Logic), временная логика реального времени (Real-Time Temporal Logic, RTTL). При этом в качестве семантической модели часто применяются таймированные автоматы (time automata)

Алгебраический подход (алгебры процессов)

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

Был сформулирован [5] базовый набор аксиом относительно операций, производимых над процессами, так, что можно сказать, что алгеброй процессов может являться любая математическая структура, удовлетворяющая этим аксиомам. Процесс - элемент алгебры процессов. Используя аксиомы, можно производить 'вычисления' над процессами. Список этих аксиом приведен ниже.

Здесь для обозначения основных операторов над процессами, используется +, обозначающий альтернативную композицию (выполнение либо одного процесса, либо другого), ; обозначающий последовательную композицию, и I , обозначающий параллельную композицию (с точки зрения порядка выполнения операций + рассматривается как самый слабый, ; , как самый сильный): x + y = y + x (коммутативность альтернативной композиции)

x + (y + z) = (x + y) + z (ассоциативность альтернативной композиции)

x + x = x (идемпотентность альтернативного состава)

(x + y) ; z = x ; z + y ; z (правая дистрибутивность + относительно ; )

(x; y); z = x; (y; z) (ассоциативность последовательной композиции)

x і y = y і x (коммутативность параллельной композиции)

(x і y) і z = x і (y і z) (ассоциативность параллельной композиции)

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

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

Основоположниками алгебр процессов стали такие авторы, как Ганс Бекик, Робин Милнер, развивший свою теорию процессов CCS (Calculus of Communicating Systems), Тони Хоар - автор CSP

(Communicating Sequential Processes).

Приблизительно в 1980, теория параллелизма, и особенно теория процессов становится активной областью исследований, во всем мире. Сюда относятся, в частности, исследования сетей Петри.

Ян Бергстра (Bergstra) и Ян Вильям Клоп в 1982 начали работать в данной проблемной области, именно им принадлежит термин «алгебра процессов», ими была развита алгебра процессов ACP, и производные от нее алгебры.

В последующие годы получили развитие и другие алгебры процессов (ATP, SCCS, CIRCAL, MEIJE, алгебра Хеннеси и др.).

Каждая из разработанных алгебр процессов имеет свой собственный набор преимуществ и неудобств. Были разработаны также некоторые инструментальные программные системы для облегчения приложения алгебр процессов к анализу систем. Самый известный общий инструмент - Concurrency Workbench, основанный на алгебре типа CCS. В традиции CSP, существует инструментальная система FDR (см.

http://www.fsel.com/). Главной проблемой, подлежащей решению при разработке подобной инструментальной системы, является необходимость соединить привлекательный пользовательский интерфейс с мощным и быстрым ядром. Дальнейшее развитие алгебр процессов проходило также в направлении расширения количественным учетом времени.

Синтез логического и алгебраического подходов при проектировании алгоритмов управления КА

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

При этом для современных космических аппаратов характерным является применение бортовых цифровых вычислительных машин (БЦВМ), для решения задач управления бортовой аппаратурой [1]. Даже на микро-и наноспутниках использование управляющего бортового компьютера (бортовой информационной системой) сейчас стало нормой [2].

При этом по ряду причин, включающих, в частности, простоту коррекции БПО и добавления в него дополнительных задач; возможность оперативного дистанционного изменения состава решаемых БПО задач; более эффективную загрузку вычислительных ресурсов, для сложных многофункциональных комплексов БПО, в которых моменты начала и окончания решения задач могут меняться в широких пределах в зависимости от временных разбросов работы бортовой аппаратуры (БА) и исходных данных, передаваемых с Земли, предпочтительно использование приоритетной динамической асинхронной организации вычислительного процесса [1]. Данная дисциплина организации вычислительного процесса характеризуется тем, что управление работой бортовой вычислительной системы (БВС) осуществляется бортовой операционной системой (БОС) реального времени, которая обеспечивает параллельное исполнение ряда задач на одной или нескольких БЦВМ, с поддержкой системы прерываний как по сигналам от бортовой аппаратуры, так и от специального устройства отсчета времени - таймера.

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

Обозначим набор базовых ЦЗ КА как

71, У2 Тк.

Привязанные к опорным моментам шкалы времени, целевые задачи образуют пары:

(71, Топ2), (71, Топ2 ),■■■, (тк, Тож).

Обратим внимание также на важное обстоятельство: многие целевые задачи (например, работа двигательной установки для сообщения требуемого импульса) имеют определенную длительность выполнения. Поэтому циклограмма выполнения ЦЗ выглядит так, как это представлено на рисунке 1.

В свою очередь, реализация каждой ЦЗ верхнего уровня требует, как правило, согласованной работы нескольких систем, приборов, агрегатов, датчиков и других элементов БА, каждый из которых при этом должен обеспечить выполнение набора функциональных задач f1, f2... fN в некоторые моменты времени t1,t2,...tN. При этом моменты времени t1,t2,...tN зависят от времени выполнения основной ЦЗ и привязываются, таким образом, к Топ. Аналогично основным ЦЗ, функциональные задачи также имеют определенные длительности исполнения - Т1,Т2,...%.

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

Для описания спецификации (требований к логике управления) на вербальном уровне часто применяются такие выражения, как «За 5 минут до X необходимо включить режим Р», «В момент срабатывания X подаются команды f 2,f5», «операции f2, f3 должны завершиться к началу работы системы С», «В случае Y с интервалом в 1 с выдаются команды f1, f2, f3», «Не менее чем через 7 мксек после X обмен данными может быть возобновлён путём выдачи команды f10».

Таким образом, как видим, для спецификации требований к времени выполнения могут быть использованы как временная (темпоральная) логика [4], а в процессе конструирования комплексного управляющего алгоритма -аппарат алгебры процессов реального времени [5].

При этом в процессе проектирования бортового комплекса управления и соответствующего бортового программного обеспечения (БПО) важно знать временные характеристики программ, начиная с самых ранних этапов проектирования БПО и КА в целом.

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

Авторами предлагается адаптированная к проблематике проектирования управляющего БПО и расширенная по сравнению с имеющимися (Real-Time Temporal Logic А. Пнуели, Process Algebra with Timing Я. Бергстры) формальная система, обладающая свойствами временной логики, которая позволяет учитывать

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

А.А. Калентьевым была предложена и исследована [3] алгебра управляющих алгоритмов (УА) реального времени, включающая операции во временном пространстве:

1. Операция совмещения по началу СН, означающая задание общего (одинакового) времени запуска некоторых управляющих алгоритмов.

2. Операция совмещения по концу СК, означающая задание общего времени окончания выполнения управляющих алгоритмов.

3. Операция следования >, означающая запуск некоторого УА сразу после окончания выполнения другого УА.

Также введена операция в логическом пространстве => (смысл операции заключается в обуславливании выполнения той или иной функциональной задачи истинностью или ложностью некоторого логического условия). Эта операция позволяет точно специфицировать альтернативную композицию в терминах текущей бортовой ситуации, то есть в данном случае она специфицирует теорему расширения алгебры процессов в понимании [5].

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

В качестве основного множества (носителя) алгебры при этом А.А. Тюгашевым был предложен набор четвёрок следующего вида.

УА РВ = { < fi, ti, Ti, li > }, i=1,N ,

где fi - функциональная программа (действие); ti - момент начала исполнения действия (целое не-

отрицательное число); Ti - длительность действия (целое неотрицательное число); li - логический вектор, обуславливающий действие. Нетрудно видеть, что графическим образом (за исключением логической компоненты) представленной математической модели будет циклограмма вида рисунка 1.

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

Состояние системы в приведенной модели в некоторый момент времени описывается - с точки зрения вычислительного процесса:

выполняющимися в данный момент функциональными задачами;

признаками - завершены ли к данному моменту те или иные функциональные задачи.

И с точки зрения физики конкретной ситуации с БА и внешней средой космического аппарата - значениями логических переменных по принципу «Да»-«Нет».

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

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

Расширенная модель алгебраической системы управляющих алгоритмов допускает истолкование присутствующих в алгебре А.А. Калентьева символов СН, СК, >, как предикатов (утверждений) о соотношении управляющих процессов:

1. f1 CH f2 означает, что управляющие алгоритмы начинаются в одно и то же время (t1=t2).

2. f1 Ж f2 означает, что управляющие алгоритмы заканчиваются в одно и то же время (t1+Ti=t2+T2).

3. f1 > f2 означает, что момент старта алгоритма f2 совпадает (равен) моменту завершения выполнения алгоритма f (t1+Ti=t2).

Расширенная модель также вводит дополнительные символы << и ?, не задающие жёстких связок между процессами, а накладывающих некоторые ограничения, в рамках которых конкретное время выполнения операций может меняться:

4. Предикат f1 << f2, означающий, что момент окончания выполнения алгоритма f предшествует (строго меньше) момента старта алгоритма f2 (t1+Ti<t2).

5. Предикат f1 ? f2, который означает, что момент запуска управляющего алгоритма f предшествует моменту запуска управляющего алгоритма f2(t1 < t2).

При этом теория интерпретируется на том же самом множестве, что и алгебра УА. Очевиден при этом тот факт, что в случае применения операций алгебры УА CH, CK, > тождественно истинными будут одноимённые им предикаты CH, CK, >. Кроме того, можно использовать при рассуждениях также следующие соотношения.

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

ЛИТЕРАТУРА

1. Управление космическими аппаратами зондирования Земли: Компьютерные технологии / Д.И. Козлов, Г.П. Аншаков, Я.А. Мостовой, А.В. Соллогуб. - М.:Машиностроение, 1998.

2. Ю.М. Урличич, А.С. Селиванов, В.М. Вишняков, Ю.М. Тучин. Предварительные результаты летных испытаний технологического наноспутника ТНС-0 // Тезисы докладов 10-й международной конференции «Системный анализ, управление и навигация». - М.:Изд-во МАИ, 2005, С.24-25. (БА)

3. А.А. Калентьев. Автоматизированный синтез алгоритмов асинхронного управления технологическими системами с множеством дискретных состояний / Самар.аэрокосм.ун-т. Самара,1998.

4. Ben-Ari M., Manna, Z., Pnueli A.: The Temporal Logic of Branching Time. Proc. 8th Annual Symposium on Principles of Programming Languages, 1981, ACM Press, Williamsburg, p. 164-176. Springer-Verlag, 1992.

5. Baeten J.C.M., Bergstra J.A.: Real time Process Algebra. Formal Aspects of Computing, 3,

p.142-188, 1991.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

6. Логика и компьютер. Моделирование рассуждений и проверка правильности программ / А.М. Анисов, П.И. Быстров, В.А. Смирнов и др.-М:Наука, 1990.

7. Касьянов В.Н., Евстигнеев В.А. Графы в программировании: обработка, визуализация и примене-

ние. -СПб.:БХВ-Петербург, 2003.

8. Глушков В.М., Цейтлин Г.Е., Ющенко Е.Л. Алгебра. Языки. Программирование.-Киев:Наукова думка, 1978.

9. Хоор Ч. А. З. Непротиворечивые взаимодополняющие теории семантики языков программирования // В сб.:Семантика языков программирования.-М.:Мир, 1980

i Надоели баннеры? Вы всегда можете отключить рекламу.