Text
                    Edmund M. Clarke, Jr.
Orna Grumberg
Doron Peled
Model Checking
The MIT Press
Cambridge, Massachusetts
London, England


Эдмунд М. Кларк, мл. Орна Грамберг Дорон Пелед Верификация моделей программ: Model Checking Перевод с английского В.Захаров, Р.Кончаков и Д.Царьков под редакцией Р.Смелянского Издательство Московского центра непрерывного математического образования Москва 2002
УДК 519.68 ББК 22.18 К47 К47 Кларк Э.М., Грамберг О., Пелед Д. Верификация моделей программ: Model Checking. Пер. с англ. / Под ред. Р. Смелянского. - М.: МЦНМО, 2002. — 416 с: ил. ББК 22.18 В монографии всемирно известных специалистов в области математической логики и теории вычислений представлено полное и подробное изложение нового подхода к решению задачи проверки правильности функционирования сложных программных систем. Издание осуществлено при финансовой поддержке Российского фонда фундаментальных исследований (РФФИ) грант №1-01-Ц031 Права на издание этой книги на русском языке получены при участии агенства Александра Коржевенского. ISBN 0-262-03270-8 (англ.) © 1999 Edmund М. Clarke, Jr., ISBN 5-94057-054-2 (русск.) Orna Grumberg, and Doron A. Peled © 2001 MIT Press, 3rd printing © 2002 МЦНМО, перевод с англ. Эдмунд М. Кларк, Орна Грамберг, Дорон Пелед Верификация моделей программ: Model Checking Лицензия ИД N 01335 от 24/Ш 2000 года. Подписано к печати 29.08.2002 Формат 60x90/16. Бумага офсетная. Печать офсетная. Объем 26 печ. л. Тираж 1000 экз. Заказ Издательство Московского центра непрерывного математического образования. 121002, Москва, Г-2, Бол. Власьевский пер., 11. Отпечатано с готовых диапозитивов в "Облиздат". Калуга, пл. Старый торг, 5.
Оглавление От редактора перевода 9 Вступительное слово 14 Предисловие 17 1. Введение 21 1.1. Необходимость использования формальных методов . 21 1.2. Верификация аппаратуры и программного обеспечения 23 1.3. Процесс верификации моделей программ 25 1.4. Темпоральная логика и проверка на модели 26 1.5. Символьные алгоритмы 29 1.6. Редукция частичных порядков 32 1.7. Другие подходы к проблеме «комбинаторного взрыва» 34 2. Моделирование систем 37 2.1. Моделирование параллельных систем 38 2.1.1. Представления первого порядка 39 2.1.2. Степень детализации переходов 41 2.2. Параллельные системы 43 2.2.1. Цифровые схемы 43 2.2.2. Программы 46 2.2.3. Параллельные программы 49 2.3. Пример трансляции программы 51 3. Темпоральные логики 55 3.1. Логика деревьев вычислений CTL* 56 3.2. CTL и LTL 59 3.3. Справедливость 61 4. Верификация моделей 64 4.1. Верификация моделей для CTL 64 4.1.1. Ограничения справедливости 70 4.2. Табличная верификация моделей для LTL 72 4.3. Верификация моделей для CTL* 79 5. Двоичные разрешающие диаграммы 83 5.1. Представление булевых функций 83
5.2. Представление моделей Крипке 91 6. Символьная верификация моделей 95 6.1. Представления неподвижной точки 95 6.2. Символьная верификация моделей для CTL 102 6.2.1. Квантифицированные булевы формулы 102 6.2.2. Символьный алгоритм верификации моделей . 103 6.3. Как учитывать справедливость при верификации . . . 105 6.4. Контрпримеры и свидетельства 109 6.5. Пример АЛУ 113 6.6. Вычисление реляционных произведений 117 6.6.1. Расщепленные отношения переходов 119 6.6.2. Рекомбинация разбиений 126 6.6.3. Еще раз о примере АЛУ 126 6.7. Символьная верификация моделей для LTL 128 7. Верификация моделей для /х-исчисления 141 7.1. Введение 141 7.2. Пропозициональное /х-исчисление 143 7.3. Вычисление значений формул неподвижной точки . . 146 7.4. Представление формул /х-исчисления 152 7.5. Трансляция CTL в /х-исчисление 154 7.6. Вопросы сложности 155 8. Верификация моделей на практике 157 8.1. Программа SMV верификации моделей 157 8.2. Пример из практики 162 9. Верификация моделей и теория автоматов 172 9.1. Автоматы на конечных и бесконечных словах 172 9.2. Верификация моделей при помощи автоматов 174 9.2.1. Недетерминированные автоматы Бюхи 180 9.2.2. Обобщенные автоматы Бюхи 181 9.3. Проверка пустоты 182 9.4. Трансляция LTL в автоматы 186 9.5. Верификация моделей на лету 193 9.6. Символьная проверка вложенности языков 195 10. Редукция частичных порядков 197 10.1. Параллельность в асинхронных системах 198
10.2. Независимость и невидимость 201 10.3. Редукция частичных порядков для LTL_je 205 10.4. Пример 210 10.5. Вычисление достаточных множеств 213 10.5.1. Сложность проверки условий 213 10.5.2. Эвристики для достаточных множеств 216 10.5.3. Редукция на лету 220 10.6. Корректность алгоритма 221 10.7. Редукция частичных порядков в системе SPIN 227 11. Эквивалентности и квазипорядки на моделях 234 11.1. Алгоритмы эквивалентности и квазипорядка 244 11.2. Табличная конструкция 247 12. Композиционные доказательства 252 12.1. Композиция моделей 255 12.2. Обоснование по схеме «допущение—подтверждение» . 257 12.3. Верификация устройства управления 258 13. Абстракция 262 13.1. Редукция по конусу влияния 262 13.2. Абстракция данных 265 13.2.1. Вычисление аппроксимаций 269 13.2.2. Точные аппроксимации 274 13.2.3. Простой язык 275 13.2.4. Пример абстракций 277 13.2.5. Конгруенция по модулю натурального числа . . 277 13.2.6. Представление по логарифму 280 13.2.7. Абстракции одиночного бита и декартова произведения 281 13.2.8. Символьные абстракции 282 14. Симметрия 286 14.1. Группы и симметрия 286 14.2. Фактормодели 290 14.3. Верификация моделей с использованием симметрии . 293 14.4. Вопросы сложности 296 14.4.1. Задача вычисления орбит и изоморфизм графов 296 14.4.2. Отношение орбит и OBDD 298
14.5. Практические результаты 301 15. Бесконечные семейства конечных систем 304 15.1. Темпоральные логики для бесконечных семейств . . . 304 15.2. Инварианты 305 15.3. Пересмотренный пример FuturebusH- 308 15.4. Графовые и сетевые грамматики 311 15.5. Неразрешимость семейства колец с маркерами 322 16. Дискретное время и количественный анализ 327 16.1. Системы реального времени 327 16.2. О верификации систем реального времени 329 16.2.1. Родственные методы верификации систем реального времени 329 16.3. Проверка выполнимости на модели для RTCTL .... 331 16.4. Количественный временной анализ 332 16.4.1. Алгоритм вычисления минимальной задержки 332 16.4.2. Алгоритм вычисления максимальной задержки 333 16.5. Пример: бортовая система управления 336 16.5.1. Описание системы 336 16.5.2. Модель бортовой системы управления 338 16.5.3. Результаты верификации 340 17. Непрерывное реальное время 343 17.1. Временные автоматы 344 17.2. Параллельная композиция 347 17.3. Моделирование временными автоматами 349 17.4. Часовые области 352 17.5. Часовые пояса 361 17.6. Матрицы разностных границ 367 17.6.1. Вопросы сложности 372 18. Заключение 373 19. Литература 377 Предметный указатель 400
От редактора перевода Сегодня положение дел в области создания систем передачи и обработки данных настораживает диспропорцией темпов развития трех ее основных компонентов: микропроцессорной техники, средств телекоммуникации и инженерии программного обеспечения. Согласно закону Мура быстродействие микропроцессоров удваивается без изменения их стоимости каждые 18 месяцев, пропускная способность каналов передачи данных растет на 75% каждые 12 месяцев, и лишь в индустрии программного обеспечения скорость разработки программных систем растет всего на 4-5% в год. Происходит это, в значительной степени, из-за отсутствия удовлетворительного для промышленности решения проблемы проверки правильности логических схем вычислительных устройств и программ. Например, из практики разработки программного обеспечения хорошо известно, что примерно 2/3 времени, затрачиваемого на создание системы, приходится на отладку, т. е. проверку ее правильности. Каждый этап в развитии программирования приносит новый взгляд на эту проблему: специфический промежуточный этап в создании программ и систем, почти детективное расследование, математическая головоломка, дело необычайной трудоемкости, доступное лишь посвященным, своеобразное искусство, особого рода логическое рассуждение. Все эти взгляды нашли отражение в специальной литературе. Перед Вами книга, отражающая еще один взгляд на эту проблему, как проблему математическую. Уже один этот факт говорит о том, что взгляд на эту проблему достиг зрелости, и ставит эту книгу в один ряд с такими замечательными произведениями, как "Дисциплина программирования" Э. Дейкстры, "Наука программирования" Д. Гриса, "Введение в теоретическое программирование: беседы о методе" А. П. Ершова. Профессор Кларк, один из авторов этой книги, — родоначальник метода model checking - проверки правильности на модели. В этом факте важны два обстоятельства. Практика показывает, что люди, стоявшие у истоков какого-то направления, видят возможности и перспективы его развития шире и глубже, нежели их по-
10 следователи: первоисточник всегда лучше переложения. Второе обстоятельство состоит в том, что мастерство педагога и ученого позволило выстроить изложение компактно и исчерпывающе. В этой книге авторы не только подробно отразили уже достигнутое, проиллюстрировав изложение примерами из практики, но и щедро поделились перспективными направлениями развития метода проверки правильности на модели. Эта книга будет полезна системотехникам, разработчикам программного обеспечения, специалистам по теории вычислений (theoretical computer science), студентам и аспирантам соответствующих специальностей. Смелянский Р.Л. От переводчиков Вы держите в руках весьма необычную книгу. Каждый, кто занимался программированием, знает, что самый трудный, а порою просто мучительный этап разработки компьютерной программы — это отладка и проверка правильности функционирования программы. При построении алгоритма и выборе системы программирования существенным подспорьем могут служить многочисленные пособия, справочники, руководства и пр. Проверка синтаксической правильности программы и ее преобразование в исполняемый машинный код проводится полностью автоматически синтаксическими анализаторами и компиляторами, которыми снабжена каждая система программирования. Но вот при отладке разрабатываемой программы проектировщик остается с нею один на один и вынужден полагаться на личный опыт, чутье и в некоторых случаях на скромный набор рекомендаций, определяющих методику тестирования. Средства отладки программы (debuggers), которые входят в состав всякой развитой системы программирования, могут помочь разработчику в той же мере, в какой лопата оказывает помощь кладоискателю. Главные вопросы — где копать и стоит ли копать вообще? Здесь скорее пригодилось бы устройство наподобие электромагнит-
11 ного металлоискателя. Но хороший металлоискатель — это тонкий инструмент, требующий знания его устройства и умелого обращения. В этой книге речь как раз идет об автоматических системах поиска ошибок и проверки правильности функционирования программ и вычислительной аппаратуры, о новых принципах и алгоритмах верификации, об их достоинствах и недостатках, областях применения и перспективах развития. Model checking — это один из наиболее перспективных и широко используемых подходов к решению проблемы автоматизации отладки и проверки правильности программ. Его суть проста. Для заданной анализируемой программы строится ее абстрактная формальная модель (например, система переходов). Проверяемое свойство или требование выражается на формальном математическом языке (например, представляется в виде логической формулы). После этого верификация программы сводится к проверке выполнимости формализованного требования (спецификации) на абстрактной модели программ. Как только удается найти алгоритм построения модели по заданной программе и алгоритм проверки спецификации на заданной модели, мы получаем возможность построить автоматическую систему верификации программ, удобную для практического применения. Все, что требуется от пользователя такой системы, — это описать свойство программы, которое необходимо проверить, на подходящем формальном языке спецификаций. Простота принципа model checking не вырождается в банальность. Имеется большое разнообразие абстрактных моделей программ, формальных языков спецификаций и алгоритмов проверки спецификаций на моделях. Здесь, скорее, грозит embarras de richesse: в мире уже имеется свыше двадцати действующих систем верификации программ, построенных по принципу model checking, а также многие десятки самых разных алгоритмов проверки выполнимости спецификаций на моделях программ. Настоящая книга поможет детально ознакомиться с методом model checking, увидеть, насколько хорошо этот метод подходит для верификации параллельных и распределенных программ, коммуникационных протоколов, логических схем, оценить те трудности, которые приходится преодолевать в стремлении приспособить model checking для решения реальных прикладных задач. Читатель-прагматик сможет убедиться в том, что model-checking — это не очередная -«теоретическая погремушка». Мы уверены, что простота, дееспособность и эффективность систем верификации программ по принципу model checking, подтвержден-
12 ная примерами довольно изощренных ошибок, которые были обнаружены при помощи этих систем в реальных программах и протоколах, не оставят его равнодушным. Те из читателей, которые ценят изящество математических построений, будут приятно удивлены широким охватом разнообразных разделов математики, которые привлекаются здесь для верификации программ. Теории матриц, решеток, булевых функций, графов, автоматов, формальных языков, игр, а также математическая логика, комбинаторика, линейное программирование — вот далеко не полный перечень разделов математики, результаты и методы которых находят существенное применение при построении эффективных систем верификации программ. Вместе с тем материал книги столь удачно скомпонован, что большая его часть вполне «по зубам» любому студенту, одолевшему стандартные курсы дискретной математики и математической логики. В двух предисловиях и введении, открывающих настоящую книгу, достаточно подробно и полно рассказывается об истоках принципа model checking, его отличительных качествах, возможностях практического применения, основных направлениях развития и т. д. Поэтому мы ограничимся несколькими замечаниями, касающимися некоторых особенностей нашего перевода. Многие термины, фигурирующие в настоящей книге и относящиеся, в первую очередь, к темпоральным логикам, не имели до сих пор адекватного перевода на русский язык. Мы предполагаем, что часть из них будет со временем скалькирована с английского, но тем не менее сочли своим долгом во всех таких случаях воспользоваться современным словарным запасом русского языка. Иногда в тексте нами предлагается несколько вариантов перевода одного и того же термина. Так, например, мы переводили сам термин model checking как «верификация моделей программ» в тех случаях, когда речь шла об общем принципе, и как «проверка выполнимости на модели», когда подразумевалось конкретное воплощение этого принципа применительно к формулам темпоральных логик и специальным моделям программ. Мы предложили также русские названия для операторов темпоральных логик. Надеемся, что читатель сочтет их вполне уместными. Мы хотим заметить также, что model checking не ограничивается только теми приложениями и моделями программ, которые описаны в настоящей книге. Область его применения неуклонно расширяется. Верификацию моделей можно проводить не только для логических схем, параллельных программ и коммуникационных протоко-
13 лов, но и, например, для последовательных программ с рекурсивным вызовом процедур (см. М. Benedikt, P. Godefroid, and Т. Reps: Model checking of unrestricted hierarchical state machines. In Proc. of 28-th International Colloquium on Automata, Languages, and Programming, (Crete, Greece, July 8-12, 2001)), криптографических протоколов (см. E. M. Clarke, S. Jha, and W. Marrero: A machine checkable logic of knowledge for specifying security properties of electronic commerce protocols. LICS Security Workshop, 1998), смешанных (гибридных) систем (см. Thomas A. Henzinger, Pei-Hsin Ho, and Howard Wong-Toi: HyTech: a model checker for hybrid systems. Software Tools for Technology Transfer 1:110-122, 1997) с использованием сетей Петри (см. И. Б. Вирбицкайте, Е. А. Покозий: Метод параметрической верификации поведения временных сетей Петри. Программирование, 1999, N 4, с. 16-29), машин с абстрактными состояниями (см. Kirsten Winter: Towards a Methodology for Model Checking ASM: Lessons Learned from the FLASH Case Study. Lecture Notes in Computer Science, vol. 1912, 2000, p.341-360), алгебры процессов (см. Holger Hermanns and Joost-Pieter Katoen: Performance Evaluation := (Process Algebra + Model Checking)? Markov Chains. Lecture Notes in Computer Science, vol. 2154, p. 59-81) и др. Воспользовавшись подходящими терминами и хорошей поисковой системой, заинтересованный читатель сможет легко отыскать немало свежих материалов по этим темам. И последнее. При подготовке к изданию перевода на русский язык всемирно известной книги Е. Clarke, О. Grumberg, D. Peled "Model checking" коллектив переводчиков и редакторов воодушевляла важная мысль. Еще не так давно книги по математике и программированию располагались в книжных магазинах по соседству, а порою и вообще на одной полке. С тех пор их пути разошлись. Многочисленные пособия и справочники по программированию и компьютерам обособились и переместились в разряд технической литературы по соседству с руководствами по ремонту и эксплуатации автомобилей и пр. Мы рассчитываем, что настоящая книга будет одинаково интересна как <чистым> математикам, так и практикующим программистам, и будет способствовать укреплению связей между ними. Захаров В.А.
Вступительное слово Широко распространено мнение о том, что «помочь компьютерам принести нам еще больше пользы» и переложить на этих полезных партнеров все более сложные и тонкие задачи затруднительно не из- за недостаточного быстродействия и неудовлетворительных вычислительных возможностей существующих машин, а, главным образом, из-за нашей ограниченной способности проектировать и создавать сложные системы с достаточно высокой степенью уверенности в их корректности при любых обстоятельствах. Задача проверки правильности проектируемой системы, т. е. обеспечения ее корректности начиная с самых ранних этапов проектирования, является основным камнем преткновения в процессе разработки любой надежной системы, и усилия, затрачиваемые на ее решение, поглощают все возрастающую долю стоимости и времени проектировочного цикла. В настоящее время во многих фирмах для проверки правильности проекта практикуются старые добрые методы имитационного моделирования и тестирования. Хотя они зарекомендовали себя весьма эффективными на очень ранних стадиях отладки, когда проектируемая система все еще наводнена многочисленными ошибками, результативность этих методов быстро снижается, как только проектируемая система становится чище. При этом возрастающее время, которое требуется для обнаружения все более тонких ошибок, приводит в смятение. Применение указанных методов существенно осложняется тем, что никто не в силах узнать, когда их возможности уже исчерпаны, или хотя бы оценить, сколько ошибок может все еще таиться в проектируемой системе. Поскольку сложность проектируемых устройств возрастает чрезмерно, скажем, от 5 тысяч до 5 миллионов вентилей в кристалле, некоторые дальновидные руководители проектов начинают осознавать, что традиционные методы не дают никакой возможности увеличить масштабы проектов и могут привести к полному провалу. Весьма привлекательной и все более манящей альтернативой имитационному моделированию и тестированию становятся методы формальной верификации, которым посвященена настоящая книга. Поскольку при имитационном моделировании и тестировании задей-
15 ствованы только некоторые из возможных сценариев поведения проектируемой системы, остается открытым вопрос о том, не содержится ли фатальная ошибка в неисследованных траекториях; а вот формальная верификация обеспечивает исчерпывающий анализ всех возможных вариантов поведения системы. Таким образом, если проектируемая система, подвергнутая формальной верификации, была признана корректной, то это означает, что все варианты ее поведения были рассмотрены, и вопросов о том, насколько полно было проведено исследование и не упущены ли какие-нибудь особенности поведения, просто не возникает. В разное время было предложено несколько подходов к формальной верификации. В этой книге основное внимание уделяется методу верификации моделей (или проверки на модели), при помощи которого желаемые свойства поведения реагирующей системы проверяются на заданной системе (модели) путем исчерпывающего перебора (явного или неявного) всех состояний, достижимых системой, и всех поведений, проходящих через эти состояния. По сравнению с другими подходами метод проверки на модели обладает двумя замечательными преимуществами. ¦ Он полностью автоматизирован, и его применение не требует от пользователя никаких особых знаний в таких математических дисциплинах, как логика и теория доказательства теорем. Всякий, кто может провести моделирование проектируемой системы, вполне способен осуществить и проверку этой системы. В ряду сложившихся практических технологий метод проверки на модели может рассматриваться как безусловно наилучшее средство имитационного моделирования. ¦ Если проектируемая система не обладает желаемыми свойствами, то в процессе проверки на модели будет всегда построен контрпример, который демонстрирует поведение системы, опровергающее это свойство. Эта ошибочная трасса дает бесценную информацию для понимания действительной причины ошибки, равно как и важный ключ к решению возникшей проблемы. Эти два замечательных достоинства, а также открытие символьных методов верификации моделей, позволяющих проводить исчерпывающий неявный перебор в пространстве с астрономически большим числом состояний, совершили революционный переворот в области формальной верификации и перевели ее из чисто академической дисциплины в дееспособную практическую технологию,
16 которая потенциально может быть внедрена во многие промышленные процессы разработки в качестве ценного дополнительного метода для проверки правильности проектируемых систем. Достаточным свидетельством тому, что в промышленности широко признан огромный практический потенциал метода проверки на модели, служит большое число исследователей и разработчиков, которые создают оригинальные средства проверки на модели и занимаются их применением в большинстве крупных компаний по производству современных полупроводниковых устройств и процессоров. Нам очень повезло, что наконец появился настоящий учебник по принципам и методам верификации моделей, написанный авторами, которые прежде других способствовали постижению идеи метода проверки на модели, развивали ее с поразительной изобретательностью и настойчивостью, и достигли изумительного успеха. Я вполне уверен, что эта книга будет служить великолепным пособием и справочником для многих читателей: студентов, научных работников и практиков, заинтересованных в ознакомлении с многообещающим направлением формальной верификации и его воплощением в методе проверки на модели. Амир Пнуели
Предисловие Параллельные системы с конечным числом состояний естественным образом возникают во многих разделах теории вычислений, в частности при проектировании цифровых электронных схем и коммуникационных протоколов. Логические ошибки, проявляющиеся на поздних стадиях проектирования таких систем, представляют чрезвычайно важную проблему как для схемотехников, так и для программистов. Эти ошибки могут задержать появление нового продукта на рынке или привести к отказу в работе одного из критических устройств, уже находящихся в эксплуатации. Наиболее широко используемая техника верификации основана на интенсивном тестировании или моделировании и может легко пропустить существенные ошибки, когда число возможных состояний схемы или протокола очень велико. Хотя были проведены обширные исследования по применению систем доказательства теорем, систем переписывания, систем проверки доказательств для верификации, эти методы требуют большого количества времени, а подчас и значительной ручной работы. В 80-х гг. Кларком и Эмерсоном [61] в США, а также независимо Квайлом и Сифакисом [217] во Франции была разработана альтернативная техника верификации, получившая название верификации моделей или проверки на модели в темпоральной логике. При таком подходе спецификации представляются формулами пропозициональной темпоральной логики, а электронные схемы и протоколы моделируются системами переходов. Чтобы проверить, верна ли спецификация на системе переходов, применяется эффективная процедура поиска. Иными словами, система переходов проверяется на предмет того, является ли она моделью дня предъявленной спецификации. Проверка на модели обладает несколькими существенными преимуществами по сравнению с механическими системами построения или проверки доказательств, используемыми для верификации схем и протоколов. Наиболее важно то, что это полностью автоматическая процедура. В типичном случае пользователь предоставляет высокоуровневое описание модели и спецификацию для проверки. Алгоритм проверки на модели либо завершает работу с ответом true, означающим, что модель удовлетворяет спецификации, либо строит 3 Зак. 271
18 в качестве контрпримера некоторое вычисление, которое показывает, почему формула не выполняется. Контрпример особенно важен для поиска тонких ошибок в сложных системах переходов. Эта процедура также вполне быстрая и обычно выдает ответ за несколько минут. Допускается проверка частичных спецификаций, и поэтому нет необходимости строить полную спецификацию всей системы, до тех пор пока не будет получена полезная информация относительно ее корректности. Если спецификация не выполняется, другие формулы, не входящие в исходную спецификацию, могут быть проверены, чтобы локализовать источник ошибок. Наконец, логика, используемая для спецификаций, позволяет непосредственно выразить многие свойства, необходимые для проведения рассуждений о параллельных системах. Основной недостаток метода проверки на модели — это «комбинаторный взрыв» в пространстве состояний, который возникает, когда исследуемая система состоит из многих компонентов, переходы в которых могут выполняться параллельно. В таком случае с увеличением количества процессов число глобальных состояний системы может возрастать экспоненциально. Именно по этой причине многие исследователи в области формальной верификации предрекали, что метод проверки выполнимости на модели никогда не сможет быть использован на практике для анализа больших систем. Однако в конце 80-х гг. размеры систем переходов, допускающих верификацию путем применения указанного метода, поразительно возросли. Этого удалось добиться, главным образом, благодаря использованию двоичных разрешающих диаграмм — структур данных для представления булевых функций. Новые структуры данных позволили строить компактные представления систем переходов и осуществлять их быстрые преобразования. Эта методика оказалось особенно полезной для синхронных схем. Для асинхронных протоколов сокращение размера пространства состояний оказалось возможным за счет применения метода редукции частичных порядков. В основу этого метода положены следующие соображения: вычисления, отличающиеся порядком выполнения независимых действий, как правило, не различаются спецификациями и могут считаться эквивалентными. Поэтому нужно всего лишь проверить сокращенное пространство состояний, в котором содержится хотя бы по одному вычислению, представляющему каждый из классов эквивалентности. В результате разработки этих, а также ряда других подходов, описанных в данной книге, метод проверки на модели в настоящее
19 время стал широко использоваться в качестве практического средства верификации. В частности, некоторые компании приступили к выпуску на рынок инструментальных средств проверки на моделях. При написании книги мы преследовали цель сделать ее одновременно введением в методику верификации моделей и справочным пособием для исследователей. При этом мы старались, насколько это возможно, сохранить ее полной и самодостаточной. Однако исследования в этой области развиваются столь стремительно, что многие новые перспективные разработки охватить просто невозможно. Некоторые разделы книги являются более техническими по сравнению с другими, и при первом прочтении они могут быть опущены. Мы особо отмечали эти разделы, предназначенные в первую очередь для исследователей и практиков. Мы искренне надеемся, что эта книга послужит стимулом для дальнейших исследований в области верификации моделей. В заключение авторы выражают благодарность всем тем, кто способствовал созданию этой книги. Прежде всего и главным образом мы признательны Девиду Лонгу, без помощи которого наша книга не могла бы появиться. Мы также благодарны тем нашим коллегам, кто прочел и обсудил с нами первоначальные варианты этой книги. Это Эрик Аллен, Айлан Бир, Армии Бьер, Сергей Березин, Серджио Кампос, Чинь-Цун Чоу, Аллен Эмерсон, Коуш Итесами, Ниссам Франчес, Масахиро Фудзита, Яир Харел, Вольфганг Хей- нель, Хироми Хираши, Нейл Иммерман, Сомеш Джа, Айрита Катри- ел, Шмуель Катц, Боб Куршан, Ким Г. Ларсен, Юань Лю, Ян Малу- жинский, Уилл Марето, Морис Минеа, Бад Мишра, Ульф Нильсон, Войцех Пенчек, Амир Пнуели, Тосио Секигути, Субаш Шанкару, Зив Штадлер, Прасад Систла, Френк Стомпа, Вольфганг Томас, Моше Варди, Дон Ван, Пьер Вольпер, Бволен Ян, Хусну Йениген, Юншань Цу. Мы просим извинения у тех, кто помог нам в написании книги, но случайно не был включен в этот список. Эдмунд Кларк выражает признательность Михаелю Шостаку за его постоянную поддержку при написании этой книги. Дорон Пелед благодарен Марте Хабер- ман за гостеприимство в период его пребывания в весеннем семестре 1998 г. в университете Карнеги-Меллона. о*
Посвящается Марте, Селдону, Джонатану и Джефри Манфреду, Ноа и Хайле Хане и Ури Фельд и Дворе и Якову Цумер
А Введение Проверка на модели — это автоматический метод верификации параллельных систем с конечным числом состояний. Он обладает рядом преимуществ по сравнению с традиционными подходами к задаче верификации, основанными на моделировании, тестировании и дедуктивном анализе. Этот метод был успешно применен на практике для проверки правильности последовательных электронных схем и сложных коммуникационных протоколов. Основная трудность, которую приходится преодолевать в ходе проверки на модели, обусловлена эффектом «комбинаторного взрыва* в пространстве состояний. Эта проблема возникает в системах, состоящих из многих компонентов, взаимодействующих друг с другом, а также в системах, обладающих структурами данных, способными принимать большое число значений (примером может служить маршрут передачи данных в логических схемах). В таких случаях количество глобальных состояний может оказаться огромным. За последнее десятилетие в решении указанной проблемы был достигнут существенный прогресс. В этой главе мы сравним метод проверки на модели с другими формальными методами верификации аппаратных и программных систем. Мы расскажем о том, как этот метод применяется для верификации сложных систем. Мы проследим также этапы развития разных алгоритмов проверки на модели и обсудим разнообразные подходы, предложенные для преодоления «комбинаторного взрыва» в пространстве состояний. 1.1. Необходимость использования формальных методов В настоящее время аппаратные и программные системы широко используется во многих приложениях, где любой отказ считается недопустимым, таких как электронная коммерция, сети телефонных коммутаторов, системы управления воздушным и дорожным движением, медицинская аппаратура, и список этот довольно велик. Мы часто узнаем о происшествиях, в которых причиной аварии явилась ошибка в аппаратуре или программном обеспечении. Недавний при-
22 Глава 1. Введение мер такого отказа связан с ракетой «Ариан-5», взорвавшейся 4 июня 1996 г. менее чем через сорок секунд после запуска. Комиссия, расследовавшая аварию, обнаружила, что ее причиной послужила ошибка в программе компьютера, отвечавшего за расчеты движения ракеты. В ходе запуска возникла исключительная ситуация, когда большое 64-разрядное число с плавающей точкой было преобразовано в 16-разрядное целое число. Это преобразование не было защищено кодом для обработки исключительных ситуаций, что и привело к сбою компьютера. Та же самая ошибка привела к сбою дублирующего компьютера. В результате на бортовой компьютер ракеты были переданы неверные данные о высоте, что вызвало уничтожение ракеты. Группа, расследовавшая аварию, предложила ряд мер, которые необходимо предпринять для предотвращения подобных происшествий в будущем, включая верификацию программного обеспечения проекта «Ариан-5». Понятно, что потребность в надежной аппаратуре и программном обеспечении систем является острой. По мере того как возрастает участие таких систем в нашей жизни, растет и бремя ответственности за правильность их функционирования. К сожалению, безопасность уже нельзя восстановить, просто отключив неправильно работающую систему. Наша зависимость от подобных систем, работающих непрерывно, стала очень велика: в некоторых случаях отключение устройства несет большую опасность. И даже тогда, когда их отказ не представляет угрозы для жизни, экономические последствия замены ключевых фрагментов кода или схемы могут быть крайне тяжелыми. Успешное внедрение Интернета и встроенных систем в автомобилях, самолетах, а также в других жизненно важных устройствах, обеспечивающих безопасность, приводит к тому, что мы, вероятно, становимся все более зависимыми от правильности функционирования вычислительных устройств. Темпы надвигающихся перемен в ближайшие годы будут, по-видимому, только нарастать. Ввиду ускоряющегося технологического прогресса, еще более насущной задачей становится разработка методов, способствующих повышению нашей уверенности в правильности работы подобных систем.
1.2. Верификация аппаратуры и программного обеспечения 23 1.2. Верификация аппаратуры и программного обеспечения Основными методами проверки правильности сложных систем являются имитационное моделирование, тестирование, дедуктивный анализ и проверка на модели. Имитационное моделирование и тестирование [200] предусматривают проведение испытаний, перед тем как приступить к производству системы. В то время как имитационному моделированию подвергается абстрактная схема или прототип, тестирование применяется непосредственно к самому продукту. В случае электронных схем, например, имитационному моделированию подвергается проект разрабатываемой схемы, тогда как тестированию подвергается сама электронная схема. В обоих случаях в этих методах определенные сигналы обычно вводятся в заданных точках схемы, а в других точках снимают соответствующие показания. Что касается программного обеспечения, то имитационное моделирование и тестирование включают в себя ввод определенных исходных данных и наблюдение за соответствующими выходными результатами. Эти методы могут быть весьма экономичны для выявления многих ошибок. Однако проверить все возможные взаимодействия и обойти все мыслимые «ловушки», применяя лишь моделирование и тестирование, вряд ли удастся. Термин дедуктивный анализ обычно подразумевает применение аксиом и правил вывода для доказательства правильности функционирования системы. На ранних этапах исследований по дедуктивному анализу основное внимание уделялось обеспечению правильности работы ключевых систем. При этом считалось, что правильность их функционирования столь важна, что разработчик или эксперт по верификации (обычно математик или логик) может потратить столь много времени, сколько потребуется для верификации системы. Первоначально такие доказательства строились исключительно вручную. Со временем исследователи осознали, что можно разработать программные средства, способные применять должным образом аксиомы и правила вывода. Такие инструментальные средства также позволяют применять систематический перебор с целью поиска различных направлений продолжения доказательства из текущего состояния. Важность дедуктивного анализа широко признана специалистами в области вычислений. Этот метод оказал значительное влияние на подходы к разработке программного обеспечения (например, по-
24 Глава 1. Введение нятие инварианта заимствовано из исследований по дедуктивному анализу). Тем не менее, процесс дедуктивного анализа требует чересчур много времени и может быть осуществлен только экспертами, обладающими знаниями в области логического вывода и имеющими немалый практический опыт. Доказательство правильности отдельного протокола или электронной схемы может занять целые дни или даже месяцы. Поэтому дедуктивный анализ применяется нечасто. Он используется главным образом для проверки систем, наиболее чувствительных к сбоям, наподобие протоколов защиты, когда можно выделить необходимые ресурсы, для того чтобы гарантировать их безопасное использование. Важно осознавать также, что некоторые математические задачи не могут решены никаким алгоритмом. Теория вычислимости [142] устанавливает пределы того, что может быть решено алгоритмически. В частности, она показывает, что не существует алгоритма, способного распознать, завершается ли работа произвольной вычислительной программы (написанной на одном из языков программирования, наподобие Си или Паскаля). Это, конечно, ограничивает и возможности автоматической верификации. В частности, правильность завершения работы программы в общем случае нельзя проверить автоматически. По этой причине большинство систем построения доказательств не могут быть полностью автоматизированы. Преимущество методов дедуктивного анализа состоит в том, что они могут быть применены к системам с бесконечным числом состояний. Эту задачу можно до определенных пределов автоматизировать. Однако даже в том случае, когда проверяемое свойство действительно выполняется, нельзя наложить никаких ограничений на промежуток времени и объем памяти, необходимый для поиска доказательства. Метод верификации моделей (или проверки на модели) применяется для верификации систем с конечным числом состояний. Одно из преимуществ, связанных с указанным ограничением, заключается в том, что проверка может быть осуществлена чисто автоматически. Обычно процедура верификации заключается в исчерпывающем обходе пространства состояний системы, для того чтобы выяснить, выполняется ли спецификация. При наличии достаточных ресурсов эта процедура всегда завершается с ответом «да» или «нет». Более того, она может быть реализована достаточно эффективным алгоритмом, способным работать на вычислительных машинах невысокого класса (но обычно все-таки не на стандартных персональных компьютерах).
1.3. Процесс верификации моделей программ 25 Хотя ограничение, связанное с конечным числом состояний системы, выглядит весьма существенным недостатком, метод верификации моделей применим ко многим важным классам вычислительных систем. К таковым относятся контроллеры, а также многие коммуникационные протоколы. В некоторых случаях системы с бесконечным числом состояний могут быть проверены этим методом в сочетании с разнообразными правилами абстракции и индукции. Наконец, нередко ошибки можно обнаружить, ограничивая структуры данных до специальных случаев, когда число состояний конечно. Например, программа с неограниченной очередью сообщений может быть отлажена, если ограничиться рассмотрением очередей небольшого размера (два или три). Поскольку метод проверки на модели может применяться чисто автоматически, он предпочтительнее дедуктивного анализа в тех случаях, когда может быть использован. Тем не менее, всегда останутся некоторые жизненно важные приложения, для полной верификации которых необходимо проводить доказательство теорем. В связи с этим можно отметить новое перспективное направление [218], предусматривающее такую интеграцию дедуктивного анализа и метода проверки на модели, чтобы фрагменты системы, имеющие конечное число состояний, проверялись автоматически. 1.3. Процесс верификации моделей программ Применение метода проверки на модели состоит из нескольких этапов, каждый из которых подробно рассматривается в соответствующих разделах этой книги. Моделирование Первая задача заключается в приведении проектируемой системы к такому формальному виду, который был бы приемлем для инструментальных средств верификации моделей программ. Во многих случаях это просто задача компиляции. В других случаях, при ограничениях по времени н объему памяти, моделирование может потребовать абстракции, чтобы избавиться от несущественных деталей, не относящихся к делу. Спецификация Перед проведением верификации нужно сформулировать свойства, которыми должна обладать проектируемая системы. Обычно 2 Зак. 271
26 Глава 1. Введение спецификации задаются на языке формальной логики. Для аппаратуры и программного обеспечения, как правило, применяют темпоральную логику, позволяющую описывать, как поведение системы протекает во времени. Важным вопросом спецификации является полнота. Метод проверки на модели дает возможность убедиться, что модель проектируемой системы соответствует заданной спецификации, однако определить, охватывает ли заданная спецификация все свойства, которыми должна обладать система, невозможно. Верификация В идеальном случае верификация проводится полностью автоматически. Однако на практике она часто требует содействия человека. Одной из сторон деятельности человека является анализ результатов верификации. Бели результаты проверки отрицательные, то пользователю нередко предоставляют трассу, содержащую ошибку. Она строится в качестве контрпримера для проверяемого свойства и может помочь проектировщику проследить, где возникает ошибка. В этом случае анализ ошибочной трассы может повлечь за собой модификацию системы и повторное применение алгоритма проверки на модели. Ошибочная трасса может появиться и вследствие некорректного моделирования системы, а также в результате использования неправильной спецификации (в таких случаях говорят о ложном опровержении). Трасса, демонстрирующая ошибку, может оказаться весьма полезной для выявления этих двух проблем. Наконец, не исключена возможность, что решение задачи верификации не будет завершено из-за большого размера модели, не позволяющего разместить ее в памяти компьютера. В таком случае, возможно, будет необходимо провести верификацию повторно, изменив параметры инструментального средства, реализующего проверку на модели, или упростив саму модель (скажем, за счет более сильной абстракции). 1.4. Темпоральная логика и проверка на модели Темпоральные логики оказались полезным средством спецификации параллельных систем, поскольку они позволяют описывать порядок событий во времени без привлечения времени в явном виде. Эти логики были первоначально разработаны философами для исследования того, как феномен времени проявляется в рассуждениях
1.4. Темпоральная логика и проверка на модели 27 на естественном языке [145]. При всем многообразии изученных темпоральных логик большинство из них содержит Оператор вида G /, обращающийся в истину в настоящий момент времени, если / всегда истинно в будущем (т. е. если / истинно глобально). Чтобы заявить о том, что события ei и ег никогда не могут происходить одновременно, нам достаточно записать формулу G (-iei V -«2). Темпоральные логики обычно классифицируются в соответствии с тем, является ли структура времени линейной или ветвящейся. В нашей книге смысл всякой формулы темпоральной логики будет всегда определяться по отношению к размеченному графу переходов. В силу причин исторического характера структуры такого вида называются моделями Крипке. Многие исследователи, включая Берсталла [48], Крюгера [157] и Пнуели [214], предлагали использовать темпоральные логики для анализа поведения компьютерных программ. Однако именно Пнуели [214] был первым, кто использовал темпоральную логику для проведения рассуждений о параллельности. Его подход предполагал обоснование рассматриваемых свойств программы, исходя из системы аксиом, описывающих поведение отдельных операторов в программе. Этот метод был распространен на последовательные схемы Бохманом [25], а также Мейлахи и Овицким [182]. Но поскольку доказательства строились вручную, эту технику было трудно применять на практике. С изобретением в начале 80-х гг. Кларком и Эмерсоном алгоритмов проверки на модели для темпоральных логик [61, 103] этот тип рассуждений удалось автоматизировать. Так как проверять выполнимость формулы на одной единственной модели гораздо проще, нежели доказывать истинность формулы на всех моделях, данный подход можно было применять весьма эффективно. Алгоритм, разработанный Кларком и Эмерсоном для логики ветвящегося времени CTL, имел полиномиальную сложность как относительно размеров модели, определяемой рассматриваемой программой, так и относительно длины ее спецификации в темпоральной логике. Им удалось также показать, каким образом следует обращаться со справедливостью [120], не увеличивая при этом сложность алгоритма. Это был важный шаг, поскольку корректность многих параллельных программ зависит от допущения справедливости определенного вида. Например, отсутствие удушения в алгоритме взаимного исключения может зависеть от предположения о том, что каждый процесс совершает очередной шаг вычисления бесконечно часто. 2*
28 Глава 1. Введение Почти в то же самое время Квайл и Сифакис [217] представили алгоритм проверки на модели для подмножества CTL, но не привели оценок его сложности. Позднее Кларк, Эмерсон и Систла [63] выдвинули улучшенный вариант алгоритма, имеющий линейную сложность относительно произведения длины формулы на размер графа переходов. Алгоритм был реализован в системе верификации ЕМС, которая была широко распространена и использовалась для проверки ряда сетевых протоколов и последовательных схем [28, 29, 30, 31, 63, 98, 195]. Сначала системы верификации моделей были способны проверять графы переходов, содержащие от 105 до 106 состояний, со скоростью около 100 состояний в секунду для типичных формул. Несмотря на такие ограничения, верификаторы были успешно использованы для обнаружения ранее неизвестных ошибок в нескольких опубликованных электронных схемах. Систла и Кларк [230, 231] исследовали задачу проверки на модели для различных темпоральных логик и установили, в частности, что для темпоральной логики линейного времени (LTL) эта задача является PSPACE-полной. Пнуели и Лихтенштейн [171], проведя более подробный анализ трудоемкости решения задачи проверки формул логики линейного времени, обнаружили, что, хотя сложность задачи и растет экспоненциально относительно длины формулы, она линейно зависит от размера глобального графа переходов. На основе этого наблюдения они пришли к выводу, что вычислительная сложность верификации моделей логики линейного времени, хотя и весьма значительная в общем случае, может тем не менее оказаться приемлемой для коротких формул. В том же году Фудзита [119] реализовал систему верификации формул LTL, основанную на табличном методе, и продемонстрировал, каким образом ее можно применять для проверки правильности аппаратуры. Особенно выразительной является темпоральная логика CTL*, сочетающая операторы ветвящегося и линейного времени. Проблема проверки выполнимости формул этой логики на модели была впервые рассмотрена Кларком, Эмерсоном и Систлой [62]; им удалось установить, что эта задача PSPACE-полна и относится к тому же общему классу сложности задач, что и проблема проверки выполнимости формул LTL на модели. Этот результат можно усилить, показав, что проблемы проверки выполнимости формул CTL* и LTL на модели имеют одинаковую алгоритмическую сложность (с точностью до постоянного сомножителя) в зависимости от размеров графа переходов и формулы. Таким образом, для проверки на модели
1.5. Символьные алгоритмы 29 практический выигрыш по сложности не достигается, если ограничиваться только темпоральной логикой линейного времени [106]. Целым рядом других исследователей были предложены альтернативные подходы к проведению верификации параллельных систем. Многие используют автоматы как для спецификации, так и для реализации. При этом проверяется, насколько поведение автомата- реализации согласуется с его спецификацией. Поскольку для спецификации и реализации применяются модели одного и того же типа, реализация программы на одном уровне абстракции может быть использована как спецификация для уточненной модели при переходе на следующий уровень. Отношение включения для языков неявно использовалось в работе Куршана [1], которая в конечном счете привела к разработке очень мощной системы верификации COSPAN [132,133,160]. Варди и Волпер [243] впервые предложили применять ш-автоматы (автоматы над бесконечными словами) для автоматической верификации. Они показали, каким образом задачу проверки выполнимости формул темпоральной логики линейного времени на модели можно сформулировать в терминах отношения включения языков для ш-автоматов. Рассматривались также и другие виды согласованности автоматов, включая эквивалентность наблюдаемого поведения [77, 194, 222] и различные отношения уточнения [77, 193, 221]. 1.5. Символьные алгоритмы В первоначальных реализациях алгоритмов проверки на модели отношения переходов представлялись явно списками смежности. Для параллельных систем с малым числом процессов количество состояний обычно было сравнительно невелико, и такой подход чаще всего был вполне оправдан. Однако в системах, состоящих из многих параллельных фрагментов, количество состояний в глобальном графе переходов становилось чрезмерно большим для обработки. Осенью 19S7 г. МакМиллан [46, 189], занимаясь дипломной работой в университете Карнеги-Меллона, понял, что, используя символьное представление графа переходов, можно верифицировать гораздо более сложные системы. Новое символьное представление было основано на упорядоченных двоичных разрешающих диаграммах (OBDD) Бриана [34]. Представление в виде OBDD является канонической формой для булевых формул, существенно более компактной,
30 Глава 1. Введение нежели конъюнктивные и дизъюнктивные нормальные формы; для манипуляции с OBDD были разработаны очень эффективные алгоритмы. Поскольку в символьном представлении отражается определенная регулярность устройства пространства состояний, определяемого схемами и протоколами, оказалось возможным проводить проверку правильности систем с чрезвычайно большим числом состояний, на много порядков превосходящем те, что поддавались проверке при помопщ алгоритмов с явным представлением пространства состояний. Применяя первоначальный вариант алгоритма проверки на модели для CTL, предложенный Кларком и Эмерсоном [61], и новое представление графов переходов, можно провести верификацию отдельных систем, содержащих более 1020 состояний (см. [46, 189]). С тех пор многочисленные улучшения, внесенные другими учеными в технологию верификации на основе OBDD, позволили расширить границы по числу состояний до 10120 (см. [43, 44]). Неявное представление вполне естественно для моделирования последовательных схем и протоколов. Каждое состояние кодируется набором булевых значений, которые присвоены переменным, ассоциированным со схемой или протоколом. Таким образом, отношение перехода можно представить булевой формулой, зависящей от двух наборов переменных: один набор обозначает код исходного состояния, а другой — код нового состояния. Эта формула, в свою очередь, представляется двоичной разрешающей диаграммой. Алгоритм проверки на модели основан на вычислении неподвижных точек преобразователей предикатов, которые строятся по заданному отношению переходов. Неподвижные точки — это множества состояний, представляющие различные темпоральные свойства параллельных систем. В новых реализациях и предикатные преобразователи, и неподвижные точки представляются OBDD. Таким образом, оказалось возможным избежать явного построения графа переходов параллельной системы. Система верификации моделей, разработанная МакМилланом в его диссертации, получила название SMV [189]. Ее основу составляет язык описания иерархических параллельных систем с конечным числом состояний. Программы на этом языке могут быть аннотированы спецификациями, представленными в виде формул темпоральной логики. Процедура верификации начинает работу с того, что извлекает из программы на языке SMV систему переходов, представленную в виде OBDD, и затем применяет алгоритм проверки модели, чтобы выяснить, удовлетворяет данная система предъявлен-
1.5. Символьные алгоритмы 31 ной спецификации или нет. Если система переходов не удовлетворяет той или иной спецификации, то процедура верификации порождает трассу выполнения, позволяющую судить о причине, по которой спецификация оказалась несправедливой. Система верификации SMV широко распространялась, и с ее помощью удалось проверить большое число примеров. Эти примеры стали наглядным свидетельством того, что SMV можно использовать для отладки реальных промышленных программных проектов. Наиболее впечатляющим примером, демонстрирующим способности символьной проверки на модели, служит верификация протокола когерентности кэш-памяти стандарта шины IEEE Futurebus+ (стандарт ШЕЕ 896.1-1991). Хотя разработка протокола когерентности кэш-памяти для стандарта шины IEEE Futurebus+ была начата в 1988 г., все прежние попытки обосновать правильность протокола основывались исключительно на неформальных рассуждениях. Летом 1992 г. исследовательская группа из университета Карнеги- Меллона [66,177] построила точную модель протокола на языке SMV и затем, применяя систему верификации SMV, показала, что полученная система переходов удовлетворяет формальной спецификации. Им удалось также обнаружить ряд ранее не замеченных ошибок и локализовать потенциально ошибочные участки в проекте протокола. По-видимому, это был первый случай, когда средство автоматической верификации было использовано для обнаружения ошибок в стандарте IEEE. Один из наилучших показателей эффективности символьных методов верификации был получен при анализе асимптотики процессорного времени, необходимого для проведения верификации, в зависимости от размеров схем и протоколов. Для большого числа весьма разнообразных примеров темпы роста этого показателя определяются полиномом невысокой степени от числа компонентов схемы (см. [18, 43, 44]). Многие другие ученые совершенно независимо пришли к открытию, что OBDD можно применять для представления больших систем переходов. Кудер, Берте и Мадр [81] разработали алгоритм проверки эквивалентности двух детерминированных автоматов с конечным числом состояний методом поиска в ширину в пространстве состояний произведения автоматов. В своем алгоритме они использовали OBDD для представления функций переходов этих двух автоматов. Подобные алгоритмы были также разработаны Пиксли [211, 212, 213]. Помимо этого некоторые исследовательские группы (Боуз
32 Глава 1. Введение и Фишер [26], Пиксли [211], Кудер, Берте и Мадр [82]) проводили эксперименты с алгоритмами проверки на модели с использованием OBDD. Отметим также труды Бриана, Седжера и Битти [18,37], в которых разработан алгоритм символьных преобразований для проверки на модели для ограниченной логики линейного времени. Спецификации представлялись парами предусловие-постусловие, записанными на языке логики. Предусловие использовалось для ограничений на входные данные и начальные состояния схемы, а постусловие выражало то свойство, которое хотел проверить пользователь. Логические формулы имели вид PoAXpiAX2p2A"-A X"-1 p„_i Л X" рп. Синтаксическая структура таких формул существенно ограничена по сравнению с возможностями синтаксиса большинства темпоральных логик, используемых для спецификации программ и схем. В частности, из всех логических связок допустима одна лишь конъюнкция, а из всех темпоральных операторов — только оператор сдвига по времени (nexttime) X. За счет ограничения класса рассматриваемых формул проверку определенных свойств можно провести очень эффективно. 1.6. Редукция частичных порядков Верификация программного обеспечения путем проверки на модели сталкивается с определенными проблемами. Программы, как правило, хуже структурированы, нежели аппаратура. К тому же параллельные программы преимущественно асинхронны, то есть большую часть действий отдельные процессы выполняют независимо без глобальных синхронизирующих часов. По этим причинам феномен «комбинаторного взрыва» в пространстве состояний представляет особенно серьезную проблему для верификации программ. Именно поэтому проверка на модели применялась для верификации программного обеспечения значительно реже, чем для верификации аппаратуры. Однако не так давно удалось добиться значительного прогресса в преодолении проблемы «комбинаторного взрыва» для программного обеспечения. Наиболее успешные методы решения этой проблемы основываются на редукции частичных порядков [126, 207, 242]. Эти методы используют независимость событий, выполняемых параллельно. Два события считаются независимыми друг от друга,
1.6. Редукция частичных порядков 33 если при любом порядке их осуществления будет достигнуто одно и то же глобальное состояние. Традиционно для представления параллельных программ используется модель чередования. Все события, осуществляемые в ходе одного выполнения программы, располагаются в линейную цепочку, называемую последовательностью чередования. Параллельно реализуемые события могут располагаться в произвольном порядке относительно друг друга. Большинство логик, используемых для спецификации свойств параллельных систем, способны различать чередующиеся последовательности, в которых два независимых события осуществляются в разном порядке. По этой причине обычно приходится рассматривать все возможные чередования таких событий, что приводит, в свою очередь, к чрезвычайно большому пространству состояний. Методика редукции частичных порядков позволяет сократить количество чередующихся последовательностей, которые нуждаются в рассмотрении. В результате уменьшается и количество состояний, необходимых для проверки на модели. В том случае, когда спецификация не позволяет провести различия между двумя чередующимися последовательностями, отличающимися друг от друга только порядком осуществления параллельных событий, достаточно проанализировать лишь одну из таких последовательностей. Эти методы связаны с моделью частичного порядка вычислений программы, согласно которой события, реализуемые параллельно, считаются неупорядоченными. Каждое частично упорядоченное вычисление соответствует целому семейству чередующихся последовательностей. Если между этими последовательностями невозможно провести различия, то достаточно выбрать по одной чередующейся последовательности для каждого частичного упорядочения событий. Идея сокращения пространства состояний путем выбора лишь некоторого подмножества из чередований рассматривалась многими исследователями. Одним из первых, кто предложил такую методику редуцирования, был Оверман [203]. Однако он рассматривал лишь ограниченную модель параллельности, которая не охватывала циклы и недетерминированный выбор. Система вывода Катца и Пеледа [152] предусматривала использование отношения эквивалентности между чередующимися последовательностями, которые соответствуют одному и тому же частично упорядоченному выполнению. В их систему входили правила вывода, предназначенные скорее для обоснования выбора чередующихся последовательностей, неже-
34 Глава 1. Введение ли для проведения рассуждений обо всех последовательностях. Алгоритмы проверки на модели, опирающиеся на редукцию частичных порядков, описаны во многих работах. Упорные (stubborn) множества Валмари [242], устойчивые (persistent) множества Годфруа [125] и достаточные (ample) множества Пеледа [207] различаются существенными деталями, но в основе их лежат сходные идеи. В нашей книге мы ограничимся описанием метода достаточных множеств. Среди других методов, использующих аналогичные соображения по поводу отношения между частично упорядоченными и линеаризованными моделями вычислений, можно выделить метод развертки МакМиллана [188] и оцепеневшие (sleep) множества Годфруа [125]. 1.7. Другие подходы к проблеме «комбинаторного взрыва» Хотя символьное представление и редукция частичных порядков позволили значительно увеличить размер систем, которые поддаются верификации, тем не менее многие практические системы по-прежнему слишком велики для анализа. Поэтому важно отыскать такие приемы, которыми можно было бы воспользоваться в сочетании с символьными методами для увеличения размеров систем, поддающихся верификации. Четыре известных приема такого рода — это композиционный вывод, абстракция, учет симметрии и индукция. Первый из перечисленных приемов использует особенности модульной структуры сложных схем и протоколов [72, 128, 129, 149, 150, 166, 216, 228]. Многие системы с конечным числом состояний образованы из большого числа процессов, работающих параллельно. Спецификации таких систем весьма часто можно разбить на отдельные свойства, каждое из которых описывает поведение лишь небольшого фрагмента системы. Если удается показать, что в исследуемой системе соблюдаются все локальные свойства, и спецификация является логическим следствием конъюнкции этих свойств, то и вся система в целом также удовлетворяет этой спецификации. Бели такая форма упрощенных умозаключений о композиции оказывается непригодной ввиду сильной зависимости компонентов системы друг от друга, то необходимо воспользоваться более изощренной стратегией. В таких случаях, проверяя поведение одного из
1.7. Другие подходы к проблеме «комбинаторного взрыва» 35 компонентов системы, мы должны выдвинуть некоторые допущения о характере поведения прочих ее компонентов. Эти вспомогательные гипотезы впоследствии должны быть подтверждены, когда удается установить корректность других компонентов системы. Подобная стратегия рассуждений получил название <д<тущение-подтвержде- ние» [129, 149, 150, 196, 216]. Другой прием основан на привлечении абстракции. Этот прием представляется весьма важным для рассуждений о реагирующих системах, в которых задействованы маршруты передачи данных. Традиционно методы верификации, в которых используются конечные множества состояний, применялись в основном для анализа систем управления. Символьные методы сделали возможным проведение анализа отдельных систем, в которых осуществляются довольно сложные преобразования данных, но сложность верификации по-прежнему оставалась значительной. В основу применения метода абстракции было положено соображение о том, что спецификации систем, в которых задействованы маршруты передачи данных, обычно устанавливают весьма простые взаимосвязи между значениями данных. Например, при верификации операции сложения микропроцессора требуется убедиться в том, что значение в одном регистре будет рано или поздно равно сумме значений в двух других регистрах. В таких случаях абстракция может быть использована для уменьшения сложности проверки на модели [20, 69, 90, 91, 159, 246]. Абстракция обычно задается отображением множества реальных значений данных системы в небольшое множество абстрактных значений данных. Распространяя это отображение на состояния и переходы, можно построить абстрактный вариант рассматриваемой системы. Абстрактная система часто бывает гораздо меньшего размера, чем исходная система, и поэтому проверять свойства значительно проще на абстрактном уровне. Для ослабления эффекта «комбинаторного взрыва» можно также использовать симметрию [64, 111, 143, 147]. Параллельные системы с конечным числом состояний нередко содержат идентичные компоненты. Например, большое число протоколов предполагет сеть одинаковых процессов, взаимодействующих определенным образом. Устройства содержат части наподобие оперативной памяти и файлов регистров, состоящие из большого числа идентичных элементов. Эти факты можно использовать для упрощения модели системы. Наличие симметрии в системе означает, что есть нетривиальная группа перестановок, сохраняющая структуру графа переходов. На осно-
36 Глава 1. Введение ве такой группы можно определить отношение эквивалентности в пространстве состояний системы и сократить пространство состояний. Редуцированную модель можно использовать для упрощения верификации свойств исходной модели, представленных формулами темпоральной логики. Индукция позволяет автоматически анализировать целые семейства систем с конечным числом состояний [33, 67, 154, 163, 185, 227, 248]. Такая необходимость нередко возникает при проектировании реагирующих систем, как на аппаратном, так и на программном уровне. Обычно проекты схем и протоколов параметризованы таким образом, что приходится иметь дело с бесконечным семейством систем. Например, схема, проектируемая для сложения целых чисел, имеет в качестве параметра длину целых чисел п, протокол шины может быть предназначен для обслуживания произвольного числа процессов, а протокол взаимного исключения также может иметь в качестве параметра число обслуживаемых процессов. Нам хотелось бы иметь возможность удостовериться в том, что всякая система из заданного семейства обладает некоторым темпоральным свойством. В общем случае эта задача неразрешима [12, 235], но во многих интересных случаях можно выработать некоторую форму инвариантного процесса, представляющую поведение произвольной системы семейства. Используя такой инвариант, мы можем проверить выполнимость заданных свойств сразу для всех представителей семейства. Индуктивные доказательства применяются для обоснования того, что инвариант действительно является представительным.
Zi Моделирование систем Первым шагом при проверке корректности системы является спецификация свойств, которыми она должна обладать. Например, желательно показать, что некоторая параллельная программа никогда не попадает в тупик. Как только станет известно, какие свойства являются важными, вторым шагом будет построение формальной модели системы. Чтобы модель была пригодна для верификации, в ней должны проявляться те свойства, анализ которых необходим для установления ее корректности. С другой стороны, она должна быть свободна от частных особенностей, не влияющих на проверяемые свойства, но усложняющих верификацию. Например, при моделировании цифровых схем целесообразно рассуждать в терминах логических ячеек и булевых значений, а не в терминах уровней напряжения. Точно так же при исследовании коммуникационных протоколов иногда желательно сосредоточить внимание на обмене сообщениями, игнорируя при этом содержание самих сообщений. В этой книге мы будем иметь дело главным образом с реагирующими системами [184] и их поведением во времени. Для таких систем характерна потребность в частом взаимодействии с окружающей средой, и они работают, как правило, бесконечно долго. Поэтому для адекватного моделирования их поведения нельзя ограничиться рассмотрением отношения вход-выход. Первой характерной чертой реагирующей системы, которую нам хотелось бы выделить, является ее состояние. Состояние — это моментальный снимок или мгновенное описание системы, в котором зафиксированы значения переменных в конкретный момент времени. Нам нужно также знать, как изменяется состояние системы в результате выполнения этой системой тех или иных действий. Мы можем описать это изменение, указав состояние системы до выполнения действия и ее состояние после выполнения действия. Такая пара состояний определяет переход системы. Вычисления реагирующей системы можно определить в терминах переходов системы. Вычисление - это бесконечная последовательность состояний, каждое из которых получено из предыдущего посредством некоторого перехода.
38 Глава 2. Моделирование систем Для формализации наших интуитивных представлений о поведении реагирующих систем мы воспользуемся разновидностью графа переходов, которая называется моделью Крипке. Модель Крипке состоит из множества состояний, множества переходов между состояниями и функции, которая помечает каждое состояние набором свойств, истинных в этом состоянии. Пути в модели Крипке соответствуют вычислениям системы. Хотя модели такого вида очень просты, они достаточно выразительны, чтобы отражать те аспекты темпорального поведения, которые наиболее важны для анализа реагирующих систем. Параллельные системы обычно задаются текстом программы или диаграммой электронной схемы. Существуют различные типы параллельных систем (синхронные и асинхронные схемы, программы с разделяемыми переменными, программы, взаимодействующие путем обмена сообщениями, и т. д.). Ввиду такого разнообразия, нужен универсальный формализм, в рамках которого можно было бы представлять параллельную систему любого типа. Мы воспользуемся для этой цели формулами логики предикатов первого порядка. По формуле, представляющей параллельную систему, легко построить модель Крипке, адекватно соответствующую этой системе. В последующих разделах мы приведем строгое определение моделей Крипке. Мы покажем, как можно строить такие модели по формулам логики предикатов первого порядка, описывающим параллельные системы. Наконец, мы продемонстрируем, как разнообразные программные конструкции могут быть описаны в терминах логики предикатов первого порядка. 2.1. Моделирование параллельных систем Рассмотрим множество атомарных высказываний АР. Моделью Крипке М над множеством АР назовем четверку М = (S,So,R,L), в которой: 1) S — конечное множество состояний; 2) 5о С 5 — множество начальных состояний; 3) R С S х S — отношение переходов, которое обязано быть тотальным, т. е. для каждого состояния « G S должно существовать такое состояние в' € S, что имеет место R(s, s'); 4) L.S ->• 2АР - функция, которая помечает каждое состояние множеством атомарных высказываний, истинных в этом состоянии.
2.1. Моделирование параллельных систем 39 Иногда множество начальных состояний So не будет представлять интереса для нас. В таких случаях мы будем опускать это множество в определении. Путь в модели М из состояния s — это бесконечная такая последовательность состояний тг = s0slS2 • • • 1 что so = а и для всех t ^ 0 выполняется Д(в<, ej+i). 2.1.1. Представления первого порядка Для понимания этого раздела потребуются только общие сведения о логике предикатов первого порядка. Читатель должен быть знаком с логическими связками (и Л, или V, не ->, влечет -? и т. п.) и понимать предназначение кванторов всеобщности V и существования 3. Для описания параллельных систем мы воспользуемся формулами первого порядка, имеющими фиксированную интерпретацию. Это означает, что предикатные и функциональные символы, встречающиеся в таких формулах, будут иметь предопределенное значение. Обычно их смысл будет ясен из контекста. Рассмотрим множество V = {их,...,v„} переменных системы. Мы предполагаем, что переменные из V принимают значения из конечного множества D, которое иногда называется доменом или универсумом интерпретации. Оценка для V — это функция, которая сопоставляет каждой переменной v из V значение из множества D. Состояние параллельной системы может быть описано указанием значений, сопоставленных всем элементам V. Другими словами, состояние — это просто оценка a: V -? D для множества переменных V. По заданной оценке мы можем написать формулу, истинную в точности на этой оценке. Например, для множества переменных V = {vi,V2,U3} и оценки (»i <- 2,va «- 3,«з +- 5) можно вывести формулу (vi = 2) Л (к2 = 3) Л (г^ = 5)- Вообще говоря, одна и та же формула может быть истинна на многих оценках. Если мы условимся, что формула представляет множество всех оценок, которые делают ее истинной, то мы сможем описать конкретное множество состояний формулой первого порядка. В частности, начальные состояния системы могут быть описаны формулой первого порядка So над переменными из V. Помимо представления множеств состояний мы должны уметь представлять множества переходов между состояниями. Для этого продолжим развивать замысел, который был только что описан. На этот раз мы воспользуемся формулами для представления множе-
40 Глава 2. Моделирование систем ства упорядоченных пар состояний. Мы не можем сделать это, располагая всего лишь единственной копией переменных системы V; поэтому мы создадим второй набор переменных V. Мы будем рассматривать переменные из V как переменные текущего состояния, а переменные из V — как переменные следующего состояния. Каждая переменная v из V имеет соответствующую переменную следующего состояния из V, которую мы обозначим v'. Всякая оценка переменных из У и У может рассматриваться как определение упорядоченной пары состояний, или перехода, а множества таких оценок мы можем представлять, используя формулы, как было указано ранее. Мы будем называть множество пар состояний отношением переходов. Если R есть отношение переходов, то запись H(V, V) будет обозначать формулу, которая его представляет. Для того чтобы написать спецификации, которые выражают свойства параллельной системы, нужно определить множество атомарных высказываний АР. Атомарные высказывания обычно имеют вид v = d, где v 6 V и d € D. Высказывание v = d истинно в состоянии з, если я(и) = d. Когда v — переменная над логическим доменом {True,False}, нет необходимости включать ии = True, и« = False в АР. Вместо обозначения v = True мы будем писать просто v, а вместо v = False — просто -<v. Теперь покажем, как построить модель Крипке М = (S, S0, R, L) на основе формул первого порядка So и %. ¦ Множество состояний S есть множество всех оценок над V. ¦ Множество начальных состояний So есть множество всех оценок so над V, которые удовлетворяют формуле So- ¦ Какова бы ни была пара состояний s и s', отношение R(s,s') соблюдается в том и только том случае, когда формула V, обращается в True, после того как каждой переменной v ?V присвоено значение s(v) и каждой переменной v' E.V — значение s'(f'). ¦ Функция разметки L: S -> 2АР определяется так, чтобы L(s) было множеством всех атомарных высказываний, истинных в s. Бели v — логическая переменная, то v € L(s) означает, что s(v) = True, а v ? L{s) означает, что s{v) = False. Поскольку мы требуем, чтобы отношение переходов в модели Крипке было всегда тотальным, нам нужно расширить отношение R, если некоторое состояние s не имеет последователей. В таком случае мы модифицируем R так, чтобы выполнялось R(s, s). Для иллюстрации понятий, введенных в этом разделе, рассмо-
2.1. Моделирование параллельных систем 41 трим простую систему с переменными яг и у, принимающими значения из множества D = {О,1}. Сответственно оценкой переменных х и у будет просто пара (di,d2) е 1> х 2?, где di — значение i, a cfe — значение у. Система содержит один переход х := (х + j/)(mod2), исходящий из состояния, в котором х = 1 и у = 1. Система будет охарактеризована двумя формулами первого порядка. Множество начальных состояний системы представлено формулой So(x,y) = ж = 1Лу = 1, а множество переходов представлено формулой К(х, у, х', у') = х' = (х + y)(mod2) Лу' = у. Модель Крипке М = (S,So,R,L), отвечающая этим формулам, такова: ¦ S = DxD; -So = {A,1)}; - R = {(A,1), @,1)), (@,1), A,1)), (A,0), A,0)), (@,0), @,0))}; - L((l, 1)) = {х = 1, у = 1}, L(@,1)) = {х = 0, у = 1}, ?(A,0)) = {х = 1, у = 0}, Щ0,0)) = {х = 0,у = 0}. Единственный путь в модели Крипке, исходящий из начального состояния, имеет вид A,1)@,1)A,1)@,1)... Этот путь является единственным вычислением системы. 2.1.2. Степень детализации переходов При моделировании параллельных систем большую роль играет степень детализации (гранулярность) перехода. Важно достичь атомарности переходов, т. е. добиться того, чтобы ни одно наблюдаемое состояние системы не являлось результатом выполнения всего лишь некоторой части одного из переходов. Определив переходы чрезмерно крупно, мы совершим распространенную ошибку. В этом случае модель Крипке может не включать некоторые наблюдаемые состояния. В результате методы верификации наподобие проверки на модели могут пропустить некоторые существенные ошибки системы. Мы можем столкнуться с проблемой и при излишне подробном описании. В таком случае переходы могут взаимодействовать, образуя новые состояния, которые никогда не будут достигнуты в реальной системе. Вследствие этого при верификации модели могут обнаружиться призрачные ошибки, которые никогда не случаются на практике.
42 Глава 2. Моделирование систем Для примера, рассмотрим систему с двумя переменными х и у и двумя переходами а и 0, которые могут исполняться одновременно: а: х:=х + у, 0: у:=у + х, с начальным состоянием * = 1 Л у = 2. Кроме того, рассмотрим более детальную реализацию этих переходов. Эта реализация использует команды языка ассемблера для загрузки, сложения и обмена данными между ячейкой памяти и регистром: ао: loadi?i,x 0q: load-ffe,!/ ац: add R\,y ft: add R.2,x аг: store Ri,x 02: store Д2>У Исполнение перехода а, а затем 0 приводит программу в состояние х = ЗЛу = 5. А вот когда 0 исполняется перед а, мы получаем х = 4 Л у = 3. Если же, с другой стороны, порядок исполнения операций более детальной реализации таков: "О, 00, «1, 01, «2, 02, то результатом будет состояние х = 3 Л у = 3. Предположим, что состояние х = 3 Л у = 3 нарушает некоторое нужное свойство системы. Кроме того, предположим, что система реализована с использованием переходов а и Д. Тогда невозможно одновременно получить х = 3 и у = 3. Однако если мы моделируем систему с помощью более детальных переходов ао, ct\, а?, 0о, 01 и 02, мы можем ошибочно заключить, что система некорректна. Далее, предположим, что система реализована с использованием ао, а\, аг, 0о, 0i и 02. В таком случае можно достичь состояния, в котором х = 3 и у = 3. Бели теперь мы будем моделировать систему, используя а и 0, мы ошибочно заключим, что система корректна. Извлечение представления первого порядка из текста программы или чертежа схемы может рассматриваться как задача компиляции. И она должна учитывать те соображения об уровне детализации, которые были только что приведены. В следующем разделе мы обсудим более подробно, как осуществляется сам процесс компиляции.
2.2. Параллельные системы 43 2.2. Параллельные системы Параллельные системы состоят из набора компонентов, которые исполняются совместно. Обычно компоненты наделены некоторыми средствами взаимодействия друг с другом. Режим исполнения и тип взаимодействия в разных системах могут различаться. Мы будем рассматривать два типа исполнения: асинхронное, или чередующееся исполнение, в котором в любой момент времени только один компонент делает шаг вычисления, и синхронное исполнение, в котором все компоненты делают шаг вычисления одновременно. Мы также будем различать три типа взаимодействия. Компоненты могут взаимодействовать либо путем изменения значения общих переменных, либо путем обмена сообщениями, причем могут быть использованы как очереди, так и какой-либо вариант протокола синхронной взаимосвязи. Поскольку моделирование не является главной темой нашей книги, в этой главе мы обсудим только взаимодействие через общие переменные. В последующих разделах мы опишем некоторые важные типы параллельных систем и покажем, как они могут быть представлены формулами логики предикатов первого порядка. По этим формулам мы построим модели Крипке, как было показано в разд. 2.1.1. 2.2.1. Цифровые схемы В этом разделе мы расскажем о том, как описывать формулами электронные схемы. Для простоты предположим, что каждый элемент, определяющий состояние схемы, может принимать одно из значений 0 или 1. Множество элементов, определяющих состояние, обозначим V. Для синхронных схем множество V обычно состоит из выходов всех регистров схемы и всевозможных первичных входов. Для асинхронных схем все соединения в схеме обычно рассматриваются как элементы, определяющие состояние. Если поставить в соответствие каждому элементу из V логическую переменную, то состояние может быть описано оценкой, присваивающей каждой переменной значения 0 или 1. По заданной оценке можно построить логическое выражение, которое становится истинным в точности при этой оценке. Например, для V = {vi,v%} и для оценки {v% <- l,v2 <- 0) такая формула будет иметь вид Hi Л -ч^. Как и раньше, условимся, что формула представляет множество всех оценок, которые делают ее истинной. Таким образом, для описания электронных схем не
44 Глава 2. Моделирование систем ¦ ¦» — » 1 » V2 «1 «о ^ _х 1 э> ь U^ Рис. 2.1. Синхронный счетчик по модулю 8 требуется всей выразительной мощности логики предикатов первого порядка; достаточно воспользоваться булевыми формулами. Булевы формулы So и H(V, V) будут описывать соответственно множество начальных состояний и отношение переходов схемы. Синхронные схемы Работа синхронной электронной схемы складывается из последовательности шагов. На каждом шаге изменяются входы схемы, и ей дают стабилизироваться. Затем через схему проходит импульсный синхронизирующий сигнал, и элементы, определяющие состояние, изменяются. Метод извлечения отношения переходов для синхронной схемы можно объснить на небольшом примере. На рис. 2.1 изображен счетчик по модулю 8. Пусть V = {vi,V2,v$} — множество переменных состояния этой схемы, а V = {v[, v'2, v'3} — другая копия переменных состояния. Переходы счетчика задаются уравнениями «о = ^«о, «1 =v0©t;i, «2 = (woA«i)©u2,
2.2. Параллельные системы 45 где ф — это оператор исключающее или. Эти уравнения можно использовать для определения отношений Ko(V,V') = (v'0#^v0), fci(v,V) = (»i<»«be«i). U2(V, V) = (v'2 О (v0 Л и,) ф v2), описывающих ограничения, которым должны удовлетворять все переменные v[ в допустимом переходе. Так как все изменения происходят в одно и то же время, для построения формулы отношения переходов ограничения соединяются конъюнкцией: n{V, V) = Ko(V, V) Л Пх(V, V) Л R2(V, V). В общем случае для схемы, содержащей п элементов, определяющих состояние, мы полагаем V = {vo,... ,un-i} и V = {v^,..., w^-i}- Так же, как и для счетчика по модулю 8, каждой переменной состояния v't сопоставляется булева формула /j(V), так что v\ = /<(V). Эти уравнения используются для определения отношений Продолжая аналогию со счетчиком по модулю 8, отметим, что конъюнкция этих формул дает нам отношение переходов пу, V) = По(у, v1) л • • ¦ л Пп^у, V). Отношение переходов синхронной схемы может быть представлено конъюнкцией отношений переходов для отдельных процессов. Асинхронные схемы Отношение переходов для асинхронных схем наиболее естественно выражается дизъюнкцией. Для упрощения описания процесса построения отношения переходов предположим, что все комопненты схемы имеют ровно один выход и не имеют внутренних переменных состояния. В этом случае каждый компонент можно охарактеризовать функцией fi(V); по заданным значениям переменных текущего состояния v компонент выдает на выходе значение /<(V). Распространить этот метод для описания компонентов, имеющих несколько выходов, не составляет труда. Так как значение компонента изменяется достаточно быстро, маловероятно, чтобы два компонента изменили свое значение одновременно. Поэтому обычно используется семантика чередования, при которой в каждый момент времени только один единственный компонент изменяет свое состояние. Это отражается в дизъюнкции вида ТИУ, V) = П„<У, V) V • • • V Tln-ilV, V), где Ъ(У, V) = («J & /,(V)) Л Л^иС*} *vj).
46 Глава 2. Моделирование систем Заметим, что состояния некоторых компонентов могут изменяться неоднократно, тогда как другие не совершат ни одного шага. На практике это чрезвычайно маловероятно. Имеется возможность снабдить модель дополнительными ограничениями справедливости, которые не будут допускать подобного поведения. Эта тема будет обсуждаться в следующей главе. Чтобы уяснить разницу между синхронной и асинхронной моделями, обратимся к примеру. Пусть V = {i>o,t>i}, v'0 = vq ® v\ и v[ = vo © «i- Пусть s — состояние, в котором vo = 1 Л v\ = 1. В синхронной модели единственным последователем состояния s будет состояние Wo = О Л v\ = О, так как оба присваивания исполняются одновременно. В асинхронной модели состояние * имеет двух последователей: 1). uo = 0Aui = l (первым выполняется присваивание vq); 2). vo = 1 Л v\ = 0 (первым выполняется присваивание vi). 2.2.2. Программы Все рассматриваемые нами программы являются асинхронными. Мы начнем с обсуждения последовательных программ, потому что параллельные программы составлены из последовательных компонентов. Мы воспользуемся подходом, подобным тому, который описан в книге Манны и Пнуели [184]. Для более детального ознакомления с затронутой темой мы рекомендуем читателю обратиться к этой книге. Программа состоит из операторов, которые последовательно соединены друг с другом. Мы определим механизм трансляции С, который преобразует текст последовательной программы Р в формулу первого порядка TZ, представляющую множество переходов программы. Не ограничивая общности, предположим, что каждый оператор имеет единственную точку входа и единственную точку выхода. Процедура трансляции значительно упрощается, если точки входа и выхода каждого оператора программы помечены уникальным образом. Далее мы определим преобразование разметки, которое по заданной неразмеченной программе Р строит размеченную программу Рс. Преобразование разметки, которое мы собираемся определить, приписывает единственную метку точке входа каждого оператора в Р, за исключением самой программы Р. Все метки считаются попарно различными. В последовательной программе точка выхода каждого оператора совпадает с точкой входа следующего за ним
2.2. Параллельные системы 47 оператора. Поэтому достаточно пометить только точки входа. Если помимо этого ввести метки для точек входа и выхода программы Р, то получится уникальная разметка точек входа и выхода для всех операторов программы. Ввиду того что мы не ограничены выбором определенного языка программирования, определим преобразование разметки для ряда типовых операторов. Это определение легко распространить и на другие типы операторов. Для заданного оператора Р размеченный оператор Рс определяется следующим образом. ¦ Если Р не является составным оператором (т. е. Р имеет вид х := е, skip, wait, lock, unlock и т. п.), то Рс = Р. ¦ Если Р = Р1;Р2, то Рс = Pf; I": Р2?. ¦ Если Р = if b then Р\ else Р2 end if, то Pc = if b then h : Pf else /2: P2? end if- ¦ Если P = while b do Pi end while, то P? = while b do li: Pi end while. Далее в этом разделе мы будем полагать, что Р — это размеченный оператор, а его точки входа и выхода помечены шит' соответственно. Обозначим через рс специальную переменную, которая называется счетчиком команд; значениями рс являются метки программы, а также особый элемент _L, который соответствует неопределенному значению. Неопределенное значение требуется, когда речь идет о параллельных программах. В таком случае равенство рс = ± является признаком того, что программа неактивна. Пусть V обозначает множество переменных программы. Определим множество V штрихованых переменных v', по одной для каждой переменной v Е V, а также штрихованую переменную pd для счетчика команд рс. Напомним, что нештрихованная копия относится к значению переменных до перехода, тогда как штрихованная копия относится к значению после перехода. Так как каждый переход обычно изменяет небольшое число переменных программы, запись same(Y) будет использоваться для обозначения формулы Keriv' = *)¦ Сначала выпишем формулу, описывающую множество начальных состояний программы Р. Для заданного условия pre (У), определяющего начальные значения переменных программы Р, она имеет вид So(V,pc) = pre(V) Лрс = m. Процедура трансляции С зависит от трех параметров: входной метки I, размеченного оператора Р и выходной метки V. Процедура
48 Глава 2. Моделирование систем определяется рекурсивно и использует по одному правилу для каждого типа операторов языка. Предикат C(l, Р, V) представляет множество переходов программы Р в виде дизъюнкции всех переходов этого множества. Каждое слагаемое такой дизъюнкции, соответствующее отдельному переходу, определяет значение булевого условия и значение счетчика команд, для которых возможно выполнение этого перехода. Указанное слагаемое обращается в истину всякий раз, когда переход осуществим; в противном случае оно будет ложным. ¦ Оператор присваивания: C(l, v := е, V) = pc = lApc? = l'Av' = eA same{V \ {«}). ¦ Оператор skip: C(l, skip, V) = pc = l t\ pd = V A same(V). ¦ Последовательная композиция операторов: СA, Рц Z":P2, V) = C(f,Pi,/") V С(Г,Р2,0. ¦ Оператор ветвления if-then-else: C(l, if Ь then l\: Р\ else /2 : Рг end if, /') представляет собой дизъюнкцию следующих четырех формул: • pc = lApcf = li Л i Л same{V), • рс = /Лрс' = /2 Л -А Л same(V), . C{h,Pi,l% • C(l2,P2,l'). Первый дизъюнкт соответствует случаю, когда условие b истинно. При этом следующим будет выполняться оператор Pi. Второй дизъюнкт соответствует случаю, когда условие Ь ложно. Тогда следующим будет исполняться оператор Р2. Оба дизъюнкта описывают переходы, занятые исключительно изменением показания счетчика команд. Третий и четвертый дизъюнкты — это формулы для переходов Pi и Р2. Трансляцию для оператора ветвления можно легко модифицировать так, чтобы охватить оператор недетерминированного выбора между несколькими альтернативами. ¦ Оператор итерации while-do: C(l, while 6 do /i: Pi end while, I') представляет собой дизъюнкцию следующих трех формул: . рс = 1 Л pd = 1\ Л Ь Л aame(V), • pc = lApd = l'A->bA same(V), . C(ii,Pi,J).
2.2. Параллельные системы 49 Первый дизъюнкт соответствует случаю, когда условие b истинно. При этом следующим будет исполняться оператор Pi. Второй дизъюнкт соответствует случаю, когда условие Ь ложно, и тогда исполнение оператора итерации завершается. Третий дизъюнкт — это формула для переходов оператора Pi. Заметим, что точка выхода оператора Pi совпадает с точкой входа в оператор итерации. Таким образом, как только завершается исполнение оператора Pi, оператор итерации запускается повторно. 2.2.3. Параллельные программы Параллельная программа образована множеством процессов, которые могут исполняться параллельно. Процесс — это последовательный оператор из числа тех, которые были описаны выше. Параллельные программы, в которых процессы не взаимодействуют посредством обмена сообщениями или изменения значения общих переменных, обычно анализируются просто, и мы не будем рассматривать их в дальнейшем. В этом разделе мы будем изучать асинхронные программы, в которых в точности один процесс может совершить переход в каждый момент времени. Мы качнем с того, что введем систему обозначений, которыми будем пользоваться в настоящем разделе. Обозначим символом V* множество переменных, которые могут изменяться процессом Р,. Мы не требуем, чтобы все эти множества переменных не пересекались. Как и прежде, V обозначает множество всех переменных программы. Счетчик команд процесса Pi будет обозначаться ра, а множество всех счетчиков — PC. Параллельная программа Р имеет вид cobegin Pi || Р2 || ... || Р„ coend, где Pi,..., Р„ — процессы. Преобразование разметки последовательных программ обогащается новым правилом, в котором параллельная программа имеет статус оператора в составе последовательной программы. Преобразование приписывает метку точке входа и точке выхода каждого оператора. В отличие от последовательных программ, никакая точка выхода параллельного процесса не отождествляется с какой-либо точкой входа. В результате точки выхода процессов должны быть помечены отдельна. Как и ранее, мы полагаем, что все метки попарно различны, а точки входа и выхода программы Р помечены шит' соответственно. ¦ Если Р = cobegin Pi || Р2 ||... || Ря coend, то Рс = cobegin h : Pfl[ \\l2: P2% || ... || l„ : P?i'„ coend. 5 Зак. 271
50 Глава 2. Моделирование систем Формула, описывающая начальные состояния параллельной программы Р, имеет вид S0(V,PC) = pre(V) Л рс = т А Д (р<ч = ±), •=1 где рс, = J. означает, что процесс Р, еще не был активизирован и поэтому не может исполняться в текущем состоянии. Процедуру трансляции С можно распространить на параллельные программы: мы будем полагать, что формула C(l, cobegin Pi || Р2 || ... || Р„ coend, /') представляет собой дизъюнкцию трех следующих подформул: ¦ рс = 1 Л pd1 = h Л ... Л pdn = ln Л pd = J-, ¦ рс = ± Л ра = 1[ Л ... Л рсп = 1'п Л pd = V Л Д?=1СК = -L). " \/"=i(e(.li,Pi,l'i) Л same(V\Vi) Л same{PC\ {pa})). Первый дизъюнкт описывает инициализацию параллельных процессов. Ему соответствует переход из точки входа оператора cobegin в точки входа отдельных процессов. Второй дизъюнкт описывает завершение параллельной программы. При этом совершается переход из точек выхода процессов в точку выхода оператора cobegin. Этот переход будет исполнен только тогда и только тогда, когда завершится исполнение всех процессов. Третий дизъюнкт описывает чередующееся исполнение параллельных процессов. Конъюнкция соединяет формулу для отношения переходов процесса Pi с формулой same(V \ Vi) Л same(PC \ {pet}). Тем самым гарантируется, что переходы в процессе Р, могут изменять только переменные множества V{. Это гарантирует также, что в каждый момент времени только один процесс может совершить переход. Разделяемые переменные Напомним, что Vi обозначает множество переменных, значения которых может изменять процесс Р<. Параллельные программы, для которых множества Р< пересекаются, называются программами с разделяемыми переменными. Мы покажем, как распространить процедуру трансляции С на общепринятые операторы синхронизации процессов. Такие операторы часто бывают необходимы, чтобы снабдить процессы средствами исключительного доступа к разделяемым переменным. Эти операторы относятся к числу атомарных операторов и обрабатываются преобразованием разметки обычным образом. Далее предполагается, что рассматриваемые операторы относятся к процессу Pi.
2.3. Пример трансляции программы 51 ¦ Оператор wait. Поскольку мы изучаем в первую очередь программы с конечным числом состояний, мы ограничимся описанием реализации этого оператора посредством ожидания по условию. В частности, мы не рассматриваем реализации, требующие сложных структур данных, наподобие очередей процессов. Оператор waitF) периодически проверяет значение булевой переменной Ь, до тех пор пока он не обнаружит, что Ь обратилась в истину. Когда переменная Ь стала истинной, осуществляется переход к последующему оператору программы. Формула C(l, waitF), V) представляет собой дизъюнкцию следующих двух подформул: . pci = I Л р<%= I Л -ib Л same(Vi), . pci = l Л pdi = V Л 6 A same(Vi). ¦ Оператор lock. Оператор lock(fr) подобен оператору wait(u = 0) с той лишь разницей, что при переходе, выполняемом после того, как обнаружится, что отношение v = 0 выполнено, значение v изменяется на 1. Этот оператор часто применяется, чтобы обеспечить взаимное исключение, предотвращая вход в критическую секцию более чем одного процесса. Формула C(l, lock(u), V) представляет собой дизъюнкцию следующих двух подформул: . pci =1 Л рс'{=1 Л v = 1 Л same(Vi), . pci=l Л pcJi = V Л i; = 0 Л г/ = 1 Л sofne(Vj \ {v}). ¦ Оператор unlock. Оператор unlock(b) присваивает значение 0 переменной v. Обычно этот оператор дает разрешение другому процессу на вход в его критическую секцию: С{1, unlock(w), V) = pa = I Л рс\ = /' Л t/ = 0 Asame(Vi\{v}). 2.3. Пример трансляции программы Рассмотрим простую программу со взаимным исключением Р = т: cobegin Р0 || Pi coend т', состоящую из двух процессов Р0 и Pi, изображенных на рис. 2.2. Счетчик команд рс программы Р принимает только три значения: m (входная метка Р), т' (выходная метка Р), ± (значение рс, когда Ро и Pi активны). Каждый из процессов Pi снабжен счетчиком команд ра, значениями которого являются метки U, l'itNCitCRi 5*
52 Глава 2. Моделирование систем Pq\: Iq: while True do NCq: wait (?urn = 0); CRq: turn := 1; end while Pi:: /i: while True do NCi: wait(turn = 1); СД1: ta:=0; end while l[ Рис. 2.2. Процессы программы со взаимным исключением и ±. Оба процесса разделяют единственную переменную turn. Таким образом, V = Vq = V\ = {turn} и PC = {pc,pco,pci}. Когда значение счетчика команд процесса Pj равно CRi, мы говорим, что процесс пребывает в критической секции. Обоим процессам запрещается пребывать в критической секции одновременно. Если значение счетчика команд равно Nd, то мы говорим, что процесс пребывает в некритической секции. В таком случае ему приходится дожидаться, когда выполнится условие turn = i, дающее ему исключительное право на вход в критическую секцию. Формула, используемая для описания начальных состояний параллельной программы Р, имеет вид S0(V,PC) = рс = т Л рсо = -L Л рсх = J_. Обратим внимание на то, что никаких ограничений на значение turn не налагается. Поэтому первоначально оно может быть либо 0, либо 1. Применяя процедуру трансляции С, мы получаем формулу для отношения %{V, PC, V, PC) переходов программы Р; формула представляет собой дизъюнкцию следующих четырех подформул: ¦ рс = т А рс^ = Iq A pdx = h A pd = J., ¦ рсо = l'Q А рс\ =1[ A pd = m' Л pcq = 1 Л pdl = 1, ¦ C(lo, Pa, 1'0) A same(V\Vo) A same(PC\ {рсо}), или, что эквивалентно, C(lo, Po, l'o) Л same{pc,pc\), ¦ C(k, Pi, l[) A same(V\Vi) A same(PC\{pci}), или, что эквивалентно, C(l\, Pi, li) Л same(pc,pco).
2.3. Пример трансляции программы 53 Рис. 2.3. Достижимые состояния модели Крипке для примера программы со взаимным исключением Для каждого процесса Pi формула C(ii, Pj, ij) представляет собой дизъюнкцию следующих подформул: ¦ pCi = U Л pdi= Nd Л True Л same(turn), ¦ р<н = NCi Л j)Cj = CRi Л turn = i Л same(turn). ¦ pa = CRi Л pdi = U Л turrt = (* +1) ( mod 2), ¦ pci = NCi Л pcj = NCi А Ыгпф i Л same(turn), ¦ pci = U ApcJ = I<A False Л some(tttrn). Модель Крипке, представленная на рис. 2.3, строится по формулам So и Л так, как это было описано в разд. 2.1.1. Изучив пространство
54 Глава 2. Моделирование систем состояний модели Крипке, легко убедиться в том, что процессы никогда не окажутся в своих критических секциях одновременно. Таким образом, для этой программы обеспечивается необходимое свойство взаимного исключения. Однако программа не способна обеспечить отсутствие удушения1, ибо один из процессов может непрерывно пытаться войти в свою критическую секцию, никогда не получая при этом доступа туда, тогда как другой процесс пребывает в своей критической секции бесконечно долго. Впоследствии мы увидим, как можно формулировать и верифицировать подобные свойства. 1 Термин удушение или истощение (starvation) означает эффект, который проявляется при неудачном планировании распределения вычислительных ресурсов: один из процессов сколь угодно долго не получает доступа к запрашиваемому ресурсу (процессору, памяти и т. п.) и не может выполнить очередное действие. — Прим. ред.
О Темпоральные логики В этой главе мы расскажем о логике, предназначенной для спецификации свойств систем переходов, или моделей Крипке, которые были введены в разд. 2.1. В этой логике атомарные высказывания и булевы связки, такие как конъюнкция, дизъюнкция и отрицание, используются для построения сложных выражений, предназначенных для описания свойств состояний. В реагирующих системах нас также интересуют описания переходов между состояниями. Это важно, поскольку такие системы взаимодействуют с окружением и реагируют на внешние воздействия. Традиционные методы верификации программного обеспечения, разработанные Флойдом [114] и Хо- аром [136], имеют дело с программами, семантика которых определяется отношениями между входными и выходными данными. Подробности того, как осуществляется вычисление, никак не отражаются в тех свойствах, которые могут быть специфицированы и доказаны; описываются только входные данные в начале выполнения программы и выходные данные по завершении ее выполнения. Но для реагирующих систем наиболее важна именно последовательность шагов вычисления, и к тому же многие реагирующие системы проектируют так, чтобы их вычисления вообще никогда не завершались. Темпоральные логики как раз и являются тем формализмом, который предназначен для описания последовательностей переходов между состояниями реагирующей системы. В темпоральных логиках, которые будут рассматриваться нами, время явно не упоминается; вместо этого формулы позволяют записывать утверждения о том, что некоторое выделенное состояние будет когда-нибудь пройдено или что состояние ошибки никогда не будет достигнуто. Свойства, в которых упоминаются события, происходящие когда-нибудь или никогда, специфицируются при помощи специальных темпоральных операторов. Эти операторы можно сочетать с булевыми связками или произвольно комбинировать друг с другом. Темпоральные логики отличаются набором используемых темпоральных операторов и семантикой этих операторов. В центре нашего внимания будет очень выразительная логика под названием CTL* [61, 63, 105].
56 Глава 3. Темпоральные логики Граф переходов, или модель Крипке Бесконечное дерево, развернутое из графа переходов Рис. 3.1. Вычислительные деревья 3.1. Логика деревьев вычислений CTL* Чисто умозрительно, формулы CTL* описывают свойства деревьев вычислений. Такое дерево образуется за счет выделения некоторого состояния в модели Крипке в качестве начального состояния и последующей развертки модели в бесконечное дерево с корнем в выделенном состоянии, как это показано на рис. 3.1. В дереве вычислений показаны все возможные исполнения, которые запускаются из начального состояния. Формулы CTL* строятся из кванторов пути и темпоральных операторов. Кванторы пути применяются для описания структуры ветвления в дереве вычислений. Имеются два таких квантора: А («для всех путей вычисления») и Е («для некоторого пути вычисления»). Эти кванторы используются в том или ином состоянии для указания того, что все пути или некоторые из путей, исходящих из данного состояния, обладают предписанным свойством. Темпоральные операторы описывают свойства пути, проходящего в дереве. Имеются пять основных операторов. ¦ Оператор сдвига по времени X (neXttime, «в следующий момент») требует, чтобы свойство соблюдалось во втором состоянии пути.
3.1. Логика деревьев вычислений CTL* 57 ¦ Оператор происшествия F (Future, «рано или поздно*, «когда-то в будущем») применяется, если нужно объявить, что свойство будет соблюдаться в каком-то последующем состоянии пути. ¦ Оператор инвариантности G (Globally, «всегда», «повсюду») позволяет заявить, что некоторое свойство соблюдается в каждом состоянии пути. ¦ Оператор условного ожидания U (Until, «до тех пор пока») чуть более изощренный, поскольку в нем содержится комбинация двух свойств. Оператор выполняется, если на пути имеется состояние, в котором соблюдается второе свойство, и при этом каждое предшествующее на этом пути состояние обладает первым свойством. ¦ Оператор разблокировки R (Release, «высвободить») логически двойственен оператору U. Он требует, чтобы второе свойство выполнялось на пути вплоть до такого состояния, в котором соблюдается первое свойство. Однако первое свойство не обязательно должно когда-нибудь быть выполнено. В заключение этого раздела приведем строгое описание синтаксиса и семантики CTL*. В CTL* имеются формулы двух типов: формулы состояния (способные обращаться в истину в некотором состоянии)* и формулы пути (способные быть истинными на протяжении некоторого пути). Введем множество АР имен атомарных высказываний. Синтаксис формул состояния определяется следующими правилами: ¦ Если р € АР, то р — формула состояния. ¦ Бели fug — формулы состояния, то ->/, /Лд и f\/g — формулы состояния. ¦ Если / — формула пути, то Е / и А / — формулы состояния. Два дополнительных правила необходимы для определения синтаксиса формул пути: " Если / — формула состояния, то / — формула пути. ¦ Если / и g — формулы состояния, то ->/, f Ag, f V д, X /, F /, Gf,f\Jg,fRg — формулы состояния. Формулами CTL* являются все формулы состояний, построенные согласно указанным правилам. Семантику CTL* определим на моделях Крипке. Напомним, что модель Крипке М — это тройка E, R, L), где S — множество состояний, RC Rx R — отношение переходов, которое обязано быть гао- 4 Зак. 271
58 Глава 3. Темпоральные логики шальным (т. е. для любого состояния s € S существует такое состояние s' G S, что (s, я') € R), a L: 5 -> 2ДР — функция, помечающая каждое состояние множеством атомарных высказываний, истинных в этом состоянии. Путем в М назовем всякую такую бесконечную последовательность состояний ж = so,«i,..., что (si,Si+x) G R для каждого г > 0. С равным успехом путь можно понимать как бесконечную ветвь в дереве вычислений, соответствующем модели М. Мы будем использовать запись ж% для обозначения суффикса ж, начинающегося состоянием Sj. Если / — формула состояния, то запись М, s |= f означает, что / выполняется в состоянии s на модели Крипке М. Точно так же, если / — формула пути, то запись М, ж (= / означает, что / выполняется на протяжении пути ж в модели М. Когда из контекста ясно, о какой модели Крипке идет речь, обозначение модели в этих записях может быть опущено. Отношение |= определяется индуктивно следующим образом (мы подразумеваем здесь, что /i и /2 обозначают формулы состояния, а дх и #2 — формулы пути): 1). M,s\=p&pEL(s); 2). M,s\=^h <^M,sH=/i; 3). М, s (= fx Л h *> M, s \= А или M,s\= /2; 4). M,s (= fx Л/2 & M,s \= fx и M,s f= /2; 5). M, s |= E 51 •?> в Af есть такой путь из состояния s, что М,ж [= </i; 6). М, s \= Адх & для любого пути ж из состояния 5 в модели М верно соотношение М,ж \= дх] 7). М, ж (= fx <$ для первого состояния s на пути ж в модели М верно соотношение M,s \= fx; 8). М,тг|=-.31 &М,ж?дх; 9). М, я- (= </1 V 32 <* М, ж |= «/! или М, 7Г |= 525 10). М,7г(=01 Л02 <$ М,ж \= дх и М,7Г |=5г; п). м^их^^м.^Ил; 12). М,ж (= F</i •<=> существует такое k ^ 0, что М,7г* |= дх; 13). М, 7г ^= G 5i *> Для любого А; ^ 0 верно соотношение Af, 7Г* |= 51; 14). М, я- f= 5i U 52 *> существует такое k ^0, что М, 7Г* \= 52 и для каждого 0^j<k верно соотношение М, тг* \= дг; 15). М, ж (= 5i R 52 •** каково бы ни было j ^ 0, если для каждого i < j верно соотношение М,ж* \? дх, то М,ж* (= 52-
3.2. CTL и LTL 59 Легко убедиться в том, что операторов V, ->, X, U, Е достаточно для того, чтобы с их помощью выразить любую формулу CTL": ¦ fAg = --bfV^g), • /Kg = ^bfV^g), ¦ F / = True lb/, ¦ G/ = -.P-n/, ¦ A(/) = -.E(^), 3.2. CTL и LTL В этом разделе речь пойдет о двух полезных подмножествах CTL*: одна из этих логик называется логикой ветвящегося времени, а другая — логикой линейного времени. Различие между ними проявляется в том, как они относятся к ветвлению в упомянутом дереве вычислений. В логике ветвящегося времени темпоральные операторы находятся непосредственно под действием кванторов по тем путям, которые исходят из заданного состояния. В логике линейного времени операторы предназначены для описания событий на протяжении единственного пути вычисления. Логика деревьев вычислений (CTL) [19, 61, 104] представляет собой фрагмент CTL*, в котором каждый темпоральный оператор X, F, G, U и R должен следовать непосредственно за квантором пути. Говоря более строго, CTL — это подмножество CTL*, в котором структура формул пути ограничена следующим правилом. ¦ Если / и д — формулы состояния, то X/, F/, G/, / U д, и / R д — формулы пути. Линейная темпоральная логика (LTL) [215], в свою очередь, состоит из всех формул вида А /, где / — формула пути, в которой все формулы состояния — это атомарные высказывания. Более строгое определение формул пути LTL таково. ¦ Если р е АР, то / — формула пути. ¦ Если / и д — формулы пути, то ->J, / Л д, f V д, X/, F/, G /, / U д, / R д — формулы пути. Как показано в [59, 105, 164), все три логики, которые мы обсуждаем, имеют разные выразительные возможности. Например, не существует CTL-формулы, эквивалентной LTL-формуле A (FGp). Эта формула выражает следующее свойство: на всяком пути найдется состояние, начиная с которого р будет выполняться всегда. И^ 4*
60 Глава 3. Темпоральные логики точно „так же не существует LTL формулы, которая была бы эквивалентна CTL-формуле AG (EFp). А дизъюнкция этих двух формул A (FGp V AG (EFp)) является формулой CTL*, которую нельзя выразить ни в CTL, ни в LTL. В этой книге большинство спецификаций будет записано в логике CTL. Имеются десять основных операторов CTL: ¦ АХ и ЕХ, ¦ AF и EF, ¦ AG и EG, « AU и EU, ¦ AR и ER. Каждый из этих операторов может быть выражен при помощи всего лишь трех операторов EX, EG и EU: » AX/ = -.EX(-i/); ¦ EF/ = E[TrueU/]; ¦ AG/ = -.EF(-./); • AF/ = -.EG(-./); ¦ A[/ U g] = i Е[-<7 U (-./ Л -.д)] Л - EG ^g; ¦ A[/Re] = -.Eb/U-,fl]; ¦ E[/Rff] = -.A[-./U^]. Рис. 3.2 на с. 61 иллюстрирует семантику четырех наиболее часто встречающихся операторов. Смысл этих операторов проще всего понять, если обратиться к дереву вычислений, полученному при развертке модели Крипке. Каждое дерево вычислений имеет в качестве корня состояние so- Некоторые типичные CTL-формулы, которые возникают при верификации систем параллельных программ с конечным числом состояний, приводятся ниже: ¦ EF (Start Л -iReady): можно достичь такого состояния, в котором условие Start выполняется, a Ready — нет; ¦ AG (Req -» AF Аск): если получен запрос, то он рано или поздно будет подтвержден; ¦ AG (AF DeviceEnabled): условие DeviceEnabled выполняется бесконечно часто на каждом пути вычисления; ¦ AG (EF Restart): из любого состояния достижимо состояние Restart.
3.3. Справедливость 61 Многие методы преодоления эффекта «комбинаторного взрыва» в пространстве состояний опираются на композиционные доказательства или абстракцию. Выразительные средства логики, которую используют в таких случаях, гораздо более ограничены и допускают применение только универсальных кванторов пути. Вариант логики CTL*, в котором разрешаются только универсальные кванторы пути, называется ACTL*, а вариант логики CTL, ограниченный использованием только универсальных кванторов пути, называется ACTL. Во избежание неявного присутствия экзистенциальных кванторов пути вследствие использования отрицания, мы будем полагать, что формулы представлены в негативной нормальной форме, где связки отрицания применяются только к атомарным высказываниям. Но теперь, чтобы не утратить выразительных возможностей логики, нам потребуются конъюнкция, дизъюнкция, а также оба оператора U и R. Формулы AF AG а и AG АХ а служат примерами ACTL- формул. Эти формулы нельзя выразить в логике LTL [59]. Коль скоро ACTL является подмножеством CTL, логики ACTL и LTL несравнимы. Интересно отметить, что ACTL* более выразительна, нежели LTL. Формулы AG EF Start и AG -• AF Start не принадлежат ACTL. 3.3. Справедливость В завершение мы обсудим вопрос о справедливости. Во многих случаях мы заинтересованы в корректности одних только справедливых путей вычисления. Например, когда мы заняты верификацией асинхронной схемы с арбитром, можно ограничиться рассмотрением только таких ее срабатываний, в которых арбитр ке игнорирует бесконечно долго ни один из ее запросов. В другом случае мы можем вознамериться рассмотреть коммуникационные протоколы, работающие только с надежными каналами связи и обладающие тем свойством, что ни одно сообщение не может непрерывно пересылаться, но при этом ни разу не быть принятым. Такого рода свойства не могут быть выражены непосредственно в CTL [59, 104, 105], но их можно представить в логике CTL*. Чтобы иметь дело со справедливостью, оставаясь в рамках CTL, нам нужно слегка видоизменить семантику этой логики. Новую семантику CTL назовем справедливой
62 Глава 3. Темпоральные логики • • M,s0 k=EFg M,s0k=AFg о<Л Л* Л' M,s0\=EGg М, в0 |= AG д Рис. 3.2. Основные операторы логики CTL семантикой. Ограничением справедливости может быть произвольное множество состояний; обычно это множество можно описать при помоши формулы нашей логики. Если ограничения справедливости понимать как множества состояний, то на справедливом пути хотя бы один элемент из каждого ограничения справедливости должен встречаться бесконечно часто. Если же ограничения справедливости представлены формулами CTL, то путь считается справедливым, если каждое ограничение выполняется бесконечно часто на этом пути. В таких случаях действие кванторов пути ограничивается только справедливыми путями. В более строгих терминах справедливая модель Крипте определяется четверкой М = (S, R, L, F), где S, R и L истолковываются так же, как и прежде, a F С 2s — множество ограничений справедливо-
3.3. Справедливость 63 сти (их часто называют обобщенными условиями допущения Бюхи). Пусть 7Г = so, si,... — путь в М. Введем следующую характеристику пути: infEr) = {s | а = Si для бесконечно многих г'}. Будем говорить, что ж — справедливый путь, если для всякого Р из F выполняется соотношение inf (ж) Л Р ф 0. Семантика CTL* на справедливых моделях Крилке очень похожа на семантику CTL* на обычных моделях Крипке. Мы будем использовать запись М, a \=р f для обозначения того, что формула состояния / истинна в состоянии s на справедливой модели Крипке М. Точно так же запись М, ж \=р g будет означать, что формула пути g истинна на пути ж в модели М. Изменения вносятся только в пп. 1, 5 и 6 первоначального определения семантики. 1). М, a \= р <Ф есть справедливый путь, исходящий из s, и при этом Р G Цв); 5). М, a (= E(gi) Ф> есть такой справедливый путь ж из состояния $, что М, ж |= 01; 6). М, a |= A(gi) ¦& для каждого справедливого пути ж из состояния s верно соотношение М, ж |= д\. Чтобы пояснить, как используется справедливость, обратимся вновь к коммуникационному протоколу с надежными каналами. Для каждого канала имеется ограничение справедливости, которое выражает требование надежности канала. В качестве такого ограничения справедливости для канала i можно выбрать множество состояний, удовлетворяющих формуле ->sendi V recievei. Таким образом, путь вычисления считается справедливым тогда и только тогда, когда для каждого канала бесконечно часто выполняется одно из двух свойств: либо сообщение еще не послано, либо сообщение уже доставлено. Другие варианты справедливости, с которыми приходится сталкиваться, представлены в работе [116].
4t Верификация моделей Проблема верификации моделей1 формулируется достаточно просто. Пусть задана модель Крипке М = (S, R, L), представляющая параллельную систему с конечным числом состояний, и формула темпоральной логики /, которая выражает некоторую желаемую спецификацию. Требуется найти в множестве S подмножество всех состояний, в которых выполняется /, т.е. множество {seS\M,s\=f}. Как правило, некоторые состояния параллельной системы особо выделяются как начальные состояния. Система удовлетворяет спецификации, если все начальные состояния принадлежат указанному подмножеству. Первые алгоритмы решения задачи верификации моделей использовали явное представление моделей Крипке в виде размеченных ориентированных графов, дуги которых задавали при помощи ссылок. В таком случае вершины представляют состояния из 5, дуги графа соответствуют отношению переходов R, а разметка вершин определяется функцией L : S —> 2АР. 4.1. Верификация моделей для CTL Пусть задана модель Крипке М = (S,R,L). Предположим, что мы хотим определить, на каких состояниях из 5 выполняется CTL- формула /. Работа алгоритма заключается в приписывании каждому состоянию s множества label(s) тех подформул формулы /, которые становятся истинными в состоянии s. Первоначально label(s) совпадает с L(s). Далее алгоритм совершает ряд шагов. На шаге t обрабатываются подформулы, в которых глубина вложенности CTL- операторов равна i — 1. После обработки подформулу добавляют к разметке всех тех состояний, в которых она истинна. По окончании работы алгоритма мы обнаружим, что соотношение M,s\= f имеет место в том и только том, случае, когда / € label(s). 'Или, в логической терминологии, проблема проверки выполнимости формулы на модели. — Прим. ред.
4.1. Верификация моделей для CTL 65 procedure CheckEU(fi,fc) Т := {8 | /2 € label(s)}; for all а е Т do label{s) := /afteJ(«) U {Е[/х U /2]}; while Т ф 0 do choose а е Т; for all t such that JZ(?, a) do if E[/i U/2] g /a6e/(i) and /i € /afe/(t) then label{t) := JabeJ@ U {E[/i U /2]}; Т:=Ги{«}; end if; end for all; end while end procedure Рис. 4.1. Процедура разметки состояний для формулы Е[Д U /а] Напомним, что всякую CTL-формулу можно записать при помощи связок и операторов -i, V, EX, EG и EU. Таким образом, на промежуточных шагах алгоритма достаточно уметь анализировать формулы шести типов в зависимости от того, является ли формула д атомарной или она представлена в одной из следующих форм: ->/i, /iV/a.EX/i.EG/ieBlAU/J. Для формул вида ->Д мы помечаем все те состояния, которые не помечены формулой /i. Для формулы вида /i V /2 мы помечаем все те состояния, которые помечены либо /i, либо /j. Для формулы вида EX /i мы помечаем все те состояния, один из последователей которых помечен Д. Чтобы проанализировать формулу вида д = Е[Д U/г], мы сначала выделим все состояния, помеченные /з • Далее мы будем отступать из них назад, используя отношение, обратное отношению переходов Я, и отыщем все те состояния, через которые проходят пути, каждое состояние которых помечено /i. Все выделенные таким образом состояния пометим д. На рис. 4.1 приведено описание процедуры CheckEU, которая добавляет E[/i U /2] к множеству labei[s) для каждого состояния в, удовлетворяющего E[/i U/a], исходя из предположения о том, что /i и /з уже были корректно обработаны, то есть для каждого состояния
66 Глава 4. Верификация моделей s мы имеем Д ? label(s) в том и только том случае, когда s \= Д, и fa 6 labels(s) тогда и только тогда, когда s \= fa. Для выполнения этой процедуры требуется время 0{\S\ + \R\). Случай EG д чуть более изощрен. Чтобы исследовать его, необходимо разбить граф на нетривиальные сильно связные компоненты. Сильно связной компонентой (SCC) С называется наибольший подграф, любая вершина которого достижима из всякой другой вершины этого подграфа по ориентированному пути, целиком содержащемуся в С. Компонента С считается нетривиальной в том и только том случае, когда она содержит более одной вершины или в точности одну вершину с циклом-петлей, проходящим через нее. Пусть модель М' получена из М за счет удаления из S всех тех состояний, в которых не выполняется /ь и соответствующего сужения R и L. Таким образом, мы получаем модель М' = (S',R',L'), в которой 5' = {s е S | М,з |= Л}, R' = R\s-xS' и V = L\s>. Нужно иметь в виду, что R' после сужения не обязательно будет тотальным отношением. Состояния, из которых не исходит ни одного перехода, могут быть удалены, но, вообще говоря, это не сказывается на корректности нашего алгоритма. Сам алгоритм обусловлен следующим соображением. Лемма 1. M,s |= EG/i тогда и только тогда, когда соблюдены следующие два условия: ¦ состояние в содержится в множестве 5'; ¦ в М' есть путь, ведущий из в в некоторую вершину t, содержащуюся в нетривиальной сильно связной компоненте С графа E', R'). Доказательство. Допустим, что M,s^= EG Д. Ясно, что s € S'. Рассмотрим такой бесконечный путь 7Г, исходящий из а, что j\ выполняется в каждом состоянии на протяжении 7г. Так как модель М конечна, путь 7г всегда можно представить в виде 7Г = поЩ, где 7Го — конечный начальный отрезок, а 7Гх — бесконечный суффикс тг, обладающий тем свойством, что каждое состояние в щ встречается в нем бесконечно часто. Ясно, что 7Го содержится в S'. Обозначим символом С множество состояний, через которые проходит iri. Очевидно, что С содержится в S'. Покажем, что между любой парой состояний из С проходит путь, целиком лежащий в С. Рассмотрим произвольные состояния si и «2 из С. Выберем некоторое вхождение 8\ в in. Учитывая то, каким образом был выбран путь ж\, мы можем утверждать, что одно из вхождений состояния я2 располагается на пути 7Ti
4.1. Верификация моделей для CTL 67 еще дальше. Отрезок между выбранными вхождениями состояний s\ и si целиком лежит в С. Этот отрезок представляет собой путь из *i в S2, лежащий в С. Таким образом, С либо является сильно связной компонентой, либо содержится в одной из таких компонент. В любом случае оба заявленных условия леммы выполняются. А теперь допустим, что условия леммы соблюдены. Рассмотрим путь 7Го из а в t. Обозначим -к\ конечный путь длины по меньшей мере 1, исходящий из t и вновь возвращающийся в t. Такой путь 7Ti наверняка существует, потому что состояние t лежит в нетривиальной сильно связной компоненте. Все состояния в бесконечном пути 7г = wo^i удовлетворяют Д. Поскольку я — один из допустимых путей, исходящих из а в модели М, мы убеждаемся в том, что M,s\=EGfi. D Алгоритм для случая д = EG/i можно получить непосредственно из леммы. Вначале мы строим сокращенную модель Крип- ке М' = (S',R',LJ), как это было описано выше. Далее разбиваем граф (S',R') на сильно связные компоненты, применяя алгоритм Тарьяна [2]. Этот алгоритм имеет сложность 0(|S'| + |Д'|). Затем мы выделяем те состояния, которые принадлежат сильно связным компонентам. Потом мы возвращаемся назад, используя обращение R', и выделяем, таким образом, все те состояния, которые лежат на путях, проходящих по состояниям, помеченным Д. Все вычисление можно выполнить за время 0(\S\ + \R\). На рис. 4.2 (с. 68) приведена процедура CheckEG, добавляющая EG Д к множеству label[s) для каждого я, в котором выполняется EG Д, при условии, что формула Д уже была корректно обработана. Для того чтобы проанализировать произвольную CTL-формулу /, мы благополучно применяем алгоритм разметки состояний ко всем подформулам этой формулы /, начиная с самых коротких и наиболее глубоко вложенных подформул, и продвигаемся наружу, пока не охватим всю формулу /. Следуя такой схеме вычисления, мы можем быть уверены в том:, что как только мы принимаемся за некоторую подформулу формулы /, все ее подформулы уже были обработаны. Коль скоро каждый проход требует времени 0(\S\ + \R\), а формула / может содержать не более |/| различных подформул, вся работа алгоритма проводится за время 0(|/|(|5| + \R\))- Теорема 1. Существует алгоритм проверки выполнимости произвольной CTL-формулы / в состоянии » на модели М = E, R, L) за время 0(|/|(|5| + |Д|)).
68 Глава 4. Верификация моделей procedure CheckEG(fi) S' := {в | /i € label{s)}; SCC := {С | С — нетривиальная SCC в S'}; т := UCescc{s 18 € с}; for all s e Г do iabei(s) := label(s) U {EG/i}; while T ф 0 do choose « € T; T:=T\{S}; for all t such that t G 5' and R(t,s) do ifEG/i ^/a6e/(t) then label(t) := label(t) U {EG /i}; T:=TU{t}i end if; end for all; end while end procedure Рис. 4.2. Процедура разметки состояний для формулы EG /i Мы поясним работу алгоритма верификации моделей для CTL на небольшом примере, описывающем поведение микроволновой печи. Модель Крипке для печи приведена на рис. 4.3. Для наглядности каждое состояние модели помечено списком, в который включены все те атомарные высказывания, которые истинны в этом состоянии, а также отрицания всех тех атомарных высказываний, которые ложны в этом состоянии. Пометки на дугах обозначают действия, приводящие к переходам; эти пометки не входят в состав модели Крипке. Мы проверим CTL-формулу AG(Start -> AF Heat), эквивалентную формуле z> T?F(Start Л EG ->Heat) (здесь EF / используется как сокращение для формулы E[true U /]). Начнем с вычисления множеств состояний, удовлетворяющих атомарным формулам, и далее перейдем к более сложным подформулам. Пусть S(g) обозначает множество всех состояний, помеченных подформулой д. Отметим, что, выбрав подходящую структуру данных, вычисление S(p) для всех р е АР можно осуществить за время 0(\S\ + \R\): S(Start) = [2,5,6,7], S{->Heat) = [1,2,3,5,6].
4.1. Верификация моделей для CTL открыть дверцу Рис. 4.3. Пример с микроволновой печью Для вычисления 5(EG -iHeat) мы сначала отыщем множество всех нетривиальных сильно связных компонент в S' = S(^Heat). Оказывается, что SCC = {{1,2,3,5}}. Продолжим вычисление, полагая множество Т всех состояний, которые должны удовлетворять формуле EG -iHeat, равным объединению всех множеств из SCC2. Таким образом, Т = {1,2,3,5}. Никакое другое состояние из S' не может достичь состояний из Т путем, проходящим в S'. Значит, этот этап вычисления завершится с результатом S(EG^Heat) = [1,2,3,5]. Далее мы вычислим S(Start Л EG -<Heat) = [2,5]. SCC — аббревиатура термина strongly connected component. — Прим. ред.
70 Глава 4. Верификация моделей При вычислении S(EF(Start Л EG -'Heat)) возьмем в качестве начального значения Т множество S(Start Л EG -<Heat). Далее воспользуемся отношением, обратным нашему отношению переходов, для пометки всех тех состояний, в которых выполняется формула EF{Start Л EG --Heat). Мы получим S(EF(Start Л EG -<Heat)) = [1,2,3,4,5,6,7]. И, наконец, вычислим S(->(EF(Start Л EG ->Heat)) = 0. Поскольку начальное состояние 1 не содержится в этом множестве, мы приходим к выводу о том, что система, соответствующая представленной модели Крипке, не удовлетворяет заданной спецификации. 4.1.1. Ограничения справедливости Теперь мы покажем, как обобщить алгоритм верификации моделей для логики CTL, чтобы охватить ограничения справедливости. Рассмотрим справедливую модель Крипке М = (S,R,L,F), в которой F = {Pi,..., Рк} — множество ограничений справедливости. Мы будем говорить, что сильно связная компонента С графа М является справедливой относительно F, в том и только том случае, когда для каждого Pi G F существует состояние U 6 С П Р{. Вначале приведем алгоритм для проверки EG /i на справедливой модели. Для того чтобы установить корректность этого алгоритма, нам потребуется лемма, аналогичная лемме 1. Как и прежде, будем полагать, что модель М' получена из М за счет удаления из S всех тех состояний, в которых Д не выполняется справедливо. Таким образом, М' = E',ii',L',F'), где S' = {s G S \ М,а Hf /i}, R' = Rs-xs-, V = Ls, и F' = {Pi П S' | Pi € F}. ЛЕММА 2. Соотношение M,s ^f EG/i верно тогда и только тогда, когда соблюдены следующие два условия: ¦ состояние s содержится в множестве S', ¦ в М' имеется путь, ведущий из s в некоторую вершину t, содержащуюся в нетривиальной справедливой сильно связной компоненте С графа (S", R'). Доказательство этой леммы аналогично доказательству леммы 1 и не приводится здесь. Опишем теперь процедуру CheckFairEG(fi), которая добавляет EG Д к пометке состояния s для каждого такого
4.1. Верификация моделей для CTL 71 s, что М, 8 ^р EG fi- Мы исходим из предположения о том, что все состояния помечены Д корректно на основе справедливой семантики нашей логики, т. е. что /i е labels(s) тогда и только тогда, когда М, s \=f /i • Процедура CheckFairEG почти идентична процедуре CheckEG, приведенной на рис. 4.2. Единственное отличие заключается в том, что SCC состоит теперь из нетривиальных справедливых сильно связных компонент. Сложность такого вычисления составляет 0((|5| + |i2|)|F|), поскольку приходится уточнять, какие из сильно связных компонент являются справедливыми. Это предполагает, что должно проводится обследование каждой компоненты, чтобы убедиться, что в ней присутствуют состояния из каждого ограничения справедливости. Для проверки других CTL-формул на справедливых моделях Крипке мы введем в рассмотрение вспомогательное атомарное высказывание fair, которое обращается в истину в некотором состоянии тогда и только тогда, когда существует справедливый путь, исходящий из этого состояния. Это значит, что fair = EG true в полном соответствии с семантикой нашей логики. Разметить состояния этим новым атомарным высказыванием можно при помощи процедуры CheckFairEG(true). Чтобы проверить соотношение М, s ^р Р для некоторого р € АР, мы проверяем соотношение М, s f= pt\ fair при помощи обычной процедуры верификации моделей. Для проверки соотношения М, s \=р EX f\ мы обращаемся к задаче анализа соотношения M,s (= EX(/i Л fair). И, наконец, для того, чтобы проверить соотношение М, в [=f E[/i U /2] мы анализируем соотношение M,s (= Е[Д U (/г Л fair)], обратившись к процедуре CheckEUih, h Л fair). Анализ сложности таков же, как и при отсутствии справедливости. Время, необходимое на каждом этапе работы алгоритма, составляет 0((|5| -I- |/l|)|F|). Так как число таких этапов не превосходит |/|, общая сложность по времени равна 0(|/|(|5| + |i?|)|F|). Теорема 2. Существует алгоритм проверки выполнимости произвольной CTL-формулы / в состоянии s на модели М = E, R, L, F) в рамках справедливой семантики за время 0(|/|(|?| + |i?|)|F|). Чтобы посмотреть, какое влияние оказывает справедливость, обратимся вновь к формуле KG{Start -» AF Heat) на модели, представленной на рис. 4.3. Однако на этот раз мы будем рассматривать только те пути, на протяжении которых пользователь правильно работает с микроволновой печью бесконечно часто. Это означает, что
72 Глава 4. Верификация моделей должно бесконечно часто выполняться условие Start Л Close A-<Error. Итак, F = {Р}, где Р = {а | s (= Start A Close A ->Error}. Множества S(Start) и S(->Heat) остаются такими же, как и прежде. Вычисляя множество сильно связных компонент над совокупностью состояний S' = S(-iHeat), мы понимаем, что компонента {1,2,3,5} не является справедливой, ибо она не содержит состояний, удовлетворяющих формуле Start A Close A ->Error. Таким образом, S(EG->Heat) = 0. В результате мы получаем S(EF(Start Л EG ->Heat)) = 0, откуда следует, что Sb(EF{Start A EG ^Heat)) = {1,2,3,4,5,6,7}. А это означает, что программа удовлетворяет нашей формуле при заданных ограничениях справедливости. 4.2. Табличная верификация моделей для LTL Пусть задана модель Крипке М = (S,R,L), а также состояние я € 5, и пусть Ад — формула линейной темпоральной логики. Это значит, что д — упрощенная формула пути, в которой только атомарные высказывания являются формулами состояния. Мы хотим определить, верно ли, что M,s \= Ад. Отметим прежде всего, что соотношение М,з \= Ад имеет место тогда и только тогда, когда М,в |= -iE-ig. Следовательно, нам достаточно суметь проверить истинность формулы вида Е/, где / — упрощенная формула пути. В общем случае это PSPACE-полная проблема [230, 231]. Доказательство ее PSPACE-полноты изобилует техническими деталями и не приводится в этой книге. Однако мы покажем, что проблема верификации моделей является NP-полной для формул вида Е/, где / — упрощенная формула пути. Рассмотрим произвольный граф G = {V, А), где V = {«1,... ,«„}. Покажем, что проблема проверки наличия в графе G гамильтонова пути сводима к проблеме анализа соотношения М, 8 (= /, где ¦ М — конечная модель Крипке, ¦ 8 — состояние в М, ¦ / — формула Е[Рр! Л • • • Л Fpn A G(pi -> X G -.pj) Л • • • Л G(p„ -> X G -.?„)], содержащая атомарные высказывания р\,... ,рп.
4.2. Табличная верификация моделей для LTL 73 Граф G мы превратим в модель, сделав каждое высказывание pi, 1 ^ г ^ п, истинным в вершине V{ и ложным во всех остальных вершинах, а также добавив вершину-источник щ, из которой достижимы все вершины Vi (но не наоборот), и вершину-сток г»2, которая достижима из всех вершин t»e- (но не наоборот). Вершина-источник задает единственное начальное состояние, которое позволяет начать гамильтонов путь из любой вершины графа. Вершина-сток нужна для того, чтобы сделать отношение достижимости на модели тотальным. Говоря более строго, модель Крипке М — (U,B,L) состоит из следующих компонент ¦ U = VU{ui,u2},TAeu1,U2^V, • B = AU {(ui,^)| vt G V}U{{vi,u2)\ vt G V} U {(и2,«2)}, ¦ L — такое означивание высказываний в состояниях, что • Pi ИСТИННО В Vi для 1 ^ i ^ п, • pj ложно в Vi для 1 ^ г, j ^ п, г ф j, . pi ложно в гц, иг Для 1 ^ з «J п. Легко видеть, что М, «i р / тогда и только тогда, когда существует ориентированный бесконечный путь в М, начинающийся в тц, проходящий по всем Vi е V в точности по одному разу и оканчивающийся циклом-петлей, проходящим через щ. Обратите внимание на то, что формула / в приведенной выше конструкции имеет по сути дела такой же размер, что и граф G. Допустим, что длина формулы, которую нужно проверить, гораздо меньше, нежели размер рассматриваемой модели Крилке. Можно задаться вопросом: а будет ли сложность столь же высока и в таком случае? Тщательный анализ, проведенный Лихтенштейн и Пну- ели [171], показывает, что хотя сложность будет, очевидно, экспоненциальной относительно длины формулы, тем не менее она будет линейной относительно размера глобального графа переходов. В их алгоритме неявно используется табличная конструкция. Таблица представляет собой граф, который строится по заданной формуле; из этого графа можно извлечь модель для исследуемой формулы в том и только том случае, когда формула выполнима. Алгоритм проверки выполнимости формулы / на модели М строит композицию таблицы и модели для того, чтобы выяснить, существует ли такое вычисление в модели, которое одновременно является путем в таблице. Далее мы приведем описание алгоритма из [171]. В разд. 6.7 мы представим другой алгоритм проверки выполнимости формулы
74 Глава 4. Верификация моделей LTL на модели, в котором непосредственно задействована табличная конструкция. Пусть задана модель Крипке М = (S, R, L), и пусть / — упрощенная формула пути. Достаточно рассмотреть только темпоральные операторы X и U, поскольку F/ = True U f, G f = ->F->f и Д R/2 = ~,[~l/i U-1/2]. Замыкание CL(f) формулы / содержит формулы, значения истинности которых влияют на истинностное значение формулы /. Более точно, замыканием формулы / называется наименьшее множество формул, содержащее / и удовлетворяющее условиям ¦ """Д € CL(f) тогда и только тогда, когда Д 6 CL(f); ¦ если Л V /а € CL(f), то Л, /2 6 СХ(/); ¦ если X/i € CL{f), то Л 6 CL(f); ¦ если -X/i е CL{f), то Х-Д е CL{f); • если Д U Д € СХ(/), то Л,/2,Х[Л U /2] G СЭД. Здесь мы отождествляем -i-i Д и Д. Можно показать, что мощность множества CL{f) линейна относительно размера формулы /. Атомом назовем пару А = (в а, К а), в которой а а 6 S и К а Я CL(f) U АР, и при этом ¦ для любого высказывания р € ЛР соотношение р G .Кд выполнено в том и только том случае, когда р ? L(sa)', ¦ для каждой формулы Д G CL(f) соотношение Д € К а выполнено в том и только том случае, когда -|Д $ ,Кд; ¦ для каждой формулы Д V Д € CL{f) соотношение Д V Д 6 ЯС* выполнено в том и только том случае, когда Д € /Са или Д € К а; ¦ для каждой формулы -¦ X Д 6 CL(f) соотношение -¦ X Д е К а выполнено в том и только том случае, когда Х->Д 6 К а; ¦ для каждой формулы Д U Д 6 CL(f) соотношение Д U Д 6 АГд выполнено в том и только том случае, когда Д € .Ка или обе формулы Д и Х[Д U Д] содержатся в .Кл- Как видно, атом (в а, К а) определен так, что К а — наибольшее непротиворечивое множество формул, согласованных с разметкой за- В графе G в качестве множества вершин используется множество атомов. Пара (А, В) задает ребро в графе G тогда и только тогда, когда (вл.«в) G Л, и для каждой формулы ХД е CL(f) включение X Д € К а имеет место в том и только том случае, когда Д € К в- Последовательностью происшествий назовем бесконечный путь я- в G, обладающий следующим свойством: если выполни-
4.2. Табличная верификация моделей для LTL 75 ется включение /i U /2 ? .Кл для некоторого вхождения атома А из п, то найдется такое вхождение атома В, достижимое из указанного вхождения А на пути 7г, что /г € Кв- Лемма 3. Соотношение М, а \= Е/ имеет место тогда и только тогда, когда существует хотя бы одна последовательность происшествий, начинающаяся таким атомом (s,K), что / € К. Доказательство. Ограничимся только наброском доказательства. Вначале допустим, что имеется последовательность происшествий (sc»)-Ko))(sb-^i)> •••, берущая начало в таком атоме {в,К) = (sq,Ko), что / 6 К. По определению последовательность состояний 7Г = so, «1, • • • является путем в М, исходящим из s = Sq. Мы хотим показать, что я ^ /. На самом деле мы обоснуем несколько более сильное утверждение: если д € CL(f) — произвольная формула, и г ^ 0, то я1 |= д тогда и только тогда, когда д € Ki. Доказательство проводится индукцией по структуре подформул. Мы обоснуем базис индукции и обеспечим осуществление индуктивного перехода, рассмотрев случаи, когда д имеет вид ->h, Ai V Л2, X Ai или hi V h?. 1. Если g — атомарное высказывание, то по определению атома мы имеем д ? Ki тогда и только тогда, когда д Е L(si). 2. Если д = -ifti, то эг* f= д тогда и только тогда, когда 7г* fc? h\. По индуктивному предположению это будет верно тогда и только тогда, когда /ii ^ К^ Согласно определению множества Ki отсюда следует, что д 6 К{. 3. Если д = h\ V Аг> то жх |= д тогда и только тогда, когда it' f= Ai или яг* |= /i2 • По индуктивному предположению это будет верно тогда и только тогда, когда h\ Е -K"i или А2 G ift- А согласно определению множества К последнее равносильно тому, что д ? Ki. 4. Если д = Xfti, то тг' (= # тогда и только тогда, когда я-* (= Ai. По индуктивному предположению это будет верно тогда и только тогда, когда hi ? /ffj+i- Поскольку ((в»,АГ«), (sj+i,.RTj+i)) 6 Л, последнее возможно в том и только том случае, когда X hi € Ki. 5. Допустим, что д = hiVhi Е Ki. По определению последовательности происшествий существует такое j ^ г, что Лг ? Ку Так как 5 6 К^ из определения атома можно заключить, что если Аз §! Ki, то Ai € If < и Х# 6 AV В таком случае из определения отношения переходов в графе G следует, что д 6 Ki+i. Тогда для каждого i ^ k < j имеет место включение Ai € Кк- По индуктивному предположению мы можем воспользоваться соотношением згл (= Аз, и к тому же для
76 Глава 4. Верификация моделей любого i ^ к < j будет выполняться соотношение 7Г* f= hi. Отсюда заключаем, что 7Г* р д. Если тг' р д, то существует такое j ^ г, что 7rJ р Лг и для всякого i ^ Jfe < j имеет место соотношение 7г* р fti. Выберем наименьшее из таких j. По индуктивному предположению мы считаем, что Лг € Kj и для всякого г ^ к < j верно включение hi 6 К^. Допустим д 4 Ki. Так как fti € if», из общего определения атома можно заключить, что X д 4 К,, а это, в свою очередь, влечет включение X ->д € Ki. Отсюда, обратившись к определению отношения переходов в G, получаем -уд G Кi+i и, следовательно, <7 ? Ki+i • Продолжая эти рассуждения по индукции, мы рано или поздно обнаружим, что д 4 Kj. А это противоречит тому, что Лг G Kj. Этим завершается обоснование достаточности условий леммы. Проведем доказательство в обратную сторону. Допустим, что М, в р Е /. Тогда есть такой путь ж = «о. «i»• • • из состояния а = во, что тг р /. Рассмотрим множества Ki = {д\ д € CL(f) и ir' р д}. Тогда верны следующие умозаключения: 1. Пара (si, Ki) является атомом. Это видно из определения отношения р. Например, для заданного д € CL(f) множество Ki должно содержать либо д, либо -<д, но не обе эти формулы. По определению множества Ki включение д € АГ» имеет место тогда и только тогда, когда л-' р д. Но, в свою очередь, соотношение ж* (= д будет выполняться тогда и только тогда, когда 7г* р -*д. И вновь по определению множества Ki соотношение я-' р ->д имеет место в том и только том случае, когда ->д 4 Ki. 2. Имеется переход из (si,Ki) в (a*+i, AT<+i). Это следует из очевидных соображений: включение ~Х.д € Ki имеет место тогда и только тогда, когда тг* р X </. Далее, соотношение я-' (= Х# выполняется в том и только том случае, когда 7г'+1 р д. Наконец, по определению множества ЯГ<+1 соотношение 7г,+1 р д будет верно тогда и только тогда, когда д 6 Ki+\. Значит, Хд е Ki равносильно д € ift+i- 3. Последовательность пар (aotKo),(ai,Ki)t... является последовательностью происшествий. Обратим внимание на то, что соотношение д = hi U/i2 € if< выполняется в том и только том случае, когда я-' р д. Это означает, что для некоторого j ^ t будет выполняться соотношение я^ р /»2. А это свидетельствует о том, что /»а G А,-. ? Нетривиальную сильно связную компоненту С графа G будем называть самодостаточной в том и только том случае, когда для
4.2. Табличная верификация моделей для LTL 77 каждого атома А из С и для каждой формулы Д U /2 € /sT^ существует такой атом В из С, что /г € В. Лемма 4. Из атома (а, ЛС) исходит некоторая последовательность происшествий в том и только том случае, когда в графе G есть путь из (в, К) в какую-либо самодостаточную сильно связную компоненту. Доказательство. Предположим, что существует последовательность происшествий, начинающаяся с (л, К). Рассмотрим множество атомов С", встречающихся в этой последовательности бесконечно часто. Множество С является подмножеством некоторой сильно связной компоненты С графа G. Обратимся к подформуле д = hi U Лг и такому атому (з,К) € С, что д € .К". Поскольку компонента С сильно связана, в С имеется конечный путь из (я, К) в С". Если hz встречается на этом пути, то в С есть атом, содержащий h^. Если же Лг не попадается на этом пути, то д присутствует в каждом атоме на этом пути, и, в частности, д содержится в одном из атомов множества С". Поскольку С" образовалось из последовательности происшествий, подформула /i2 содержится в одном из атомов множества С", а значит, и в одном из атомов множества С. Следовательно, компонента С является самодостаточной. Теперь допустим, что имеется путь из (а, К) в самодостаточную сильно связную компоненту С. Ясно, что мы можем построить последовательность атомов из С, в которой вслед за каждым вхождением подформулы hi U /i2 будет когда-либо следовать вхождение подформулы h2. Остается лишь выяснить вопрос о подформулах hi U Лг, встречающихся на пути из (s, К) в С. Вхождение каждой такой подформулы либо предшествует некоторому вхождению hi, либо повторяется во всех атомах на протяжении указанного пути, до тех пор пока не будет достигнута компонента С. Но поскольку С является самодостаточной компонетой, мы в любом случае способны достичь некоторого вхождения подформулы h?. Q Следствие 1. Соотношение М, а (= Е / верно тогда и только тогда, когда в G найдется такой атом А = {а,К), что / € К и при этом в G существует путь из Л в самодостаточную сильно связную компоненту. Следствие 1 можно положить в основу алгоритма верификации моделей для линейной темпоральной логики. Этот алгоритм будет
78 Глава 4. Верификация моделей иметь сложность по времени ОЩЗ! + \R\) ¦ 2°^'^). Кроме того, Лихтенштейн и Пнуели показали, как обощить этот основополагающий алгоритм, чтобы его можно было сочетать с разнообразными понятиями справедливости без существенного увеличения сложности. Чтобы продемонстрировать, как осуществляется верификация моделей для LTL, обратимся вновь к модели М = (S,R,L), изображенной на рис. 4.3, со спецификацией A[(-iHeat) U Close], которая будет верна для этой модели, если печь не может нагреваться с открытой дверцей. Чтобы показать, что эта формула выполняется, мы убедимся в том, что ее отрицание E-i((-i.Heai) U Close) не выполняется. Обозначим символом / подформулу (pHeat) U Close. Прежде всего вычислим замыкание формулы -¦/: CL(->f) = {-./, /, X /, -«X /, X -./, Heat, ->Heat, Close, -iClose}. Далее построим множество атомов, которые будут служить вершинами графа G. В соответствие с последним пунктом определения множества К а формула (-iHeat) U Close принадлежит К а тогда и только тогда, когда либо Close содержится в К а, либо обе формулы -iHeat и X((-iffeat) U Close) содержатся в Ка- К тому же К а должно быть согласовано с L(sa)- Формулы ->Close и ->Heat содержатся в пометках состояний 1 и 2. Поэтому множество формул, которые ассоциируются с этими состояниями, может иметь вид К[ = {-.Close, ->Heat, f, X /} или К'{ = {^Close, --Heat, -./, X -./, -»X /}. Атомами здесь являются пары A,К[), B,К[), A,К"), B, К"). Точно так же пометки состояний 3, 5 и 6 содержат формулы ->Heat и Close. Поэтому с ними можно ассоциировать два множества К'2 = { Close, ->Heat, f, X /} или Kg = { Close, ^Heat, -i/, X -./,-. X /}. И наконец, для состояний 4 и 7 эти множества таковы: К'г = {Close, Heat, /,Х/} или КЦ = { Close, Heat, -./, X -./, -i X /}. Чтобы определить отношение переходов между атомами, мы напомним, что переход из атома (sa,Ka) в атом (sb,Kb) существует в том случае, когда в М есть переход из ад в sb и, кроме того, для каждой формулы вида ХЛ G К а имеется включение h 6 Кв.
4.3. Верификация моделей для CTL* 79 Поскольку A,2) 6 R, существует переход из (l.-Kj) в B,К[), ибо X/ € К[ и / ? .К]. По тем же причинам есть переход из A,К") в B, К"). Однако переход из A, К[) в B, К") невозможен, так как X/etf{, но/?#{'. Прочие переходы строятся аналогично. Следствие 1 утверждает, что формула ->f выполняется в состоянии з, если найдется такой атом [а,К), что -i/ 6 К и при этом существует путь в графе G из (я,if) в самодостаточную сильно связную компоненту. Как только граф полностью построен, нетрудно убедиться в том, что ни один из указанных атомов не лежит в начале никакого бесконечного пути. Поэтому ни одно состояние не удовлетворяет Е -¦/. Отсюда следует, что А / выполняется во всех состояниях модели. 4.3. Верификация моделей для CTL* Можно было бы ожидать, что сложность верификации моделей для CTL* будет превосходить сложность верификации моделей как для CTL, так и для LTL. Удивидительно, но это не так. В [62, 106] было показано, что проблема верификации моделей для CTL* имеет в сущности такую же сложность, что и проблема верификации моделей для LTL. Основная идея состоит в том, чтобы совместить метод разметки состояний модели, принятый для логики CTL, с методом верификации моделей для LTL. Изначальный алгоритм для LTL применяется к формулам вида Е /, где / — упрощенная формула пути, в которой формулами состояния могут быть только атомарные высказывания. Этот алгоритм можно обобщить на случай формул /, содержащих в качестве подформул произвольные формулы состояния. Предположим, что подформулы состояния формулы / уже были обработаны, и пометки состояний были соответствующим образом уточнены. Каждая формула состояния будет в таком случае замещена новым атомарным высказыванием как в разметке модели, так и в самой формуле. Обозначим новую формулу Е/'. Если это формула CTL, то мы применяем процедуру верификации моделей для CTL. В противном случае /' будет бескванторной формулой пути LTL, и тогда применяется алгоритм верификации моделей для LTL. В обоих случаях формула добавляется к пометкам всех тех состояний, в которых она выполнима. Если Е / — подформула более сложной СТЪ*-формулы, то после замещения Е / новым атомарным выска-
80 Глава 4. Верификация моделей зыванием процедура применяется повторно. И это продолжается до тех пор, пока не будет обработана вся формула. Как и в случае алгоритма для CTL, работа алгоритма для CTL* состоит из этапов, причем на этапе i обрабатываются подформулы уровня г. Рассмотрим СТЬ*-формулу /. Подформулы состояния уровня i определяются индуктивно: ¦ Уровень 0 содержит все атомарные высказывания. ¦ Уровень i + 1 содержит все такие подформулы состояния д, что любая подформула состояния формулы д располагается на уровне i или на еще более низком уровне, а сама д не содержится ни на одном более низком уровне. Поясним понятие уровня СТЬ*-формулы на примере микроволновой печи. Приведенная ниже формула CTL* утверждает, что при всякой недопустимой последовательности шагов печь либо никогда не будет нагреваться, либо рано или поздно произойдет перезапуск: AG((-.Close Л Start) -л A(G -*Heat V F ->Error)). Недопустимая последовательность шагов характеризуется условием (-1 Close Л Start), которое означает, что кнопка запуска нажата еще до того, как была закрыта дверца. Осуществление перезапуска обозначено -lError. Это свойство невыразимо в CTL. Чтобы упростить верификацию модели, мы ограничимся рассмотрением одних только кванторов существования по путям. Тогда нашу формулу можно переписать в виде -. EF(-.CTose Л Start Л E(F Heat Л G Error)). Уровни ее подформул таковы: ¦ На уровне 0 лежат формулы Close, Start, Heat и Error. ¦ На уровне 1 — формулы E(F Heat Л G Error) и -¦ Close. ¦ На уровне 2 - формула EF(-- Close Л Start AE(F HeathG Error)). ¦ На уровне 3 лежит вся наша формула. Пусть дана СТЬ*-формула д. Тогда подформула E/ii формулы д называется .максимальной, если E/ii не является собственной подформулой какой-либо собственной подформулы вида Е h\ формулы д. Рассмотрим, например, формулу E(aVE(bAEFc)). Здесь EFc — максимальная подформула формулы Е(ЬЛ EFc), но не является таковой для Е(о V Е(Ь Л EF с)). Пусть задана модель Крипке М = (S,R,L) и СТЬ*-формула /. Пусть д — подформула состояния формулы / уровня i. Мы будем
4.3. Верификация моделей для CTL* 81 procedure CheckE(g) if д является CTL-формулой then применить к д алгоритм верификации моделей для CTL; return; end if; а' :=5[ац/ЕЛ1,...,о*/ЕЛ*]; for all s G S for t = 1,... ,k do if Ehi € label(a) then labei(s) := label{s) U {a{}; end for all; применить к g' алгоритм верификации моделей для LTL; for all s 6 S do if g' € iobei(s) then label(s) := label(s) U {#}; end for all; end procedure Рис. 4.4. Процедура разметки состояний для формулы д = Egi полагать, что состояния М уже корректно размечены всевозможными подформулами из уровней, меньших, чем г. На этапе i алгоритма верификации для CTL* формула д добавляется ко всем тем состояниям, на которых она истинна. Необходимо рассмотреть несколько случаев в зависимости от вида формулы д. ¦ Если д — атомарное высказывание, то д заносят в label(s) в том и только том случае, когда это высказывание содержится в L(s). ¦ Если д = -*gi, то д заносят в label {а) в том и только том случае, когда д\ не содержится в label{s). ¦ Если д = 0i Vp2i то д заносят в label(s) в том и только том случае, когда 0i или д% содержится в label(s). ¦ Если д = Ejft, то применяется процедура CheckE(g), представленная на рис. 4.4, с целью пополнения пометок тех состояний, на которых выполняется д. Здесь E/»i,... ,ЕЛц — максимальные подформулы формулы д, а аь...,а* — новые атомарные высказывания. Формула д', которую анализирует эта процедура, получается из д путем подстановки на место каждой подформулы Е hi атомарного высказывания сч. Нужно отметить, что полученная в результате формула будет иметь вид Е д1, где д' — бескванторная формула пути логики LTL. Далее мы запускаем блок верификации моделей для 7 Зак. 271
82 Глава 4. Верификация моделей LTL с целью уточнения пометок label(s) таким образом, чтобы присваивание label(s) :— label(s) U {<?'} осуществлялось в том и только том случае, когда имеет место соотношение М, а |= д'. Сложность этого алгоритма зависит от сложности используемых процедур верификации моделей для CTL и LTL. Как было показано в разд. 4.1, сложность проблемы проверки выполнимости формул логики CTL на модели линейна как по размеру модели М,'так и по размеру формулы /. Наилучшие известные алгоритмы проверки выполнимости формул логики LTL имеют сложность 0(\М\ -2°^^). Теорема 3. Существует алгоритм верификации моделей для CTL*, имеющий сложность 0(\М\ ¦ 2°(Щ. Следует иметь в виду, что в конкретных реализациях алгоритма не нужно замещать формулы состояния вспомогательными атомарными высказываниями. Как только пометки состояний будут модифицированы применительно к некоторой подформуле, эта подформула приобретет статус атомарного высказывания. Продемонстрируем алгоритм верификации моделей для CTL* в действии применительно к СТЬ*-формуле -.EF(-.Close Л Start Л E(F Heat Л G Error)) на модели микроволновой печи, описанной на рис. 4.3. На уровне 0 обрабатываются все атомарные высказывания. На уровне 1 формула ->dose добавляется к пометкам состояний 1 и 2. Другая формула из уровня 1, а именно E(F Heat Л G Error), является бескванторной формулой LTL, и поэтому к ней применяется процедура верификации моделей для LTL. Коль скоро эта формула не выполняется ни в одном состоянии, она никуда не добавляется. На уровне 2 формула E(F Heat Л G Error) сначала замещается атомарным высказыванием а. Затем процедура вериификации для CTL применяется к бескванторной формуле ~EF{pClose Л Start Л а). Ни одно состояние не помечается этой формулой, и поэтому на уровне 3 все состояния помечаются -1 EF(-.C7ose Л Start Л E(F Heat Л G Error)). Таким образом, наша микроволновая печь всегда обладает указанным свойством.
Двоичные О разрешающие диаграммы В этой главе мы расскажем о том, как представлять реагирующие системы с конечным числом состояний в символьном виде при помощи двоичных разрешающих диаграмм. Сначала обсудим, как можно использовать двоичные разрешающие диаграммы для представления булевых функций. Булевы функция определяются на значениях 0 и 1, причем 0 соответствует логической константе False, а 1 — логической константе True. Мы покажем, что размер двоичных разрешающих диаграмм существенно зависит от выбранного порядка расположения переменных, и обсудим коротко некоторые эвристики, которые помогают выбрать нужное упорядочение. Мы продемонстрируем также, как можно эффективно выполнять различные логические операции, используя указанную форму представления булевых функций, а затем поясним, как при помощи двоичных разрешающих диаграмм можно закодировать модели Крипке таким образом, чтобы синхронные и асинхронные системы были представлены как можно более компактно. Это одна из наиболее важных идей в теории автоматической верификации, поскольку именно она делает возможной символьную верификацию и переводит верификацию очень больших систем на уровень обыденной практики. 5.1. Представление булевых функций Упорядоченные двоичные разрешающие диаграммы (или, сокращенно, OBDD — ordered binary decision diagrams) — это каноническая форма представления булевых функций [34]. Часто они оказываются значительно более компактными, нежели традиционные нормальные формы, такие как дизъюнктивная нормальная форма и конъюнктивная нормальная форма; кроме того, с ними можно работать очень эффективно. По этим причинам они нашли широкое применение во многих приложениях, относящихся к автоматическому проектированию, в том числе в символьном имитационном моделировании, верификации комбинационных логических схем и, совсем недавно, в верификации параллельных систем с конечным числом состояний. 7*
84 Глава 5. Двоичные разрешающие диаграммы 1 00 10 00 0000 01 00 1 Рис. 5.1. Двоичное разрешающее дерево для двухбитового компаратора Чтобы пояснить наш интерес к двоичным разрешающим диаграммам, сначала рассмотрим двоичные разрешающие деревья. Двоичное разрешающее дерево — это корневое ориентированное дерево, вершины которого разбиты на два класса — терминальные вершины и нетерминальные вершины. Каждая нетерминальная вершина v помечена переменной var(v) и имеет две вершины-последователя: low(v), которая соответствует случаю, когда переменная var(v) равна 0, и high(v), которая соответствует случаю, когда переменная var(v) равна 1. Каждая из терминальных вершин v имеет пометку value(v), равную 0 или 1. На рис. 5.1 приведено двоичное разрешающее дерево для двухбитового компаратора, который описывается формулой /@1,02,61,62) = (в1 *4 6i)A@2-H62).
5.1. Представление булевых функций 85 Чтобы выяснить, какое значение принимает формула при заданном наборе значений переменных, нужно спустится по дереву из корня до терминальной вершины. Если переменная var(v) имеет значение 0, то следующей вершиной на пути из корня в терминальную вершину будет low(x). Если же var(v) имеет значение 1, то последующей вершиной на пути будет high{x). То значение, которым помечена достигнутая терминальная вершина, и будет значением функции на этом наборе. Например, оценка (oi := 1,ог := 0, h := 1,&2 := 1} приводит к висячей вершине, помеченной 0; следовательно, при таком означивании формула ложна. Двоичные разрешающие деревья не дают очень компактного представления булевых функций. По сути дела, они имеют точно такой же размер, как и таблица истинности. К счастью, такие деревья обычно бывают чрезвычайно избыточными. Например, дерево на рис. 5.1 содержит восемь поддеревьев, корни которых помечены 6г, но только три из них попарно различны. За счет этого мы можем добиться более компактного представления для булевых функций, как только сольем воедино все изоморфные поддеревья. В результате получится ориентированный ациклический граф, который и называется двоичной разрешающей диаграммой. Точнее говоря, двоичная разрешающая диаграмма — это корневой ориентированный ациклический граф, вершины которого разбиты на два класса — терминальные вершины и нетерминальные вершины. Как и в случае двоичных разрешающих деревьев, каждая нетерминальная вершина v помече- на'переменной var[v) и имеет две вершины-последователя: low(v) и high{v). Каждая терминальная вершина помечена либо 0, либо 1. Всякая двоичная разрешающая диаграмма В с корнем в вершине v определяет булеву функцию /„(ari,... ,хп) следующего вида: 1. В случае, когда v — терминальная вершина, мы считаем, что а), если vaiue(v) = 1, то fv[x\,...,хп) = 1, Ь). если value{v) = 0, то /„ (zi,..., хп) =0. 2. В случае, когда v — нетерминальная вершина и var{v) = ж* мы имеем fv(xi,.. .,Х„) = (-!«< Л flow(v)(?l,... ,Хп)) V (xt Л Л^Л@)(Х1, ..., хп)). На практике во многих приложениях желательно иметь каноническое представление булевых функций. Такое представление должно обладать тем свойством, что две булевы функции логически экви-
86 Глава 5. Двоичные разрешающие диаграммы валентны тогда и только тогда, когда они имеют изоморфные представления. Это свойство упрощает некоторые задачи наподобие проверки эквивалентности двух формул или решения вопроса о выполнимости заданной формулы. Две двоичные разрешающие диаграммы считаются изоморфными, если существует такое взимно однозначное отображение h, которое сопоставляет терминальные вершины одной из них терминальным вершинам другой, а также нетерминальные вершины одной — нетерминальным вершинам другой, так что для каждой терминальной вершины v справедливо равенство value{6) = value(h(v)), а для каждой нетерминальной вершины v выполняются соотношения var(v) = var(h(v)), h(low(v)) = low(h(v)) и h(high(v)) = high(h(v)). Бриан [34] показал, как можно строить канонические представления булевых функций, налагая два ограничения на структуру двоичных разрешающих диаграмм. Во-первых, по каждому пути из корня в терминальную вершину переменные должны следовать в одном и том же порядке. Во-вторых, в диаграмме не должно быть изоморфных подцеревьев или избыточных вершин. Первое требование можно выполнить, установив некоторый линейный порядок < на множестве переменных, которыми помечены вершины двоичной разрешающей диаграммы, и объявив, что каждая нетерминальная вершина и диаграммы, имеющая нетерминальную вершину-последователя v, должна подчиняться соотношению var(u) < var(v). Второе требование можно выполнить, последовательно применяя три правила преобразования, сохраняющих функцию, представленную диаграммой. Удаление повторных вхождений терминалов. Удаляются все кроме одной терминальные вершины, имеющие заданную пометку; все дуги, которые ранее вели в изъятые терминальные вершины, направляются теперь в оставшуюся терминальную вершину- Удаление повторных вхождений нетерминалов. Бели для каких- нибудь двух нетерминальных вершин и и и имеют место равенства war(u) = var(v), low(u) = low(v) и high(u) = high(v), то одна из них удаляется, а все ведущие в нее дуги направляются в оставшуюся вершину. Удаление избыточных проверок Если для нетерминальной вершины v выполняется равенство low(v) = high(v), то она удаляется, а все ведущие в нее дуги направляются в low{v).
5.1. Представление булевых функций 87 0 1 1 1 (V 0 a) oi < 61 < а2 < kt б) ai < оъ < bx < fa Рис. 5.2. OBDD для двухбитового компаратора при различных порядках переменных Каноническую форму можно получить из любой двоичной разрешающей диаграммы, обладающей свойством упорядоченности; в ходе построения правила преобразования применяются до тех пор, пока размер диаграммы не будет сокращен. Бриан показал, как это можно осуществить, проводя преобразования снизу вверх при помощи процедуры, которая называется Reduce, за время пропорциональное размеру исходной двоичной разрешающей диаграммы [34]. Термин упорядоченная двоичная разрешающая диаграмма (OBDD) будет отныне применяться к графу, полученному именно таким методом. Например, если используется упорядочение а\ < &i < ог < 6з для двухбитовой функции сравнения, то в результате будет получена OBDD, изображенная на рис. 5.2 а). Если использовать OBDD в качестве канонической формы для булевых функций, то проверка эквивалентности сводится к проверке
88 Глава 5. Двоичные разрешающие диаграммы изоморфизма между двоичными разрешающими диаграммами. Это означает, что выполнимость может быть установлена путем проверки эквивалентности исследуемой OBDD и вырожденной OBDD, состоящей из единственной терминальной вершины, помеченной 0. Размер OBDD очень сильно зависит от упорядочения переменных. Например, если мы упорядочим переменные а\ < ai < bi < b? для двухбитовой функции сравнения, то в результате будет получена OBDD, изображенная на рис. 5.2 б). Отметим, что эта OBDD имеет одиннадцать вершин, в то время как у OBDD, представленной на рис. 5.2 а), всего лишь восемь вершин. В общем случае, когда речь идет о n-битовом компараторе, выбрав упорядочение переменных ai < Ь\ < • ¦ • < оп < Ьп, мы получим OBDD, число вершин в которой равно Зп + 2. Но если мы выберем упорядочение ai < ¦ • • < ап < Ь\ • • ¦ < Ьп, то число вершин такой OBDD будет равно 3 ¦ 2" — 1. Вообще говоря, отыскать эффективно наилучший порядок расположения переменных невозможно; в частности, можно показать, что даже проверка того, будет ли предложенный порядок оптимальным, является NP-полной задачей [36]. Более того, существуют последовательности булевых функций, размер OBDD для которых растет экспоненциально с увеличением числа переменных независимо от порядка их расположения. Одним из примеров булевых функций такого рода может служить функция, вычисляющая n-й бит произведения двоичных целых чисел [35, 36]. Было разработано несколько эвристик поиска хороших упорядочений переменных в случаях, когда такого рода порядок существует. Если булева функция представлена логической схемой, то эвристики, основанные на обходе графа схемы в глубину с возвратом, дают обычно хорошие результаты [118, 183]. Интуитивные соображения, служащие источником для этих эвристик, опираются на результаты научных наблюдений, показывающих, что OBDD проявляют тенденцию к уменьшению, по мере того как связанные между собой переменные становятся ближе друг к другу. Переменные, содержащиеся в схеме, считаются взаимосвязанными в том смысле, что они совместно определяют выходы схемы. Следовательно, эти переменные должны быть, как правило, тесно сгруппированы при их упорядочении. Этого можно добиться, располагая переменные в том порядке, в котором они учитываются при осуществлении обхода графа схемы в глубину с возвратом. Метод под названием динамическое переупорядочение [223] может оказаться полезным в тех случаях, когда никакая очевидная эвристика упорядочения не применима. Приме-
5.1. Представление булевых функций 89 нение этой эвристики сопряжено с периодическим переупорядочением переменных, которое вьшолняет пакет программ для обработки OBDD с целью сократить общее число используемых вершин. Метод переупорядочения призван скорее экономить время, нежели искать оптимальный порядок. Далее мы расскажем о том, как выполнять различные логические операции для булевых функций, представленных в виде OBDD. Начнем с операции, ограничивающей значения некоторого аргумента Х{ булевой функции / заданной константой Ь. Полученная в результате функция обозначается f\Xit-b и определяется следующим соотношением: f(Xi,...,Xn) = f(Xi,...,Xi-i,b,Xi+1,...,Xn). Если имеется OBDD для /, то OBDD для ограниченной функции f\Xii-b может быть легко построена путем обхода исходной OBDD. Для всякой вершины v, которая указывает на такую вершину ш, что var(w) = Xi, мы направляем этот указатель в low(w), если Ь равно 0, и в high(w), если Ь равно 1. Полученный в результате таких действий граф может оказаться неканоническим, и поэтому мы применяем далее функцию Reduce для получения OBDD представления Для /Ui^-6. Для булевых функций, представленных OBDD, все шестнадцать двуместных булевых операций могут быть эффективно реализованы. И, что очень важно, сложность этих операций линейна относительно произведения размеров исходных OBDD. Ключ к эффективной реализации этих операций дает разложение Шеннона f = bxbf\xt-0)V(xbf\x+-i) Бриан [34] предложил единый алгоритм под названием Apply для вычисления всех шестнадцати логических операций. Ниже мы поясним вкратце, как работает Apply. Обозначим символом * произвольную двухместную логическую операцию и рассмотрим пару булевых функций / и /'. Чтобы проще объяснить алгоритм, мы введем следующие обозначения: ¦ v и и' будут обозначать корневые вершины OBDD для / и /'; ¦ х = var(v) и х* = var(v'). Нам придется рассмотреть несколько вариантов в зависимости от соотношений между ки(/. ¦ Если обе вершины v и v' терминальные, то / * /' = vadue[v) * * valiie(v'). 6 Зак. 271
90 Глава 5. Двоичные разрешающие диаграммы ¦ Если ж = ж', то мы воспользуемся разложением Шеннона /*/' = (^Л (/|,-о * /'|х4-о)) V (X Л (/I.-! * /'|x4-l)) для разбиения задачи на две подзадачи. Эти подзадачи решаются рекурсивно. Корневой вершиной результирующей OBDD будет новая вершина w, для которой var(w) = ж; при этом low(w) будет корневой вершиной OBDD для /|Х4-о * /'1*4-0. a high(w) будет корневой вершиной OBDD для /|z<_i * /'|x«-i- ¦ Если х < х', то /'|хч-1 = /'|хч-1 = /'> поскольку /' не зависит от ж. В таком случае разложение Шеннона упрощается и принимает вид /*/'=' (^ Л (/|х4-0 * /')) V (Ж Л (/|х4-1 * /')), a OBDD для / * /' вычисляется рекурсивно, как и в предыдущем случае. ¦ Если ж' < ж, то схема вычислений будет аналогична предыдущему случаю. Поскольку каждая задача порождает две подзадачи, нужно позаботиться о том, чтобы предотвратить экспоненциальное разрастание вычислений. Применяя метод динамического программирования, можно сохранить полиномиальность алгоритма. Каждая подзадача соответствует паре OBDD, которые являются подграфами исходных OBDD для / и /'. Так как каждый такой подграф полностью определяется своей корневой вершиной, количество подграфов OBDD для / ограничено размером самой OBDD для /. Такие же ограничения имеют место и для /'. Таким образом, количество подзадач ограничено произведением размеров OBDD для / и /'. Хэш- таблица под названием кэш результатов используется для хранения в памяти ранее вычисленных подзадач. Перед тем как осуществить рекурсивное обращение, мы просматриваем этот кэш и проверяем, была ли уже решена предъявленная подзадача. Если это так, то результат выбирается из кэш; в противном случае выполняется рекурсивное обращение. Полученную в результате OBDD нужно редуцировать, чтобы обеспечить каноничность формы. После этого она помещается в кэш результатов. Булево отрицание — это одна из тех шестнадцати логических операций, которые можно реализовать, применяя Apply. Однако гораздо легче вычислить OBDD для отрицания формулы /, просто поменяв местами значения в терминальных вершинах OBDD для /.
5.2. Представление моделей Крипке 91 Для того чтобы понизить требованимя к объему памяти, свойственные первоначальному варианту представления булевых функций в виде OBDD, предложенному Брианом, был разработан ряд обобщений этого метода (см. [27]). Один и тот же многокорневой граф может быть использован для представления семейства булевых функций, имеющих общие подграфы. Для всех функций этого семейства действует один и тот же порядок расположения переменных. Как и в случае стандартных OBDD, в таком графе отсутствуют изоморфные подграфы и избыточные вершины. Если используется подобное обобщение, то две функции семейства будут равны в том и только том случае, когда они имеют один и тот же корень. Следовательно, время, требуемое для проверки равенства двух функций, ограничено постоянной величиной. Другое полезное обобщение предполагает добавление пометок дугам графа для обозначения булевых отрицаний. Благодаря этому пропадает необходимость использовать разные подграфы для представления формулы а ее отрицания. Современные пакеты OBDD могут эффективно работать с графами, имеющими миллионы вершин. Сами OBDD можно рассматривать как одну из разновидностей детерминированного конечного автомата [236]. Всякую га-местную булеву функцию можно охарактеризовать множеством наборов из {0,1}п, на которых она обращается в 1. Поскольку этот язык является конечным, а все конечные языки — регулярные, имеется минимальный конечный автомат, который допускает такое множество. Этот автомат служит каноническим представлением для исходной булевой функции. Логические операции над булевыми функциями можно выразить посредством теоретико-множественных операций над языками, допускаемыми конечными автоматами. Например, операция логического умножения соответствует пересечению множеств. Для вычисления теоретико-множественных операций над языками можно воспользоваться стандартными конструкциями элементарной теории автоматов. Тогда стандартные операции над OBDD можно рассматривать в качестве аналогов подобных конструкций. 5.2. Представление моделей Крипке OBDD чрезвычайно удобны для получения компактных представлений отношений на конечных областях [46,189]. Далее мы увидим, как использовать эти представления для описания и анализа б*
92 Глава 5. Двоичные разрешающие диаграммы моделей Крипке. Всякое n-местное отношение Q на множестве {0,1} можно представить в виде OBDD для его характеристической функции: /q(xi,...,хп) = 1 тогда и только тогда, когда Q{xi,...,я„). С другой стороны, предположим, что Q — n-местное отношение на конечной области D. Без ограничения общности можно считать, что D содержит 2т элементов для некоторого га > 1. Для того чтобы представить Q в виде OBDD, мы закодируем все элементы множества D, воспользовавшись биекцией ф : {0, l}m -? D, отображающей всякий булев вектор длины m в элемент множества D. При помощи кодирования ф мы посторим булево отношение Q местности тхппо следующему правилу: Q{xu... ,ж„) = Я{ф{хх),..., ф{хп)), где x~i обозначает вектор, состоящий из т булевых переменных, при помощи которого закодирована переменная х<, принимающая значения из D. Отношение Q можно представить в виде OBDD для характеристической функции /я отношения Q. Этот метод можно легко распространить на отношения над разными областями Di,...,D„. Кроме того, рассматривая множества как одноместные отношения, этот метод можно использовать и для представления множеств посредством OBDD. Обратимся теперь к модели Крипке М = (S,R,L). Для того чтобы отыскать представление для этой модели, необходимо описать множество S, отношение R и отображение L. Начнем с того, что закодируем состояния множества S; для простоты будем полагать, что есть в точности 2т состояний. Как и прежде, мы будем полагать, что имеется функция ф : {0,1}ш -*• S, отображающая булевы векторы в состояния. Поскольку каждый набор значений булевых переменных кодирует некоторое состояние из 5, характеристической функцией, представляющей S, является константа 1. При обращении к отношению переходов мы используем то же самое кодирование состояний. Как и в гл. 2, нам потребуются два множества булевых переменных: одно для представления исходного состояния, которым начинается переход, а другое для представления результирующего состояния, в котором переход оканчивается. Если отношение переходов R закодировано булевой функцией R(x,x*), то R задается OBDD для своей характеристической функции /g. И наконец, обратимся к отображению L. Хотя L и определяется как отображение из множества состояний в множество подмножеств семейства атомарных высказываний,
5.2. Представление моделей Крипке 93 Рис. 5.3. Модель Крипке с двумя состояниями гораздо удобнее рассматривать его как отображение из множества атомарных высказываний в множество всех подмножеств пространства состояний. Каждое атомарное высказывание р отображается в множество {s | р б L(s)} тех состояний, в которых оно выполняется. Обозначим это множество Lp; его можно представить в виде OBDD при помощи кодирования ф, как было указано выше. Таким способом мы представляем по отдельности оценку каждого атомарного высказывания. Для того чтобы проиллюстрировать, как можно использовать OBDD для представления моделей Крипке, рассмотрим модель с двумя состояниями, изображенную на рис. 5.3. Здесь есть две переменных состояния а и Ь. Мы введем две дополнительные переменные для кодирования состояний-последователей. Таким образом, переход из состояния si в состояние а% мы будем представлять конъюнкцией (а Л 6 Л а' Л -i6')- Булева формула для всего отношения переходов имеет вид (аЛЬЛа'Л ->V) V (аЛ -^Л о' Л -*') V (о Л -<ЬЛ а' Л У). Эта формула содержит три дизъюнктивных слагаемых, поскольку модель Крипке содержит три перехода. Далее эта формула преобразуется в OBDD для наиболее компактного представления отношения переходов. Порой нам хотелось бы также описывать множества возможных начальных состояний или справедливые модели Крипке. Множество начальных состояний представляется точно так же, как и всякое другое множество. Что касается ограничения справедливости F = {Р1з...,Рп}, мы просто представляем каждое Р* по от-
94 Глава 5. Двоичные разрешающие диаграммы дельности. Далее мы будем в основном использовать одни и те же обозначения для отношений, например R, и для их закодированных вариантов, наподобие R. Во многих случаях строить явное представление модели Крипке М, а затем кодировать его, как было указано выше, нецелесообразно, поскольку модель может оказаться слишком большой, несмотря на то что окончательное символьное представление будет компактным. Поэтому на практике мы строим OBDD непосредственно на основе сравнительно небольшого по размерам описания системы на языке высокого уровня. Процедура трансляции, приведенная в гл. 2, преобразует системы в формулы. Если каждая область закодирована, как указывалось выше, то эта процедура может быть использована для построения OBBD, представляющих отношения переходов, исходя непосредственно из описания системы на языке высокого уровня.
п Символьная верификация О моделей В этой главе мы опишем эффективный алгоритм, который использует представление моделей Крипке в виде OBDD для проверки выполнимости формулы на модели. Такой алгоритм верификации моделей называется символьным, поскольку он основан на манипуляциях с булевыми формулами. Коль скоро OBDD представляют множества состояний и переходов, нам приходится оперировать с целыми множествами, а не с отдельными состояниями и переходами. Для этого мы воспользуемся определением операторов темпоральной логики в терминах неподвижной тонки. Множество S' С S называется неподвижной точкой функции т: V{S) -? P(S), если t(S') = 5'. В разделе 6.1 будет показано, как можно описать множество состояний, удовлетворяющих некоторой CTL-формуле, при помощи наименьшей или наибольшей неподвижной точки подходящей функции. Для вычисления этих неподвижных точек применяется итеративная процедура, основанная исключительно на теоретико-множественных операциях. В разделе 6.2 мы представим алгоритм верификации моделей для CTL, в котором применяются только стандартные операции над OBDD. В разделах 6.3 и 6.4 рассказывается о том, как учитывать ограничения справедливости и порождать контрпримеры. В разделе 6.5 мы продемонстрируем, как можно применять символьную верификацию моделей для проверки правильности конвейерного арифметико-логического устройства. В разделе 6.6 рассматриваются сложностные аспекты символьной верификации моделей. Глава завершается обсуждением вопросов о том, как можно применить символьный алгоритм верификации моделей, ориентированный на логику CTL, для проверки выполнимости формул логики LTL, а также для проверки включения языков. 6.1. Представления неподвижной точки Пусть задана произвольная модель Крипке М = (S, R, L) с конечным множеством состояний. Множество V(S) всех подмножеств множества S образует решетку по отношению порядка теоретико-
96 Глава 6. Символьная верификация моделей множественного включения. В настоящей главе мы будем обозначать эту решетку V(S). Всякий элемент S' данной решетки может рассматриваться как предикат на S, принимающий значение true в точности на всех состояниях из S'. Наименьшим элементом решетки является пустое множество, которое будет обозначаться False, а наибольшим элементом решетки служит само множество S, которое мы будем иногда обозначать True. Функцию, отображающую V(S) в V(S), будем называть преобразователем предикатов. Пусть т: V{S) -? V(S) — одна из таких функций. Тогда 1) Функция т считается монотонной, если из включения Р С Q следует т(Р) С r(Q); 2) Функция г считается ^-непрерывной, если из цепочки включений Pi С Р2 С ... следует t(UjPj) = UjT(Pi); 3) Функция т считается П-непрерывкой, если из цепочки включений Pj Э Р2 Э ... следуетт^Р/) = П<г(Р<). Запись t1{Z) будет обозначать i-кратное применение т к Z. Более строго r%(Z) определяется рекурсивно соотношениями r°(Z) = Z и rt+1(Z) = t(t'(Z)). У монотонного преобразователя г на V(S) всегда есть наименьшая неподвижная точка uZ . t(Z) и наибольшая неподвижная точка vZ . t(Z) (см. статью Тарского [238]); наименьшая неподвижная точка имеет вид /xZ . t(Z) = D{Z \ t(Z) С Z} для монотонного т, и при этом uZ . t(Z) = UiTl(False), если преобразователь г является U-непрерывным. Аналогично vZ . t(Z) = U{Z | t(Z) D Z} для монотонного т, и при этом /iZ . t(Z) = DjT*(True), если преобразователь т еще к тому же Л-непрерывный. Следующие леммы весьма полезны, когда приходится иметь дело с преобразователями предикатов, определенными на конечных моделях Крипке [61, 107]. Лемма 5. Если 5 — конечное множество, а г — монотонный преобразователь, то г также U-непрерывен и Л-непрерывен. Доказательство. Рассмотрим последовательность Pi С Р2 С ... подмножеств множества 5. Так как S — конечное множество, существует такое jo, что Р,- = Pj0 для любого j ^ jo- При этом Р,- С Р,0 для каждого j < jo- Таким образом, UiP* = Р,0, и вследствие этого мы получаем r(UiPi) = т(Р,0). С другой стороны, в силу монотонности т мы имеем т{Р\) С т(Р2) С ... Поэтому r(Pj) С t(Pj0) для каждого j < jo, и t(Pj) = t(Pj0) для каждого j ^ jo- В результате
6.1. Представления неподвижной точки 97 function Lfp(Tau: PredicateTrans former): Predicate Q := False; Q' := Tan(Q); while (Q ф Q') do Q ~ Q'; Q':=Tau(Q'); end while' return(Q); end function Рис. 6.1. Процедура вычисления наименьшей неподвижной точки получаем соотношение Ujr(Pi) = t(Pj0), а это означает, что преобразователь т является U-непрерывным. Обоснование П-непрерывности преобразователя т проводится аналогично. D Лемма 6. Если т — монотонный преобразователь, то для любого натурального числа »' имеют место включения т'(Ра1зе) С Ti+1 (False) и т*(Тгие) Э ri+l(True). Лемма 7. Если т — монотонный преобразователь, a S — конечное множество, то существуют такие натуральные числа to и jo, что для любого i ^ »о верно равенство т* (False) = r"°(False), и для любого 3 ^ jo верно равенство г3 (True) = т^°(Тгие). Лемма 8. Если т — монотонный преобразователь, a S — конечное множество, то существуют такие натуральные числа t'o и jo, что HZ . r(Z) = т* (False) и vZ . t(Z) = т*>(Тгие). На основании приведенных лемм для вычисления наименьшей неподвижной точки монотонного преобразователя г можно воспользоваться программой, приведенной на рис. 6.1. Инвариант цикла while в теле процедуры задается отношением (Q, = t(Q))A(Q'C^Z.t(Z)). Нетрудно заметить, что в начале i-й итерации цикла выполняется Q С г*-1(False)' и Q' С ^(False). Из леммы 6 вытекает цепочка включений False С T(False) С г2(False) С ...
98 Глава 6. Символьная верификация моделей function Gfp(Tau: PredicateTrana former): Predicate Q := True; g':=Tou(Q); while (Q ф Q') do Q ¦= Q'l Q'~Tau(Q'); end while' return(Q); end function Рис. 6.2. Процедура вычисления наибольшей неподвижной точки Следовательно, максимальное число итераций оператора цикла ограничено количеством элементов в множестве 5. Как только будет осуществлен выход из цикла, мы получим Q = t(Q) и Q С \iZ . t[Z). Так как Q является неподвижной точкой, мы имеем \iZ . t(Z) С Q, и, следовательно, Q = \xZ . t(Z). Тем самым показано, что значение, которое возвращает процедура, — это действительно наименьшая неподвижная точка. Наибольшая неподвижная точка вычисляется подобным же образом при помощи программы, приведенной на рис. 6.2. Применяя по сути дела ту же самую аргументацию, можно показать, что и эта процедура всегда завершает свои вычисления и возвращает в качестве значения vZ . t(Z). Если сопоставить каждой формуле / предикат {s | М, s |= /} на V(S), то каждый базовый оператор CTL можно описать в терминах наименьшей или наибольшей неподвижной точки подходящего преобразователя предикатов (см. [104]). • AFA=/iZ. Д VAXZ, " EF/1=^Z./1VEXZ, ¦ AG Д = i/Z./j Л АХ Z, ¦ EG/i=i/Z. /iAEXZ, • A[/i U /я] = nZ . h V (Д Л AX Z), - E[/iU/3]=mZ./3V(/iAEXZ), • А[Д R /a] = i/Z . /a Л (Д V AX Z), ¦ E[/i R /2] = vZ . /2 Л (/i V EX Z). Интуитивно понятно, что наименьшие неподвижные точки соответствуют свойствам, которые должны выполняться когда-нибудь, а
6.1. Представления неподвижной точки 99 наибольшие неподвижные точки соответствуют свойствам, которые должны выполняться всегда. Поэтому AF/i характеризуется при помощи наименьшей неподвижной точки, a EG/i имеет описание в терминах наибольшей неподвижной точки. Мы обоснуем описания в терминах неподвижных точек только для EG и EU. Аналогичным образом можно обосновать приведенные соотношения и для остальных операторов CTL. Четыре последующие леммы 9-12 показывают, что EG fi=vZ . f\A EX Z. Лемма 9. Преобразователь t(Z) = Д Л EXZ монотонный. Доказательство. Предположим, что Pi С Р2. Чтобы проверить включение r(Pi) С 7-(Рг), возьмем произвольное состояние я е t(Pi). Тогда s \= Д и существует такое состояние а', что (s, *') € R и в' G Рх. Но ввиду того что Pi С Р2, верно также и включение я' € Рг- Значит, s е т(Р2). ? Лемма 10. Пусть r(Z) = Д Л EXZ. Обозначим через т*°(Ггие) предел последовательности True Э т(Тгие) Э ... Тогда для любого состояния s из т1° (True) мы имеем j (= /i н, кроме того, найдется такое состояние s', что (a, а') ? й и а' 6 т*°(Ггые). Доказательство. Предположим, что a € г*°(Тгие). Поскольку предикат т*° (True) является неподвижной точкой т, имеет место равенство т,0(Тгие) = г(г,0(Тгие)). Таким образом, а G r(r*°(True)). По определению преобразователя г получаем, что а ^ Д и, кроме того, имеется такое состояние а', что (s,s') е Я и «' ? т'°(Тгие). D Лемма 11. Предикат EG/i является неподвижной точкой преобразователя t(Z) = Д Л EX Z. Доказательство. Предположим, что So \= EG Д. Тогда по определению отношения выполнимости (= существует такой путь »о> "ъ • • в М, что для всякого к имеет место соотношение а* |= Д. Отсюда следует, что «о И /i и ei N EG Д. Иными словами, во |= Д и а0 (= EXEG/j. Поэтому EGfx С Д Л EXEG/i. И наоборот, если so И Д A EXEG/i, то s0 (= EG Д. В результате получаем EG/i=/iABXEG/i. D Лемма 12. Предикат EG/i является наибольшей неподвижной точкой преобразователя т(#) = Д Л EX 2Г.
100 Глава 6. Символьная верификация моделей Доказательство. Поскольку т является монотонным преобразователем, в соответствии с леммой 5 он является также и Л-непрерыв- ным. Поэтому для того чтобы показать, что предикат EG Д является наибольшей неподвижной точкой преобразователя т, достаточно убедиться в том, что EG Д = r\iTl(True). Покажем сначала, что EG/i С Л»т*(Тгие). Для этого воспользуемся индукцией по г и убедимся, что включение EG Д С т%(Тгие) выполняется для любого i. Очевидно, EG Д С True. Допустим, что выполняется EG/i С т1(Тгие). Поскольку г — монотонная функция, имеет место включение t(EG Д) С т,+1(Тгие). По лемме 11 мы имеем r(EG/i) = EG/i. Следовательно, EG/i С r"+1. Чтобы показать, что Л»т*(ТУие) является подмножеством EG Д, рассмотрим произвольное состояние s из П<т'(Тгие). Это состояние входит в каждое множество т'(Ггие). Следовательно, оно содержится также и в неподвижной точке т,0(Тгие). По лемме 10 состоянием s начинается бесконечная последовательность состояний, каждое из которых связано со своим предшественником отношением R. Помимо того, в каждом из этих состояний выполняется Д. Значит, а И EG Д. П Лемма 13. Предикат Е[Д U Д.] является наименьшей неподвижной точкой преобразователя t(Z) = Д V (Д Л EX Z). Доказательство. Прежде всего нужно отметить, что преобразователь предикатов t(Z) = Д V (Д Л EX Z) является монотонным. По лемме 5 преобразователь г будет и U-непрерывным. Непосредственно из определений легко показать, что Е[Д ЧД] является неподвижной точкой преобразователя t(Z). Но нам еще нужно показать, что Е[Д,Ди =] Uj т*(False). В одну сторону обоснование провести легко: воспользовавшись индукцией по i, можно убедиться в том, что Tx(False) С Е[Д U Д]. Таким образом, мы покажем, что UiT^False) С Е[Д U Д]. А с другой стороны, соотношение Е[Д иД] С и^т* (False) устанавливается индукцией по длине начального отрезка пути, на котором выполняется Д U Д. Более подробно, если s (= Е[Д U Д], то существует такой путь п = 81,82,..., что s = 81, и при этом для некоторого j ^ 1 выполняется 8j f= Д, а для каждого I < j верно «I \= Д. Мы покажем, что всякое такое состояние s принадлежит т3(False). Базис индукции устанавливается просто: если / = 1, то s |= Д, и поэтому s € r(False) = Д V (Д Л EX False).
6.1. Представления неподвижной точки 101 so т2 (False) Рис. 6.3. Последовательность приближений для E[pUq] Чтобы обосновать индуктивный переход, допустим, что требуемое свойство соблюдается для каждого состояния а и любого натурального числа j ^ п. Предположим, что состояние а лежит в начале такого пути тг = ai.ag,..., что sn+i |= Д, и для каждого I < п + 1 имеет место si \= fi- Рассмотрим состояние яг на этом пути. Этим состоянием начинается отрезок пути длины п, на котором выполняется Д U Д3 а значит, по индуктивному предположению имеет место включение s^ 6 тп(False). Так как (я, »г) G Л и s ^ Д, приходим к заключению в 6 Д AEXTn(Folse). Отсюда следует, что a € rn+1(Fa?ae). ?
102 Глава 6. Символьная верификация моделей На рис. 6.3 показано, как множество состяний, удовлетворяющих Е[р U q] может быть вычислено для простой модели Крипке при помощи процедуры Lfp. В этом случае функция т определяется соотношением t(Z) = q V (р Л EX Z). На этом рисунке показано также, как последовательность приближений т' (False) сходится к E[pUg]. Состояния, образующие аппроксимацию для E[pUg] на каждом шаге, обведены двойным кружком. Легко видеть, что т3(False) = т* (False). А это и означает, что E[pU q] = т3(False). Поскольку «о принадлежит т3(False), мы можем убедиться в том, что M,so \= E[pU q]. 6.2. Символьная верификация моделей для CTL Алгоритм верификации моделей для CTL с явным представлением состояний, описанный ранее, имеет линейную сложность как по размеру графа модели, так и по длине формулы. На практике этот алгоритм работает достаточно быстро [61, 63]. Однако при извлечении графа системы переходов из параллельной системы с конечным числом состояний, состоящей из многих процессов или компонентов, может произойти резкое увеличение размеров модели. В этом разделе мы опишем символьный алгоритм верификации моделей для CTL, который работает с моделями Крипке. Модели Крипке будут представлены в символьном виде при помощи OBDD, как было описано в разд. 5.2. Чтобы сформулировать символьный алгоритм верификации моделей, лучше всего иметь под рукой сокращенную систему обозначаний для сложных операций на булевых формулах. Для этого мы воспользуемся логикой квантифицированных булевых формул (QBF) [2, 12]. 6.2.1. Квалифицированные булевы формулы Пусть задано множество V = {«о,..., vn-i} пропозициональных переменных. Обозначим через QBF(V) наименьшее множество формул, удовлетворяющих следующим условиям: ¦ каждая переменная из V является формулой; ¦ если fug — формулы, то формулами являются и выражения -\f,/A«/,/Vfl; ¦ если / — формула и v € V, то формулами являются и выражения Зи/ и Vu/.
6.2. Символьная верификация моделей для CTL 103 Оценкой значений истинности для множества QBF(V) называется функция а: V -* {0,1}. Если а € {0,1}, то запись o~(v «- а) обозначает истинностное означивание, которое определяется следующим соотношением: , ., . / о, если v = и>, Л 'v ' [ <т\Щ, если v ф w. Запись сг f= /, где / — квалифицированная булева формула, а а — истинностное означивание, обзначает, что формула / истинна при означивании а. Отношение (= определяется индуктивно очевидным образом: ¦ а \= v •«=» <r(v) = 1, " о И -./ <=»• а \? /, " о \= I V 9 <=>¦ о f= / или a f= д, • o\=jNg <=> а \= / к а \= д, ¦ а \= 3v/ •<=>• a(v -> 0) |= / или a{v -> 0) |= /, ¦ а |= Vv/ <=» <r(v -)¦ 0} |= / и <r<v -» 0) |= /. Выразительные возможности QBF точно такие же, как и у обычных пропозициональных формул; однако нередко они более лаконичны. Каждая квантифицированная булева формула задает n-местное булево отношение на множестве К; оно образовано всеми оценками переменных из V, которые обращают эту формулу в истину. Мы будем использовать одни и те же обозначения для квантифицирован- ных булевых формул и соответствующих им булевых отношений. Ранее было показано, как можно сопоставить OBDD каждой формуле пропозициональной логики. Операции наложения кванторов можно реализовать в виде композиции операции ограничения и операции Apply, описанных в предшествующей главе: " Эх/ = /|s<-o V /|#ч_о, ¦ Vi/ = /U<_oA/|I+_o. Мы будем использовать кванторы преимущественно в операциях реляционного произведения, которые можно представить в виде 3v[/(w,v) Л g(v,x)]. 6.2.2. Символьный алгоритм верификации моделей Символьный алгоритм верификации моделей реализован в виде процедуры Check; она получает в качестве аргумента CTL формулу, которую необходимо проверить, и возвращает OBDD, представляющую в точности все те состояния системы, которые удовлетворяют
104 Глава 6. Символьная верификация моделей заданной формуле. Само собой разумеется, что выход Check зависит от OBDD, представляющей отношение переходов анализируемой системы; в последующих рассуждениях предполагается, что этот параметр задан неявно. Устройство Check определяется индуктивно по структуре CTL формул. Если / — это атомарное высказывание а, то Check(f) — это OBDD, представляющая множество состояний системы, в которых выполняется а. Бели / = /i Л /г или / = -i/i, то Check(f) получается применением функции Apply, описанной в разд. 5.1, к аргументам Check(fi) и Check^). Формулы вида ЕХ/, Е[/ U <?] и EG / обрабатываются при помощи отдельных процедур Check(EXf) = CheckEX{Check(f)), Check(E[f U g]) = CheckEU(Check(f),Check(g)), Check(EGf) = CheckEG(Check(f)). Обратите внимание на то, что эти вспомогательные процедуры требуют в качестве аргументов OBDD, тогда как Check принимает в качестве аргумента CTL-формулу. В тех случаях, когда CTL-формулы имеют вид /Лд или -¦/, применяются стандартные алгоритмы вычисления булевых операций над OBDD. А так как все другие темпоральные операторы можно переписать, используя лишь те, что указаны выше, наше определение Check охватывает все CTL-формулы. Процедура CheckEX опирается непосредственно на определение темпорального оператора ЕХ: формула ЕХ / истинна в некотором состоянии, если это состояние имеет последователя, в котором истинна формула /. CheckEX(f(v)) = ЗГ[/(«) Л R(v,v>)], где R(v, if) — это OBDD, представляющая отношение переходов. Если мы располагаем OBDD для / и R, то мы можем вычислить OBDD для ЗВЧ/C)ЛЯ(*,*)] при помощи операций над QBF. Процедура CheckEU опирается на формулу наименьшей неподвижной точки, описывающую CTL оператор EU, которая была приведена в разд. 6.1: E[/i U /2] = nZ.f2V (Л Л EX Z). Мы воспользуемся функцией Lfp для вычисления последовательности приближений Qo,Qi,Q2,---,Qi,---i
6.3. Как учитывать справедливость при верификации 105 сходящейся к E[fTJg] за конечнное число шагов. Если мы располагаем OBDD для /, д и текущего приближения Qi, то мы можем вычислить OBDD для следующего приближения Qi+i • Поскольку OBDD обеспечивает представление булевых функций в канонической форме, сходимость легко проверить, сравнивая последовательные приближения. Как только выполнится равенство Qi = Qi+i, функция Lfp прекратит вычисления. Множество состояний, соответствующих Е[/ U д], будет представлено OBDD для Qt. Процедура CheckEG устроена сходным образом. В ее основе лежит формула наибольшей неподвижной точки для CTL оператора EG, которая была приведена в разд. 6.1: EG/1 = j/Z./1aEXZ. Если мы располагаем OBDD для Д, то функция Gfp может быть использована для вычисления OBDD, представляющей множество состояний, удовлетворяющих EG Д. 6.3. Как учитывать справедливость при символьной верификации моделей В главе 3 мы уже обсуждали ограничения справедливости и их значимость. В главе 4 ограничения справедливости были привнесены в алгоритм верификации моделей с явным представлением состояний. В данном разделе мы обобщим символьный алгоритм верификации моделей для CTL, представленный в предыдущем разделе, включив в него также и ограничения справедливости. Далее мы будем считать, что ограничения справедливости заданы множеством CTL-формул F = {Pi,...,Рп], и определим новую процедуру CheckFair для проверки выполнимости CTL-формул с учетом ограничений справедливости F. Мы проделаем это, введя в рассмотрение новые вспомогательные процедуры CheckFairEX, CheckFairEU и CheckFairEG, которые являются аналогами вспомогательных процедур, используемых для определения Check. Для заданного ограничения справедливости F рассмотрим формулу EG /. Эта формула означает, что существует путь, начинающийся в текущем состоянии в, на протяжении которого / выполняется всюду (является инвариантом пути), а каждая формула из F выполняется на этом пути бесконечно часто. Множество Z всех таких состояний а — это наибольшее множество, обладающее следующими двумя свойствами:
106 Глава 6. Символьная верификация моделей 1) все состояния из Z удовлетворяют /; 2) для любого ограничения справедливости Рь из F и состояния 8 из Z существует последовательность состояний длины не менее 1, ведущая из в в одно из состояний множества Z, удовлетворяющее Pk, причем в каждом состоянии последовательности выполняется /. Такое описание существенно отличается от описания, использованного в лемме 1 для случая явного представления состояний. Оно более подходит для символьной верификации моделей, поскольку его можно выразить в терминах неподвижной точки следующим образом: EGf = vZ.fA Л EXE[/U(ZAPk)]. F.1) fc=i Обратите внимание на то, что в этой формуле фигурируют как CTL- операторы, так и операторы неподвижной точки. Можно показать, что данную формулу нельзя выразить непосредственно в CTL. В главе 7 мы расскажем об одной очень выразительной логике, которая называется ^-исчислением и позволяет использовать операторы наименьшей и наибольшей неподвижной точки. Представленную выше гибридную формулу для справедливой разновидности оператора EG можно легко перевести в /^-исчисление. Корректность уравнения F.1) будет обоснована ниже. Доказательство состоит из двух лемм. Первая лемма показывает, что EG / является неподвижной точкой уравнения Z = / Л Д ЕХЕ[/ U (Z Л Рк)). F.2) *=i Следовательно, это множество включается в наибольшую неподвижную точку. Вторая лемма устанавливает, что наибольшая неподвижная точка указанного уравнения включается в EG /. Из этих двух частей доказательства можно заключить, что EG/ является наибольшей неподвижной точкой. Лемма 14. Справедливая разновидность оператора EG/ является неподвижной точкой формулы из уравнения F.2). Доказательство. Пусть a € EG/. Тогда в состоянии а начинается справедливый путь, все состояния которого удовлетворяют /. Рассмотрим на этом пути первое1 такое состояние Sj, что 8< € Pi и Si ф 8. Состояние з< также является началом справедливого пути, во 1Это означает, что «j не должно быть первым состоянием на этом пути, но не отменяет возможности того, что а и 5{ окажутся идентичны. — Прим. перев.
6.3. Как учитывать справедливость при верификации 107 всех состояниях которого выполняется /. Значит, з< € EG /. Отсюда получаем, что для каждого i имеет место соотношение s \= / Л EX Е[/ U (EG / Л Щ, и поэтому а \= / Л Д EXEf/ U (EG / Л Pi)]. fc=i Таким образом, мы приходим к заключению EG/ С /Л Л EXE[/U(EG/APfe)]- fe=i Чтобы показать обратное включение /Л Д EXE[/U(EG/APfc))CEG/, заметим, что соотношение з|=/Л ЛЕХЕ[/и(ЕС/ЛР*)] подразумевает существование конечного пути, начинающегося вей ведущего в такое состояние »', что s' |= EG/ Л Р*. Помимо того, каждое состояние на пути из s в s' удовлетворяет формуле /, a s' служит началом справедливого пути, в каждом состоянии которого выполняется /. Значит, з \= EG/, что и требовалось установить. Отсюда мы заключаем, что EG / является неподвижной точкой. ? Лемма 15. Наибольшая неподвижная точка формулы из уравнения F.2) включается в EG /. Доказательство. Пусть Z — произвольная неподвижная точка формулы из уравнения F.2). Покажем, что Z включается в EG/. Предположим, что s € Z. Тогда в состоянии а выполняется /. Кроме того, у этого состояния есть последователь «', из которого в некоторую вершину «1 исходит такой путь, что во всех состояниях этого пути выполняется /, а само в' удовлетворяет формуле Z А Р\. Поскольку «1 S Z, мы можем, применив те же самые рассуждения, сделать вывод о том, что из s\ исходит путь, ведущий в состояние «2 6 Рг- А применив эти же рассуждения п раз подряд, мы придем к заключению о том, что в состоянии s берет начало путь, проходящий через Pi,..., Рп, во всех состояниях которого выполняется /. Более того, последнее состояние, которого достигает этот путь, принадлежит множеству Z. Тогда из него исходит путь, ведущий вновь в одно из состояний множества Pi, и все построение можно повторить заново.
108 Глава 6. Символьная верификация моделей Можно воспользоваться индукцией, чтобы показать более формально, что есть путь, начинающийся в з, на протяжении которого формула / выполняется в каждом состоянии, а всякое ограничение справедливости соблюдается бесконечно часто. Это и означает, что а принадлежит EG/. Коль скоро Z является произвольной неподвижной точкой, наибольшая неподвижная точка будет содержаться в EG/. ? Из приведенного описания устройства неподвижной точки следует, что множество состояний, удовлетворяющих формуле EG/ при ограничениях справедливости F = {Рх,...,Рп}, может быть вычислено процедурой CheckFairEG(f(v)) по следующей формуле неподвижной точки: uZ(v) . f(v) Л Л EXE[/(tJ) U (Z(v) Л Рк)]. Эту неподвижную точку можно вычислить тем же самым способом, как и прежде. Основное отличие состоит в том, что каждый раз, когда проходит одна итерация вычисления значения приведенного выше выражения, выполняется несколько вложенных вычислений неподвижных точек (процедурой CheckEU). Проверка ЕХ / и E[/Ug] при ограничениях справедливости проходит подобно тому, как это было проделано в случае явного представления состояний. Множество всех состояний, которыми начинаются справедливые вычисления, определяется соотношением fair(v) = С heckFair (EG True). Формула EX/ будет истинна при ограничениях справедливости в состоянии з тогда и только тогда, когда найдется последователь з', удовлетворяющий формуле /, из которого исходит хотя бы один справедливый путь. Таким образом, формула ЕХ / (при ограничениях справедливости) эквивалентна формуле ЕХ / Л fair (без ограничений справедливости). Поэтому мы определяем процедуру CheckFairEX(f(v)) = CheckEX(f(v) Л fair(v)). Подобным же образом читатель может легко убедиться в том, что формула E[/U </] (при ограничениях справедливости) будет эквивалентна формуле Е[/ U (</ Л fair)] (без ограничений справедливости). Поэтому мы определяем процедуру CheckFairEU(f(v),g(v)) = CheckEU(f(v),g(v) Л fair(v)).
6.4. Контрпримеры и свидетельства 109 6.4. Контрпримеры и свидетельства Одним из наиболее важных свойств алгоритмов верификации моделей для CTL является способность обнаруживать контрпримеры и свидетельства. Верификатор моделей, обладающий такой способностью, обнаружив, что формула с универсальным квантором пути ложна, находит вычислительный путь, демонстрирующий выполнимость отрицания заданной формулы. Бели же система верификации обнаружит, что формула с экзистенциальным квантором пути верна, то будет найден и вычислительный путь, объясняющий, почему эта формула выполняется. Например, если верификатор обнаружит, что формула AG / неверна, он выдаст путь, ведущий в состояние, в котором выполняется ->/. А если эта система обнаружит, что формула EF / верна, то будет построен путь в состояние, удовлетворяющее /. Заметим, что контрпример для формулы с квантором всеобщности — это свидетельство для двойственной формулы с квантором существования. Учитывая это замечание, мы ограничимся изучением способности обнаруживать свидетельства для трех основных операторов CTL: EX, EG и EU. Для того чтобы объяснить устройство процедуры поиска свидетельства для некоторой CTL-формулы, мы рассмотрим сильно связные компоненты графа переходов, который определяется моделью Крипке. По сути дела, мы сформируем новый граф, вершинами которого будут сильно связные компоненты, и две сильно связные компоненты будут соединены дугой в том и только том случае, если имеется дуга из состояния одной компоненты в состояние другой. Нетрудно заметить, что новый граф не содержит никаких циклов, отличных от петель; иначе говоря, всякий цикл в графе не выходит за пределы одной сильно связной компоненты. Кроме того, поскольку мы рассматриваем лишь конечные модели Крипке, каждый бесконечный путь обязан иметь суффикс, который целиком содержится внутри одной сильно связной компоненты графа переходов. Рассмотрим сначала задачу поиска свидетельства для формулы EG/ при ограничениях справедливости F = {Pi,...,Pn}. Каждое ограничение Р{ мы будем истолковывать как множество состояний, на котором оно обращается в истину. Напомним, что множество состояний, удовлетворяющих формуле EG/ с ограничениями справедливости F, задается формулой vZ . / Л Д ЕХЕ[/ U (Z Л F),)]. F.3) •
110 Глава 6. Символьная верификация моделей Воспользуемся записью EG/ для обозначения множества состояний, удовлетворяющих EG / при ограничениях справедливости F. Для заданного состояния s из EG / мы хотим предъявить путь я-, начинающийся в а, проходящий только через состояния удовлетворяющие /, и, кроме того, проходящий через каждое множество Р* 6 F бесконечно часто. Мы всегда можем отыскать подобный путь, состоящий из конечнного префикса, за которым следует повторяющийся цикл. Построим этот путь, последовательно наращивая его префикс, до тех пор пока не удастся обнаружить цикл. На каждом шаге построения мы должны быть уверены в том, что построенный префикс можно продолжить до справедливого пути, все состояния которого удовлетворяют формуле /. Эта инвариантность может быть обеспечена, если, добавляя каждый раз новое состояние к текущему префиксу, мы будем знать, что оно удовлетворяет формуле EG /. Сначала мы вычислим приведенную выше формулу неподвижной точки. На каждой итерации вычисления внешней неподвижной точки мы вычисляем совокупность наименьших неподвижных точек, связанных с формулами Е[/ U (Z Л Р)] для каждого ограничения справедливости Р € F. Для каждого такого ограничения справедливости Р мы получаем возрастающую последовательность приближений Qq С Qf С Qf С ..., где Qf обозначает множество состояний, из которых некоторое состояние из Z Л Р может быть достигнуто не более чем за i шагов так чтобы при этом выполнялась формула /. На последней итерации вычисления внешней неподвижной точки, когда имеет место соотношение Z = EG /, мы сохраняем последовательность аппроксимаций Qf для каждого Р из F. Предположим теперь, что нам дано начальное состояние а, удовлетворяющее формуле EG /. Тогда а принадлежит множеству состояний, вычисленному согласно уравнению F.3), и поэтому у него должен быть последователь в E[/U(ZAP)] для каждого Р е F. Для того чтобы минимизировать длину пути-свидетельства, мы выбираем ближайшее ограничение справедливости, которое может быть достигнуто из в. Это можно сделать, попытавшись отыскать последователя t состояния 8 в сохраненных множествах Q% для каждого Р € F. Если такое состояние t не обнаружено, мы просматриваем множества Qf для всех Р е F. Если мы все еще не нашли подходящее t, то обращаемся к множествам Qf и т. д. Так как s принадлежит EG /, мы рано или поздно отыщем такого последователя t, что t € Qf. Заметим, что из t выходит путь длины г в состояние, удовлетворяющее формуле (EG /) Л Р, и поэтому t принадлежит EG /.
6.4. Контрпримеры и свидетельства 111 Рис. 6.4. Подтверждающий путь лежит в первой сильно связной компоненте Если i > 0, то мы отыщем последователя t в QfLi ¦ Это можно осуществить, отыскав множество последователей t, взяв его пересечение с Qf-i и выбрав произвольный элемент из полученного множества. Продолжая выбирать состояния до, тех пор пока не достигнем i = О, мы построим путь из 8 в некоторое состояние и из (EG /) Л Р. Вслед за этим мы исключаем из рассмотрения Р и повторяем описанную процедуру для состояния и, пока не посетим все множества, определяемые ограничениями справедливости. Обозначим символом я' последнее состояние получившегося таким образом пути. Чтобы замкнуть цикл, нам нужно попасть из s' в состояние t невырожденным путем, на протяжении которого выполняется формула /. Иными словами, вам требуется свидетельство для формулы {«'}ЛЕХ E[/U{?}]. Если такая формула верна, то мы отыскали путь- свидетельство для а. Иллюстрацией здесь может служить рис. 6.4.
112 Глава 6. Символьная верификация моделей Рис. 6.5. Подтверждающий путь проходит через три сильно связные компоненты Если же 4юрмула ложна, то есть несколько стратегий. Простейшая из них заключается в том, чтобы запустить повторно всю описанную процедуру из последнего состояния а', используя весь список F ограничений справедливости. Поскольку {в'} Л EX Е[/ U {*}]
6.5. Пример АЛУ 113 обращается в ложь, мы знаем, что s' не лежит в сильно связной компоненте формулы /, содержащей t, но при этом, однако s' располагается в EG /. Если мы последуем такой стратегии, то будем спускаться по графу сильно связных компонент и при этом сумеем рано или поздно либо обнаружить цикл -к, либо достичь крайней сильно связной компоненты формулы /. В последнем случае цикл непременно отыщется, поскольку покинуть эту крайнюю сильно связную компоненту нам не удастся. Иллюстрацией здесь служит рис. 6.5. Несколько более изощренный подход состоит в предварительном вычислении Б[/ U {<}]. Как только мы в первый раз покидаем это множество, мы знаем, что цикл замкнуть не удастся, и поэтому перезапускаем процедуру начиная с этого состояния. Интуиция подсказывает, что эти подходы тяготеют к обнаружению кратчайших контрпримеров (возможно, в силу того что число сильно связных компонент, как правило, невелико), и поэтому никаких попыток отыскать самый короткий цикл не предпринимается. В заключение поясним, как отыскать свидетельства для формул Щ/\]д] и ЕХ/ при наличии ограничений справедливости. Напомним, что fair обозначает множество состояний, удовлетворяющих EG Trite при ограничениях справедливости F. Можно вычислить Е[/ U д] при условии F, применяя стандартный алгоритм верификации моделей (без ограничения справедливости) к CTL-формуле Е[/ U (g Л fair)]. Так же можно вычислить и ЕХ/, применяя стандартный алгоритм верификации моделей к формуле ЕХ(/ Л fair). Чтобы расширить свидетельства для формул E[/Up] и ЕХ / до бесконечных путей, применим процедуру отыскания свидетельств для формулы EG True при ограничениях справедливости F. 6.5. Пример АЛУ Приведем некоторые практические результаты, показывающие эффект использования символьного представления. Начнем с простой схемы конвейера, которая описывается при помощи CTL. Конвейер выполняет трехадресные арифметические и логические операции над операндами, хранящимися в файле регистров. Наша схема является обобщенным вариантом логической схемы, описанной в [45]. Блок-схема конвейера изображена на рис. 6.6 (см. с. 114). Количество регистров конвейера — величина переменная; если есть г регистров конвейра, то выполнение команды требует г + 2 тактов. 9 Зак. 271
114 Глава 6. Символьная верификация моделей Read ports Write port Register file Instruction registers Control 0p2 Opl Pipe registers Bypass circuitry Рис. 6.6. Блок-схема конвейера 1. На первом такте выполнения команды ее операнды считываются из файла регистров в регистры операндов команд. 2. На втором такте вычисляется результат операции и помещается в первый регистр конвейера. 3. На протяжении последующих тактов, с третьего по (г+ 1)-й, этот результат проходит через остальные регистры конвейера. (Если есть один регистр конвейера, то этот этап опускается.)
6.5. Пример АЛУ 115 4. На последнем такте результат возвращается в файл регистров. Тип исполняемой операции, регистры источника и регистры назначения определяют данные на входах схемы, но только по прошествии г + 2 тактов эти данные повлияют на содержимое файла регистров. Результат операции записывается обратно в файл регистров после г + 2 тактов. Кроме входов, определяющих адреса и операции, у конвейера есть особый вход stall1, который указывает на то, что команда недействительна и должна быть пропущена. Или, в технических терминах, содержимое регистра назначения не должно измениться, если вход stall имеет значение True. Сигнал stall может быть использован, например, для индикации отсутсвия команды в кеш-памяти; этот сигнал будет подаваться на вход, до тех пор пока нужная команда не будет извлечена из основной памяти. Чтобы результаты можно было использовать до того, как они поступят в файл регистров, данные разрешается считывать на выходе АЛУ, а также из регистров кон- вейра обратно в операционные регистры АЛУ. В работе [45] описан ряд экспериментов над различными вариантами конвейеров. Было исследовано влияние таких параметров, как число регистров, размер регистра, длина конвейера и количество операций. Спецификация конвейра задана в CTL. Чтобы упростить изложение, мы приведем спецификацию только для схемы с двумя основными регистрами и одним конвейерным регистром, предполагая при этом, что схема способна выполнять только операцию XOR2. В работе [45] рассматривались более сложные схемы с более широким набором операций; эти схемы проверялись на предмет соответствия требуемым спецификациям. Спецификация конвейера состоит из двух частей. Первая часть отвечает зато, что регистр назначения в файле регистров обновляется корректно. Она представлена множеством формул следующего вида: AG(-istall -»• ((srclopi Ф src2opi) = resviti)). Здесь srclopi и src2opi — сокращенные обозначения формул, задающих значения 1-го бита двух операндов источника, a resulti — формула, представляющая i-й бит результата, который записывается в файл регистров. Вся формула в целом гласит: если конвейер не заблокирован, то г-й бит результата текущей операции должен быть равен сумме г-х битов двух операндов источника по модулю 2. 1 Сигнал на этом входе блокирует работу конвейера. — Прим. ред. исключающее ИЛИ. — Прим. перев. 9*
116 Глава 6. Символьная верификация моделей Чтобы построить формулы для srclopi, srclopi и results, нам нужно принять во внимание задержку в конвейере. Например, требуемые значения операндов источника могут быть еще не занесены в файл регистров к моменту начала соответствующей операции. Это происходит потому, что ранее запущенные операции, которые все еще находятся в стадии выполнения, могут изменить содержимое одного или нескольких регистров источника. Однако, если бы мы подождали два такта, всякое незавершенное изменение данных в регистрах источника было бы доведено до конца. Таким образом, нам нужно найти способ для того, чтобы описать значение, которое будет занесено в некоторый бит регистра спустя какое-то количество тактов. Напомним, что в случае конвейера с одним регистром действующая операция способна изменить состояние файла регистров не ранее чем спустя три такта. Поэтому будущее значение можно выразить при помощи CTL-оператора АХ. Значение г'-го бита регистра j по истечении к тактов (где к ^ 3) определяется следующей CTL-формулой: АХ АХ... АХ regjti, * раз которую мы будем сокращенно обозначать АХ regjj. Мы можем проверить предположение о том, что входные данные влияют на состояние регистрового файла не ранее чем по истечении трех тактов; для этого достаточно удостовериться в том, что EX regjj и АХ* regjti эквивалентны для всех значений к, не превосходящих 3. Теперь мы знаем, что srclopi — это либо формула АХ2 гедо,%, либо формула АХ2 regij, в зависимости от того, каков адрес первого источника, 0 или 1. Как мы уже отметили, АХ2 вносит коррективы, связанные с задержкой конвейера; спустя два такта все значения, вычисляемые в данный момент, будут занесены в файл регистров. В итоге у нас получается формула srclopi = (-larcladdr Л АХ2 rego,i) V (srcladdr Л АХ2 гедх^). В этой формуле srclopi служит обозначением t-го бита входа по адресу первого источника. Формула для ягс2ор* строится по тому же принципу. Формула для resulti получается подобным же образом; отличие состоит лишь в том, что нас интересует значение в регистровом файле спустя три такта после завершения операции, а регистр по адресу назначения выбирается на основе destaddr: resulti = (-«lestaddr Л АХ3 rego,») V (destaddr Л АХ2 reg\yi).
6.6. Вычисление реляционных произведений 117 Другая часть спецификации описывает, что происходит с теми регистрами, в которые нет записи (или же со всеми регистрами, когда конвейер заблокирован). В частности, текущая операция не должна оказывать влияния на такой регистр. Например, для регистра 1 мы имеем AG(stall V -idestaddr) ->• (АХ2 геди = АХ3 reglti). Стоит обратить внимание на то, что ряд общих подформул, наподобие АХ2 regjti, встречаются на протяжении всей спецификации. В тех экспериментах, о которых пойдет речь далее, множество состояний, удовлетворяющих каждой из таких подформул, вычислялось единожды и сохранялось затем в памяти. В одном из экспериментов система верификации моделей на основе CTL была применена для проверки конвейера шириной 8 бит с четырьмя регистрами общего назначения, одним регистром конвейера и одной операцией. В этом примере было более 1020 состояний. Для представления отношения переходов потребовалась OBDD почти с 41000 вершинами, а верификация заняла приблизительно 22 минуты процессорного времени на Sun 3. Эти результаты показывают существенное превосходство символьного метода верификации над методом, использующим явное представление состояний; однако, применяя оптимизирующие преобразования, о которых пойдет речь в следующем разделе, можно достичь гораздо большего. 6.6. Вычисление реляционных произведений Большинство операций, используемых в нашем алгоритме символьной верификации моделей, линейны относительно произведения размеров участвующих в них OBDD. Наиболее важным исключением является операция реляционного умножения, используемая для вычисления EX h: 3v'[h(v')AR(v,v')]. Хотя эту операцию можно реализовать при помощи одной конъюнкции и ряда проекций, на практике такое вычисление проводилось бы довольно медленно. К тому же OBDD для fc(w;) Л R(v, т?) подчас имеет гораздо больший размер, нежели OBDD для окончательного результата, и нам хотелось бы по возможности избежать ее построения. По этим причинам мы применяем специальный алгоритм, который вычисляет OBDD для реляционного произведения за один шаг
118 Глава 6. Символьная верификация моделей function RelProd(f,g,: OBDD, Е: setof variables): OBDD if / = 0 V 3 = 0 then return 0; else if/ = lA<7=l then return 1; else if (/, g, E, г) содержится в кеше результатов then return г; else пусть x — старшая переменная /; пусть у — старшая переменная д пусть z — старшая из двух переменных х и у, го := RelProd{f\z<-o,9\z*-o,E); ri := falProd(f\zi-i,g\z<-i,E); if z G E then; r := Or(r0,ri); \* OBDD для r0 V ri *\ else r := IfThenElse(z,ro,ri); \* OBDD для (z Л n) V (-iz Л r0 *\ end if Помещаем (/, g, E, г) в кеш результатов return г end if end function Рис. 6.7. Алгоритм реляционного умножения по OBDD для Л и Д. На рис. 6.7 (см. с. 118) этот алгоритм изображен для двух произвольных OBDD fug. Как и во многих алгоритмах, связанных с OBDD, в RelProd используется кеш результатов. В данном случае элементы этого кеша имеют вид (f,g,E,r), где Е — это множество переменных, связанных квантором существования, по которым и осуществляется проекция, а /, д и г — это OBDD. Бели такой элемент есть в кеше, то это означает, что результат предшествующего обращения к процедуре RelProd(f,g,E) есть г. Хотя приведенный алгоритм на практике работает неплохо, он имеет экспоненциальную сложность в наихудшем случае. В боль-
6.6. Вычисление реляционных произведений 119 шинстве примеров, в которых проявляется такая сложность, результирующая OBDD оказывается экспоненциально большего размера, нежели OBDD аргументов f(v) и g(v). В таких случаях всякий метод вычисления реляционного произведения неизбежно имеет экспоненциальную сложность. 6.6.1. Расщепленные отношения переходов В описанном выше алгоритме реляционного умножения предполагается, что RtyjV1) — это цельное отношение переходов, представленное единой OBDD. В разделе 5.2 мы рассматривали методы построения OBDD для синхронных и асинхронных схем. К сожалению, на практике для многих примеров такие OBDD получатся чересчур большими. Расщепленные отношения переходов представляются гораздо более компактно, но они не подходят для алгоритма реляционного умножения, изображенного на рис. 6.7. Здесь уместно напомнить, что отношения переходов для синхронных и асинхронных схем задаются в виде конъюнкции или дизъюнкции отдельных отношений Rt(v, v1). Каждая из этих частей представляется, как правило, небольшой OBDD. В наших экспериментах эти OBDD обычно имели не более ста вершин, чаще всего значительно меньше, и только в очень редких случаях число вершин превышало тысячу. Вместо того чтобы строить конъюнкцию или дизъюнкцию отношений Ri(v,rf) для получения R(v, V1), мы можем представлять схему списком таких OBDD, подразумевая при этом, что к ним применяется конъюнкция или дизъюнкция. Такой список мы будем называть расщепленным отношением переходов [42, 43]. Для синхронных схем каждое отношение Ri имеет вид Ri(v,v') = (v'i = fi(v)), где fi — булева функция, определяющая значение Vj. Тогда R — это конъюнкция отношений Ri. Когда отношение переходов представляется списком отношений Ri, неявно соединенных конъюнкцией, мы говорим о коньюнктивно расщепленном отношении переходов. Для асинхронных схем каждое отношение Ri имеет вид Ri(v,V,) = (v'i = fi(v))A/\(v,j=vj), a OBDD для R задается дизъюнкцией Я*. Список отношений -Ri, неявно соединенных дизъюнкцией, назовем дизъюнктивно расщепленным отношением переходов. В таком случае OBDD для Ri может иметь значительно больший размер, нежели OBDD для fi (размер
120 Глава 6. Символьная верификация моделей может возрасти в п раз, где п — число переменных, используемых для кодирования состояний схемы). Однако для эффективного представления отношений такого вида есть вспомогательные методы. Пусть Nilv^i) = v[ = fi{v). Используем пару (JV*(t;,v{),t) для представления Д^(г7,и'), полагая, что значение переменной v[ определяется N{, а при j ф i значение переменной «J равно Vj. Мы воспользуемся указанным представлением при вычислении реляционного произведения, заменяя формулу Зг?[Цг') Л Riiv,!?)] = m?[hQf) Л (ВД,«{) Л Д М = »,))] эквивалентным вьфажением 3^[Л(«1,..., Vi-i, v'i, vi+l,..., vn) Л Ni(v, v$]. Хотя расщепленное отношение переходов, в котором приходится по одной OBDD на каждую переменную состояния, чаще всего строится гораздо эффективнее, нежели цельное отношение переходов, это может оказаться далеко не самым лучшим выбором. Пока OBDD не становятся чересчур большими, лучше всего при помощи конъюнкции или дизъюнкции строить одну единственную комбинированную OBDD для нескольких подходящих Ri. Для такого представления может потребоваться не так уж много вершин, если OBDD, представляющие Ri, имеют сходную структуру вблизи их корня. Комбинация нескольких OBDD в расщепленном отношении переходов позволяет также ускорить вычисление реляционного произведения. Далее мы покажем, как можно обобщить наш основной алгоритм, чтобы получить возможность вычислять реляционное произведение для расщепленных отношений переходов. ¦ Дизъюнктивное расщепление Для дизъюнктивно расщепленного отношения переходов реляционное произведение представимо в виде ЭйЧМй') Л (Ro{V,&) V • • ¦ V Rn-iW))]. Такое реляционное произведение можно вычислить, не прибегая к построению OBDD для полного отношения переходов, а просто расставляя кванторы существования перед дизъюнктивными слагаемыми: 3tf[h(tf) ЛRo(v,v')] V • • • V 3&[h(tf) ЛRn-i(v,v')]. За счет этого мы можем свести задачу вычисления реляционного произведения к выполнению ряда реляционных умножений для относительно небольших OBDD. Применяя указанный способ вычисле-
6.6. Вычисление реляционных произведений 121 ния вместо монолитного представления отношения переходов, можно проверить значительно больше асинхронных схем. ¦ Конъюнктивное расщепление Когда применяется конъюнктивно расщепленное отношение переходов, реляционное произведение задается формулой 3C[A(tO Л (ад,U0 Л • • • Л Л»_1 (и, 10)]. Главная трудность при вычислении такого реляционного произведения без построения конъюнкции состоит в том, что здесь квантор существования нельзя внести внутрь квадратных скобок. Описанный далее прием позволяет преодолеть это затруднение. Метод, предложенный в работах [42,43], основывается на двух следующих соображениях. Во-первых, схемы обладают определенной локальностью, и поэтому многие Ri зависят лишь от небольшого числа переменных из v и V1. (Ранее, при обсуждении построения отношений переходов для схем, для каждого Ri использовалась только одна штрихованная переменная, хотя, как будет показано в разд. 6.6.2, иногда выгодно объединить несколько частей, введя зависимость от нескольких штрихованных переменных.) Во-вторых, хотя квантор существования и не вносится внутрь скобок, охватывающих конъюнкцию, мы можем вынести некоторые подформулы за пределы области действия квантора существования, если они не зависят от переменных, связанных этим квантором. Мы воспользуемся этим и будем соединять поочередно конъюнкцией Ri(y,v') и Л(й'), используя «раннюю квантификацию» для устранения каждой переменной «J, когда ни одно из оставшихся отношений #j(tJ,v') не зависит от »}. Обратимся к счетчику по модулю 8, описанному в разд. 2.2.1. Напомним его описание: Bo(V,V') = (»&*-*o), n1(V,V,) = (.v[&v0<&v1), тг2(у, V) = (ve2 <# (vo л in) е щ). В данном случае реляционное произведение для БХ h таково: этрф/ФР) л (адч) л Ri(%v[) л ад,»>))]• Перепишем его в виде 3t43t/13ui[/i(F') л (ад, v'Q) л Ri (v, v[) л ад, v'2))]. F.5) Причины, по которым установлен именно такой порядок кванторов и конъюнктивных сомножителей, вскоре станут понятны. Как было отмечено ранее, подформулы могут быть вынесены за пределы 8 Зак. 271
122 Глава 6. Символьная верификация моделей области действия кванторов существования, если они не зависят от переменных, связанных этими кванторами. Поскольку R2(v,v2) не зависит ни от «о, ни от v[, мы можем привести реляционное произведение к виду 3v'2[3v'13v0[h(v') Л (Ro(v,v'0) Л Ri(v,v[)} Л Я2(й,и2))]- А поскольку R\ (tJ, v'2) не зависит от v0, мы получаем Sv'^Bv^v'olhiv') Л (Ro(vA)} Л Ri(v,v[)] Л Я2(й,«2))]. Мы можем начать вычисление этого реляционного произведения с h(v'), и на каждом шаге будем соединять ранее полученный результат с Ri(v, v't), удаляя соответствующую переменную и| при помощи квантора. Таким образом, нам удалось свести задачу вычисления полного реляционного произведения к выполнению ряда простых действий, напоминающих реляционное умножение. Следует иметь в виду, что промежуточные результаты могут зависеть как от переменных из и, так и от переменных из v1. Теперь мы можем объяснить, почему в уравнении F.5) нами был выбран именно такой порядок переменных. Мы хотели упорядочить переменные формулы Д^(и,и/) так, чтобы переменные V1 удалялись кванторами как можно быстрее, а переменные из v добавлялись как можно медленнее. Это разумное пожелание, так как оно позволяет сократить число переменных, от которых зависят промежуточные OBDD, а значит, и сокращает размер самих OBDD. В нашем конкретном случае на каждом шаге удаляется по одной переменной из if независимо от порядка их расположения в R+(и, и'). Поэтому оптимальный порядок расположения i?i(t7,v') определяется тем, как быстро добавляются переменные из и. Для каждой переменной Vi из v оценивается количество формул Я,-, которые завсят от и<: все три формулы зависят от vq, две из них зависят от «i, и лишь одна зависит от V2- Поэтому если мы начнем с До, то введем одну новую переменную г>о и в то же время исключим из дальнейшего рассмотрения v'0. Вот почему на первом шаге вычисления мы выбрали комбинацию hfv1) и До(и,и'). По тем же соображениям следующей была выбрана формула Ri(v,lf), поскольку она вводит только одну новую переменную v\, но исключает при этом v[. В приведенном примере пришлось вычислять реляционное произведение для ЕХЛ, т. е. вычислять предшественников для некоторого множества состояний. Нам бывает необходимо также вычислять последователей некоторого множества состояний. Реляционное произведение в этом случае имеет почти такое же устройство, как
6.6. Вычисление реляционных произведений 123 в рассмотренных выше формулах. Однако при реляционном умножении вместо связьгаания кванторами существования переменных следующего состояния мы навешиваем кванторы на переменные текущего состояния. Это изменение сказывается и на выборе оптимального упорядочения для R^tJjV1) при конъюнктивном расщеплении. Для демонстрации обратимся вновь к примеру счетчика по модулю 8. Реляционное произведение для вычисления последователей имеет вид . 3uo3ui3u2[ft(iJ) Л (До(«о,«О ЛRi(v0,vi,v') A Д2(«о,«1,»г,«*))]¦ В данном случае мы выписываем явно все нештрихованные вхождения переменных в отношения Д* и обозначаем вхождения штрихованных переменных неявно. Так как конъюнкция подчиняется законам ассоциативности и коммутативности, мы вправе записать нашу формулу в виде 3t703i;i3u2[((/i(?J) Л R2(V0,VI,V2,V')) Л Ri(«о,vuif)) Л (До(«0,«ОЬ Поскольку Rq(vq,1?) не зависит от vi и «2, мы получаем 3v0[Bvi3v2[(h{v) AR2(v0,vi,V2,v')) Л Ri(y0,«!,«*)] Л (До(у0, и*)]- Теперь Ri(vo,vi,i?) не зависит от «2, и мы получаем 3w0[3wi[3t;2[ft(v) Л Д2(и0,vi,V2,v')} Л R\(vq,vi,i?)] Л (До(«о,й% В данном примере количество новых переменных состояния v't в промежуточных OBDD не зависит от порядка расположения подформул формулы Ri(v, й'). Однако количество старых переменных состояния Vi , остающихся свободными на каждом шаге, зависит от этого порядка; при выбранном нами порядке оно будет минимальным. Следует отметить, что это упорядочение отличается от того, что было приведено в уравнении F.5). Метод, который был описан выше применительно к вычислению реляционного произведения для счетчика по модулю 8, можно распространить на произвольные конъюнктивно расщепленные отношения переходов с п переменными состояния. Пользователь должен выбрать перестановку р на {0,... ,п - 1}. Эта перестановка определяет порядок, в котором соединяются расщепления Ri(v,%f). Для каждого i обозначим символом D( множество переменных ь'{, от которых зависит RiiVjV'). Положим 8*
124 Глава 6. Символьная верификация моделей while iV ф 0) do Для каждой v GV вычислить стоимость исключения и; Исключить переменную наименьшей стоимости и внести соответствующие изменения в С и V; end while Рис. 6.8. Алгоритм для исключения переменных Таким образом, Ei — это множество переменных, которые содержатся в Dp(i) и отсутствуют в Dp(k) Для всех значений к, превосходящих i. Множества Ei попарно не пересекаются, а их объединение содержит все переменные. Реляционное произведение для EX h вычисляется по следующей схеме: Мй.йО = 3„»€Bl [Гцф) ЛRp{1)(v,v')), Результатом реляционного умножения будет hn- Отметим, что если какое-либо Ei пусто, то hi+tivtf) = [hiitf) ARp^i^V)], и никаких кванторов на этом шаге не требуется. Упорядочение р существенно влияет на то, как скоро будут связаны кванторами переменные состояния. От этого зависят размер OBDD и эффективность самой процедуры верификации. Поэтому нужно быть аккуратным при выборе перестановки р, так же как и в случае с выбором порядка расположения переменных в OBDD. Мы ищем хорошую перестановку р.чтобы определить оптимальный порядок исключения переменных «<, с помощью «жадного» алгоритма. Каждому упорядочению переменных очевидным образом соответствует порядок расположения отношений Ri, так чтобы переменные исключались в том порядке, какой был установлен «жадным» алгоритмом.
6.6. Вычисление реляционных произведений 125 Основная идея «жадного» алгоритма представлена на рис. 6.8. Мы начинаем с множества переменных V, которые нужно исключить, и семейства С множеств Di, где D% — множество переменных, от которых зависит Ri. Мы удаляем по одной переменной на каждом шаге, выбирая всякий раз переменную наименьшей стоимости, и вносим необходимые изменения в V и С. Теперь осталось лишь определить подходящую меру стоимости. Мы рассмотрим три разные меры стоимости. Чтобы упростить последующие пояснения, будем обозначать символом R» отношение, приводящее к исключению переменной v за счет соединения конъюнкцией всех формул Ri, зависящих от и, и последующего связывания квантором существования переменной v. Множество свободных переменных, от которых зависит указанное отношение Л„, обозначим Dv. Минимиалъный размер. Стоимость исключения переменной v — это величина \DV\. С такой функцией стоимости мы всегда пытаемся добиться того, чтобы число переменных, от которых зависит составляемое нами новое отношение, было как можно меньше. Минимиалъный прирост. Стоимость исключения переменной v измеряется разностью \Dv\- max |А|, между мощностью множества Dv и мощностью наибольшего множества Di, содержащего v. Смысл состоит в том, что мы пытаемся избежать исключения тех переменных, которые приводят к построению большого отношения из многих маленьких отношений. Другими словами, лучше немного увеличить в размерах существующее большое отношение, чем создать новое большое отношение. Минимиалъная сумма. Стоимость исключения переменной v измеряется суммой ? \А\ A€C,v€A мощностей множеств Di, содержащих v. Так как стоимость конъюнкции зависит от размеров аргументов, мы аппроксимируем ее числом переменных, от которых зависит каждая формула Ri. Конечная цель состоит в том, чтобы минимизировать размер наибольшей BDD, создаваемой в процессе исключения переменных. В наших абстрактных терминах эта задача превращается в поиск упорядочения, которое минимизирует мощность наибольшего мно-
126 Глава 6. Символьная верификация моделей жества Dv, построенного в ходе указанного процесса. Делая всегда локально оптимальный выбор, мы не имеем гарантии получения оптимального решения, и для каждой из трех функций стоимости существуют контрпримеры. На самом деле задача поиска оптимального упорядочения относится к числу NP-полных. Однако похоже, что функция стоимости «минимальная сумма» дает наилучшее приближение реального объема операций над BDD и на практике имеет наилучшую производительность. в.6.2. Рекомбинация разбиений Ранее мы описали, как можно представить синхронную схему в виде множества отношений переходов ^(v,^), каждое из которых зависит от одной единственной переменной из V. Мы отметили также, что, соединив некоторые Ri в одну OBDD, можно добиться еще более простого представления. Соединяя часть отношений переходов таким образом, мы также существенно ускоряем вычисление реляционных произведений. Например, рассмотрим случай n-битового счетчика. При обычном порядке следования переменных число вершин OBDD, представляющей отношение переходов, растет линейно с ростом п как в цельном, так и в полностью расщепленном представлении. Предположим, что h(v') представляет некоторое отдельное состояние счетчика. Вычисление реляционного произведения с вполне расщепленным отношением требует п OBDD-операций, сложность каждой из которых 0(п); значит, общая сложность будет 0{п2). С другой стороны, если мы пользуемся цельным представлением, то выполняем одну операцию сложности 0(п), достигая экономии времени в п раз. На практике мы часто можем достичь ускорения, соединяя все OBDD, относящиеся к заданному регистру, без значительного увеличения количества вершин OBDD, представляющей отношение переходов. 6.6.3. Еще раз о примере АЛУ В этом разделе мы приведем некоторые эмпирические результаты, иллюстрирующие эффект использования расщепленных отношений переходов. Мы займемся верификацией схемы АЛУ из разд. 6.5, используя расщепленные отношения переходов. Из рис. 6.6 видно, что блок-схема разбивается естественным образом на фрагменты. Мы воспользовались этой декомпозицией как отправной точкой для
6.6. Вычисление реляционных произведений 127 разбиения отношения переходов на составные части. Далее мы заметили, что некоторым из этих частей, наподобие файла регистров, потребуются OBDD большого размера; такие фрагменты были разбиты на еще более мелкие части. Мы обнаружили также, что отдельные фрагменты, как, например, большинство регистров конвейера, можно было бы объединить, не увеличивая количества вершин OBDD; и мы делали это с целью сократить издержки. Окончательная декомпозиция состояла из следующих частей: 1) блок логики управления; 2) первый регистр конвейера; 3) прочие регистры конвейера; 4) регистр первого операнда АЛУ; 5) регистр второго операнда АЛУ; 6) по одному фрагменту для каждого регистра общего назначения в файле регистров. Порядок, в котором перечислены фрагменты, — это тот порядок, который использовался при обработке отношения переходов. При таком упорядочении число переменных в промежуточных представлениях никогда не превосходит количества переменных состояния более чем на ширину регистра. Мы обнаружили, что размер промежуточных результатов при таком упорядочении возрастает монотонно на каждом шаге; это означает, что разбиение отношения переходов на отдельные части не приводит к необходимости иметь дело с OBDD, пространство состояний которых превосходит пространство состояний единой OBDD, используемой для цельного представления отношения переходов. Это чрезвычайно важно, ибо во многих приложениях, где используются OBDD, именно число вершин в промежуточных (а не в окончательных) результатах служит ограничением размера задач, поддающихся решению. Мы выяснили, что время верификации возрастало полиномиально относительно числа компонентов этой схемы, по мере того как мы изменяли число регистров, ширину регистра, длину конвейера и число конвейерных операций. Полиномиальное время верификации было также отмечено в работах [45, 46]. В статье [23] авторы воспользовались символьным методом, чтобы привести пример верификации, требующей времени, сублинейного относительно числа состояний системы, но экспоненциального относительно числа компонентов.
128 Глава 6. Символьная верификация моделей Применяя расщепление отношений переходов, мы верифицировали 32-битовый конвейер с восемью регистрами общего назначения, двумя конвейерными регистрами и одной операцией. В этом примере имелось 406 переменных состояния, образующих более 10120 достижимых состояний, и верификация заняла один час и двадцать минут процессорного времени на машине SPARC-station 1+. Для сравнения со случаем, когда расщепление не проводилось, мы запустили также пример с 8-битовыми регистрами. Для расщепленного представления отношения переходов потребовалось менее 750 вершин, что на два порядка меньше, чем для цельного представления. К тому же время верификации сократилось в десять раз. В качестве другого примера рассмотрим задачу верификации асинхронной схемы, обеспечивающей взаимоисключающий доступ к разделяемым ресурсам (см. работы Мартина [187, 96]). Схема состоит из кольца ячеек. Каждая ячейка связана с пользователем ресурса, а также с ее правым и левым соседями в кольце. Взаимное исключение обеспечивается при помощи единственного маркера, который передается по кольцу. Ячейка должна обладать маркером, прежде чем предоставить доступ ее пользователю. Распределенная схема взаимоисключающего доступа служит примером асинхронной схемы со сложным управлением без передачи данных. Мы изучали трудоемкость решения задачи анализа достижимости в зависимости от количества ячеек. Мы объединили отношения переходов для функциональных элементов, образующих отдельную ячейку, и поэтому число элементов в расщеплении было равно количеству ячеек. Наибольшая схема, которую мы исследовали, имела 16 ячеек, 256 булевых переменных и 101в достижимых состояний. Потребовалось чуть менее тридцати минут процессорного времени на машине SPARC-station 1+ для поиска всех достижимых состояний. Общее число вершин OBDD, необходимых для представления отношения переходов, равно как и число состояний, возрастало линейно по мере увеличения числа ячеек. 6.7. Символьная верификация моделей для LTL В этом разделе мы покажем, как можно решать задачу проверки выполнимости формул линейной темпоральной логики на модели при помощи символьных методов. Мы приведем формальное доказательство корректности этих методов. Некоторые леммы и теоремы
6.7. Символьная верификация моделей для LTL 129 будут иметь чисто техническое значение, и поэтому при первом прочтении этого раздела их доказательства можно пропустить. Рассмотрим формулу линейной темпоральной логики А/. Таким образом, / — это ограниченная формула пути, в которой формулами состояния могут быть только атомарные высказывания. Нам нужно выделить все такие состояния в ? 5, что М, в (= А /. Поскольку М, 8 ^= А / тогда и только тогда, когда М, s \= -> В -i/, для этого достаточно уметь проверять истинность формул вида Е /, где / — ограниченная формула пути. В гл. 4 мы описали алгоритм Лихтенштейн и Пнуели [171] для решения этой задачи, сложность которого линейна относительно размера модели М и экспоненциальна относительно длины формулы /. Хотя их алгоритм имел линейную сложность относительно размера модели, он все же был неприменим на практике для больших примеров из-за эффекта комбинаторного взрыва. Как и в случае верификации моделей для CTL, представляя отношение переходов в виде OBDD, мы можем применить указанную процедуру для решения задач гораздо большего размера. Экспоненциальная сложность алгоритма Лихтенштейн-Пнуели относительно длины формулы обусловлена табличной конструкцией, которой может потребоваться объем памяти экспоненциальный относительно длины формулы. К счастью, таблицы можно также представить в виде OBDD. Чтобы добиться дополнительного выигрыша по времени и объему памяти, мы немного модифицируем таблицы для LTL-формул (см. [46, 65]). В частности, такое видоизменение определения нередко дает таблицы, имеющие меньшее количество состояний. Мы начнем с неформального описания алгоритма верификации моделей. По заданной формуле Б / и модели Крипке М мы построим таблицу Т для формулы пути /. Таблица Г представляет модель Крипке, в которой содержится каждый путь, удовлетворяющий формуле /. Построив композицию Т и М, мы найдем множество путей, которые содержатся как в Т, так и в М. В состоянии модели М будет выполняться формула Е / в том и только том случае, когда этим состоянием начинается путь указанной композиции, на котором выполняется /. Чтобы отыскать все такие состояния, применяется процедура верификации моделей для CTL, описанная в разд. 6.3. Опишем теперь более подробно устройство таблицы Т. Воспользуемся записью АР] для обозначения множества атомарных высказываний, входящих в /. Таблицей для формулы / назовем модель Т = (St,Rt,Lt) над множеством атомарных высказываний АР/.
130 Глава 6. Символьная верификация моделей В отличие от алгоритма Лихтенштейн-Пнуели, нам не нужно полное замыкание формулы. Каждое состояние таблицы — это множество элементарных формул, полученных из /. Множество элементарных подформул формулы / обозначается el(f) и определяется рекурсивно следующим образом: ¦ ei(p) = {р}, если р е АР/, " el(->g) = el(g), ¦ el{gVh) = el(g)Uel(h), - el(Xg) = {Xg}Uel(g), • el(g Vh) = {X(g U h)} U el(g) U el(h), Таким образом, множеством состояний 5т таблицы является семейство всевозможных подмножеств множества el(f). Функция разметки Lt определена так, чтобы каждое состояние было помечено множеством тех атомарных высказываний, которые содержатся в нем. Для построения отношения переходов Rt нам потребуется вспомогательная функция sat, которая сопоставляет каждой подформуле д формулы / множество состояний из St- По смыслу sat(g) обозначает множество состояний, которые удовлетворяют д: ¦ aat(g) = {а \ д G а}, где д € el(f), ¦ e/(-iff) = {а | д i aat(g)}, • aat(g V Л) = aat(g) U aat(h), • sat{g U Л) = aat(h) U (aat(g) П aat(X (g U h))). Желательно, чтобы отношение переходов обладало тем свойством, что всякая элементарная формула, содержащаяся в состоянии, являлась истинной в этом состоянии. Ясно, что если Хд принадлежит некоторому состоянию а, то все последователи s должны удовлетворять д. Учитывая, кроме того, что мы имеем дело с формулами LTL, если X д не содержится в в, то в в должна выполняться формула -'Хд. Следовательно, ни один последователь состояния а не должен удовлетворять д. Поэтому отношение Rt определяется так: RT(a, а')= Д * € aat(Xg) & а' € aat(g). Xp€ei(/) Рассмотрим спецификацию д = (->Heat) U Close для микроволновой печи из примера гл. 4. Отношение переходов Rt для таблицы, соответствующей формуле ->д, изображено на рис. 6.9. Чтобы сократить количество дуг, мы соединяли два состояния а я а' двунаправленными дугами в тех случаях, когда имелась дуга из в в в' и из
6.7. Символьная верификация моделей для LTL 131 з' в s. Каждое подмножество множества el(g) является состоянием таблицы Т. При разметке состояний на рис. 6.9 мы использовали Л в качестве сокращения для Heat, а с — как сокращение для Close. Для большей наглядности мы учитывали также отрицания атомарных высказываний. Отметим, что aat(Xg) = {1,2,3,5}, поскольку каждое из этих состояний содержит Xg, a sat(g) = {1,2,3,4,6}, так как каждое из этих состояний либо содержит Close, либо содержит -iHeat и X д. Поэтому sat(g) = {5,7,8} как дополнение множества sat(g). Из всякого состояния множества sat(X.g) в любое состояние множества sat(g), а также из всякого состояния дополнения множества sat(Xg) в любое состояние дополнения множества sat(g) есть переход. Это объясняется тем, что Rt — это конъюнкция формул равносильности. К сожалению, данное определение Rt не гарантирует выполнимости свойств происшествия. Это можно заметить из рис. 6.9. Хотя состояние 3 принадлежит sat(g), путь, зациклившийся навсегда в состоянии 3, не удовлетворяет формуле д, поскольку свойство Close никогда не соблюдается на этом пути. В связи с этим необходимо дополнительное условие, позволяющее выделить все такие пути, на которых выполняется /. Путь зг, начинающийся в состоянии s € sat(f), будет удовлетворять / тогда и только тогда, когда выполняется следующее условие ¦ Для любой подформулы д U h формулы / и произвольного состояния s на пути 7г, если а € sat(g U h), то либо s 6 sat(h), либо далее на пути 7Г найдется такое состояние t, что t € sat(h). Чтобы сформулировать ключевое свойство табличной конструкции, необходимо ввести еще одно новое обозначение. Рассмотрим некоторый путь -к1 = з'0, s'1(... в модели Крипке М. Тогда label^) = L(s'0), L(s[), Для всякой последовательности / = /о, Ji,... подмножеств множества АР и подмножества АР' С АР назовем сужением I на АР' такую последовательность 1\ар> = mo,mi,..., что m,i = UnAP' для каждого г > 0. Кроме того, мы условимся использовать обозначение sub(f) для множества всех подформул формулы /. Приведенная ниже теорема выражает формальна наше интуитивное требование к таблице Т, чтобы она включала все пути, удовлетворяющие формуле /. Теорема 4. Пусть Т — таблица для формулы пути /. Тогда для любой модели Крипке М и всякого такого пути ж'ъМ, что М, тг' ^= /, существует такой путь 7г в Т, что sat(f) label(nf)\Apf = label(ir).
132 Глава 6. Символьная верификация моделей Рис. 6.9. Таблица для формулы д = (-<Heat) U Close Для доказательства этой теоремы нам потребуются две леммы. Далее мы будем полагать, что тг' = «o,«i, • •. представляет путь в М. Мы обозначим символом 7г| суффикс пути 7г', начинающийся в состоянии ej, т. е. 7rJ = s'i, a'i+1, — Для пути ж1 определим множество e< = {^|Veei(/)HM,7r;|=^}. F.6) Заметим, что в* содержит все элементарные формулы, выполнимые на суффиксе тг( пути тг', и при этом является состоянием таблицы Т.
6.7. Символьная верификация моделей для LTL 133 Лемма 16. Для любой формулы д из множества sub(f) U el(f) соотношение М, nrt \= д имеет место тогда и только тогда, когда выполняется включение e< € sat(g). Доказательство. Доказательство проводится индукцией по структуре формулы. 1. Допустим, что д € е/(/). Тогда из определения 8* легко видеть, что соотношение М, ж'{ |= д имеет место тогда и только тогда, когда д € а,-. По определению функции sat формула д содержится в Sj в том и только том случае, когда Si G sat(g). Следует иметь в виду, что базис индукции охватывает все случаи атомарных формул, а также все случаи формул вида Х<? для произвольной LTL-формулы д. 2. Допустим, что д = ->gi или д = giVg^. Для обоснования этих случаев достаточно воспользоваться предположением индукции и определением функции sat. 3. Допустим, что д = gi U д%. Из определения оператора U следует, что М, ж'4 (=siU (ft тогда и только тогда, когда М, зг| |= д% или выполняются оба соотношения М,ъ'4 \= д\ и М,зг{ |= X[#i Ujft]- По предположению индукции и определению состояния Sj выполнимость М,7Г^ |= дъ или совместная выполнимость М,7г{ |= д\ и М, ж'{ (= X[gi U рг] возможны в том и только том случае, если либо Si ? sat(gi), либо «j е sat(<7i) и s< € sa?(X[gi U 92]). Следует принять во внимание то, что X[#i U 92] содержится в ei(/) и относится за счет этого к базису индукции. По определению функции sat выполнимость соотношения s< € sat(g2)V(8i € sat(gi)Asi G sat(X [giU^])) возможна в том и только том случае, если в,- ? sat(g\ \J gt). D Лемма 17. Пусть яг' = Sq, si,... — путь в М. Для каждого i > О определим состояние Sj таблицы, удовлетворяющее уравнению F.6). Тогда я- = so, 81, ¦ ¦ ¦ — путь в таблице Г. Доказательство. Ясно, что s< 6 St для всех t ^ 0. Используя лемму 16 и определение оператора X, заметим, что s» G eat(Xp) тогда и только тогда, когда М, irj \= X р, что, в свою очередь, возможно в том и только том случае, если M,ir'i+1 |= д, а последнее равносильно включению 8<+1 € ea?(<7). По определению отношения Rt, если Sj € sat(Xg) ¦*> s<+i С sat(p), то (s<,8j+i) € Дг- Поэтому 7г = so,Si,... — путь в Т. ? Мы можем приступить теперь к доказательству теоремы 4.
134 Глава 6. Символьная верификация моделей Доказательство. Предположим, что для некоторого пути 7г' в М выполняется соотношение M,pi' (= /. По лемме 17 мы можем отыскать путь л- = во, «1,. • • в Т. По лемме 16 мы имеем sq € sat(f). По определению состояния s<, соответствующего уравнению F.6), получаем L(a'i)\AP/ = ?т(я«) и, следовательно, label(n')\APf = label(n), что и требовалось установить. ? Далее нам нужно вычислить произведение Р = E, R, L) таблицы Г = Eт, Rt, Lt) и модели Крипке М = (Sm, Rm, Lm)- ¦ S = {(в,в') | s G ST,s' € SM и L(s')|ap, = Lr(s)}; ¦ .R((s, a'), (t, t')) тогда и только тогда, когда Rt(s, t) и Rm(в', f')> - L((a,8')) = Lr(s). Отношение переходов такого произведения может оказаться нетотальным. Если это случится, мы удалим из S все те состояния, у которых нет последователей, и сузим отношение переходов R на оставшиеся состояния. В следующей лемме утверждается, что Р содержит в точности все те последовательности 7г", для которых имеются пути я- в Г и 7г' в М с одинаковой разметкой высказываний из APf. Лемма 18. Последовательность я-" = (ао)Яо)>Cьв1)>-- является путем в Р с пометками Lp((si,s'J) = Lt(s«) для всех i ^ 0 в том и только том случае, когда существуют такой путь 7г' = s0, s[,... в Т и такой путь п' = s'0, s[,... в М, что Ьт{вг) = Ьм{в\)\ар} для всех значений г ^ 0. Доказательство этой леммы бесхитростное. Располагая путем 7г" в Р, мы получаем пути ж и тг', проецируя каждое состояние исходного пути на соответствующую модель. С другой стороны, поскольку разметки я- и ж' согласованы по высказываниям из APf, мы видим, что пара (sj, sj) является состоянием из Р для каждого г ^ 0. Кроме того, всегда имеется переход из (sj.aj) в (sj+1,Sj+1). Мы распространим функцию sat на множество состояний произведения Р, полагая (в,«') G «of (<?) в том и только том случае, когда 8 G ea*(s). Затем мы применяем систему верификации моделей для CTL, чтобы выделить множество всех состояний V в Р, V С sat(f), удовлетворяющих формуле EG True с ограничением справедливости ¦ {sat{->(g U Л) V Л) | 5 U ft входит в /}. F.7) Каждое состояние из V содержится в sat(f). Более того, с него начинается бесконечный путь, который удовлетворяет всем ограничени-
6.7. Символьная верификация моделей для LTL 135 ям справедливости. Эти пути обладают тем свойством, что никакая подформула вида д U Л не выполняется почти всюду на пути, пока условие Л остается ложным. Корректность нашего построения подтверждается в итоге следующей теоремой. Теорема 5. Соотношение М, а' |= Е / имеет место тогда и только тогда, когда в таблице Т существует такое состояние а, что пара (8,8') содержится в sat(f), и Р, («,«') |= EG True при ограничении справедливости {sat(->(g U Л) V Л) | д U h входит в /}. Предположим, что М,а' \= Е/, и пусть 7г' — такой путь из «', что я-' ^ /. Рассмотрим путь 7г = so,si,..- в таблице, отдельные состояния Si которого определяются уравнением F.6). Следующие три леммы описывают свойства пути ж. Лемма 19 устанавливает, что этот путь удовлетворяет ограничениям справедливости. Лемма 20 показывает, что если а е aat(gi U дъ), то все последователи состояния 8 будут оставаться в sat(g\ U д%), до тех пор пока один из последователей не попадет в sat fa)- Наконец, в лемме 21 доказано, что если путь в таблице является справедливым, то для того чтобы этот путь удовлетворял /, необходимо и достаточно, чтобы его начальное состояние принадлежало sat(f). Последняя лемма убеждает нас, что для обнаружения в таблице путей, удовлетворяющих /, нам следует отыскать справедливые пути, начинающиеся в aat(f). Это замечание распространяется естественно и на произведение Р. Лемма 19. Определенный выше путь тг удовлетворяет формуле GTrue при ограничении справедливости F.7). Доказательство. Чтобы показать, что ж |= G True при ограничении справедливости, нам нужно доказать, что для каждой подформулы вида gJJh формулы / на пути 7г имеется бесконечно много таких состояний я*, что а< ? aat(->(gUh) Vh). Предположим, что это не так. Тогда найдется такое to, что для всякого i ^ to имеет место Si g 8at(->(g U Л) V Л). Это означает, что Si G sat(g U Л) и 3t ? aat(h). По лемме 16 для каждого i ^ to выполняются соотношения ж\ \= gUh и ж\ ^ h. Поскольку 7г{ |= д U Л означает, что для некоторого j ^ i имеет место irj |= Л, это приводит к противоречию. ? Лемма 20. Предположим, что для всех k ^ j выполнены условия ak € aat(gi) *> 7rfc (= 0i и sk€ aot(g2) €>¦ згк f= jfe. Тогда если 7Г,- ^ й U й и Ч € aat(gi U 92)) то я* ? j?i U 92 и а* € яа<(ф U <fe) для всех к ^ j.
136 Глава 6. Символьная верификация моделей Доказательство. Вначале мы покажем, что если выполнены условия Sj € sat(gi U52) и тгл- р gi U52, то будут выполнены и соотношения 8j+i 6 sat(g\ U 52) и Kj+i р gi U 52- Как видно из определения функции sat, из включения ал- € sa?Ei U52) следует либо включение 8j € eat(^2), либо соотношения Sj € sat(gi) и 8j € sa?(XEi U 52))- Отсюда, принимая во внимание предположения, выдвинутых в условиях леммы, и определение Rt, мы получаем тг,- р 52 или тт,- р gi и eJ+i е sat(gi U52). F.8) Если TTj- р 51 U 52, то тг,- р 52, и поэтому соотношение F.8) можно привести к виду тг,- р 51 и 8j+i е sat(gi U 52)- F.9) Из F.9) мы заключаем, что тг,- р 51, а условия леммы гласят, что имеет место тг,- р 51 U 52- Если бы путь тг,-+1 удовлетворял 51 U 52, то на основании соотношения тг,- (= 5i мы могли бы заключить, что itj И 5i U 52- Но коль скоро это невозможно, приходим к выводу о том, что имеет место тг,-+1 р 51 U 52- Подобным же образом для всех k = j + 2, j + 3, j + 4,... мы можем показать, что s* G eatEi U 52) и тг* р 51 U 52- П Лемма 21. Предположим, что при ограничениях справедливости выполняется соотношение тг р G True. Тогда соотношение Т, тг р / имеет место тогда и только тогда, когда во 6 sat(f). Доказательство. Проводя индукцию по структуре формулы, мы покажем, что для всякой формулы д € sub(f) U el(f) и для любого j соотношение Г, ttj р д имеет место тогда и только тогда, когда выполняется включение Sj € sat(g). 1. Допустим, что 5 = Р С АР}. Исходя из определений состояния 8j и функции sat легко установить следующую цепочку равносиль- ностей: соотношение тг,- (= р имеет место тогда и только тогда, когда р G Lr(ej), а это, в свою очередь, возможно в том и только том случае, если р € «;, последнее же равносильно тому, что Sj € sat(p). 2. Допустим, что 5 = -1 или 9 = 9i V02- Обоснование этих случаев можно провести очень просто, воспользовавшись предположением индукции и определением связок -i и V. 3. Допустим, что 5 = Х51. По определению Дт и на основании предположения индукции легко устанавливается следующая цепочка равносильностей: включение 8j € eat(X 51) имеет место тогда и только тогда, когда Sj+i € sat(gi), а это, в свою очередь, возможно в
6.7. Символьная верификация моделей для LTL 137 том и только том случае, если 7r,+i |= д\, последнее же равносильно соотношению itj |= Х#. 4. Допустим, что д = giV gi- Для доказательства в одну сторону предположим, что 7Г,- ^ gi U 52. Тогда существует такое I, I ^ j, что я-/ И 92 и для любого г, j ^ * < ^ выполняется соотношение 7Tj (= ffi. По предположению индукции sj € eai(<fe), и поэтому s/ G sat(gi U Р2). По определению отношения Rt отсюда следует, что 5j_i G eot(X(^i Upa))- Коль скоро jt(_i [= gi, предположение индукции позволяет считать, что ej_i € sat(gi), а, следовательно, S|_i € sat(g\ U 92). Применив индукцию по (I — j), мы рано или поздно придем к заключению о том, что Sj € sat(gi U 32). Для доказательства в другую сторону допустим, что Sj € sat(gi U02), но itj \fc gx U Q2. Предположение индукции обеспечивает выполнимость условий леммы 20. Поэтому для всякого к, к > j, мы имеем 8к € sat(gi U 52) и я* И= 0i U 52- Отсюда следует, что я* ^ $2. и согласно предположению индукции мы получаем »». & во<(рг). Это означает, что л* G sa?(gi U 52) и в* ? sa^(g2) для всех к, к ^ j. А это приводит к противоречию, ибо выполнимость соотношения 7г ^ G True при ограничениях справедливости гарантирует нам существование бесконечно большого числа таких состояний Sk, что в* 6 aat(->(gi U <7г) V <й)- Таким образом, если ej 6 sat(gi U 52), Т0 7Г,- |= 01 U ff2- D Теперь можно приступить к доказательству теоремы 5. Доказательство (теоремы 5). Необходимость. Условие М, я0 ^= Е / влечет за собой существование такого пути тг', что тг' f= /. Воспользовавшись теоремой 4 и леммой 19, мы можем показать, что соответствующий путь тг в таблице Т обладает свойствами тг |= GTrue и labei(ir) = Jabe/Er')|AP/- По лемме 18 существует такой путь тг" в модели-произведении Р, что /оЬе/Gг") = label(n'). Так как label(n) = label{ir')\APj, и я-' ^= /, легко видеть, что будет верно и соотношение п \= f. Отсюда по лемме 21, принимая во внимание соотношение 7Г )= GTrue, получаем во 6 sat(f). Таким образом, (s0,s0) ? *«*(/)• Поскольку !оЬе1(тг) = label(ir") и я- f= G True, ясно видно, что it" \=G True. Поэтому будет иметь место и соотношение Р, («о, s0) ?= EG True. Достаточность. Если (яо,*о) € «at(/) и Р,(во,я0) (= EG True, то существует путь тг", удовлетворяющий соотношению тг" f= GTrue. По лемме 18 в Т и М соответственно имеются пути такие я- и ж',
138 Глава 6. Символьная верификация моделей что label(ir") = label(n) = 1аЬе1(ж')\АР, ¦ Поскольку 7г" (= GTrue и 1аЬе1(к") = label (я-), легко видеть, что п (= GTrue. Коль скоро (eo»s(>) G sat(f), очевидно, что и sq € sat(f). Тогда по лемме 21 получаем я" f= /. Так как label(ir) = label(it')\Apf, это означает также, что имеет место соотношение п' |= /, которое, в свою очередь, равносильно M,s'0\=Ef. П Для иллюстрации этой конструкции проверим выполнимость формулы д = -)((->Яеа?) U Close) на модели Кринке М, изображенной на рис. 4.3 (см. с. 69), которая описывает микроволновую печь. Таблица Т для указанной формулы представлена на рис. 6.9. Если вычислить произведение Р, как было описано нами ранее, то мы получим модель Крипке, которая изображена на рис. 6.10 (см. с. 139). Каждое состояние произведения помечено парой состояний (s',s), где в' € Т и а е М. Мы удалили состояния D,4), D,7), F,3), F,5), F,6), G,1) из диаграммы произведения, поскольку в этих состояниях не начинается ни один бесконечный путь. Применим алгоритм ве- риифкации моделей для CTL, чтобы выделить множество V состояний из 8at(->g), удовлетворяющих формуле EG True с ограничением справедливости sat(->((->Heat) U Close) V Close). Так как sat(->g) = {G,1), G,2)}, но ни одно из этих состояний не является началом какого-либо бесконечного пути, мы заключаем, что V = 0. Поэтому мы приходим к выводу о том, что ни одно состояние из Мне удовлетворяет формуле E-i((-iffeof) U Close). А это означает, что все состояния удовлетворяют формуле A.({~>Heat) U Close). Расскажем теперь о том, как реализовать описанную процедуру с использованием OBDD. Мы полагаем, что отношение переходов для М представлено OBDD, которая определена над множеством атомарных высказываний АР. Чтобы представить отношение переходов для Т в виде OBDD, мы сопоставим каждой элементарной формуле д переменную состояния vg. В случае когда д — атомарное высказывание, vg будет просто совпадать с д. Таким образом, обе модели МиГ будут определены над множеством переменных из АР/ и некоторыми вспомогательными переменными состояния. Мы представим отношение переходов Rt в виде булевой формулы, зависящей от двух наборов v и «* переменных состояния. Чтобы представить таблицу как можно более компактно, булеву формулу преобразуем в OBDD. Как только композиция Р будет построена, целесообразно отделить все переменные состояния, входящие в APf. Обозначим символом р двоичный набор истинностных значений этих переменных состояния. Таким образом, каждое состояние из St бу-
6.7. Символьная верификация моделей для LTL 139 Рис. 6.10. Произведение Р модели микроволновой печи М и таблицы Т для формулы д = -i((->Heat) U Close) дет определяться парой (р, г), где 7 — двоичный набор значений тех переменных состояния, которые содержатся в таблице, но не входят в АР/. Всякое состояние из Sm будет обозначаться парой (|>,5), где q — двоичный набор значений тех переменных состояния модели М, которые не упоминаются в /. В итоге отношение переходов Др произведения двух моделей Кринке будет задаваться формулой Rpfawtftfy) = RT(p,f,p,f)ARM(p,q,P,^)- Мы применяем символьный алгоритм проверки выполнимости формул на модели, способный обработать ограничения справедливости,
140 Глава 6. Символьная верификация моделей чтобы выделить множество состояний V, удовлетворяющих формуле EG true при ограничениях справедливости, представленных уравнением F.7). Каждое состояние из V задается булевым вектором вида (p,q,r). Таким образом, состояние (р,д) модели М удовлетворяет формуле Е/ тогда и только тогда, когда существует такое г, что fa,q,r) eV и (р,г) G sat(f).
^ Верификация моделей i для /i-исчисления 7.1. Введение Пропозициональное ^-исчисление — это очень мощный язык, позволяющий выражать свойства систем переходов при помощи операторов наименьшей и наибольшей неподвижной точки. Оно вызвало значительный интерес среди исследователей в области автоматических методов верификации. Этот интерес обусловлен прежде всего тем фактом, что многие темпоральные и программные логики могут быть переведены в ^-исчисление. Другая причина пристального внимания к ^-исчислению состоит в том, что для этого формализма существуют эффективные процедуры верификации моделей. Вследствие этого процедуры верификации для многих темпоральных и модальных логик могут быть получены за счет трансляции этих логик в /1-исчисление. Широко распространенное применение двоичных разрешающих диаграмм придало алгоритмам, основанным на вычислении неподвижных точек, еще большую значимость, поскольку методы, требующие манипуляции с отдельными состояниями, не могут воспользоваться преимуществом этого представления. В математической литературе уже описано несколько различных вариантов /^-исчисления, и алгоритмы, предложенные в этой главе, могут работать с любым из них. Но поскольку необходимо сделать конкретный выбор, мы воспользуемся пропозициональным ^-исчислением в трактовке Козена [156]. Замкнутые формулы этой логики оцениваются на множествах состояний. Значительные усилия исследователей были приложены к поиску методов эффективного вычисления значений таких формул, и было предложено немало алгоритмов решения указанной задачи. В большинстве своем эти алгоритмы разделяются на две категории — локальные и глобальные. Локальные процедуры разрабатываются для доказательства того, что некоторое особое состояние системы переходов удовлетворяет заданной формуле. Поэтому порой отпадает необходимость исследовать все состояния системы переходов. Однако эти алгоритмы никак не сочетались с OBDD. Локальный подход, в основе которого лежит табличный метод, был разработан Кливлендом [75], Стар-
142 Глава 7. Верификация моделей для /i-исчисления лингом и Уолкером [234] и Уинскелем [245]. Позднее Андерсен [11] и Ларсен [167] разработали эффективные локальные методы для некоторого подмножества ^-исчисления. Улучшения в табличный метод Стирлинга и Уолкера внес также и Мейдер [181], повысив, по всей видимости, его эффективность. В этой главе мы будем иметь дело только с глобальными методами проверки на модели. Глобальные процедуры, базирующиеся на OBDD, показали свою высокую эффективность на практике. Эти процедуры обычно обрабатывают формулу снизу вверх, вычисляя значение каждой ее подформулы на основе значений слагающих ее частей. Для вычисления неподвижных точек применяется итерация. Из-за вложенности операторов неподвижной точки бесхитростный глобальный алгоритм требует 0{пк) итераций для оценки формулы, где п — число состояний системы переходов, а к — глубина вложенности операторов неподвижной точки. Эмерсон и Ли [107] улучшили оценку, обратив внимание на то, что последовательно применяемые операторы неподвижной точки одного и того же типа не увеличивают сложность вычислений. Это наблюдение было формализовано при помощи понятия глубина чередования. По сути дела глубина чередования — это число чередований операторов наибольшей и наименьшей неподвижной точки в формуле. Они предложили алгоритм, требующий всего лишь 0(nd) итераций, где d — глубина чередований. Организация вычислений и манипуляции с множествами могут увеличить требуемое время еще на один порядок по п. Последующие усилия Андерсена, Кливленда, Клейна и Стеффена [11, 73, 74] устранили эту добавочную сложность, но в целом число итераций осталось, как и прежде, 0(nd). В работе [176] этот результат был улучшен: был предложен алгоритм, требующий 0(nd/2) итераций для вычисления значения формулы глубины чередований d. Таким образом, этому алгоритму требуется время, составляющее квадратный корень от того времени, которое было необходимо для ранних алгоритмов. В этой главе описаны пропозициональное /^-исчисление и общие алгоритмы оценки формул /i-исчисления. Также рассмотрены примеры задач верификации, которые можно представить на языке ц- исчисления.
7.2. Пропозициональное /i-исчисление 143 7.2. Пропозициональное ^-исчисление Формулы пропозиционального /i-исчисления интерпретируются на системах переходов. Чтобы различать разные переходы в системе, мы слегка изменим определение модели Кринке. Вместо одного отношения переходов R мы будем иметь дело с множеством отношений переходов Т. Для простоты мы будем называть каждый элемент а из Т переходом, а не множеством переходов. Формально модель Крипке М = (S, Т, L) состоит из ¦ непустого множества состояний S, ¦ множества переходов Т, каждый переход а € Г в котором представляет отношение а С S х S, ¦ отображения L : S -* 2АР, устанавливающие для каждого состояния множество истинных в нем атомарных высказываний. Введем в рассмотрние множество VAR = {Q,Qi,Q2, • • •} реляционных переменных. Значениями каждой реляционной переменной Q € VAR являются подмножества множества S. Формулы />исчисления строятся по следующим правилам: ¦ если р е АР, тор — формула; ¦ реляционная переменная является формулой; ¦ если fug — формулы, то ->f, /Лри/Vp — формулы; ¦ если / — формула и о G Т, то [a]f и (a)f — формулы; ¦ если Q G VAR и / — формула, то выражения fsQ-f и vQ.f являются формулами при условии, что / синтаксически монотонна относительно Q, то есть все вхождения Q в / располагаются в областях действия четного числа связок отрицания. Переменные ^-исчисления могут быть как свободными, так и связанными операторами неподвижной точки. Замкнутой формулой называется формула, не имеющая свободных переменных. Для обозначения того, что формула / содержит свободные реляционные переменные Qi,..., Qn, будем использовать запись f{Q\,..., Qn)- Содержательный смысл формулы (а)/ таков: «может быть совершен а-переход в состояние, в котором выполняется /к Аналогично формула [о]/ гласит: «/ выполняется во всех состояниях, достижимых (за один шаг) о-переходом». Операторы и и v используются для обозначения наименьшей и наибольшей неподвижной точки. Пустое множество состояний будем обозначать Faiae, а все множество состояний S будем обозначать True. Кроме того, аа протяжении всей
144 Глава 7. Верификация моделей для /д-исчисления этой главы вместо (a, s') € а будет использоваться более наглядная запись а А «'. Строго говоря, формула / интерпретируется как множество состояний, на которых / обращается в истину. Такое множество будем обозначать [/]ме, где М — система переходов, а е : VAR -+ 2s — окружение. Запись e[Q <- W] служит обозначением нового окружения, отличающегося от е только тем, что e[Q «- W](Q) = W. Множество [/]ме имеет следующее рекурсивное определение: ¦ Ь>]ме = {а | р € ?(«)}; ¦ [Я]ме = e(Q); ¦ b/bfe = S\[/lMe, ¦ [/ Л д]м е = [/]ме П [д]м е; • [f^9]Me = [f}MeU\g]Me; a Ш»ме = {а | 3t [a A t и t 6 [Яме]}; ¦ Н/Пме = {8 | Vt [в А * =» t е [/]ме]>; ¦ \pQ • /]ме — наименьшая неподвижная точка преобразователя предикатов т : 2s -* 25, который определяется соотношением TW = |/]we[Q4-W]; " \VQ • /]ме — наибольшая неподвижная точка преобразователя предикатов т : 2s -> 2s, который определяется соотношением *-(И0 = [/]Afe[g «- W). Использование отрицания внутри формул ограничено; это обеспечивает монотонность и коррректность определения неподвижных точек. Если говорить формально, то все логические связки, за исключением отрицания, монотонны (т. е. из выполнимости / -> /' следует выполнимость f/\д -> f/\д, /Vg -> f'Vg,(a)f -> (a)f, [a]f -ь [a]f), а все связки отрицания можно пронести вглубь формулы вплоть до атомарных высказываний, применяя законы де Моргана и тождества двойственности ->[о]/ = (a)-i/, -<(о)/ = [о]->/, "W f(Q) = vQ. ->fbQ), ->vQ. f(Q) = nQ ¦ ^fi-Q). Поскольку связанные переменные находятся под действием четного числа отрицаний, после выполнения описанных преобразований они освободятся от отрицаний. Таким образом, каждая формула в операторе неподвижной точки монотонная и, следовательно, каждый преобразователь предикатов г также монотонен (т. е. из выполнимости S С S' следует выполнимость тE) С t(S')). Этого достаточно, чтобы обеспечить существование неподвижных точек [238]. Более того, прини-
7.2. Пропозициональное /^-исчисление 145 мая во внимание то обстоятельство, что мы оцениваем формулы на конечных системах переходов, мы видим,что монотонность пероб- разователя т влечет за собой U-непрерывность и П-непрерывность этого преобразователя (см. лемму 5 из гл. 6). Значит, наименьшая и наибольшая неподвижные точки могут быть вычислены при помощи итеративной процедуры №Пме = [JT^Falae) [uQ.f]Me = fV(True)( » » где т*(ф) определяется рекурсивно двумя соотношениями t°(Q) = Q и t*+1(Q) = r(r'(Q)). Поскольку область S конечна, итерация завершится спустя конечное число шагов (см. лемму 7 в главе 6). Выражаясь более строго, найдутся такие t, j ^ \S\, что наименьшая неподвижная точка будет равна т% (False), а наибольшая неподвижная точка будет равна т*(Тгие). Чтобы отыскать неподвижные точки, мы будем многократно применять г, начиная с False или True, до тех пор пока результат не будет оставаться неизменным. Глубиной чередования [107] для формулы условимся называть число чередований вложенных операторов наименьшей и наибольшей неподвижной точки при условии, что все отрицания применяются только к атомарным высказываниям. Чтобы сделать это определение более строгим, нам потребуется ввести понятия v- и /«-подформул верхнего уровня для формул /i-исчисления. Назовем v-подформулой верхнего уровня для формулы / всякую такую подформулу vQ.g формулы /, которая не содержится ни в какой другой подформуле формулы /, начинающейся оператором наибольшей неподвижной точки. Например, ^-подформулами верхнего уровня для формулы / = nQ'. (vQi. g\ V vQ%. 52) являются uQi.gi и vQz.g^. Аналогично определяется ^-подформула верхнего уровня для формулы /. Тогда строгое определение глубины чередования таково. ¦ Глубина чередования для атомарного высказывания и реляционной переменной равно 0. ¦ Глубина чередования для формул / Л g, / V д, {a)f и [a]f равна максимальной глубине чередований для формул fug. ¦ Глубина чередования для fiQ. f равна наибольшему из следующих чисел: 1) константа 1; 2) глубина чередования для /; 3) единица плюс максимальная глубина чередования для всякой {/-подформулы верхнего уровня для /. 11 Зак. 271
146 Глава 7. Верификация моделей для /^-исчисления ¦ Глубина чередования для pQ. / определяется двойственным образом. Рассмотрим, например, систему переходов, в которой Т = {о}. Напомним, что EG/ при наличии ограничения справедливости Л выполняется в некотором состоянии, если из этого состояния исходит путь, на котором / выполняется всегда, ah — бесконечно часто. Это свойство выражается при помощи следующей формулы неподвижной точки (см. разд. 6.1): EGf = vZ.fAEXE[fV(ZAh)]. G.1) Воспользовавшись определением определением EU в терминах неподвижной точки, мы получим Е[/ U (Z Л /»)] = цУ. (Z Л h) V (/ Л ЕХУ). G.2) Подстановка правой части равенства G.2) в G.1) приводит к формуле vZ. (/ Л ЕХ(/гГ. (Z Л Л) V (/ Л EX Г))). И наконец, заменив ЕХ на (а), мы получаем формулу ^-исчисления vZ. (/ Л (а)((л?. (Z Л Л) V (/ Л (a)Y))). G.3) Глубина чередования для этой формулы равна 2. Ввиду свойства двойственности uQ.f(...,Q,...) = -*nQ. -/(...,-Q,...) мы могли бы определить пропозициональное ^-исчисление только с одним оператором наименьшей неподвижной точки и отрицанием. Для того чтобы иметь возможность приводить краткое описание некоторых конструкций, мы иногда будем пользоваться двойственными формулировками. Тем не менее, понятие глубины чередования проще всего ввести так, как это было только что проделано. 7.3. Вычисление значений формул неподвижной точки В этом разделе мы приведем алгоритм верификации моделей для /u-исчисления. Этот алгоритм определяет множество состояний модели, на которых выполняется та или иная формула этой логики. На рис. 7.1 приведен простой бесхитростный рекурсивный алгоритм, оценивающий формулы /^-исчисления. Сложность по времени алгоритма, представленного на рис. 7.1, экспоненциальна относительно длины формулы. Чтобы убедиться в этом, мы проанализируем поведение этого алгоритма при вычислении вложенных неподвижных точек. Алгоритм вычисляет неподвижные точки путем итеративного
7.3. Вычисление значений формул неподвижной точки 147 1. function eval(/, е) 2. if / = р then return {в | р € L(s)}; 3. if / = Q then return e(Q); 4. if / = 5i Л ff2 then 5. return eval(<7i,e)neval(<72>e); 6. if / = gi V ^2 then 7. return eval@i,e)Ueval(p2je); 8. if / = (a)p then 9. return {s | 3t [s A t and t € eval(<?,e)]}; 10. if / = [a]g then 11. return {s | Vt [s Л t implies ? € eval(#,e)]}; 12. if f = nQ.g(Q) then 13. Q„o( := Fa/se; 14. repeat 15. Qoid '•= Qvai; 16. Q„0j := eval(g,e[<2 <- gUO|]); 17. until QVal=Qold; 18. return Qeaj; 19. end if 20. if f = vQ.g(Q) then 21- QBO/ := True; 22. repeat 23. QoW := Qvai; 24. Q„o/ := eval(p,e[Q <- g„aj]); 25. until Q„aj=Q<,i<i; 26. return <5„aj; 27. end if 28. end function Рис. 7.1. Простой алгоритм верификацни моделей для /i-исчисления 11*
148 Глава 7. Верификация моделей для //-исчисления уточнения их аппроксимаций. Последовательные приближения образуют цепочку множеств, упорядоченных по включению. Поскольку количество строгих включений ограничено сверху числом возможных состояний, цикл (либо образованный строками 14-17 для вычисления наименьшей неподвижной точки, либо образованный строками 22-25 для вычисления наибольшей неподвижной точки) будет выполнен самое большее п + 1 раз, где п = |5|. Каждая итерация в таком цикле включает рекурсивное обращение к процедуре вычисления значения тела оператора неподвижной точки при разных значениях переменной неподвижной точки. Если подформула, оценку которой необходимо вычислить, содержит, в свою очередь, оператор неподвижной точки, вычисление значения его тела вновь приведет к циклу, который может потребовать до п + 1 рекурсивных вызовов применительно к еще более коротким подформулам. В конце концов тело наиболее глубоко вложенного оператора неподвижной точки будет перевычисляться 0{пк) раз, где к — максимальная глубина вложенности операторов неподвижной точки в рассматриваемой формуле. Следует отметить, что мы всего лишь рассмотрели число итераций, необходимых для вычисления неподвижных точек, а не число шагов, которые необходимо сделать для оценки значения формулы /х-исчисления. И хотя каждая неподвижная точка может потребовать всего лишь 0(п) итераций, для каждой такой итерации может потребоваться 0(\М| • |/|) шагов, где М = (S, Т, L) — модель и \М\ = \S\ + YlaeT 1°1- Это означает, что в общем случае алгоритм имеет сложность 0(|М| • |/| • п*). Результат, полученный Эмерсоном и Ли [107], свидетельствует о том, что значение формулы неподвижной точки может быть вычислено за 0((|/| • n)d) итераций, где d обозначает глубину чередования для /. Их алгоритм весьма похож на тот простой алгоритм, который мы только что рассмотрели; отличия проявляются лишь тогда, когда неподвижная точка находится непосредственно в области действия оператора неподвижной точки того же самого типа. В этом случае неподвижная точка вычисляется совсем иначе. Основная идея заключается в том, чтобы извлечь пользу из последовательно вложенных операторов неподвижной точки одного и того же типа и сократить за счет этого сложность алгоритма. Тогда исчезнет необходимость проводить повторное вычисление внутренней неподвижной точки, начиная с False (для наименьшей неподвижной точки) или
7.3. Вычисление значений формул неподвижной точки 149 с True (для наибольшей неподвижной точки) в тех случаях, когда требуется уточнить новое приближение для внешней неподвижной точки. Чтобы пояснить этот замысел, достаточно простого примера. Когда речь будет идти об оценке формул неподвижной точки, мы будем использовать символы Qi,.--,Qk для обозначения переменных неподвижной точки, полагая, что Qi соответствует самой внешней неподвижной точке, a Qk — самой внутренней. Запись Q?' ",J будет обозначать значение tj-й аппроксимации для Qj, после того как были вычислены ц-е аппроксимации для Qi, 1 ^ I < j. Если i,- = ш, то это означает, что рассматривается окончательная аппроксимация, представляющая значение неподвижной точки для Qj. Так, например, Q" есть не что иное, как значение неподвижной точки для Qi, a Q\ ° представляет начальную аппроксимацию для Qz, после того как была вычислена третья аппроксимация для Q\. Рассмотрим формулу /*Qi gi(Qi,nQ2¦92{Qi,Qi))- Подформула nQi-giiQiiQz) определяет монотонный преобразователь предикатов т, отображающий одно множество (значение Qi) в другое (значение наименьшей неподвижной точки для Q2), а именно r(Qi) = idJ.g»{QiM. При вычислении внешней неподвижной точки мы начинаем с наименьшей аппроксимации Q\ = False и затем определяем значение t(Q4). Для этого проводится итеративное вычисление аппроксимаций для внутренней неподвижной точки, которое также начинается с наименьшей аппроксимации Q%° = False и продолжается до тех пор, пока не будет достигнута неподвижная точка Q% ш. Теперь Qi наращивает свое значение до Q\, которое является результатом вычисления ^(Q?,^ <"): Q\ = 9i(Q°i,Q°2U). Далее вычисляется наименьшая неподвижная точка для t{Q\). Поскольку Q\ С Q\, в силу монотонности оператора т мы имеем включение t{Q\) С t(Q\). Обратим внимание на то, что монотонность оператора т и конечность множества S обеспечивают U-непрерыв- ность этого оператора. Это позволяет легко доказать по индукции следующую лемму. Лемма 22. Если W С U< ^(False), то Ц r{W) С (Jj^(False)
150 Глава 7. Верификация моделей для /х-исчисления Иными словами, вычисление наименьшей неподвижной точки можно начинать со всякой аппроксимации, приближающей эту неподвижную точку снизу. Таким образом, мы можем начинать следующий итеративный процесс с Ql0 = Cftf = tQ\ вместо Q^0 = False. Когда мы вычислим неподвижную точку Qjw, мы сможем, определив значение 0i(Qi>Q2W)) вычислить и новую аппроксимацию для Q\, которую обозначим Q\. Ql = дЖЯ?). Зная, что Q\ С Q\, мы снова отсюда заключаем, что r(Q\) С r(Qf). Но поскольку значение внутренней неподвижной точки, вычисленное в последний раз, имело вид t(Q{) = Q\w, можно заключить, что неподвижная точка, которая будет вычислена в следующий раз, определится соотношением t(Q\) = Q^- И вновь мы можем начать итеративный процесс со всякой аппроксимации, которую охватывает неподвижная точка. Поэтому для вычисления Q\w мы начинаем с Qi° = Q}f — T(Q\)- А в общем случае вычисление Q^ всегда начинается с QjP = Q% . Поскольку мы никогда не начинаем вычисление внутренней неподвижной точки заново, величина переменной, соответствующей внутренней неподвижной точке, может претерпеть не более п увеличений. В общем и целом нам необходимо не 0(п2), а всего лишь 0(п) итераций, чтобы вычислить это выражение. Подведем итог: рассмотренный тип упрощения приводит к алгоритму оценки значений формул неподвижной точки за время, зависящее экспоненциально от глубины чередования для формулы, поскольку нам приходится начинать заново вычисление внутренней неподвижной точки только в том случае, когда происходит чередование типов неподвижных точек в формуле. Предположим, что формула / имеет N подформул неподвижной точки. В алгоритме используется массив A[l ...N] для хранения аппроксимаций неподвижных точек. Первоначально в А[г] заносится False, если i-я формула неподвижной точки относится к типу наименьших неподвижных точек, и True в противном случае. Этот алгоритм представлен на рис. 7.2. В тех случаях, когда главный оператор подформулы не является оператором неподвижной точки, этот алгоритм ничем не отличается от простого алгоритма (см. рис. 7.1). Но в отличие от этого простого алгоритма приближенные значения A[i] не начинают вычисляться заново, когда оценивается подформула fiQi. g(Qi) (или vQi. g{Qi))- Вместо этого все переменные наи-
7.3. Вычисление значений формул неподвижной точки 1. function eval(/, е) 2. if / = р then return {s | p € L(a)}; 3. if / = Q then return e(Q); 4. if / = Л Л 02 then 5. return eval(<7i,e)neval(<72!e); 6. if / = gi V да then 7. return eval@i,e)Ueval@2)e); 8. if / = {a)g then 9. return {л I 3t[s A ? and t € eval@,e)]}; 10. if / = [a)g then 11. return {« | V*[e Л ? implies t 6 eval@,e)]}; 12. if f = fiQi.g(Qi) then 13. forall подформул наибольшей неподвижной точки 14. vQj. g'(Qj) верхнего уровня у формулы д 15. do Л[>]:=Гг«е; 16. repeat 17. Qoid := Щ; 18. ЛИ := enUgrfQi +- ЛИ]); 19. until A[»]=QoW; 20. return A[i\; 21. end if 22. if f = vQ.g(Q) then 23. forall подформул наименьшей неподвижной точки 24. fiQj . g'[Qj) верхнего уровня у формулы д 25. do A\j]:=False; 26. repeat 27. Qold := ЛИ; 28. ЛИ := eva%e[Qi <- ЛИ]); 29. untU ЛН=0ом; 30. return ЛИ; 31. end if 32. end function Рис. 7.2. Алгоритм Эмерсона и Ли
152 Глава 7. Верификация моделей для ^-исчисления большей (наименьшей) неподвижной точки верхнего уровня, содержащиеся в д, устанавливаются в свое первоначальное значение True (соответственно False). Это гарантирует, что при вычислении оценки подформулы неподвижной точки верхнего уровня, имеющей тот же самый тип, нам придется начинать не с False или True, а с ранее вычисленного значения, как это было показано в нашем примере. Чтобы понять, почему выполнение алгоритма Эмерсона-Ли требует 0((|/| -n)d) итераций, заметим прежде всего, что размер формулы |/| служит верхней границей числа последовательно вложенных неподвижных точек одного и того же типа в формуле /. Так как мы никогда не начинаем заново вычисление внутренней неподвижной точки при уточнении новой аппроксимации для объемлющей неподвижной точки того же самого типа, число итераций для каждой такой последовательности будет оцениваться величиной 0(\f\ -п) вместо ?>(п), как это было для безыскусного алгоритма. Вычисление перезапускается на границе, разделяющей две последовательности вложенных неподвижных точек разного типа. Значит, в случае, когда имеются d чередующихся последовательностей, нам потребуется совокупно 0((|/| • n)d) итераций. В [176] были рассмотрены формулы со строгим чередованием операторов наименьшей и наибольшей неподвижной точки. Было показано, что если сохранять в памяти еще больше промежуточных значений, то временная сложность вычисления значений формул неподвижной точки может быть уменьшена до 0(п^2'+1), где d, как и прежде, обозначает глубину чередований, а сомножитель |/| просто заменен на 1. 7.4. Представление формул пропозиционального /i-исчисления при помощи OBDD В этом разделе мы расскажем о том, как использовать OBDD в алгоритмах проверки на модели, описанных ранее. Сначала мы покажем, как можно при помощи OBDD описать систему переходов М = (S,T,L). Этот способ описания во многом похож на аналогичный способ описания моделей Крипке, который был представлен в разд. 5.2. Состояния множества 5 кодируются посредством п булевых переменных ц,...,хп, то есть S становится пространством булевых векторов длины п. Каждая переменная х< получает штрихованного напарника х\. Вместо записи х\,...,хп мы будем порой
7.4. Представление формул /х-исчисления 153 использовать обозначение х. Если задана некоторая интерпретация, то мы будем строить OBDD, соответствующую замкнутой формуле /i-исчисления, руководствуясь следующей схемой: ¦ Каждому атомарному высказыванию р сопоставляется OBDD, которая обозначается OBDDp(a?) и полностью характеризуется следующим свойством: OBDDp(x) выполняется на наборе у € {0,1}п тогда и только тогда, когда у € L(p). ¦ Каждому переходу о сопоставляется OBDDa(x,x'). Для произвольной пары векторов (у, 2) G {0,1}2п диаграмма OBDDa выполняется на этой паре тогда и только тогда, когда (у, г) € а. Теперь перейдем к описанию трансляции формул в OBDD. Допустим, что мы располагаем формулой /i-исчисления, зависящей от свободных реляционных переменных Qi,--.,Qk- Функция assoc[Qj] используется для задания OBDD, соответствующей множеству состояний, ассоциированному с Q*. Запись assoc[Q «- Bq\ будет означать, что вводится новая реляционная переменная Q, значение которой определяется OBDD Bq. Иными словами, assoc следует воспринимать как окружение, представленное посредством OBDD. Описанная ниже процедура В по заданной формуле /i-исчисления / и списку ассоциированных множеств assoc, который сопоставляет OBDD каждой свободной реляционной переменной из /, строит OBDD, полностью характеризующую семантику формулы /: ¦ В(р, assoc) = OBDDp(f); ¦ В (Qi, assoc) = assoc[<5<]; ¦ B(-if, assoc) = B(f, assoc); ¦ B(f A g, assoc) = B(f, assoc) Л B(g,assoc); ¦ B(f V g, assoc) = B(f,assoc) V B(g, assoc); ¦ B«o)/,assoc) = Bx'iOBDDaix,!1) AB(/,assoc)(f), где B(f, assoc) (f) — OBDD, в которой каждая переменная Xi заменена штрихованным напарником х[; ¦ B([a]f, assoc) = B(->{a)~>f, assoc), здесь используется двойственность [а] и (а); • B(nQ. /, assoc) = FIX(f, assoc, FALSE - BDD); ¦ B(vQ. /, assoc) = FIX(f, assoc, TRUE - BDD). OBDD для булевых функций False и True обозначены FALSE- BDD и TRUE-BDD соответственно. Нужно обратить внимание на то, что в двух последних правилах формула / имеет дополнительную свободную реляционную переменную Q. Описание функции FIX 10 Зак. 271
154 Глава 7. Верификация моделей для /i-исчисления function FIX(f, assoc, Bq) result_bdd := Bq; repeat old_bdd := result_bdd; result_bdd := B(f, aasoc(Q 4- old_bdd)); until (equal(old_bdd,result_bdd)); return (result _ bdd); end function Рис. 7.3. Алгоритм вычисления функции FIX приведено на рис. 7.3. Процедура ее вычисления напоминает описанные в разд. 6.1 процедуры Lfp и Gfp. Рассмотрим пример, который иллюстрирует описанный метод. Предположим, что пространство состояний S закодировано при помощи п булевых переменных xi,.. .,хп. Рассмотрим формулу f = fxZ.((qAY)V(a)Z). Нужно учесть, что переменная Y свободна в /. Пусть OBDD, (л?) задает интерпретацию для q, a OBDDa(x,x') описывает переход а. Предположим также, что у нас есть список assoc, связывающий переменную Y с OBDD Ву(х)- В процедуре FIX начальное значение OBDD result-bdd устанавливают: №(х) = FALSE - BDD. Пусть N% — значение result-bdd в начале i-й итерации цикла функции FIX. В конце итерации значение result-bdd будет иметь вид Ni+1{x) = (OBDD,(f) Л Ву(?)) V 3?(OBDDe(f,?) Л #<(*)). Итерации прекращают, когда выполнится условие N*(S) = N%+1(x"). 7.5. Трансляция CTL в /^-исчисление Опишем трансляцию CTL в пропозициональное /z-исчисление. Алгоритм Тг берет на входе формулу CTL и выдает эквивалентную ей формулу ^-исчисления с единственным переходом а: ¦ Тг(р)=р; • ТгЫ) = -,Тг(/); •Tr{fAg)=Tr(f)ATr{g); -Tr(EX/) = (o>Tr(/);
7.6. Вопросы сложности 155 - Гг(Е[/ U д]) = ixY. (Тг{д) V (Tr(f) Л (a)Y)); - 7Y(EG f) = vY. (Tr(f) Л {a)Y. Обращаем внимание на то, что все формулы ^-исчисления получились замкнутыми. Поэтому окружение е при трансляции не используется. Так, например, TV(EG (Е[/ U д])) дает в качестве результата следующую формулу /{-исчисления uY. (jjlZ . (q V (р Л (a)Z)) Л (о)У). Обозначим через [/]м множество состояний, на которых выполняется /. При помощи тех методов, которые были рассмотрены в разд. 6.1, не составляет труда доказать следующую теорему Теорема 6. Пусть задана модель Крипке М = E, Т, L) и формула / логики CTL. Предположим, что переход а в алгоритме трансляции Тг — это отношение Т в модели Крипке. Тогда для любого состояния s 6 S имет место равносильность M,s\=f & ве\Гг(/)]м. 7.6. Вопросы сложности Один мз наиболее важных вопросов о сложности верификации моделей для ^-исчисления все еще остается открытым. Наиболее эффективные алгоритмы решения этой задачи, насколько нам известно, имеют экспоненциальную сложность относительно глубины чередования для формулы. Мы склоняемся к предположению, что полиномиальных алгоритмов решения проблемы проверки выполнимости формул /i-исчисления на конечных моделях не существует. Можно показать, что эта проблема содержится в классе NP П co-NP B2,112, 176]. Если бы она была NP-полной, то класс NP оказался бы равным co-NP, что представляется малоправдоподобным. Это говорит о том, насколько трудно было бы доказать наше предположение. Для того чтобы убедиться в том, что задача проверки выполнимости формул ^-исчисления на конечных моделях содержится в классе NP П co-NP, рассмотрим следующий недетерминированный алгоритм, который угадывает наибольшие неподвижные точки и вычисляет наименьшие неподвижные точки при помощи итеративной процедуры, начиная с наиболее глубоко вложенных операторов. Выбрав наугад значение для наибольшей неподвижной точки, можно легко проверить, является ли это значение действительно неподвижной точкой. Кроме того, хоть мы и не можем убедиться в том, что ю*
156 Глава 7. Верификация моделей для ^-исчисления эта неподвижная точка наибольшая, но мы знаем, что наибольшая неподвижная точка должна включать в себя и неподвижную точку, выбранную наугад. Вследствие монотонности окончательное значение, которое будет вычислено этим недетерминированным алгоритмом, будет подмножеством правильной интерпретации анализируемой формулы. Более того, хотя бы одно из вычислений такого алгоритма даст в качестве результата все множество тех состояний, на которых выполняется наша формула ^-исчисления. Значит, формула выполняется в состоянии s тогда и только тогда, когда оно содержится в множестве, которое строится в результате прогона нашего алгоритма. Следовательно, проблема верификации моделей для /z-исчисления лежит в классе NP. Поместив перед формулой связку отрицания, мы обнаружим, что сложность задачи проверки выполнимости формулы в некотором состоянии точно такая же, как и сложность задачи проверки невыполнимости этой формулы в том же состоянии. Следовательно, проблема верификации лежит в пересечении NP и co-NP.
Верификация моделей О на практике 8.1. Программа SMV верификации моделей Символьный верификатор моделей SMV (аббревиатура *Symbo- lic Model Verifier») [191] — это инструментальное средство, предназначенное для проверки того, что система переходов с конечным числом состояний удовлетворяет спецификации, заданной в CTL. В нем применяется описанный в разд. 6.2 символьный алгоритм верификации моделей, основанный на OBDD. Для описания сложных систем с конечным числом состояний используется специальный язык SMV. Отметим некоторые наиболее важные особенности этого языка. Модули. Пользователь может разбить описание сложной системы на отдельные модули. Одни и те же модули могут иметь по несколько экземпляров; модули могут содержать ссылки на переменные, объявленные в других модулях. В проектируемых системах с иерархической структурой для именования переменных используются стандартные правила видимости. Допустима параметризация модулей, причем в качестве параметров могут выступать компоненты состояний, выражения или другие модули. В модулях могут содержаться ограничения справедливости, которые представляют произвольные формулы логики CTL (см. разд. 6.3). Синхронная и интерливинговая композиция. Модули SMV могут быть скомопонованы либо синхронно, либо с использованием чередования. При синхронной композиции один шаг системы соответствует одному шагу каждого компонента. При чередовании одному шагу системы соответствует один шаг в точности одного компонента. Если экземпляру модуля предшествует ключевое слово procees, то используется чередование; в противном случае предполагается синхронная композиция. Недетерминированные переходи. В моделях могут быть как детерминированные, так и недетерминированные переходы. Недетерминизм может отражать реальный выбор в действиях моделируемой системы, но может быть использован и для сокрытия некоторых подробностей при описании более абстрактной модели. Во многих язы-
158 Глава 8. Верификация моделей на практике ках описания аппаратуры отсутствует возможность описания недетерминизма, однако, она играет ключевую роль при построении моделей высокого уровня абстракции. Отношение переходов. Отношения переходов модулей могут быть заданы либо явно в терминах булевых отношений, зависящих от переменных состояния в текущий и последующий моменты времени, либо неявно в виде множества операторов параллельного присваивания. Операторы параллельного присваивания определяют значения переменных в следующем состоянии в зависимости от их значений в текущем состоянии. Мы не будем приводить здесь формальное описание синтаксиса и семантики языка; оно представлено в диссертации МакМиллана [191]. Вместо этого рассмотрим простую программу взаимого исключения для двух процессов (см. рис. 8.1). Каждый процесс может пребывать в одной из трех секций кода: некритической, пороговой и критической. Первоначально оба процесса пребывают в своих некритических секциях. Цель программы — исключить возможность одновременного пребывания обоих процессов в своих критических секциях. Помимо этого потребуем, чтобы каждый процесс, стремящийся попасть в критическую секцию, рано или поздно сумел бы это сделать. Процесс показывает, что ему нужно попасть в критическую секцию, входя в пороговую секцию. Если один из процессов пребывает в своей пороговой секции, а другой — в некритической, то первый процесс может немедленно перейти в свою критическую секцию. Бели же оба процесса находятся в своих пороговых секциях, то для определения процесса, переходящего в критическую секцию, используется булева переменная turn. Если переменная turn имеет значение 0, то процесс 0 переходит в свою критическую секцию и изменяет значение turn на 1. Если переменная turn имеет значение 1, то процесс 1 переходит в свою критическую секцию и изменяет значение turn на 0. Вообще говоря, предполагается, что процесс обязан рано или поздно покинуть свою критическую секцию; при этом, однако, он может неограниченно долго пребывать в своей некритической секции. Чтобы ознакомиться с синтаксисом SMV более подробно, обратимся к программе, изображенной на рис. 8.1. Описание модуля начинается ключевым словом MODULE. Модуль main — это модуль верхнего уровня. Модуль pre имеет формальные параметры stateO, statel, turn и turnO. Объявление переменных начинается ключевым словом VAR. В нашем примере переменная turn — булева, тогда
8.1. Программа SMV верификации моделей 159 1 MODULE main -two process mutual exclusion program 2 VAR 3 sO: noncritical, trying, critical; 4 si: noncritical, trying, critical; 5 turn: boolean; 6 prO: process prc(sO, si, turn, 0); 7 prl: process pre(si, sO, turn, 1); 8 ASSIGN 9 init(turn) := 0; 10 FAIRNESS !(s0 = critical) 11 FAIRNESS Ksl = critical) 12 SPEC EF((sO = critical) ft (si = critical)) 13 SPEC AG(sO = trying -> AF(sO = critical)) 14 SPEC AG(sl = trying -> AF(sl = critical)) 15 SPEC AG(sO = critical -> A[(sO = critical) U 16 (!(s0 = critical) ft !E[!(sl = critical) U 17 (sO = critical)])]) 18 SPEC AG(sl = critical -> A[(sl = critical) U 19 (Ksl = critical ft !E[!(sO = critical) 0 20 (si = critical)])]) 21 MODULE prc(stateO, statel, turn, turnO) 22 ASSIGN 23 init(stateO) := noncritical; 24 next(stateO) := 25 case 26 (stateO = noncritical) : trying, noncritical; 27 (stateO = trying) ft 28 (statel = noncritical) : critical; 29 (stateO = trying) ft (statel = trying) ft 30 (turn = turnO) : critical; 31 (stateO - critical) : critical, noncritical; 32 1: stateO; 33 esac; 34 next(turn) := 35 case 36 (turn = turnO) ft (stateO = critical) : (turn; 37 1: turn; 38 esac; 39 FAIRNESS running Рис. 8.1. SMV-программа 2-х процессов с взаимоисключающим доступом.
160 Глава 8. Верификация моделей на практике как s0 и si могут принимать любое из трех значений: nc-ncritical, trying или critical. Как свидетельствуют строки 6 и 7, оператор VAR может быть использован также и для включения экземпляров других модулей. В нашем примере модуль pre имеет два экземпля- ря: один из них с именем ргО, а другой — prl. Поскольку в обоих случаях использовалось ключевое слово process, вычисления глобальной модели строятся путем чередования шагов вычислений ргО и prl. Оператор ASSIGN используется для задания начальных состояний и переходов модели. В нашем примере начальное значение булевой переменной turn равно 0. Значение переменной stateO в следующем состоянии определяет оператор case в строках 25-33. Значение turn в следующем состоянии определяет оператор case в строках 35-38. Значение оператора case определяется последовательным вычислением предложений внутри оператора. Каждое предложение состоит из условия и выражения, разделенных двоеточием. Если условие первого предложения истинно, то значение соответствующего выражения определяет значение оператора case. В противном случае вычисляется следующее предложение. Выражением может быть множество значений (см. строки 26 и 31). Когда такое множество присваивается переменной, ее значение недетерминированно выбирается из этого множества. Ограничения справедливости задают операторы FAIRNESS. Использование высказывания running в ограничениях справедливости модуля pre ограничивает рассматриваемые вычисления только теми, в которых каждый экземпляр данного модуля pre исполняется бесконечно часто. Без введения дополнительных ограничений недетерминированный выбор в строке 31 позволит процессу все время оставаться в критической секции. Эту возможность предотвращают также ограничения в строках 10 и 11. Оператор SPEC представляет в виде формул CTL те свойства программы, которые нуждаются в проверке. Первая спецификация (строка 12) контролирует нарушения взаимного исключения. Вторая и третья спецификации (строки 13 и 14) контролируют неизбежность перехода процесса в критическую секцию, если процесс стремится туда попасть. Две последние спецификации (строки 15 и 18) контролируют строгую очередность переходов процессов в свои критические секции. Это означает, что после того как процесс покидает свою критическую секцию, он не способен войти в нее до тех пор, пока другой процесс не побывает в своей критической секции.
8.1. Программа SMV верификации моделей 161 - specification EF(sO = critical к si = critical) is false - specification AG(sO = trying -> AF(sO = critical)) is true - specification AG(si = trying -> AF (si = critical)) is true - specification AG(sO = critical -> A( ... is false - specification AG(sl = critical -> A( ... is false resources used: user time: 1.15 s, system time: 0.3 s BDD nodes allocated: 2405 BDD nodes representing transition relation: 56+1 Рис. 8.2. Результат применения SMV к программе взаимоисключающего доступа Когда вычисление SMV проводится по программе, изображенной на рис. 8.1, мы получаем результат, представленный на рис. 8.2. Заметим, что свойство взаимного исключения не нарушается, и при этом гарантируется отсутствие удушения. Поскольку две последние спецификации оказались ложными, строгое чередование входов в критические секции не является необходимым. Для этих двух спецификаций SMV выдает также пути вычислений, которые служат контрпримерами. Один из контпримеров приведен на рис. 8.3. Он показывает, что процесс 0 может войти в свою критическую секцию несколько раз подряд, не допуская при этом входа процесса 1 в его критическую секцию. Вычислительный путь описан в виде последовательности изменений значений переменных состояния. Поэтому если переменная состояния не упомянута в некотором состоянии вычисления, то это означает, что она не изменяла свое значение. Хотя первая спецификация является ложной, никакого контрпримера порождено не было. Ведь отрицание перед квантором существования превращает его в квантор всеобщности. Поэтому никакой отдельный путь вычисления не может здесь служить контрпримером.
162 Глава 8. Верификация моделей на практике - specification AG(sO = critical -> А( ... is false - as demonstrated by the following execution sequence state 2.1: sO = noncritical si = noncritical turn = 0 state 2.2: [execution process prO] state 2.3: [execution process prO] sO = trying state 2.4: sO = critical state 2.5: [execution process prO] state 2.6: sO = noncritical turn = 1 state 2.7: [execution process prO] state 2.8: [execution process prO] sO = trying state 2.9 sO = critical Рис. 8.3. Результат применения SMV к программе взаимоисключаиющего доступа 8.2. Пример из практики В этом разделе коротко описаны формализация и верификация протокола когерентности кеш-памяти, используемого в проекте стандарта IEEE Futurebus+ [147]. Сначала точная модель протокола была описана на языке SMV, а затем был применен метод верификации модели для демонстрации того, что она удовлетворяет формальной спецификации когерентности кеш-памяти. По ходу формализации и верификации был обнаружен целый ряд ошибок и неточностей. Впервые формальные методы были использованы для обнаружения нетривиальных ошибок в предложенном стандарте IEEE. В результате выполнения этого проекта была получена сравнительно небольшая, удобочитаемая, не допускающая неточных истолкований модель протокола когерентности кеш-памяти. Этот опыт свидетель-
8.2. Пример из практики 163 ствует о том, что язык описания аппаратуры и методы верификации модели могут быть полезным подспорьем при проектировании реальных промышленных стандартов. Для более подробного ознакомления с этим примером читателю следует обратиться к работе [66], которая посвящена исключительно этой теме. Futurebus-\— это архитектура шины для высокопроизводительных компьютеров. Комитет, разработавший Futurebus+, преследовал цель создать общедоступный стандарт протокола шины, который не был бы привязан к характеристикам отдельного процессора или технологии какого-то устройства и мог быть востребован и реализован широким кругом производителей. Протокол когерентности кеш-памяти, используемый в Futurebus+, необходим для обеспечения согласованности данных в иерархических системах, образованных из многих процессоров и устройств кеш-памяти, взаимосвязанных многочисленными сегментами шины. Подобные протоколы устроены очень сложно, и поэтому весьма трудны для отладки. Кстати говоря, FuturebusH это первый стандарт шины, для которого учитывалась такая особенность. Прежние попытки обосновать правильность этого протокола основывались исключительно на неформальных методах [101]. В частности, не было предпринято никаких попыток специфицировать формально весь протокол или проанализировать его при помощи автоматических систем верификации. Главная часть проекта предусматривала разработку формальной модели протокола когерентности кеш-памяти на языке SMV и формирование CTL-спецификаций его корректности на основе текста описания этого протокола в рассматриваемом стандарте. Описание модели протокола когерентности кеш-памяти на языке SMV содержит 2300 строк, не считая комментариев. Модель оказалсь в ыс- шей степени недетерминированной; это было обусловлено стремлением понизить сложность верификации путем избавления от излишних подробностей и сохранить заложенные в протоколе возможности произвольного выбора для проектировщика (в стандарте они обозначены словом may (можете)). При помощи SMV в иерархическом протоколе удалось обнаружить несколько потенциальных ошибок. Наибольшая конфигурация, которую удалось верифицировать, была образована из трех сегментов шины и восьми процессоров; она имела более 1030 состояний. В протоколе FuturebusH- когерентность поддерживается за счет того, что отдельные кеш-памяти подслушивают, или отслеживают, все транзакции на шине. Когерентность между шинами поддержива-
164 Глава 8. Верификация моделей на практике Р1 Р2 М Рис. 8.4. Система с одиночной шиной ется мостами. Специальные агенты на концах мостов выступают в роли представителей удаленных кеш-памятей и устройств основной памяти. Для повышения производительности в протоколе используются разделяемые транзакции. Когда происходит разделение транзакции, ее завершение задерживается, а шина освобождается; в последующем вырабатывается определенная реакция, приводящая эту транзакцию к завершению. Эта возможность позволяет обслуживать локальные запросы во время обработки удаленных запросов. Чтобы показать, как функционирует протокол, мы рассмотрим пример транзакций для одной кеш-строки в двухпроцессорной системе, изображенной на рис. 8.4. Кеш-строка — это последовательность ячеек основной памяти, которые в целях когерентности воспринимаются как единое устройство. Первоначально ни у одного процессора нет копии этой строки в кеш-памяти: как говорят в таком случае, они пребывают в освобожденном состоянии. Чтобы получить разделяемую для чтения копию данных из основной памяти М, процессор Р1 запускает транзакцию read-shared. Процессор Р2 подслушивает эту транзакцию и может в случае необходимости также получить разделяемую для чтения копию данных; это называется захват данных. Если Р2 захватывает данные, то по завершении этой транзакции кеш-памяти обоих процессоров будут содержать разделяемые немодифицированные копии данных. Затем Р1 принимает решение записать в ячейку кеш-строки. Для поддержки когерентности копия данных, хранимая процессором Р2, должна быть аннулирована. Процессор Р1 запускает на шине транзакцию invalidate.
8.2. Пример из практики 165 Р2 Шина 2 МА Р1 СА Р1 1 РЗ Р2 МА СА Шина 2 Шина 1 Шина! М М Рис. 8.5. Система с двумя шинами Рис. 8.6. Иерархическая система Как только Р2 подслушает эту транзакцию, он сразу удаляет эту строку из своей кеш-памяти. По завершении транзакции invalidate процессор Р1 будет обладать уникальной модифицированной копией данных. Стандарт определяет все возможные состояния кеш-строки для каждого процессора, а также спецификацию этих состояний на протяжении всякой допустимой транзакции. Чтобы продемонстрировать работу протокола в иерархической системе, мы обратимся к примеру системы с двумя шинами, изображенной на рис. 8.5. Первоначально кеш-памяти обоих процессов пребывают в освобожденном состоянии. Если процессор Р2 запустит транзакцию read-modified для получения перезаписываемой копии данных, то агент основной памяти МА на шине 2 разделяет транзакцию, поскольку он должен сперва извлечь данные из памяти на шине 1. Команда передается агенту кеш-памяти СА, и СА запускает транзакцию read-modified на шине 1. Память М поставляет данные агенту СА, который, в свою очередь, переправляет их агенту МА.
166 Глава 8. Верификация моделей на практике Агент основной памяти МА запускает транзакцию modified-response на шине 2, чтобы завершить первоначальную разделенную транзакцию. Предположим, что Р1 запускает команду read-shared на шине 1. Агент СА, зная о том, что удаленная кеш-память владеет уникальной модифицированной копией, вмешивается в эту транзакцию, чтобы заявить о том, что он собирается извлекать данные, и разделяет указанную транзакцию так, чтобы извлечь данные из удаленной кеш-памяти. Агент СА переправляет команду read-shared агенту МА, который запускает ее на шине 2. Процессор Р2 вмешивается и поставляет данные агенту МА, который переправляет их агенту СА. Агент кеш-памяти выполняет транзакцию shared-response, которая и завершает исходную транзакцию read-shared, запущенную процессором Р1. Стандарт содержит описание иерархического протокола на английском языке, но в нем не уточняется взаимодействие между агентом кеш-памяти и агентом основной памяти. В описании стандарта [147] есть два раздела, касающиеся протокола когерентности кеш-памяти. Первый раздел содержит неформализованное доходчивое описание на английском языке того, как функционирует протокол; это описание, однако, не охватывает всех сценариев его поведения. В втором разделе представлена спецификация, которая собственно и считается настоящим стандартом. Спецификация записана при помощи булевых аттрибутов. По существу, булев аттрибут представляет собой булеву переменную вместе с набором правил изменения ее значений. Аттрибуты гораздо более точны, но трудны для чтения. Для описания поведения отдельной кеш-памяти или устройства основной памяти требуется около трехсот аттрибутов, сорок пять из которых относятся к обеспечению когерентности кеш-памяти. Для того чтобы осуществить верификацию, нам потребовалось применить ряд абстракций. Во-первых, пришлось опустить описание ряда мелких подробностей, касающихся обмена данными между отдельными модулями. Наиболее существенным упрощением было использование такой модели, в которой один шаг вычисления соот- ветствовует одной транзакции на одной из шин системы. Это позволило нам избавиться от всех процедур установления соединения, необходимых для запуска команды. Другой пример касается аттри- бута шины. Стандарт шины Futurebu8+ определяет две разные схемы арбитража, но для верификации использовалась модель, в кото-
8.2. Пример из практики 167 рой bus-master процесс1 определяется абсолютно недетерминированно. Помимо всего прочего в стандарте содержится описание поведения модели во внештатных ситуациях, таких как ошибка четности при передаче данных по шине. Однако такого рода условия мы не рассматривали. Упрощения второго типа применялись для уменьшения размера некоторых фрагментов системы. Например, рассматривались только транзакции с одиночной кеш-строкой. Этого вполне достаточно, поскольку транзакции, в которых задействована одна кеш-строка, не влияют на транзакции, в которых задействована другая кеш-строка. К тому же объем данных в каждой кеш-строке был сведен к одному биту. Упрощения третьего типа предусматривали удаление команд read-invalid и write-invalid. Эти команды используются в DMA для передачи данных в основную память и из нее. Протокол не гарантирует когерентность для кеш-строки, когда к этой строке применяется транзакция tvrite-invalid. Последний тип абстракций предусматривал введение недетрми- низма для упрощения моделей некоторых компонентов. Например, предполагалось, что процессоры запускают запросы на считывание и запись для заданной кеш-строки недетерминированно. Предполагалось также, что отклик при разделенной транзакции может поступать с произвольной задержкой. И наконец, модель моста между шинами является совершенно недетерминированной. На рис. 8.7 и 8.8 изображена часть SMV-программы, моделирующей кеш-памяти процессоров. Она определяет, как изменяется состояние кеш-строки. Компоненты состояний с именами из заглавных букв (CMD.SR.TF) обозначают сигналы шины, которые может видеть кеш-память, а компоненты с именами из прописных букв (state, tf) — объекты под управлением кеш-памяти. Первая часть кода (строки 3-14) определяет, что происходит в цикле холостого ожидания (CMD=none). Бели кеш-память содержит разделяемую немодифи- цированную копию строки, то эта строка может быть недетерминированно удалена из кеш-памяти, и предотвратить это может только особый запрос, который потребует считать эту строку уникальной модифицированной. Бели кеш-память содержит уникальную немо- дифицированную копию строки, то она может либо удалить эту строку, либо изменить ее статус на уникальный модифицированный. bus-master процесс — это процесс, которому разрешается захватить шину в текущем цикле арбитража.— Прим. ред.
168 Глава 8. Верификация моделей на практике 1 next(state) := 2 case 3 CMD=none: 4 case 5 state=shared-unmodified: 6 case 7 request=exclusive: shared-unmodified; 8 invalid, shared-unmodified; 9 esac; 10 state=exclusive-unmodified: invalid, 11 shared-unmodified, exclusive-unmodified, 12 exclusive-modified; 13 1: state; 14 esac; 15 ... 16 master: 17 case 18 CMD=read-shared: - Cache issues a read-shared 19 case 20 state=invalid 21 case 22 !SR к !TR: exclusive-unmodified; 23 !SR: shared-unmodified; 24 1: invalid; 25 esac; 26 ... 27 esac; 28 ... 29 esac; 30 ... Рис. 8.7. Фрагмент описания модели кеш-памяти процессора Вторая часть кода (строки 16-27) показывает, как изменяется состояние кеш-строки, когда кеш-память запускает транзакцию read- shared (master и CHD=read-shared). Это может случиться только в том случае, когда кеш-память не содержит косий этой строки. Бели транзакция не была разделена (!SR), то данные будут доставлены в кеш-память. При этом либо никакая другая кеш-память не захватит
8.2. Пример из практики 169 31 CMD=read-shared: - Cache observes a read-shared 32 case 33 state in invalid, shared-unmodified: 34 case 35 !tf: invalid; 36 !SR: shared-modified; 37 1: state; 38 esac; 39 ... 40 esac; 41 ... 42 esac; Рис. 8.8. Фрагмент описания модели кеш-памяти процессора (продолжение) те же данные (!TF), и в таком случае наша кеш-память будет обладать уникальной немодифицированной копией, либо какая-то другая кеш-память сумеет захватить те же данные, и тогда каждГг из них будет обладать разделяемой немодифицированной копией. Бели же транзакцию разделяют, то кеш-строка остается аннулированной. Последний фрагмент кода (строки 31-40) говорит о том, как реагируют кеш-памяти, когда обнаруживают, что другая кеш-память запустила транзакцию read-shared. Если обнаружившая это кеш-память является освобожденной или у нее есть разделяемая немодифи- цированная копия, то она может показать, что ей не нужна копия этой строки, обнулив свой выход !tf. В таком случае кеш-строка становится освобожденной. Существует и другая возможность: кеш- память может установить tf и попытаться захватить эти данные. В этом случае, если транзакцию не разделяют (!SR), то кеш-память получает разделяемую немодифицированную копию. Во всех остальных случаях кеш-память остается в своем текущем состоянии. Далее мы обсудим спецификации, которые использовались для верификации рассматриваемого протокола. Очевидно, возможны и более исчерпывающие спецификации; в частности, мы пытались всего лишь описать, что такое когерентность кеш-памяти, а не то, как она достигется. Спецификации первого типа задают свойства, формулировка которых такова: если кеш-память обладает уникальной немодифицированной копией некоторой кеш-строки, то все другие
170 Глава 8. Верификация моделей на практике кеш-памяти не имеют копий этой строки. Эта спецификация включает формулу AG(pl.writable -+ -ip2.readable) для каждой пары кеш-памятей pi и р2. Здесь pl.tvritable — это макро-выражение (описанное в SMV при помощи оператора DEFINE); оно имеет значение «истина», когда р\ обладает уникальной немо- дифицированной копией данных. Подобным же образом, p2.readable имеет значение «истина», когда р2 не пребывает в освобожденном состоянии. Непротиворечивость определяется следующим требованием: если две кеш-памяти обладают копиями одной и той же кеш-строки, то они согласованы по данным в этой строке. AG(pl.readable Л p2.readable -> p.data = p2.data). Точно так же, если в основной памяти содержится актуальная копия некоторой строки, то любая кеш-память, располагающая копией этой строки, должна быть согласована с основной памятью по этим данным: AG(p.readableA-tm.memory-line-modi fied -* p.data = m.data). Переменная m.memory — line — modified обращается в ложь, когда в основной памяти находится актуальная копия кеш-строки. Последний класс свойств используется для проверки того, что кеш-память всегда может получить доступ к строке для считывания или записи: AG EF pleadable Л AG EF p.writable. В заключение мы расскажем о двух ошибках, которые были обнаружены при верификации протокола. Первая ошибка содержится в протоколе одиночной шины. Рассмотрим систему, изображенную на рис. 8.4. Стандарт не исключает следующего сценария ее поведения. Первоначально обе кеш-памяти освобождены. Процессор Р1 получает уникальную немодифицированную копию. Затем Р2 запускает транзакцию read-modified, которую Р1 разделяет, чтобы аннулировать у себя эту копию. Основная память М выдает копию кеш- строки процессору Р2, и тот становится обладателем разделяемой немодифицированной копии. В этот момент Р1, все еще располагающий уникальной немодифицированной копией, переходит в другое состояние: его копия становится уникальной модифицированной, и он осуществляет запись кеш-строки. Теперь Р1 и Р2 утрачивают согласованность по данным. Эту ошибку можно устранить, потребовав, чтобы Р1 делал свою копию разделяемой немодифицированной,
8.2. Пример из практики 171 как только он разделит транзакцию read-modified для аннулирования. Это изменение устраняет также ряд смежных ошибок. Вторая ошибка возникает в иерархической конфигурации, изображенной на рис. 8.6. Процессоры PI, Р2 и РЗ получают разделяемые немодифицированные копии кеш-строки. Процессор Р1 запускает транзакцию invalidate, которую разделяют процессор РЗ и агент основной памяти МА. Процессор РЗ также запускает транзакцию invalidate, которую разделяет агент кеш-памяти СА. Мост между шинами определяет, что возникает коллизия типа invalidate- invalidate, т. е. РЗ пытается перевести в освобожденное состояние процессор PI, а Р1 пытается перевести в освобожденное состояние процессор РЗ. Когда подобное событие случается, стандарт предписывает разрешать эту коллизию агенту основной памяти путем перевода Р1 в освобожденное состояние. Как только агент памяти попытается запустить для этой цели транзакцию invalidate, Р2 обнаружит, что для данной кеш-строки уже есть транзакция, пребывающая в процессе выполнения, и выставит на шине сигнал занятости. Агент памяти МА заметит это и получит статус requester-waiting (ожидающий заявитель). Бели модуль имеет такой статус, то, прежде чем повторить команду, он будет ожидать, пока не завершится ответная транзакция. Теперь Р2 завершает транзакцию invalidate и запускает транзакцию modified-response. Бе разделяет МА, поскольку РЗ все еще не освобожден. Однако агент МА по-прежнему сохраняет статус requester-waiting. На сей раз МА не будет запускать никаких команд, так как он ожидает сигнала завершения. Но такому сигналу взяться неоткуда. Взаимной блокировки можно избежать, заставив агент МА изменить статус requester-waiting, как только он увидит, что Р2 перешел в освобожденное состояние.
j- Верификация моделей У и теория автоматов В этой главе мы представим ряд основополагающих сведений из теории автоматов и продемонстрируем, как можно осуществить верификацию моделей в рамках этой теории. В частности, мы покажем, как преобразовать LTL-формулу в автомат. За счет этого можно построить альтернативный алгоритм проверки на модели для логики LTL, который может быть выполнен «на лету». При таком подходе проверяемое свойство определяет порядок построения графа переходов для моделируемой системы. Вследствие этого возникает возможность избежать построения больших фрагментов графа переходов. 9.1. Автоматы на конечных и бесконечных словах Конечный автомат представляет собой математическую модель устройства, объем памяти которого определяется постоянной величиной независимо от размера входных данных. Мы будем рассматривать конечные автоматы над конечными словами и конечные автоматы над бесконечными словами (их также называют ш-автома- тами). Говоря более строго, конечным автоматом (над конечными словами) Л называется пятерка (?, Q, Д, Q°, F), в которой ¦ ? — конечный алфавит, ¦ Q — конечное множество состоянии, ¦ ACQxSxQ — отношение переходов, ¦ Q0 Я Q — множество начальных состояний, ¦ F С Q — множество заключительных состоянии. Автомат может быть представлен в виде ориентированного графа с помеченными переходами; в этом графе состояния из множества Q играют роль вершин, а дуги заданы отношением А. Пример автомата приведен на рис. 9.1. Здесь ? = {a,b}, Q = {91,92}, Q° = {91} (каждое начальное состояние помечено входящей в него стрелкой), и F = {qi} (каждое заключительное состояние обведено двойным кружком).
9.1. Автоматы на конечных и бесконечных словах 173 а Ъ b Рис. 9.1. Конечный автомат Пусть задано некоторое слово (строка, последовательность) v из Е* длины \v\. Проходом автомата А на v назовем всякое такое отображение р: {0,1,..., |и|} »-> Q, что ¦ первое состояние является начальным, т. е. р@) 6 Q0, ¦ переход от i-ro состояния р(») к i + 1-му состоянию /i(t + 1) по прочтении t-й буквы v(i) согласуется с отношением переходов, т. е. для каждого 0 ^ i < \v\, выполняется условие (p(i),v(i),p(i+l)) € Д. Проход р автомата .4 на и соответствует пути в графе автомата из начального состояния р@) в состояние p(\v\), причем дуги, составляющие этот путь, помечены последовательно буквами слова v. Мы говорим, что v является входным словом для А или что А считывает v. Проход р на v называется допускающим, если он завершается в заключительном состоянии, т. е. p(\v\) € F. Автомат А допускает слово v тогда и только тогда, когда существует хотя бы один допускающий проход А на v. Например, автомат, изображенный на рис. 9.1, допускает слово aabba, поскольку есть проход через состояния gigigifcjfljgi. Язык ?(А), С(А) С Е*, автомата А состоит из всех слов, которые допускает А. Автомат, представленный на рис. 9.1, допускает язык, который описывается регулярным выражением е + (а + Ь)*а, т. е. состоит из пустого слова е, а также из всех слов, которые образованы из некоторого количества букв а и Ь и при этом оканчиваются буквой а. Оператор + обозначает выбор, а оператор * обозначает произвольное конечное число повторов. Поскольку большинство параллельных систем устроены так, что они не останавливаются в ходе нормального функционирования, мы моделируем вычисления бесконечными последовательностями состо-
174 Глава 9. Верификация моделей и теория автоматов яний. Поэтому в этой главе основное внимание будет уделено конечным автоматам над бесконечными словами. Такие автоматы устроены так же, как и конечные автоматы над конечными словами. Однако они распознают слова из ?ш; верхний индекс ш обозначает бесконечное число повторений. Простейшие автоматы над бесконечными словами — это автоматы Бюхи [39]. Автомат Бюхи состоит из тех же компонент, что и автомат над конечными словами. Однако состояния из множества F называются допускающими, а не заключительными. Проход автомата Бюхи Л на бесконечном слове v, v € Еы, определяется почти так же, как и проход конечного автомата на конечном слове, за исключением того, что |и| = ш. Таким образом, областью определения прохода служит все множество натуральных чисел. Проход соответствует пути в графе автомата, но теперь этот путь бесконечный. Обозначим через й»Др) множество состояний, встречающихся бесконечно часто в проходе р (когда проход трактуется как бесконечный путь). Проход р автомата Бюхи Л на бесконечном слове считается допускающим тогда и только тогда, когда inf{p)C[F ф 0, т. е. когда некоторое допускающее состояние появляется в р бесконечно часто. Структура, представленная на рис. 9.1, может быть истолкована как автомат Бюхи. В таком случае среди прочих слов он допускает слово (аЬ)ш, т. е. бесконечную последовательность чередующихся букв а и Ь, начинающуюся с а. Язык, который допускается этим автоматом, представляет собой множество слов, в которых имеется бесконечно много вхождений буквы а; этот язык может быть представлен w-регулярным выражением (Ь*а)ш. 9.2. Верификация моделей при помощи автоматов Конечные автоматы могут быть использованы для моделирования параллельных и взаимодействующих систем. При этом либо множество состояний Q, либо алфавит Е могут представлять состояния моделируемой системы. Одно из главных преимуществ применения автоматов для верификации моделей состоит в том, что и моделируемая система, и ее спецификация представлены одинаково. Модель Крипке соотносится непосредственно с w-регулярным автоматом, все состояния которого допускающие. В таком случае множество поведений системы М задается языком С(А) соответствующего
9.2. Верификация моделей при помощи автоматов 175 Модель Крипке Автомат Рис. 9.2. Преобразование модели Крипке в автомат автомата А. А именно, модель Крипке (S,R,S0,L), где L: S -+ 2АР, можно преобразовать в автомат А = {E,SU {t},A,{t},5U {t}), у которого Е = 2АР. Для каждой пары состояний а, У из S отношение переходов А содержит тройку (а, а, я') тогда и только тогда, когда {s,s') € R и а = L(s'). Кроме того, (t,a,s) € Д в том и только том случае, когда я € So и a = L(s). На рис. 9.2 приведен пример модели Крипке и соответствующего ей автомата. Спецификацию также можно представить в виде автомата S над тем же алфавитом. В таком случае C{S) задает множество допустимых поведений. Мы приведем несколько примеров свойств, выразимых посредством автоматов Бюхи. Свойства относятся к примеру взаимного исключения, изображенного на рис. 2.2. В таких примерах мы помечаем дуги булевыми выражениями, а не множествами высказываний из АР. Одна и та же дуга может соответствовать нескольким переходам; каждый из них определяется истинностной оценкой высказываний из АР, при котором выполняется указанное булево выражение. Например, когда АР = {X, Y, Z}, дуга, помеченная X V -Y, обозначает переходы, помеченные {X, Z} и {X} (т. е. множествами высказываний, которые обязательно содержат X, не содержат Y и могут включать или не включать Z).
176 Глава 9. Верификация моделей и теория автоматов (CRoACRi) -н(GЯо Л CRi) True Рис. 9.3. Свойство взаимного исключения ->CRo True Рис. 9.4. Свойство живости Множество атомарных высказываний АР в приведенных ниже примерах соответствует пометкам CRo и CR\ из примера системы взаимного исключения. Например, высказывание CRo выполняется в тех состояниях, в которых счетчик команд процесса Pq принимает значение CRo- На рис. 9.3 изображен автомат, задающий свойство, согласно которому два процесса не могут войти в их критическую секцию одновременно. В логике LTL эта спецификация выражается формулой пути G -i(CRo Л CR{). В примере взаимного исключения это свойство, очевидно, соблюдается. На рис. 9.4 изображен автомат, который специфицирует следующее свойство: процесс Ро рано или поздно входит в свою критическую секцию. В логике LTL оно выражается формулой пути F CRq. В примере нашей системы это свойство не соблюдается, так как вполне допустимо, что Ро никогда не сделает попытку войти в свою критическую секцию. ъ
9.2. Верификация моделей при помощи автоматов 177 Система Л удовлетворяет спецификации «S, если имеет место включение ?(Л) С C(S). (9.1) Иными словами, всякое поведение моделируемой системы относится к числу поведений, дозволенных спецификацией. Пусть ?(S) обозначает язык аш \ ?(S). Тогда (9.1) можно представить иначе в виде ?(Л) П C(S) = 0. (9.2) Это означает, что ни одно поведение системы Л не относится к числу недозволенных спецификацией S. Если же указанное пересечение непусто, то всякое поведение, содержащееся в нем, соответствует контрпримеру. Автоматы Бюхи замкнуты относительно операций пересечения и дополнения [39]. Это означает, что всегда найдется автомат, который в точности распознает пересечение языков двух других автоматов, а также автомат, распознающий в точности дополнение языка заданного автомата. Чуть позже мы покажем, как построить автомат, распознающий пересечение двух языков, допускаемых парой автоматов Бюхи. Подробное описание метода вычисления дополнения автомата Бюхи весьма замысловато. Необходимые для этой цели построения можно найти в работах [224, 232]. Формулировка критерия корректности (9.2) приводит к следующей процедуре верификации моделей. 1. Дополнить автомат S, т. е. построить автомат S, который распознает язык ?{S). 2. Построить автомат, распознающий пересечение ?(Л) и ?(S). Если пересечение пусто, то объявить, что спецификация S соблюдается для Л. В противном случае мы должны предъявить контрпример. Мы покажем далее, что бесконечное слово из пересечения можно представить используя конечные средства. А именно, контрпример можно представить в виде wP, где и и и — конечные слова. В некоторых реализациях наподобие SPIN [138, 140] предполагается, что сам пользователь сразу же представит автомат для дополнения «S, вместо того чтобы строить автомат для S. При таком подходе пользователь описывает плохие поведения вместо хороших. Другая возможность [160] состоит в том, чтобы использовать иные разновидности ш-регулярных автоматов, для которых дополнение получается достаточно просто. Наконец, автомат S можно получить, применяя трансляцию из некоторого языка спецификаций наподобие LTL. Тогда вместо тран-
178 Глава 9. Верификация моделей и теория автоматов сляции свойства у» в 5 и последующего дополнения автомата S мы можем просто транслировать -к/з, что приведет немедленно к автомату для дополнительного языка, как того требует (9.2). Впоследствии мы опишем эффективный метод трансляции из LTL в автоматы Бю- хи. Пусть Вх = <?,Qi,AuQ°i,Fi) и В2 = (Е,Q2) Д2, Q§,F2). Построим автомат, допускающий С{В\) Л С(В2), следующим образом: положим ВхГ)В2 = (Е,QixQ2x{О,1,2}, Д,CfixQ^x {0},QxxQ2x {2}). Здесь отношение перехода ((ri,qj,x),a,(rrn,qn,y)) G Д соблюдается в том и только том случае, когда выполнены следующие условия: ¦ (г,,а,гго) 6 Ai и (<Zj,a,g„) е Д2, т. е. локальные компоненты согласованы с отношениями переходов В\ и В2; ¦ третья компонента подчиняется условиям допущения автоматов Вх и В2: . если х = 0 и rm G Fx, то у = 1; . если х = 1 и qn € Fx, то у = 2; . если х = 2, то у = 0; . в остальных случаях у = х. Третья компонента призвана обеспечить бесконечно частое появление допускающих состояний обоих автоматов ВхиВ2. Следует иметь в виду, что не исключен случай, когда допускающие состояния обоих автоматов могут появляться совместно только конечное число раз, хотя по отдельности каждое из них появляется бесконечно часто. Поэтому мы не получим должного эффекта, просто полагая F = Fx xF2. Первоначально третья компонента равна 0. Она изменяет свое значение с 0 на 1, как только достигается допускающее состояние первого автомата. Ее значение изменяется с 1 на 2, как только достигается допускающее состояние второго автомата, а при переходе к следующему состоянию снова обращается в 0. Построенный автомат допускает слово в том и только том случае, когда встречаются бесконечно много состояний из Fx и бесконечно много состояний из F2. Пересечение автоматов, изображенных на рис. 9.5, представлено на рис. 9.6. На этом рисунке указаны только те состояния, которые достижимы из начального. Пересечение может быть получено более простым способом, когда все состояния одного из автоматов являются допускающими. Такое пересечение используется, например, в уравнении (9.2), поскольку все состояния автомата для моделируемой системы являются допускающими. Предположим, что все состояния автомата Вх
9.2. Верификация моделей при помощи автоматов 179 а ° Ъ Рис. 9.5. Автомат для слов с бесконечным количеством букв а (слева) и автомат для слов с бесконечным количеством букв b (справа) Рис. 9.6. Автомат для слов с бесконечным числом букв а и Ь допускающие, a F2 представляет множество допускающих состояний автомата Б2. Тогда их пересечение будет иметь следующий вид: В1ПВ2 = <?, Qi х д2,Д',<3? х Q°2,QX х F2). Допускающими состояниями автомата-пересечения служат пары из Qi х Ft, в которых вторая компонента является допускающим состоянием автомата В^. Кроме того, ({n,qj),a,(rm,qn)) € Д' тогда и только тогда, когда (г<,о,гот) б Ai и (g,,a,g„) е Да- l U л 13*
180 Глава 9. Верификация моделей и теория автоматов Общий алгоритм вычисления пересечения полезен для верификации систем с ограничениями справедливости. В таком случае некоторые состояния автомата Bi могут перестать быть допускающими. 9.2.1. Недетерминированные автоматы Бюхи Мы допускаем, что отношение переходов как у регулярных автоматов, так и у автоматов Бюхи может быть недетерминированным. Это означает, что возможны переходы (q,a,l), (q,a,V) G Д, для которых I ф V. Всякий недетерминированный автомат на конечных словах может быть преобразован в эквивалентный ему детерминированный автомат, допускающий тот же самый язык. Это можно сделать при помощи метода подмножеств. Для недетерминированного автомата М = (?, Q, Д, Q°, F) мы строим эквивалентный детерминированный автомат М' = (E,№,A',{Q°},F'), в котором Д' С 2Q х ? х 2° содержит тройки такие (Qi,a,Q2), что «2 = U,6QI{g'l(9,e,9,)eA}. Множеством F' заключительных состояний автомата М' является множество {Q1 \ Q' С Q Л Q' П F ф 0}. Поскольку М' — детерминированный автомат, Д' можно представлять себе как функцию Д': 2° х Е -> 2Q. Каждое состояние автомата М' соответствует множеству состояний, которые могут быть достигнуты автоматом М по прочтении заданной входной последовательности. Таким образом, мы видим, что дополнение недетерминированного автомата над конечными словами можно построить, первоначально подвергнув его детерминизации методом подмножеств. После этого заключительные и незаключительные состояния меняются ролями. Однако для автоматов Бюхи положение дел совсем иное. Не всякий недетерминированный автомат Бюхи имеет эквивалентный ему детерминированный автомат. Язык, распознаваемый детерминированным автоматом Бюхи В, обладает следующим свойством для каждого слова v G Еы: если существует бесконечно много конечных префиксов слова и, на которых проходы автомата достигают допускающего состояния, то v принадлежит языку. Если автомат детерминированный, то проход определяется однозначно для каждого конечного префикса слова. Предположим, что имеется бесконечно много конечных префиксов v, на которых проходы достигают допускающих состояний. Тогда эти проходы служат началами единственного прохода автомата на v. По определению такой проход должен быть допускающим.
9.2. Верификация моделей при помощи автоматов 181 a,b Ь Рис. 9.7. Автомат для слов с конечным количеством букв а Рассмотрим автомат, изображенный на рис. 9.7. Он допускает язык бесконечных слов над алфавитом Е = {а, 6}, в которых есть лишь конечное число вхождений буквы а. Это недетерминированный автомат, и никакой детерминированный автомат не способен распознать этот язык. Если бы существовал детерминированный автомат, распознающий этот язык, он обязательно достигал бы некоторого допускающего состояния по прочтении конечной строки Ь для некоторого щ,П1 ^ 0. В противном случае слово ЬР не могло бы быть допущено. Начиная с этого состояния, автомат должен достичь некоторого допускающего состояния, прочитав Ьп,оЬ для некоторого пг, «2^0 (ибо иначе не допускается слово Ъ^аЬ"), и так далее. Таким образом, он должен допускать слово вида ЬП1оЬ"аа6Пз..., содержащее бесконечно много вхождений буквы о. Интересно отметить, что дополнение этого языка, т. е. язык бесконечных слов, содержащих бесконечно много вхождений а, распознается детерминированным автоматом Бюхи (он изображен слева на рис. 9.5). Значит, множество языков, допускаемых детерминированными автоматами Бюхи, не замкнуто относительно дополнения. 9.2.2. Обобщенные автоматы Бюхи Порой бывает удобно работать с автоматами Бюхи, у которых есть несколько множеств допускающих состояний, хотя это и не расширяет класс языков, которые могут быть выражены. Далее мы опишем трансляцию LTL-спецификаций в обобщенные автоматы Бюхи. Обобщенный автомат Бюхи наделен допускающей компонентой F С 2^. Проход р обобщенного автомата Бюхи считается до-
182 Глава 9. Верификация моделей и теория автоматов пускающим, если для каждого Pi € F выполняется соотношение тДр) П Pi ф 0. Заметим, что множественные ограничения справедливости для моделей Крипке из разд. 4.1.1 соответствуют понятию допускаемости применительно к обобщенным автоматам Бюхи. Переход от обобщенного автомата Бюхи В = (E,Q,A,Q°,F) к обычному автомату Бюхи весьма прост. Пусть F — {Pi,Ра» • • •. Рп}- Построим автомат В' = (E.Q х {0,...,n},A',Q° х {0},Q х {п}>. У этого автомата отношение переходов Д' устроено так, что включение ((q,x),a, (q',y)) 6 А' имеет место всякий раз, когда {q,a,q') € А, а х и у определены согласно следующим правилам: ¦ если q'€.PiHX = i-l, то у = t; ¦ если х = п, то у = 0; ¦ в остальных случаях х = у. Данное преобразование увеличивает размер автомата в я + 1 раз. Отметим также, что если множество F обобщенного автомата Бюхи пусто, то любое бесконечное слово допускается. 0.3. Проверка пустоты Проверить пустоту автомата Бюхи также просто. Пусть р — допускающий проход автомата Бюхи В = (S,Q, A,Q°,F). Тогда р содержит бесконечно много допускающих состояний из F. Поскольку множество Q конечно, найдется такой суффикс р' прохода р, что всякое состояние, содержащееся в нем, появляется бесконечно много раз. Каждое состояние из р' достижимо из всякого другого состояния, содержащегося в р'. Значит, состояния из р' входят в состав некоторой сильно связной компоненты. Эта компонента достижима из некоторого начального состояния и содержит допускающее состояние. И наоборот, любая сильно связная компонента, достижимая из начального состояния и содержащая допускающее состояние, порождает допускающее вычисление автомата. Таким образом, проверка пустоты языка С(В) равносильна поиску сильно связной компоненты, которая достижима из начального состояния и содержит допускающее состояние. Иначе говоря, язык С(В) непуст тогда и только тогда, когда имеется достижимое допускающее состояние, через которое проходит цикл. Ясно, что все вершины такого цикла должны содержаться в некоторой сильно связной компоненте. И наоборот, располагая сильно связной компонентой,
9-3. Проверка пустоты 183 содержащей допускающее состояние, всегда можно отыскать цикл, проходящий через это допускающее состояние. Смысл этого наблюдения состоит в том, что если язык С{В) непустой, то существует контрпример, который может быть представлен в конечной форме. Контпример — это проход, образованный конечным префиксом и периодической последовательностью состояний. В частности, этот подход применим в случае, когда В является пересечением автомата, представляющего проверяемую систему, и автомата, задающего дополнение спецификации, как описано в разд. 9.2. Алгоритм Тарьяна [237] поиска в глубину (DFS) для обнаружения сильно связных компонент может быть применен для решения проблемы пустоты автоматов Бюхи за время 0(|С?| + |Д|). Мы дадим описание альтернативного алгоритма [84, 141]. Этот алгоритм более эффективен на практике при решении этой проблемы. Алгоритм использует двойной DFS для поиска цикла с допускающим состоянием. Два поиска в глубину чередуются. Первый из них может запускать второй, а второй может либо завершить работу всего алгоритма, либо передать управление первому начиная с того места, где его выполнение было приостановлено. Когда первый DFS готов к откату из допускающего состояния после завершения обхода всех его последователей, запускается второй поиск, который ищет цикл, проходящий через это состояние. Если второй поиск не находит такого цикла, то первый поиск возобновляет работу с того места, где он был прерван. В алгоритме, представленном на рис. 9.8, мы помещаем состояние в хэш-таблицу, как только оно достигается первым DFS, и говорим, что данная вершина была хэширована. Для того, чтобы отметить, попадалось ли это состояние при некотором вызове второго DFS, применяется булев флаг. Если это состояние встречалось, то вершина называется помеченной. Для эффективной реализации каждое состояние в хэш-таблице сопровождается двумя битами, указывающими, было ли занесено это состояние в стек поиска первым или вторым DFS. В алгоритме используется команда terminate для прекращения выполнения всей программы и возврата значения. Когда алгоритм завершает работу со значением True, в качестве контрпримера пустоты выдается цикл, проходящий через достижимое допускающее состояние. Пусть q± — допускающее состояние, начиная с которого запускается второй DFS. Тогда стек первого DFS содержит путь из начального состояния в «ft. Этот путь слу-
184 Глава 9. Верификация моделей и теория автоматов procedure emptiness for all g0 € Q° do dfsl(q0); terminate(.Fa/se); end procedure procedure dfsl(q) local q'; hash(q); for all последователей q' вершины q do if д'не содержится в хэш-таблице then dfsl (q'); if accept(q) then dfs2(q); end procedure procedure dfs2(q) local q1; for all последователей q' вершины q do if q' в стеке dfsl then terminate(True); else if q1 не является помеченной then dfs2(q')', end if; end procedure Рис. 9.8. Алгоритм двойного DFS жит конечным префиксом контрпримера. Пусть qi — это состояние, на котором завершилась работа второго DFS. Периодическая часть строится следующим образом: стек второго DFS содержит путь из q\ в Q2, а само <fe содержится в стеке поиска первого DFS; тогда состояния, которые были помещены в стек первого DFS после </2, и завершают цикл, проходящий через </i. Корректность алгоритма Следующее хорошо известное свойство DFS существенно для доказательства корректности алгоритма. Лемма 23. Пусть q — вершина, не содержащаяся ни в одном цикле. Тогда алгоритм DFS откатывается из q только после того, как все вершины, достижимые из q, были исследованы и все откаты из них были завершены.
9.3. Проверка пустоты 185 Ф Рис. 9.9. Два случая теоремы 7 Нетрудно заметить, что лемма сохраняет справедливость применительно к первому DFS в алгоритме двойного DFS. Теорема 7. Алгоритм двойного двойного поиска в глубину (DFS) строит контрпример для проблемы пустоты проверяемого автомата В в том и только том случае, когда С(В) не пуст. Доказательство. Когда алгоритм двойного DFS возвращает в качестве результата путь в допускающее состояние и цикл, проходящий через это состояние, он образует контрпример для предположения о пустоте проверяемого автомата. Намного сложнее показать, что, когда алгоритм сообщает о пустоте С(В), этот язык действительно пуст. Обратим внимание на то, что второй DFS помечает флагом те состояния, которых он достиг уже, после того как первый DFS запустил его из предшествующих состояний. Предположим, что второй DFS был запущен из состояния q и при этом есть путь из q в некоторое состояние р, помещенное в стек поиска первого DFS. Тогда путь из q в р можно достроить до цикла, проходящего через q, добавив к нему состояния, находящиеся в стеке после р. Возможны следующие два случая. ¦ Существует путь из q в некоторое состояние, помещенное в стек поиска первого DFS, проходящий через состояния, которые не были помечены к тому моменту, когда второй DFS был запущен из q. В таком случае, как и ожидалось, второй DFS отыщет цикл. ¦ На каждом пути из q в какое-либо состояние стека поиска первого DFS имеется состояние г, которое уже было помечено ранее. В таком случае алгоритм не обнаружит цикла, проходящего через q. Мы покажем, что второй случай невозможен. Допустим противное. Тогда существует допускающее состояние, из которого второй DFS, будучи запущенным, никогда не сможет отыскать цикл несмотря на то, что таковой имеется. Пусть q — первое из подобных со- 12 Зак. 271
186 Глава 9. Верификация моделей и теория автоматов стояний. Обозначим символом г первое из помеченных состояний, расположенных в цикле, проходящем через q, которое достигается из q в ходе выполнения второго DFS. И наконец, пусть q1 обозначает допускающее состояние, из которого был запущен второй DFS, в ходе выполнения которого было помечено г. Тогда согласно нашим предположениям, второй DFS был запущен из q1 ранее, нежели он был запущен из q. Возможны следующие два варианта (см. рис. 9.9): 1. Состояние q1 достижимо из q. Тогда есть цикл q1 —> • • • -? -tr-*----*q-*----tql. Этот цикл ранее не мог быть обнаружен. В противном случае алгоритм уже был бы остановлен. Однако, это противоречит нашему предположению о том, что q является первым допускающим состоянием, выходя из которого второй DFS пропускает цикл. 2. Состояние q' недостижимо из q. Если q1 содержится в цикле, то этот цикл, вопреки нашему предположению, был пропущен еще до того, как второй DFS был запущен из q. Согласно нашему допущению состояние q достижимо из г. Значит состояние q достижимо из q'. Следовательно, если q' не содержится в цикле, то по лемме 23 мы должны были осуществить обход и откат из q при первом DFS, до того как совершили откат из q'. Тогда согласно описанию алгоритма двойного DFS мы должны были запустить второй DFS из q, прежде чем запустить его из q1. Но это противоречит нашему предположению о порядке осуществления второго DFS. ? 9.4. Трансляция LTL в автоматы В этом разделе мы представим алгоритм Герта, Пеледа, Варди и Волпера [124] трансляции формул пути логики LTL в обобщенные автоматы Бюхи. Этот алгоритм можно рассматривать как реализацию табличного метода для LTL. Для применения описанной далее процедуры мы должны сперва привести формулу <р в негативную нормальную форму, в которой отрицание применяется только к пропозициональным переменным. Вначале заменим подформулы вида Ftp на TrueU V>, а подформулы вида G ф на False R ф. Мы воспользуемся также булевыми тождествами, так чтобы в формуле остались только булевы операции and (Л), or (V) и not (->). В итоге отрицания «погружаются» вглубь при помощи тождеств LTL -<(fi\Jri) = (-i/i)R(-itj), -i(/iR»j) = (-i/i)U(-u;)
9.4. Трансляция LTL в автоматы 187 и чХг) = Х-47. Рассмотрим, например, формулу А\3 В -> FC. Мы выражаем импликацию через дизъюнкцию и получаем формулу -i(.AU i?)VF С'. Происшествие FС замещается на TrueUС, что приводит к формуле (-i(iUB)) V (True U С). В итоге мы «погружаем» отрицание вглубь и получаем ((-*А) R (-if?)) V (True U С). На протяжении всего этого раздела мы будем исходить из предположения, что формула <р уже находится в нормальной форме. Основная структура данных, используемая в рассматриваемом алгоритме, называется вершиной. Состояния автомата, который будет получен в результате, представлены вершинами. Вершина q имеет следующие поля: record node = [ID: NodelD, Incoming: NodelD list Old: Form list, New: Form list, Next: Form list); Поле ID — индивидуальный идентификатор вершины. Поле Incoming — список вершин-предшественников. Каждая вершина г из этого списка представляет дугу из г в q. Поля Old, New, Next — это списки подформул формулы (р. Говоря неформально, эти поля описывают темпоральные свойства суффиксов вычислений. Подформулы в этих полях содержат информацию о суффиксе ?' вычисления f, в том случае когда соблюдены следующие условия: на пути ?' выполняются все подформулы из обоих списков Old и New, а на пути f,+1 выполняются все подформулы из списка Next. Подформулы из Old уже были обработаны алгоритмом в текущей вершине, а подформулы из New еще ожидают своей очереди. Мы будем использовать символ •<= для присваивания значения полю вершины. Например, запись New <= {уз} обозначает присваивание одноэлементного множества, содержащего формулу <р, полю New текущей вершины. Мы заведем список Nodes для вершин, построение которых уже завершено. Эти вершины вместе со специальной вершиной, носящей имя init, образуют множество состояний построенного автомата. Вершина init позднее будет объявлена начальным состоянием автомата. Первоначально список Nodes полагается пустым. Алгоритм, приведенный ниже, использует функцию new_IDQ для выработки новых значений типа NodelD, всякий раз когда осуществляет ее вызов. Функция Neg определена следующим образом: Neg(A) = -пА, Neg(pA) = А для высказывания A, Neg{True) = False, Neg(Faise) = True. 12*
188 Глава 9. Верификация моделей и теория автоматов ID: nl Incoming: {init} New:{AV{BVC)} Old:0 Next: 0 расщепление ID:n2 Incoming: {init} New: {A} Old:{AU(B\JC)} Next: {AU (BUC)} ID-.nS Incoming: {init} New:{AVC} Old:{AU(BUC)} Next: 0 Рис. 9.10. Расщепление вершины Алгоритм трансляции формулы <р начинает работу, располагая единственной вершиной. Эта вершина имеет единственную входящую дугу из особой вершины init. Кроме того, для нее New = {ip} и Old = Next = 0: function create_graph((p) expand([ID •$= new_IDQ, Incoming •<= {init}, Old «= 0, New <= {(p}, Next*= 0], 0); end function Например, верхняя вершина на рис. 9.10 — как раз та самая вершина, с которой алгоритм начинает построение автомата для LTL- формулы AUВ -* FC. Рекурсивная функция expand строит таблицу. Она имеет два входных параметра — текущую вершину и список ранее построенных вершин, а возвращает в качестве результата модифицированный список вершин: function expand(q, Nodes)
9.4. Трансляция LTL в автоматы 189 ID: тЦ Incoming: {init} New: {A} Old:{A,AU(BVC)} Next:{AU(BUC)} создание вершины ID: n5 Incoming: {n4} New:{AV{BVC)} Old:0 Next: 0 Рис. 9.11. Создание новой вершины Для текущей вершины q алгоритм проверяет, является ли пустым ее поле New. Если это так, то алгоритм проверяет, нельзя ли добавить текущую вершину к списку Nodes. Если в списке Nodes есть вершина г, содержащая те же самые подформулы, что и вершина q, в обоих полях Old и Next, то поле Incoming вершины г изменяется следующим образом: список дут, входящих в q, добавляется к списку дуг, входящих в г. Если же таких вершин в списке Nodes нет, то q добавляется к вершинам Nodes и строится новая текущая вершина q' по следующим правилам: ¦ создается дуга из q в q', т. е. в поле Incoming вершины q1 заносится {q}; ¦ поле New вершины q' полагается равным Next(q); ¦ поля Old и Next вершины q1 полагаются пустыми. На рис. 9.11 изображена вершина q, которая помещается в список Nodes. Затем формируется новая вершина а4: if New(q) is empty then if there exists a node г in Nodes with Old(r) = Old(q) and Next(r) = Next(q) then Incoming{r) :— Incoming(r) U Incoming{q); return (Nodes); else expand([ID •*= new_IDQ, Incoming •<= {ID(q)}, Old <t= 0, New ¦*= Next(q), Next «= 0], Nodes U {q}) end if; В том случае, если поле New вершины q непусто, формула ij выбирается и удаляется из списка New. Если п уже содержится в
190 Глава 9. Верификация моделей и теория автоматов списке Old, то текущая вершина продолжает обрабатываться, но уже без формулы п в New: else /* New(q) is not empty */ let j/ 6 New(q); New(q) := New{d)\{q}; if n€Old(q) then expand (q, Nodes); Предположим теперь, что n не содержится в Old(q). Тогда в зависимости от главной операции формулы т], вершина q либо расщепляется на две части q^n 92 > либо замещается новым вариантом q'. Новые вершины формируются за счет выбора новых имен для этих вершин и копирования в них из q полей Incoming, Old, New и Next. Затем п добавляется к списку формул Old. Кроме того, некоторые формулы могут быть добавлены в поля New и Next вершины q1, либо вершин 9i и 92 согласно приведенным ниже правилам. ¦ Формула г] является либо высказыванием р, либо отрицанием высказывания ->р, либо булевой константой True, либо булевой константой False. Если п есть константа False, или -ч] содержится в списке Old (мы отождествляем ->->А и А), то текущая вершина q удаляется, поскольку содержит противоречие. Сделать это легко: мы просто возвращаем список Nodes, не добавляя в него q: if т) =False or -<п ? Old(q) then return(Nodes); В противном случае вершина q заменяется на вершину q', как это указано ниже: q' := [Ш <= new_ID(), Incoming <= Incoming(q), Old <= Old{q) U {rj}, New •<= New(q), Next <= Next(q)\; expand(q'', Nodes); ¦ Пусть формула n имеет вид ц U ip. Поскольку формула ц U ф равносильна формуле ip V (ц Л X(ji U V>))> вершина g расщепляется на две вершины gi и дг. В вершине gi формула /х добавляется в поле New, а формула ц\] гр — в поле ATezt. В вершине дг формула V* добавляется в поле New. Это показано на рис. 9.10, где ц = А, ф = (В\]С):
9.4. Трансляция LTL в автоматы 191 q! := [ID •*= new_ID(), Incoming *= Incoming(q), Old <= Old(q) U {n}, New <= New\q) U {/*}, Next «= Next(q) U {^ U ^}]; й := [Я> <= new_ID(), Incoming <= Incoming(q), Old <= Ш(д) U {i7}, JVeu; <= JVetu(g) U {^}, Afert •?= JVearf(g)]; expand(q2,expand(qi, Nodes)); ¦ Пусть n = цЛ.ф. Вершина g расщепляется. Заметим, что формула /iR^ равносильна фЛ (/* VX(^R^)), которая, в свою очередь, равносильна формуле (фЛц)\/(фЛХ.(ц11ф)). Поэтому ф добавляется в поле New обеих вершин ft и ft, формула р. добавляется в поле New вершины qi, а ц Rф — в поле ЛГех* вершины ft- Псевдокод в этом случае строится аналогично псевдокоду для ц\]ф. ¦ Пусть п = цУ ф. Вершина q расщепляется, формула р отходит в поле New вершины ft, а ф — в поле ЛГеи/ вершины ft. Псевдокод аналогичен случаю цХ1ф. ¦ Пусть п = цЛф. Вершина q замещается вершиной q1. Обе формулы (i и ф добавляются в список New вершины of, поскольку истинность обеих формул необходима, чтобы обратить в истину п: a* := [ID <= new_ID(), Incoming <= Incoming(q), Old <= Old{q) U {»?}, New ¦$= New(q) U {ц,ф}, Next <= Next(q)]; expand(q', Nodes); ¦ Пусть n = ~X.fi. Тогда q просто замещается вершиной qf, и /j добавляется в поле JVeatf вершины q'. с{ := [ID <= new_ID(), Incoming <= Incoming(g), Old «= Old{q) U {»/}, JVew <= New(q), Next «= JVeatf(g) U {/*}]; expand^, Nodes);
192 Глава 9. Верификация моделей и теория автоматов Затем алгоритм рекурсивно обращается к обработке новых копий. Как только вершина q была расщеплена или замещена новым вариантом, занимаемая ею память может быть освобождена. Мы не станем вдаваться в описание процесса сборки мусора как составной части нашего алгоритма. Корректность алгоритма является следствием двух инвариантных соотношений. Мы будем использовать запись Д Y для обозначения конъюнкции всех формул множества Y. 1. Бели вершина q была расщеплена на qi и &, то сохраняется следующий инвариант: (Д Old{q) Л Д New{q) Л X Д ЛГеа*(д)) <—> <—> ((Д oid(qi) л Д лода) л х Д Mertfai))v V (Д Ш(д2) Л Д Newin) Л X Д Nex^))). 2. Бели вершина q была замещена вершиной q\, то сохраняется следующий инвариант: (Д Old{q) Л Д JVew(g) Л X Д JVearffa)) <—> 4—> ((Д Old(q') Л Д ЛМ«') А X Д JVerf(g')) • Список вершин Nodes, построенный приведенным выше алгоритмом, можно преобразовать теперь в обобщенный автомат Бюхи, определяемый следующими компонентами. ¦ Алфавит Е образуют всевозможные множества высказываний из АР. Элемент а 6 Е обозначает истинностное означивание, которое приписывает значение True всем высказываниям из а, а значение False всем высказываниям, не входящим в а. (На практике дуга, помеченная булевым выражением, может соответствовать множеству переходов, как показано на рис. 9.3 и 9.4.) ¦ Множество состояний Q включает множество вершин Nodes и дополнительное состояние init. ¦ Мы имеем переход (г, а, г') G Д тогда и только тогда, когда г б Incoming{r'), и а удовлетворяет конъюнкции всех позитивных и негативных высказываний из Old(r'). ¦ Начальным состоянием служит trot В init не ведет ни одна входящая дуга.
9.5. Верификация моделей на лету 193 ¦ Допускающее множество F представлено набором множеств состояний Pi € F, по одному множеству для каждой формулы вида fi U ф; множество Р{ содержит все те состояния г, для которых имеются включения ф € ОЫ(т) или ц U ф $ ОЩг). Таким образом Pi должно гарантировать, что если ц U ф встречается в некотором состоянии на протяжении допустимого вычисления, формула ф обязательно встретится в этом же вычислении позднее. Алгоритм можно сделать более эффективным, если не помещать в списки Old подформулы вида рЛф, рЧфиХц, как только они будут удалены из списков New, за исключением случаев, когда они составляют правую часть подформул типа until Нетрудно видеть, что эти подформулы избыточны. Например, если в поле Old некоторой вершины из списка Nodes содержится ц V ф, то в нем также содержится либо ц, либо ф. То же самое справедливо и для других случаев. Число вершин, которые порождаются алгоритмом, а также его временная сложность зависят экспоненциально от длины формулы. Впрочем, эксперименты свидетельствуют, что построенные автоматы обычно невелики. Как отмечалось в разд. 9.2, для проверки выполнимости нам нужен автомат, представляющий плохое поведение, т. е. поведение, которое не дозволено спецификацией (р. Трансляция <р в автомат и последующее построение его дополнения может привести в итоге к автомату, размер которого оценивается двойной экспонентой от размера формулы. Гораздо более выгодно преобразовывать -лр в автомат. Тогда в худшем случае мы будем иметь автомат, размер которого экспоненциально зависит от размера <р. 9.5. Верификация моделей на лету В предшествующих разделах мы познакомились с целым рядом алгоритмов, которые можно использовать в разных сочетаниях, чтобы проверить, обладает ли система некоторым свойством <р. Моделируемую систему преобразуют в соответствующий автомат Бюхи Л, а отрицание спецификации <р транслируют в другой автомат S. Затем проверяют пустоту пересечения Л и S. Если пересечение непусто, то выдается контрпример. Сейчас мы покажем, как воспользоваться разработанной к настоящему времени методикой, для того чтобы провести верификацию модели наиболее эффективно. Вместо того
194 Глава 9. Верификация моделей и теория автоматов чтобы строить сразу оба автомата Л и S, мы построим только автомат S, представляющий свойство. Затем он будет использован для управления построением автомата системы Л по ходу вычисления пересечения. Таким образом, мы можем ограничиться построением только небольшой части пространства состояний к тому моменту, когда будет обнаружен контрпример проверяемого свойства. При верификации моделей с явным представлением состояний, как описано в гл. 4, модели Кринке задают в виде графов, в которых вершины соответствуют состояниям, а дуги — переходам. Извлечение такой конструкции из параллельной системы на стадии, предшествующей верификации модели, может привести нас к графу, размеры которого экспоненциально зависят от размера системы. Применяя теоретико-автоматный подход, который описан в настоящей главе, во многих случаях удается избежать построения всего пространства состояний моделируемой системы. И все это происходит потому, что состояния автомата Л порождаются по мере необходимости в ходе проверки пустоты его пересечения с автоматом S, представляющим свойство. Подобная тактика получила название верификация моделей «на лету» [84, 113]. Итак, одно из преимуществ верификации моделей на лету заключается в том, что при вычислении пересечения автомата Л, представляющего систему, и автомата S, представляющего свойство, некоторые состояния автомата Л могут быть вообще никогда не порождены. Другое достоинство процедуры проверки на лету состоит в том, что контрпример может быть обнаружен задолго до того, как завершится построение пересечения двух автоматов. Едва лишь контрпример будет обнаружен и выдан, исчезнет и необходимость завершать построение. Например, предположим, что двойной DFS из разд. 9.3 применяется для проверки пустоты пересечения автоматов AtiS. Напомним, что состояния, используемые при построении пересечения, представляют собой пары, образованные состояниями из Л и состояниями из S. Отметим также, что все состояния автомата Л являются допускающими. Следовательно, состояние автомата-пересечения будет допускающим в том и только том случае, если таковой является его 5-компонента. При верификации моделей на лету состояния автомата-пересечения строятся по мере того, как они оказываются востребованными алгоритмом двойного DFS. Допустим, что автомат S уже построен по формуле ip. Допустим также, что часть автомата Л, задейство-
9.6. Символьная проверка вложенности языков 195 ванная в процессе поиска, уже построена. Пусть s = (r,q) — текущее состояние, достигнутое в ходе поиска, где г — состояние автомата A, a q — состояние автомата S. Чтобы продолжить поиск, мы определяем поочередно последователей а. Так как автомат S уже построен, последователи <7ъ дг> • • •, <7п состояния q в S также уже известны. Пусть г' — очередной последователь состояния г. Тогда последователь в< = (г',%), где 1 < t ^ п, существует только при условии, что переходы изгвг'ииздв^ одинаково размечены высказываниями из АР. Можно описать два способа сокращения пространства состояний, используемого при верификации моделей на лету. 1. Разметка состояния г' не согласуется с разметкой ни одного из последователей <к состояния q. Тогда алгоритм поиска прекращает анализ последователей г'. 2. Цикл обнаружен до того, как алгоритм поиска был вынужден откатиться в «. Тогда поиск завершается до того, как проанализированы прочие последователи состояния 8, в которых, быть может, задействованы другие последователи состояния г. В обоих случаях сокращение числа состояний проистекает из того, что построение автомата А проводится целенаправленно по проверяемому свойству с использованием автомата S. 9.6. Символьная проверка вложенности языков В этом разделе мы покажем, как символьные методы верификации моделей могут быть применены для решения вопроса о вложенности языков, порождаемых иьавтоматами. Хотя существует множество видов иьавтоматов, в этом разделе мы рассматриваем только автоматы Бюхи. Алгоритмы для других видов автоматов могут быть получены подобным образом из результатов, изложенных в [60]. В общем случае задача проверки вложенности языков двух недетерминированных ш-автоматов является PSPACE-полной. Поэтому мы рассматриваем частный случай общей задачи, в котором автомат спецификации детерминирован. Таким образом, наш алгоритм не может использоваться в ситуациях, когда спецификация не выразима детерминированным автоматом (см. разд. 9.2.1). Для простоты мы потребуем, чтобы оба автомата были полными. Пусть А = <Е, Q, Д, Q°, F) и А' = (Е, Q', Д\ Q'°,F') - два автомата Бюхи с общим входным алфавитом Е. Пусть М{Л, А') — модель
196 Глава 9. Верификация моделей и теория автоматов Крипке (Q х Q', R, L) над АР = {q, q1}, где q, q1 — два новых символа и при этом ¦ q € L((s, s')) тогда и только тогда, когда s G F; ¦ q1 € ?((«, в')) тогда и только тогда, когда в' G F'; ¦ (в, в') R (г, г') тогда и только тогда, когда За € ?: (в, ст, г) 6 Д и (*>,»•')€ Д'. Напомним, что в разд. 5.2 мы показали, каким образом можно представить модель Крипке в символьном виде. В [60] доказано, что если автомат Л' детерминирован, то С(Л)СС{Л') <=> M{A,A')\=A(GFq=>GFq'). Заметим, что приведенная выше формула не является формулой CTL, так как содержит темпоральные операторы, не предваренные кванторами пути. Однако она эквивалентна формуле AG AF q' («бесконечно часто q'>) при ограничении справедливости «бесконечно часто q>. Проверка истинности вышеприведенной формулы с данным ограничением справедливости может быть выполнена методами, описанными в разд. 6.2. Теорема 8. Включение ?(-4) С С(Л') имеет место тогда и только тогда, когда М(Л, Л') (= AG AF q1 с учетом ограничения справедливости д.
Редукция частичных порядков Редукция частичных порядков предназначена для сокращения размера пространства состояний, которое должно быть обследовано алгоритмами верификации. В расчет принимается перестановочность параллельно выполняемых переходов, которая приводит к одному и тому же состоянию при выполнении их в разном порядке. Поэтому метод редукции наилучшим образом подходит к асинхронным системам (в синхронных системах параллельные переходы не чередуются, а срабатывают одновременно). Суть метода заключается в построении сокращенного графа переходов. Полный граф переходов, который может быть слишком велик, чтобы поместиться в память, никогда не строится. Поведения в сокращенном графе образуют подмножество множества поведений в полном графе переходов. В ходе обоснования метода редукций уда* ется показать, что отсутствующие поведения не привносят никакой информации. Точнее говоря, можно определить отношение эквивалентности на поведениях так, что проверяемое свойство не позволяет различить эквивалентные поведения. Бели какое-либо поведение отсутствует в сокращенном графе переходов, то хотя бы одно эквивалентное ему поведение должно в нем содержаться. Своим происхождением термин редукция частичных порядков обязан первоначальным версиям алгоритмов, где моделью вычислений программ служили частичные порядки [126,152,242]. Однако lkz этого методу гораздо лучше подходит название проверка на представительной модели [208, 210], поскольку верификация проводится с использованием представителей из классов эквивалентности поведений. В этой главе переходы системы играют значительную роль. Редукция частичных порядков основана на отношении зависимости между переходами системы. Кроме того, метод редукции устанавливает, какие переходы должны быть включены в сокращенную модель, а какие нет. Как и в гл. 7, нам хотелось бы провести различие между разными переходами в системе. Поэтому мы слегка модифицируем определение модели Крипке. Вместо одного отношения 10
198 Глава 10. Редукция частичных порядков переходов R мы будем иметь дело с множеством отношений переходов Т. Для упрощения мы будем называть каждый элемент а из Т переходом, а не отношением переходов. Системой переходов назовем четверку (S,T,Sq,L), в которой множество состояний 5, множество начальных состояний So и функция разметки L определяются так же, как и для моделей Крипке, а символом Т обозначено множество таких переходов, что а С S х 5 для каждого а из Т. При этом модель Крипке М = (S, R, So, L) может быть получена, если определить R так, чтобы отношение R(s, a') выполнялось всякий раз, когда хотя бы для одного а из Т выполняется отношение a(e, з'). Всякий переход а из Т будем называть допустимым в состоянии в, если существует состояние я', для которого выполняется а(а,«'). В противном случае а считается запрещенным в а. Множество допустимых в 8 переходов обозначим enabled(s). Переход а считается детерминированным, если для каждого состояния з имеется не более одного состояния а', для которого выполняется a(s, s'). Если переход а детерминированный, мы будем часто использовать запись в' = а(а) вместо а(а, в'). Далее мы будем рассматривать только детерминированные переходы. Путем из состояния а в системе переходов назовем такую конечную или бесконечную последовательность 7Г = so -^2> si -^> ..., что а = во и для всякого t, t ^ 0, выполняется a(si,si+i). Здесь не требуется, чтобы путь был непременно бесконечным. Более того, любой префикс пути также является путем. Бели путь п конечен, то его длина равна числу переходов в 7г и обозначается |7г|. 10.1. Параллельность в асинхронных системах В соответствии с общим представлением о параллельных асинхронных системах можно считать, что модель чередований устанавливает произвольный порядок параллельных событий. Во избежание дискриминации каких-то конкретных упорядочений события чередуются всеми возможными способами. Упорядочивать независимые переходы довольно бессмысленно. Однако известные языки спецификаций, включая многие темпоральные логики, позволяют различать поведения, отличающиеся только в этом. Наша цель состоит в том, чтобы воспользоваться преимуществами тех случаев, когда спецификации не различают подобные поведения. Тогда редукция
10.1. Параллельность в асинхронных системах 199 Рис. 10.1. Выполнение трех независимых переходов частичных порядков проверяет только некоторое подмножество поведений. Тем не менее, проверке подвергается достаточная их часть, чтобы гарантировать добротность верификации. Одна из потенциальных причин «комбинаторного взрыва> — это расположение параллельных событий во всех возможных порядках. Чтобы убедиться в этом, рассмотрим п переходов, которые можно выполнить параллельно. Тогда имеется п! разных упорядочиваний и 2П различных состояний (по одному на каждое подмножество переходов). Если спецификация не различает эти последовательности, то нам, безусловно, выгодно рассмотреть только одну последовательность сп + 1 состоянием. Это показано на рис. 10.1 для п = 3. Наша цель — сократить число состояний, рассматриваемых в процессе верификации модели, сохраняя при этом корректность проверяемого свойства. Для простоты изложения мы будем полагать, что сокращенный граф переходов сначала порождается явно с использованием DFS. Вслед за этим к построенному графу применяется алгоритм верификации модели. Редукция строит граф с меньшим числом состояний и переходов. Это ускоряет построение графа и использует меньше памяти, что приводит к более эффективному алгоритму верификации модели. Кроме того, редукцию можно применять на лету по ходу верификации модели [207]. Вместо алгоритма DFS можно применять поиск в ширину [55] в сочетании с символьной верификацией модели [4, 162].
200 Глава 10. Редукция частичных порядков 1 Ла«Л(во); 2 set on_stack(s0); 3 expand_state(s0); 4 procedure expand_state(so) 5 work_set := ample (s); 6 while work_ set is not empty do 7 let a etiK>rfc_se$(«); 8 t»orfc_se$(a) := work_8et(e)\{a}; 9 *' := a(e); 10 if new(s') then 11 hash(s'); 12 set on_5tacA;(s'); 13 expand_state(e')', 14 end if; 15 create_edge(8, a, «'); 16 end while; 17 set completed(s); 18 end procedure Рис. 10.2. Поиск в глубину с редукцией частичных порядков Редукция проводится модифицированным алгоритмом DFS, который используется для построения графа переходов, как показано на рис. 10.2. Отправной точкой поиска служит начальное состояние «о (строка 1); далее поиск продолжается рекурсивно. Для каждого состояния 8 выбирается только подмножество ample(8) множества допустимых переходов (строка 5), а не все множество допустимых переходов, как при построении полного пространства состояний. Затем DFS анализирует только тех последователей, которых порождают указанные переходы (строки 6-16). В описании алгоритма DFS на рис. 10.2 состояние помечается оп_ stack (строки 2, 12), когда оно рассматривается впервые, и completed (строка 17), когда все его последователи были обследованы. Таким образом, состояние помечается оп_ stack, когда оно оказывается в стеке поиска DFS. Эта информация используется для вычисления функции ample. Когда алгоритм вериифкации моделей применяется к сокращенному графу переходов, он завершает работу с положительным отве-
10.2. Независимость и невидимость 201 том, если свойство выполняется на исходном полном графе переходов. В противном случае он выдает контрпример. Ввиду того что сокращенный граф представляет меньшее число поведений, контрпример может отличаться от того, который был бы построен с использованием полного графа переходов. Обращаем внимание на то, что алгоритм поиска в глубину, представленный на рис. 10.2, строит сокращенный граф переходов непосредственно. Построение нередуцированного графа переходов и его последующее сокращение лишает всякого смысла идею редукции. Для реализации алгоритма нам нужно найти систематический метод вычисления ample(s) для всякого заданного состояния s. Вычисляя ample(s), мы преследуем три цели. 1. В случае использования ample(s) вместо enabled(s) в сокращенном графе должно быть представлено достаточно много поведений, для того чтобы алгоритм верификации моделей выдавал правильные результаты. 2. При использовании ample(s) вместо enabied[s) должен получиться граф переходов значительно меньшего размера. 3. Издержки вычисления ample(s) должны быть сравнительно невелики. 10.2. Независимость и невидимость В этом разделе мы введем два понятия, которые могут способствовать сокращению графа переходов. Как было отмечено ранее, в модели чередования для параллельных систем переходы, выполняемые параллельно в некотором состоянии, чередуются в произвольном порядке. Это можно строго сформулировать, определив отношение независимости на парах переходов, которые могут выполняться параллельно. Отношением независимости называется симметричное антирефлексивное отношение I СТ хТ, удовлетворяющее следующим двум условиям для каждого состояния s € 5 и всякой пары (о,/J)e/. ¦ Допустимость. Если а,/3€ enabled(s), то а 6 enaMerf(/3(s)). ¦ Коммутативность. Если а,/? 6 enabled(a), то a(/3(a))=/?(a(s)). Отношение зависимости D является дополнением отношения /, т. е. D = (Т х Т) \ I. Условие допустимости устанавливает, что для всякой пары независимых переходов ни один переход не отменяет допустимость друго-
202 Глава 10. Редукция частичных порядков Рис. 10.3. Выполнение независимых переходов го. Отметим, однако, что возможны случаи, когда один переход делает допустимым другой. Следует иметь в виду, что в данном определении существенно используется то обстоятельство, что / симметрично. Условие перестановочности, которое определено корректно с учетом требования допустимости, устанавливает, что при выполнении независимых переходов в разном порядке будет получен один и тот же результат. Иллюстрацией этого условия служит рис. 10.3. Если трудно проверить, являются ли два перехода а и /? независимыми или нет, то предположение, что они зависимые, сохраняет корректность редукций, описанных в настоящей главе. Определение независимости можно использовать для редукции и в том случае, когда пара независимых переходов не может в действительности выполняться параллельно. Например, когда два перехода из разных процессов увеличивают значение разделяемой переменной, они удовлетворяют условиям независимости, хотя нужно применять некий физический арбитраж для предотвращения их одновременного выполнения. Условие перестановочности, как видно из рис. 10.3, предлагает возможную редукцию графа переходов, так как достичь состояния г из а можно вне зависимости от того, будет ли а выполняться после /9 или наоборот. Возникает искушение выбрать только один из переходов, исходящих из s. Это непригодно по следующим причинам. Проблема 1. Проверяемое свойство может быть чувствительным не только к выбору между состояниями s и г, но и к выбору между СОСТОЯНИЯМИ Si И 82-
10.2. Независимость и невидимость 203 Проблема 2. Состояния s\ и s? могут иметь других последователей помимо г, которые станут недоступны, при удалении s\ или S2- К этим проблемам мы обратимся в разд. 10.3. Первым шагом на пути их решения будет введение такого понятия как невидимый переход. Пусть L: S —> 2АР — функция, помечающая каждое состояние множеством атомарных высказываний. Переход а € Т называется невидимым относительно множества высказываний АР' С АР, если для всякой такой пары состояний s, s' е S„ что s' = a(s), выполняется равенство L(s) П АР' = L(s') П АР'. Иными словами, переход невидим, когда его выполнение в любом состоянии не изменяет значений пропозициональных переменных из АР'. Переход считается видимым, если он не является невидимым. К этому свойству тесно примыкает понятие прореживания [165], относящееся к последовательности одинаково помеченных состояний на пути в модели Крипке. Два бесконечных пути (см. рис. 10.4) а - з0 —> «1 —> • • • и р = го —> п —> • • ¦ эквивалентны по прореживанию (это отношение обозначается a ~ej р), в случае если имеются две такие бесконечные последовательности целых чисел 0 = г0 < i\ < %ъ < ¦ ¦ ¦ и 0 < jo < 3\ < h < •••¦> что Для всякого k ^ 0 выполняется цепочка равенств L{8ib) = L(8ih+J = ... = L(8ik+l-i) = L(rjh) = L(rjh+i) = ... = L(rih+1-i). Назовем конечную последовательность одинаково помеченных состояний блоком. По сути, два пути эквивалентны по прореживанию, если их можно разбить на бесконечное число блоков таким образом, что состояния в fc-м блоке одного пути помечены точно так же, как и состояния в fe-м блоке другого пути. Следует отметить, что соответствующие блоки могут иметь разную длину. Подобным же образом эквивалентность по прореживанию можно определить и для конечных путей, рассматривая конечные последовательности индексов 0 = io < Ч < h < ¦ ¦ • in и 0 < j'o < Л < h < ¦ ¦ ¦ jn- Понятие прореживания чрезвычайно важно для асинхронных систем, поскольку для них отсутствует взаимосвязь между временем, разделяющим два события, и количеством переходов, происходящих между ними. LTL-формула А / инвариантна относительно прореживания в том и только том случае, когда для каждой пары таких путей 7г и я-', что 7Г ~«t я-', справедливо соотношение я- (= / тогда и только тогда, когда 7г' |= /.
204 Глава 10. Редукция частичных порядков Рис. 10.4. Два пути, эквивалентные после прореживания Воспользуемся записью LTL_x для обозначения подмножества логики LTL без оператора сдвига по времени X. Теорема 9. Всякое LTL-x-свойство инвариантно относительно прореживания. Теорема доказывается простой индукцией по длине LTL-формулы. Интересно отметить (см [211]), что верно и обратное утверждение. Теорема 10. Всякое LTL-свойство, замкнутое относительно прореживания, выразимо в LTL_x- Распространим теперь понятие эквивалентности по прореживанию на модели. Две модели М и М' эквивалентны по прореживанию тогда и только тогда, когда выполнены следующие условия. ¦ Модели М и М' имеют одно и то же множество начальных состояний. ¦ Для всякого пути с в М, исходящего из начального состояния s, существует такой путь а' в М', исходящий из того же начального состояния s, что a ~st а'. ¦ Для всякого пути а' в М', исходящего из начального состояния 8, существует такой путь а в М, исходящий из того же начального состояния s, что a1 ~,t а. Следствие, приведенное ниже, полезно для демонстрации того, что при помощи формулы логики LTL_x нельзя отличить эквивалентные по прореживанию модели. Оно будет использовано далее, так как редукция частичных порядков порождает модель, которая эквивалентна по прореживанию исходному графу переходов.
10.3. Редукция частичных порядков для LTL_x 205 Следствие 2. Пусть М и М' — две эквивалентные после прореживания системы переходов. Тогда для всякого 1ЛЪ_х-свойства А / и для каждого начального состояния s е So отношение М, s [= А / справедливо тогда и только тогда, когда имеет место соотношение M',s\=Af. Обратившись к рис. 10.3, предположим, что хотя бы один из переходов (например, переход а) невидим. Тогда справедливы равенства L(s) = L(si) и L(s2) = L(r). Следовательно, SSiT ~,t 882Г. 10.3. Редукция частичных порядков для LTL_x В случае когда спецификация инвариантна относительно прореживания, перестановочность и невидимость позволяют избежать порождения некоторых состояний. Основываясь на этом наблюдении, мы предлагаем систематический метод отбора достаточного множества переходов для всякого заданного состояния. Достаточные множества будут использоваться алгоритмом DFS для построения такого сокращенного графа переходов, что всякий путь, который не был учтен алгоритмом DFS, эквивалентен по прореживанию одному из путей, построенных этим алгоритмом. Это служит залогом того, что сокращенный граф переходов эквивалентен по прореживанию исходному графу переходов. Будем говорить, что состояние s является вполне раскрытым, если ample(s) = enabled(s). В таком случае все преемники этого состояния должны быть рассмотрены алгоритмом DFS. Вместо того чтобы привести специальный алгоритм построения достаточных множеств, мы сначала представим четыре условия отбора подмножества ample(s), благодаря которым сохраняется выполнимость ЬТЬ_х-спецификации. Редукция будет определяться множеством высказываний АР', фигурирующих в LTL-^-формуле. Условие СО предусматривает, что состояние, имеющее хотя бы одного преемника, будет также иметь некоторого преемника в сокращенном графе. CO. ample(s) = 0 •» enabled(s) = 0. Условие Cl является наиболее сложным из ограничений на ample(s). Cl [126, 152, 206, 242]. На каждом пути, исходящем в полном графе переходов из состояния s, выполняется следующее условие: вся-
206 Глава 10. Редукция частичных порядков кий переход, зависящий от какого-либо перехода из ample(s), не может быть выполнен прежде, чем осуществится указанный переход из ample{s). Нужно иметь в виду, что в условии С1 речь идет о путях в исходном графе переходов. Нам нужен такой способ проверки условия С1, при котором не будет строиться исходный граф переходов. Далее мы покажем, как сузить С1, чтобы можно было вычислять ample(s), располагая только текущим состоянием s. Лемма 24. Все переходы из enabled(s) \ ample(s) независимы от переходов из ample(s). Доказательство. Рассмотрим переход у из enabled(s) \ ample(a). Предположим, что (~/,5) ? D, где S ? ample(s). Так как переход 7 допустим в s, в полном графе переходов есть путь, начинающийся с 7- Но тогда переход, зависящий от некоторого перехода из ample(s), выполняется ранее указанного перехода из ample(s) вопреки С1. ? Для того чтобы гарантировать корректность алгоритма редукции на основе DFS, нам нужно быть уверенным, что всякий раз, когда для продолжения поиска выбирается очередной переход из ample{s), не будет упущен ни один путь, существенный для проверки корректности графа переходов. Согласно условию С1 такой путь будет иметь одну из двух следующих форм. ¦ Путь имеет такой префикс ftjft • • • &та, что a G ample(s) и каждый переход ft не зависит от всех переходов из множества ample(s), включая а. ¦ Путь представляет собой бесконечную последовательность переходов /?0ft..., в которой каждый переход ft не зависит от всех переходов из ample(s). Из условия С1 также вытекает, что если в последовательности переходов /Soft .. .ftn, начинающейся в состоянии s, не содержится ни один переход из ample(s), все переходы из ample(s) остаются допустимыми. Это происходит потому, что каждый ft не зависит от переходов из ample(s) и не может, таким образом, отменить их допустимость. В первом случае предположим, что указанная последовательность /?oft ¦ • • ftn" достигает состояния г. Эта последовательность не будет рассматриваться алгоритмом DFS. Однако, воспользовавшись
10.3. Редукция частичных порядков для LTL_jv 207 Рис. 10.5. Переход а перестановочен с /?o/3i • • • /3m го раз условиями допустимости и перестановочности, мы можем построить конечную последовательность a/?o/?i ¦¦¦0т, которая также достигает г. Это показано на рис. 10.5. Иными словами, даже если сокращенный граф не содержит последовательности /?оА . • • Рта, достигающей состояния г, можно построить другую последовательность, начинающуюся из состояния s и достигающую того же самого состояния г. Рассмотрим две последовательности состояний а = soS\.. .smr и р = вгоп ... rm, порожденные путями ДоА • • • Рт& и а/Зо А • • • #то соответственно (см. рис. 10.5). Для того чтобы избавиться от с, нужно, чтобы а и р были эквивалентны по прореживанию. Это отношение будет выполнено, если a — невидимый переход, поскольку тогда L(si) = 1г(г*) для 0 ^ i! ^ т. В таком случае для проверяемого свойство две указанные выше последовательности неразличимы. Это достигается при условии С2. С2 [Невидимость [209]]. Если s не является вполне раскрытым, то каждый переход а из ample(s) невидим. Рассмотрим теперь случай, когда бесконечный путь /Soft • • •> начинающийся из s, не содержит переходов из ample(s). По условию С2 все переходы из ample(s) невидимы. Пусть a — некоторый пере-
208 Глава 10. Редукция частичных порядков а) Два параллельных процесса Ь) Полный и сокращенный граф переходов Рис. 10.6. ход из ample(s). Тогда путь, порожденный бесконечной последовательностью переходов аВоВ\..., эквивалентен после прореживания тому пути, который порождается последовательностью ВоВ\ И вновь, хотя путь BqB\... не включен в сокращенный граф переходов, в этом графе есть по крайней мере один путь, эквивалентный ему по прореживанию. Условий С1 и С2 еще недостаточно, чтобы обеспечить эквивалентность по прореживанию сокращенного графа переходов полному графу переходов. На самом деле не исключена возможность того, что некоторый переход будет навсегда задержан из-за присутствия цикла в построенном графе переходов. Обратимся к примеру процессов на рис. 10.6. Предположим, что переход В не зависит от а\, аг и аз- Переходы ai, аг и аз — взаимозависимые. Процесс на левой половине рисунка может исполнить видимый переход В только один раз. Предположим, что имеется высказывание р, которое изменяет значение с True на False при выполнении В, и поэтому В — видимый переход. Процесс на правой половине рисунка выполняет невидимые переходы c*i, а2 и аз по циклу. Нередуцированный граф переходов для системы, изображенной на рис. 10.6 а), представлен на левой половине рис. 10.6 Ь). На пра-
10.3. Редукция частичных порядков для LTL_x 209 вой половине того же рисунка показаны начальные этапы редукции графа переходов, учитывающие невидимость переходов ai, а% и аз- Исходя из начального состояния а\, мы можем выбрать ample(s) = {ai}. Условия СО, С1 и С2 при этом соблюдены. В результате мы получаем S2 = ai(si). Точно так же можно выбрать amplefa) = {0:2}, получив при этом вз = аг(8г). Наконец, мы достигаем вз- Условия СО, С1 и С2 позволяют выбрать атр1е(аз) = {«а}- Но сокращенный граф переходов, построенный таким образом, не содержит ни одной последовательности, на которой р изменяло бы значение с True на False. Проблема состоит в том, что каждое состояние в цикле si,S2,S3,si откладывает выполнение /5 до следующего раза. Когда цикл замкнулся, построение завершается, и о переходе /? просто забывают. Чтобы справиться с этой проблемой, мы добавим следующее условие. СЗ [Условие цикла [21, 55, 208]]. Цикл запрещен, если в нем содержится состояние, в котором переход а допустим, но не включен в ample(s) ни для одного состояния s цикла. Теперь мы способны справиться с проблемами 1 и 2, описанными в предшествующем разделе. Обратимся вновь к рис. 10.3. Предположим, что алгоритм редукции на основе DFS выбрал 0 в качестве ample(s) и не включил si в состав сокращенного графа. Рассмотрим сначала проблему 1. Согласно условию С2, перход /3 должен быть невидимым. Поэтому 8,82, г и в, »i,r эквивалентны по прореживанию. В этой главе нас интересуют только свойства, инвариантные относительно прореживания. Такие свойства не дают возможности провести различие между этими двумя последовательностями. Рассмотрим теперь проблему 2. Предположим, что имеется переход 7, допустимый в состоянии «1, как показано на рис. 10.7. Мы покажем, что 7 остается допустимым в состоянии г. Более того, цепочки переходов а, 7 и /?, а, 7 приводят к эквивалентным после прореживания последовательностям состояний. Прежде всего отметим, что 7 не может зависеть от /?. В противном случае последовательность а, 7 нарушает условие С1, ибо переход, зависящий от р", выполняется ранее чем р\ Таким образом, переход у не зависит от р\ И поскольку этот переход допустим в состоянии 8%, он также должен быть допустим в состоянии г. Предположим, что 7 при выполнении 15 Зак. 271
210 Глава 10. Редукция частичных порядков Рис. 10.7. Диаграмма, иллюстрирующая проблему 2 в г приводит в состояние г', а при выполнении в «i приводит в состояние з[. Так как переход /? невидим, две последовательности состояний з,«i,«i и з,32, г,г' эквивалентны по прореживанию. Поэтому свойства, инвариантные относительно прореживания, не будут различать эти две последовательности. 10.4. Пример Рассмотрим пример программы взаимного исключения Р, который был приведен в конце гл. 2. Граф переходов для Р изображен на рис. 10.8. Состояния программы помечены высказываниями АР = {NCi,CRi,U,turn = i, J.}, где i = 1,2, и при этом CRj 6 L(s), если pci = CRi в состоянии s, и CR* $ L{s), если pci ф CRi в состоянии в. Подобным же образом разметка Ь(з) определена и для всех прочих атомарных высказываний из АР. Рассмотрим LTL-x-формулу / = G-i(CRo Л CR\), описывающую свойство взаимного исключения. Покажем, как алгоритм DFS, представленный на рис. 10.2, может быть применен для построения сокращенного графа переходов, эквивалентного по прореживанию исходному графу переходов относительно подмножества АР' атомарных высказываний. Поскольку нам хотелось бы выяснить, удовлетворяет ли Р свойству /, мы выбрали АР' = {CRo,CR\}. Ниже приведен список переходов программы Р, допустимых в
10.4. Пример 211 1 i (turn =0 \ . . / turn = 1 A Рис. 10.8. Сокращенный граф переходов для программы взаимного исключения тех или иных достижимых состояниях (предполагается, что i = 0,1). Для краткости из каждого перехода удалено same(pcj), если i ф j. а: рс = тЛpd^ = IqЛpc[ = ii Лpd = J_; 0% • pci = h Л pcj = NCi A True Л eame(iurn); 7«: Pd — WC< Лрс^ = CRi Л turn = i Л eome(turn); J<: pcj = OR* ApcJ = U Л turn' = (i + 1) mod 2; ?*: pcj = iVC< Лpcj = M7j Л turn фО\ eame(turn). 15*
212 Глава 10. Редукция частичных порядков Видимыми относительно АР' являются те переходы, при выполнении которых CRo или CRi имеют разные значения до перехода и после него. Так, например, 7о, 7ь Sa, <Si — видимые переходы. Каждый переход зависит от самого себя, поскольку отношение зависимости рефлексивно. Все переходы зависят от перехода а, потому что он должен быть вьгаолнен ранее всякого другого перехода программы. Отношение зависимости для остальных переходов вычисляется сообразно следующим двум правилам. ¦ Два перехода, изменяющие значение одной и той же переменной (в том числе счетчика команд), зависимы. ¦ Если один из переходов изменяет значение переменной, а другой проверяет ее значение, то эти переходы зависимы. Таким образом, взаимозависимыми оказываются все переходы, относящиеся к одному процессу. Кроме того, G1,^0), Go,<5i)) (ei,<*o), (ei, Si), (S0, Si) также относятся к D, ввиду того что Si изменяет значение переменной turn, тогда как 7» и ?» проверяют ее значение. Наконец, мы вправе потребовать, чтобы отношение D было симметричным. Нередуцированный граф переходов изображен на рис. 10.8. Состояния и переходы, вошедшие в сокращенный граф, помечены черными кружками. Приведем список состояний сокращенного графа переходов, расположенных в том порядке, в каком их обходит алгоритм DFS: s0, ei, s3, S4, s6, ею, Зц, si3, s7, ss. Алгоритм DFS начинает работу из s0 — одного из начальных состояний. Для этого состояния ample(so) = enabled(s0) = {а}. Для si в качестве ample(si) можно выбрать {До}, {Дг} или {АьДг}- В последнем случае сокращение будет менее значительным, и поэтому оно не рассматривается. Первый вариант соответствует выбору допустимого перехода из Pq, а второй вариант — выбору из Pi. Условие СО, очевидно, выполняется. В обоих случаях будет выполнено и С1. Например, допустимо, что ample(si) = {До}- Тогда на всяком пути, исходящем из si, либо До выполняется немедленно, либо Pi выполняется ранее До. Однако переход &\ независим от Д0. Условие С2 тоже выполнено, так как переходы До и /?i невидимые. И наконец, условие СЗ также выполнено, поскольку никакого цикла еще не сформировано. Возможен произвольный выбор между этими двумя множествами, хотя не исключено, что на поздних этапах алгоритма одно из них может дать лучшее сокращение. Мы выбираем ampfe(si) = {До}-
10.5. Вычисление достаточных множеств 213 Переход /?о преобразует «i в s3. Рассуждая подобным же образом, мы выбираем в качестве атр1е(зз) множество тех переходов Pi, которые допустимы в зз, а именно {/?i}. Затем мы выбираем ample(si) = {70, ?i}- Мы не можем выбрать для 84 множество {70}; так как 70 — видимый переход. Мы также не можем выбрать одноэлементное множество {ei}, поскольку тогда образуется петля, в которой переход 70 допустим, но не входит в достаточное множество, что нарушает условие СЗ. Мы можем теперь выбрать ample(se) = {ei,<$o}. Так как эти переходы зависимы, мы должны вять оба перехода, чтобы не нарушить условие С1. Для состояний »ю и зц мы выбираем ample(sw) = {/?о} и ample(sn) = {71,?о}- Обоснования такие же, как и для состояний аз и 34 соответственно. Далее мы выбираем атр1е{з\з) = {^i5?o}- Переход 5\ из состояния «13 замыкает цикл 93,34,66,310,311,313- Глядя на рис. 10.9, легко убедиться в том, что условие СЗ для этого цикла выполняется. Алгоритм DFS продолжает поиск из другого начального состояния 37- Мы полагаем ample(sr) — {а} и, следуя рассуждениям, подобным тем, которые приводились для si, выбираем ample(sa) — {/?i}- При выполнении перехода /3 в Зв мы достигаем состояния зю, которое было рассмотрено ранее. На этом алгоритм завершает работу. Теперь можно применить алгоритм верификации моделей для LTL, чтобы проверить, будет ли формула / выполняться на сокращенном графе переходов, построенном нашим алгоритмом, поскольку/6 LTL_x. Формула выполнима на полном графе переходов тогда и только тогда, когда она выполнима на сокращенном графе переходов. 10.5. Вычисление достаточных множеств 10.5.1. Сложность проверки условий Для того чтобы сделать метод частичных редукций эффективным, нам надо уметь вычислять достаточные множества для состояний сокращенного графа с минимальными издержками. Мы рассмотрим связанные с этим задачи проверки условий СО-СЗ для множества допустимых переходов в заданном состоянии. Условие СО для каждого состяния можно проверить за время, ограниченное некоторой константой. Условие С2 тоже просто проверить, проанализировав все переходы заданного множества.
214 Глава 10. Редукция частичных порядков Условие С1 задает ограничение, которое нельзя проверить, рассмотрев непосредственно текущее состояние поиска, поскольку оно затрагивает те состояния, которые встретятся в будущем (а некоторые из них могут вообще отсутствовать в сокращенном графе). Следующая теорема показывает, что в общем случае проверка условия С1 не менее трудна, чем задача поиска в полном пространстве состояний. Теорема 11. Проверка условия С1 для состояния s и множества переходов Т С enabled(s) не менее сложна, нежели проверка достижимости в полном пространстве состояний. Доказательство. Рассмотрим задачу проверки достижимости состояния г в системе переходов Т из начального состояния во- Мы сведем эту задачу к проверке условия С1. Введем вначале новые переходы а и /?. Пусть а — единственный допустимый переход в состоянии г. Пусть переход /? допустим в начальном состоянии и независим от всех переходов Т. Потребуем, чтобы а и 0 были зависимыми (например, чтобы они изменяли значение одной и той же переменной). Рассмотрим кандидатуру {/?} в качестве достаточного множества для во- Предположим вначале, что условие С1 оказалось нарушено. Тогда существует путь в новом графе переходов, на котором а выполняется ранее, чем р. Так как переход а допустим только в г, этот путь ведет из во в г. Последовательность переходов этого пути от в0 до г содержится и в исходном графе переходов, поскольку в ней отсутствуют добавленные переходы а и /9. Таким образом, состояние г достижимо из во в исходной системе. Напротив, предположив, что г достижимо из во в исходном графе переходов, мы заключаем, что существует последовательность переходов из so в г, не содержащая 0. Эта же последовательность присутствует и в модифицированном графе переходов и может быть теперь продолжена переходом а из состояния г. В результате получаем последовательность, нарушающую условие С1. ? С учетом только что доказанной теоремы мы будем избегать проверки условия С1 для произвольного подмножества допустимых переходов. В разд. 10.5.2 мы опишем процедуру вычисления множества переходов, гарантированно удовлетворяющего условию С1. Хотя эта процедура может не давать достаточного множества, приводящего к наиболее значительному сокращению, зато она очень эф-
10.5. Вычисление достаточных множеств 215 фективна. Здесь, очевидно, имеет место компромисс между эффективностью вычисления и объемом сокращения. Условие СЗ также определяется в глобальных терминах. Однако, оно апеллирует к сокращенному графу переходов, тогда как С1 имеет дело с нередуцированыым графом переходов. Один из возможных способов соблюсти это ограничение состоит в том, чтобы построить сначала сокращенный граф переходов, а затем провести его коррекцию, добавляя новые переходы до тех пор, пока не будет выполнено условие СЗ [242]. С другой стороны, если следовать избранному нами подходу, условие СЗ заменится более жестким требованием, которое можно проверить непосредственно для текущего состояния. Лемма 25. Для соблюдения условия СЗ достаточно, чтобы хотя бы одно состояние в каждом цикле было вполне раскрытым. Доказательство. Предположим, что существует цикл, содержащий вполне раскрытое состояние, но не удовлетворяющий условию СЗ. Это означает, что имеется переход а, который допустим в некотором состоянии s цикла, но не включен ни в одно достаточное множество на этом цикле. По лемме 24 если переход а не входит в достаточное множество, то он независим от всех переходов этого множества. Значит, а не зависит от всех переходов, входящих в достаточные множества, построенные вдоль цикла, и, следовательно остается допустимым во всех состояниях цикла. Однако если одно из состояний з' является вполне раскрытым (что означает ample(s') = enabled(s')), то переход а будет неизбежно включен в ample(s') вопреки предположению о том, что он ни разу не был выбран. О Эффективные меры, обеспечивающие соблюдение условия СЗ, основаны на специальной стратегии поиска, применяемой для порождения сокращенного пространства состояний. При поиске в глубину с возвратом мы вправе воспользоваться тем обстоятельством, что всякий цикл содержит дугу, ведущую назад в одну из вершин в стеке поиска. Такая дуга называется также дугой возврата. Следовательно, мы можем усилить СЗ следующим образом. СЗ'. Бели состояние s не вполне раскрыто, то ни один переход из ample(s) не может достичь никакого состояния в стеке поиска. Мы будем поэтому всегда стремиться выбрать достаточное множество, в котором не содержится дуга возврата. Если нам это не удастся, то текущее состояние становится вполне раскрытым.
216 Глава 10. Редукция частичных порядков При поиске в ширину обход совершается по уровням; каждый уровень к образован множеством состояний, достижимых из начального состояния за к переходов. Необходимое условие замыкания цикла при поиске в ширину таково: переход, применимый к состоянию s на текущем уровне, ведет в состояние того же или предшествующего уровня. Это условие не является достаточным, и поэтому его применение для определения момента замыкания цикла вынуждает нас делать вполне раскрытыми больше состояний, чем необходимо. 10.5.2. Эвристики для достаточных множеств В свете результатов о сложности, полученных в разд. 10.5.1, мы приведем ряд эвристических приемов для вычисления достаточных множеств. Наши алгоритмы будут определяться моделью вычислений. Мы будем рассматривать разделяемые переменные, а также обмен сообщениями подтверждением передачи и с очередями. Во всех этих моделях вычислений используется понятие счетчика команд, которое является составной частью состояния. Мы будем использовать запись pci(s) для обозначения показание счетчика команд процесса Pi в состоянии з. Для описания алгоритма понадобятся следующие обозначения. ¦ Обозначим через рге(а) множество переходов, содержащее все те переходы, выполнение которых делает а допустимым. Более строго, рге(о) содержит все переходы /?, для которых существует такое состояние я, что а $ enabled(s), 0 € enabled(s) и а € enabled{fi(a)). ¦ Обозначим через dep(ot) множество переходов, зависящих от а, {/9|08,а)€Д}. ¦ Обозначим через Т{ множество всех возможных переходов процесса Pi. Тогда Ti(s) = Т Л enabled(s) обозначает множество переходов процесса Р<, допустимых в состоянии s. ¦ Обозначим через currents) множество переходов процесса Pi, допустимых в некотором таком состоянии s', что pci{s') = pci{s). Примем во внимание, что множество currents) всегда включает Ti(s). В него также могут быть включены запрещенные в состоянии s переходы, счетчики команд которых принимают значение pCi(s). Следует отметить, что на всяком пути, начинающемся в состоянии 8, какой-нибудь переход из currenti (s) должен быть выполнен до того, как смогут быть выполнены другие переходы из Т$. Определения множества рте (а) и отношения зависимости D (которое непо-
10.5. Вычисление достаточных множеств 217 средственно влияет на dep(a)) допускают определенную избыточность. Множество рге(а) может содержать переходы, которые не делают переход а допустимым, а отношение зависимости D может содержать пары переходов, которые на самом деле независимы. Такая свобода позволяет эффективно вычислять достаточные множества, сохраняя при этом корректность редукции. Приведенные выше определения естественным образом распространяются на множества. Например, dep(T) = (J dep(a). ает Далее мы специализируем рге(а) применительно к различным моделям вычислений. Напоминим, что рге(а) включает все переходы, выполнение которых из некоторого состояния может сделать переход а допустимым. Мы построим рге(а) следующим образом. ¦ В множество рге(а) включаются все переходы процессов, содержащих а и способных придать счетчику команд значение, при котором а станет выполнимым. ¦ Если в условии допустимости для а задействованы разделяемые переменные, то в рге(а) включаются все остальные переходы, способные изменять значения этих разделяемых переменных. ¦ Если в а использован обмен сообщениями с очередями, т. е. а отправляет или принимает данные из некоторой очереди q, то в pre (а) включаются все переходы других процессов, соответственно принимающих или отправляющих данные через q. Опишем отношение зависимости для разных моделей вычислений. 1. Любые два перехода, разделяющих переменную, значение которой изменяется хотя бы одним из них, зависимы. 2. Любые два перехода, относящихся к одному процессу, зависимы. В частности, это относится к любой паре переходов из current (я) для всякого состояния s и процесса Р». Следует отметить, что переход, осуществляющий взаимодействие с подтверждением или рандеву, как в CSP или ADA, может рассматриваться как совместный переход, выполняемый обоими процессами. Поэтому он зависит от всех переходов обоих процессов. 3. Два перехода, соответствующие отправлению сообщения с использованием одной и той же очереди сообщений, зависимы, так как выполнение одного из них может повлечь исчерпание очереди и сделает другой переход запрещенным. По сходной причине зависимы также и переходы, соответствующие приему сообщений1. 1Из одной и той же очереди. — Прим. перев. 14 Зак. 271
218 Глава 10. Редукция частичных порядков Нужно иметь в виду, что два перехода из разных процессов, осуществляющие прием и отправление сообщений с использованием одной и той же очереди, независимы. Это объясняется тем, что каждый из них потенциально может сделать другой переход допустимым, но не может сделать его запрещенным. Очевидной кандидатурой на роль ample(s) является множество Тх{а) переходов, допустимых в состоянии s для некоторого процесса Pi. Поскольку все переходы в Tj(e) взаимозависимые, достаточное множество для s должно включать либо все эти переходы, либо ни один из них. Построение достаточного множества для текущего состояния s мы начнем с такого процесса Р<, что Т,(з) Ф S3. Нам нужно проверить, верно ли, что ample(s) = Tj(s) удовлетворяет условию С1. Возможны два случая, при которых сделанный нами выбор нарушает условие С1. В обоих случаях некоторые переходы, независимые от переходов из Ti(s), приводят после выполнения к тому, что какой-нибудь переход а, зависящий от Т{(з), становится допустимым. Выполняемые при этом независимые переходы не могут принадлежать Ti(s), так как все переходы из Pj взаимозависимые. 1. В первом случае а относится к некоторому другому процессу Pj. Необходимое условие для того, чтобы это случилось, состоит в том, что dep(Ti(s)) содержит переход процесса Pj. Указанное условие может быть эффективно проверено путем анализа отношения зависимости. 2. Во втором случае а относится к Pj. Предположим, что переход а, принадлежащий множеству X* и нарушающий условие С1, выполняется в некотором состоянии а'. Переходы, выполняемые на пути из s в я', независимы от Tj(s) и, следовательно, относятся к другим процессам. Поэтому pci(s') = pci{a). Значит, переход а должен принадлежать current (в). Кроме того, о ^ Ti(e), так как иначе этот перход не нарушал бы условие С1. Таким образом, а € currenti(s) \ T{(s). Так как переход а не принадлежит Ti(s), он запрещен в я. Поэтому последовательность переходов из я в я' должна содержать переход изрге(а). Для этого нужно, чтобы множествоpre(currenti(s)\Ti(s)) содержало переходы процессов, отличных от Pj. Это условие также может быть проверено эффективно. В обоих случаях мы отказываемся от 7<(s) в качестве достаточного множества и можем попытаться привлечь на роль ample(s) множество переходов Tj(s) другого процесса. Нужно иметь в виду, что мы придерживаемся осторожного подхода, отказываясь от неко-
10.5. Вычисление достаточных множеств 219 торых достаточных множеств, невзирая на то, что в ходе реальных вычислений условие С1 на самом деле никогда не будет нарушено. Следующая программа проверяет условие С1 для допустимых переходов процесса Р< на основании приведенных выше рассуждений: function check_Cl(s, Pi) for all Pj ф Pi do if dep{Ti(s)) DTj^0 or pre[currenti{a) \T{(«)) ПТ^0 then return False; end if; end for all; return True; end function Функция check_C2 получает на входе множество переходов и возвращает на выходе True, если все переходы этого множества невидимы. В противном случае возвращается False: function check_С2{Х) for all q e X do if visible(a) then return False; return True; end function Процедура check_C3' проверяет, верно ли, что результат выполнения перехода из заданного множества X С enabled(s) уже помещен в стек поиска. Для этого мы используем пометки on_stack и completed, которые наносит состояниям алгоритм, представленный на рис. 10.2. Напомним, что состояние имеет пометку on_stack, если оно помещено в стек поиска: function check _CZ'{s, X) for all a e X do if <m_stack(a(s)) then return False; return True; end function Алгоритм для ample(s) пытается обнаружить такой процесс Р;, что Ti(s) удовлетворяет всем условиям от СО до СЗ. Если такого процесса найти не удается, ample выдает в качестве результата enabled(s): 14*
220 Глава 10. Редукция частичных порядков function ample(s) for all Pi such that Tj(e) ф 0 do if check_Cl(s, Pi) and check_С2(Т{(а)) and check_C3'(8,Ti(s)) then return Ti(s); end if; end for all; return enabled(s); end function В системе SPIN [138,140] реализована [139] редукция частичных порядков. Эвристики, применяемые для выбора достаточных множеств, подобны тем, что были описаны в настоящем разделе. Однако в SPIN для многих состояний условия СО, С1 и С2 вычисляются заранее, когда подлежащая верификации система преобразуется во внутреннее представление. 10.5.3. Редукция на лету В предыдущих разделах этой главы алгоритм верификации моделей был описан как процесс из двух этапов. На первом этапе строится сокращенное пространство состояний. На втором этапе применяется алгоритм проверки на модели для LTL, чтобы удостовериться в правильности формулы для сокращенного графа переходов. На практике многие системы верификации моделей используют более эффективный способ. В них сочетается построение графа переходов и проверка его соответствия спецификации. Как было показано в разд. 9.5, установить, что система нарушает спецификацию, нередко удается на лету, еще до того, как завершится построение графа переходов. Редукцию частичных порядков можно применять в сочетании с верификацией на лету. Единственное условие, которое требует особого внимания, — это условие замыкания цикла СЗ. Циклы в декартовом произведении графа переходов и автомата, задающего проверяемое свойство, совсем не обязательно будут такими же, какие возникают в сокращенном графе переходов, построенном обычным алгоритмом. Для того чтобы убедиться в этом, следует обратить внимание на то, что каждое состояние (s, q) в произведении представляется парой, состоящей из состояния системы s и состояния q автомата, задающего проверяемое свойство. Предположим, что цикл замыкается в состоянии а
10.6. Корректность алгоритма 221 графа переходов. Но в произведении при вторичном прохождении состояния s его напарником может оказаться уже другое состояние автомата. Поэтому ему не удается замкнуть цикл. Однако можно показать [207], что корректной является и проверка условия СЗ' по отношению к циклам произведения. Интуиция подсказывает, что СЗ' предназначено для того, чтобы избежать бесконечно долгой задержки с включением некоторого состояния в сокращенный граф. Это свойство по-прежнему обеспечивается, когда СЗ' применяется к циклам произведения. Формальное обоснование приведено в [207]. Некоторые тонкости возникают, когда процедура двойного DFS, описанная в разд. 9.3, применяется в сочетании с редукцией частичных порядков. В этом случае порядок обхода вершин графа может быть различным на первом и втором этапах поиска. Вследствие этого циклы на данных этапах могут замыкаться в разных состояниях. Следовательно, между двумя этими этапами должна циркулировать некоторая дополнительная информация, чтобы обеспечить выбор одинаковых достаточных множеств на обоих этапах [141]. Ю.в. Корректность алгоритма Пусть М — нередуцированный граф переходов некоторой системы, а М' — сокращенный граф переходов, построенный алгоритмом редукции частичных порядков, описанным в разд. 10.1. Строкой будем называть последовательность переходов из Т. Рассмотрим множество Т* всех строк над Т. Для конечной или бесконечной строки v запись vie(v) будет обозначать проекцию и на множество видимых переходов. Таким образом, если а и b — видимые переходы, а с и d — невидимые, то vis(abddbcbaac) = abbbaa. Мы будем использовать запись tr{a) для обозначения последовательности переходов на пути а. Пусть v, w — две конечные строки. Будем использовать запись v с w, если v может быть получена из w удалением одного или более переходов. Например, abbcd С aabcbccde. Обозначение vQw применяется в случае, когда и = w или v с w. Будем использовать запись а о г) для обозначения конкатенации путей а и г) в М при условии, что путь <т — конечный и последнее состояние last(a) в а совпадает с первым состоянием firstffl) в т). Длиной пути а назовем число дуг в ег; эту длину обозначим |а|. Пусть а — некоторый бесконечный путь, исходящий из начального состояния графа переходов М. Мы построим бесконечную по-
222 Глава 10. Редукция частичных порядков следовательность путей тго, fl"i, ¦ •., начинающуюся с тго = о. Каждый путь щ представим в виде щ o0j, где щ имеет длину г. Предположим, что мы уже построили пути 7Го, - - - ,7Г^; опишем теперь, как устроен путь 7Г,+1 = »7»+1 о 0»+i- Пусть so = last(rfi) = firstiBi) и а — переход, помечающий первую дугу в^ Будем считать, что а - во=Я „ °1у . aat "i = «О > »1 > «2 > • • • Возможны два случая. A. Пусть а е ample(so). Тогда положим jjj+1 = щ о (во -2+ a(so)). В качестве 0<+i будем использовать 8\ -^> вг -^> ..., т. е. 0j без первой дуги. B. Пусть а ? ample(so). Согласно С2 все переходы из ample(s0) должны быть невидимы, поскольку состояние so не вполне раскрыто. Тогда вновь возникают следующие два варианта, В1 и В2. 81. Некоторый переход 0 из ampfe(so) появляется в 0< после выполнения последовательности переходов аосцаг. ..atk-i, т. е. /? = а*. Тогда в М имеется путь с _ » JL. at. \ ао=Р at. \ _?_lv °*~1 дг« \ a»+.' „ а*+? ? = S0 > P(S0) > P(8l) > • • • > P(Sk) > Sjfc+2 ? . . . , в котором переход /? поставлен перед a0aiQ2 .. • од_1. Поскольку /?(а*) = «k+i, мы приходим к выводу, что f}{sk) -^ зц.+2 совпадает С Sfc+i > Sjk+2. 82. Некоторый переход C из ampfe(so) не зависит ни от одного перехода, встречающегося в в{. Тогда в М имеется путь « = »оЛ /?(s0) a-^a /?(*) -% /?(s2)... , в котором /? вначале применяется к во, а каждое последующее состояние этого пути — это результат применения /? к соответствующему состоянию в{. а В обоих вариантах r)i+i =^о (s0 —> РЫ)), и путь 0j+i образуется а из ? после удаления первого перехода so —> /?(so). Обозначим символом т) путь, имеющий щ в качестве префикса длины 1. Путь »; определен корректно, поскольку щ образуется из j^_i за счет добавления единственного перехода.
10.6. Корректность алгоритма 223 Лемма 26. Для всякой пары i,j, j ~? i ^ 0, справедливы следующие соотношения: 1) Я"» ~,< Kj\ 2) vi8(tr(ni)) = vis(tr(irj)); 3) если 4» и ^ — такие префиксы путей тг< и it, соответственно, что vis(tr($i)) = vis(tr(Si)), то ?Ий)) = ?М6))- Доказательство. Достаточно рассмотреть случай, когда t = j +1. Возможны три способа построения яч+1 из я<. В случае А имеем 7г»+1 = 7г<, и все три утверждения леммы, очевидно, справедливы. Далее обратимся к варианту В1, в котором 7Tj+i получается из -Ki за счет того, что некоторый невидимый переход jfl выполняется в 7г,+1 ранее, нежели в я-,-. В таком случае заменим последо- оо си. »*-2 0 вательность во —> «i —> • • • —* 8*_1 —> в* последовательностью а0 —? /?(ао) -^ /?(«i) -^ •• -^ ^(•sit-i)- Так как переход /? невидим, соответствующие состояния помечены одинаково, т. е. L(si) — L@(si)) для всякого /, 0 < / < к. Порядок следования видимых переходов остается также неизменным. Отсюда немедленно вытекают утверждения 1), 2) и 3). Наконец, в случае В2 путь яч+1 отличается от щ тем, что в 7Tj+i присутствует дополнительно невидимый переход 0, так как мы заменили в 7г< некоторый суффикс зо -^Ч s\ -2l> ... последовательностью so —> /3(so) а^~^ &(si) ~^ P(s2) ~^ ••• В результате L(si) = L@(si)) для всякого 1^0. Порядок видимых действий вновь остается неизменным. Как и в предыдущем случае, отсюда немедленно следуют утверждения 1), 2) и 3). ? Лемма 27. Рассмотрим путь г), представляющий собой предел последовательности конечных путей щ. Тогда rf содержится в сокращенном графе переходов М'. Доказательство. Воспользуемся индукцией по длине префиксов % пути г}. Базис индукции — путь %, состоящий из единственного состояния, каковым является начальное состояние из 5. В соответствии с алгоритмом редукции все начальные состояния включены в ¦S". Для обоснования индуктивного перехода предположим, что путь i]i содержится в М'. В таком случае следует заметить, что »ft+i получен из щ присоединением к нему перехода из атр1еAаа^щ)). ? Последующие три леммы будут использоваться для демонстрации того, что путь г), построенный как предел последовательности
224 Глава 10. Редукция частичных порядков конечных путей тц, содержит все видимые переходы а, расположенные в том же порядке. Лемма 28. Пусть а — первый переход в 0j. Тогда существует такое j, j > i, что а — последний переход в T]i и для каждого к, i < к < j, переход а — первый переход в 0*. Доказательство. Согласно приведенному в начале этого раздела построению, если а — первый переход в в к, то либо а остается первым переходом в вк+i (случай В), либо он становится последним переходом в щ+i (случай А). Нам нужно показать, что первая альтернатива невозможна для всех без исключения к ^ i. Допустим противное. Пусть s* = first{6k). Рассмотрим бесконечную последовательность Si, s»+i,... Согласно указанному выше построению для некоторого 7t G ample(sk) выполняется соотношение вк+i = 7*(8*)- Кроме того, поскольку а является первым переходом в 0* и не был выбран в случае А для занесения в щ+i, переход а должен принадлежать множеству enabled(sk) \ ample(sk). Так как множество состояний 5 конечно, найдется некоторое состояние а*, которое впервые повторится в последовательности sj,Sj+i,... Таким образом, у нас образуется цикл Sk,&k+i,-- -sr, в котором sr = Sk, и а не фигурирует ни в одном из достаточных множеств. Тем самым нарушается условие СЗ. ? Лемма 29. Пусть -у — первый видимый переход в последовательности 0j, и pre/ix7@j) — это максимальный префикс из tr@i), не содержащий переход 7- Тогда справедливо одно из следующих утверждений: ¦ 7 — первый переход в 0j и последний переход в Tfr+i; ¦ 7 — первый видимый переход в 0j+i, последний переход в щ+i невидим, и prefix^{Oi+i) С prefixy(&i). Доказательство. Первое из утверждений леммы справедливо, когда переход 7 выбран из ample(si) и становится последним переходом в rii+i в случае А нашего построения. Если этого не случилось, то существует иной переход /3, который после присоединения к r?j образует Oi+i. Переход fi не может быть видимым. Если бы это было так, то в соответствии с условием С2 выполнялось бы равенство ample(si) = enabled(8i). Согласно случаю В1 нашего построения ft был бы первым переходом в 0<. Но это противоречит тому, что /? — видимый переход, предшествующий 7 в в%.
10.6. Корректность алгоритма 225 Есть три возможности: 1) Р появляется в 0< ранее у (вариант В1 нашего построения); 2) /? появляется 0i вслед за у (вариант В1 нашего построения); 3) /3 не от переходов из 6i (вариант В2 нашего построения). Согласно приведенному выше построению путей, если реализуется возможность 1), то prefix^(9i+i) С preftx7Fi), так как при построении пути 0j+i переход /9 удаляется из префикса пути 0< ранее, чем 7- В остальных случаях prefiXy(#i+i) С prefixy(9i), так как префикс пути 0j+i, предшествующий переходу у, состоит из тех же самых переходов, что и соответствующий префикс пути 0j. ? Лемма 30. Пусть v — префикс пути vis(tr(a)). Тогда существует такой путь щ, что v = vis(tr(r)i)). Доказательство. Проведем индукцию по длине префикса v. Базис индукции для \v\ = 0 обосновывается просто. Для обоснования индуктивного перехода мы должны доказать, что если vy — префикс vis(tr(a)), и имеется путь щ, обладающий свойством visftrfa)) = v, то существует такой путь щ, где j > i, что vis(tr(r]j)) = vy. Таким образом, нам нужно показать, что 7 будет рано или поздно добавлен к щ для некоторого j, j > г, и при этом никакой видимый переход не будет добавлен к щ для всякого k, i < к < j. Согласно нашему построению пути для случая А нам разрешается присоединять видимый переход к пути tj* для получения q^+i только тогда, когда он является первым переходом в 0*. Лемма 29 показывает, что 7 остается первым видимым переходом в путях #*, формируемых вслед за 0i, до тех пор пока он не будет добавлен к некоторому щ. Кроме того, последовательность переходов, предшествующих у, может только сокращаться. Лемма 28 свидетельствует о том, что первый переход в каждом пути вк будет рано или поздно оттуда удален и присоединен к некоторому пути гц, где I > к. Значит, и у будет когда-то присоединен к последовательности t)j. ? Теорема 12. Системы переходов М и М' эквивалентны по прореживанию. Доказательство. Всякий бесконечный путь в М\ исходящий из начального состояния, является также и путем в М, так как он исходит из начального состояния системы М и образован в результате
226 Глава 10. Редукция частичных порядков последовательного применения переходов системы М. Нужно пока- зать, что для всякого пути а — «о —> «1 —> ... в Ла из начального состояния so найдется такой путь я = го —> т\ —* ... в М , что a ~,t п. Покажем, что путь я, устройство которого определено в начале этого раздла, будет эквивалентен пути а после прореживания. Сначала мы покажем, что а и я имеют одну и ту же последовательность видимых переходов, т. е. via(tr{a)) = vis(tr(rj)). Согласно лемме 30 путь я содержит видимые переходы пути а в том же самом порядке, поскольку для каждого префикса пути с, имеющего m видимых переходов, существует префикс щ пути я с теми же m видимыми переходами. С другой стороны, а должен содержать видимые переходы из я в том же самом порядке следования. Возьмем произвольный префикс щ пути я. По лемме 26 путь 7г* = щ о в% имеет те же видимые переходы, что и яо = а. Значит, в а есть префикс, содержащий ту же последовательность видимых переходов, что и т/». Далее мы построим две бесконечные последовательности индексов 0 = to < ti < ... и 0 = jo < ji < • ¦ •, которые выделяют соответствующие прореживающие блоки в а и я, как того требует определение эквивалентности по прореживанию. Предположим, что оба пути а — 7Го и г) имеют не менее я. видимых переходов. Пусть t„ — это длина кратчайшего префикса &„ пути а, содержащего в точности п видимых переходов. Пусть jn — длина кратчайшего префикса гцп пути ч), содержащего ту же самую последовательность видимых переходов, что и f*п. Напомним, что п,-п является префиксом пути 7г7„. Тогда согласно п. 3 леммы 26 справедливо равенство L(sin) = L(rjn). Из определения видимых переходов нам известно, что при п > 0 равенство L(st) = L(si„_1) выполняется для всех к, in-i ^ к ^ tn — 1, потому что t„_i — это длина наименьшего префикса &„_, пути а, содержащего в точности п — 1 видимых переходов. Таким образом, между tn_i и tn — 1 нет видимых переходов. Аналогично обосновывается равенство L{r{) = L(sjn_1) для всех jn-\ ^ J ^ Jn — 1- Бели оба пути а и я имеют бесконечно много видимых переходов, то этот процесс создает две бесконечные последовательности индексов. В случае когда а и я содержат только конечное число яг видимых переходов, мы получаем, что L{sk) = L(sin_1) для А; > tm и L(ri) = L{8jn_x) для / > jm. Тогда мы будем полагать t'*+i = t* +1 и jfc+i = j't + 1 для к ^ яг. Как было установлено ранее, для к ^ 0 блОКИ СОСТОЯНИЙ 8{к ,8{к+1,... в<ь+1_1 И Tjk , rjk+i,... rjh+1 _i СООТВвТ- ствуют друг другу при прореживании и несут одинаковую разметку. Таким образом, а ~,t я. D
10.7. Редукция частичных порядков в системе SPIN 227 10.7. Редукция частичных порядков в системе SPIN SPIN [138, 140] — это система верификации моделей для логики LTL на лету с использованием явного перечисления состояний и редукции частичных порядков. Она была разработана Жераром Гольцманом и Дороном Пеледом в лаборатории Белла. Это инструментальное средство использовалось главным образом для верификации асинхронных программных систем и, в частности, коммуникационных протоколов. Оно способно выявлять в моделях программ взаимную блокировку, недостижимые участки кода, а также определять вьшолнимость ЬТЬ-спецификаций, основываясь на алгоритме трансляции [124], описанном в разд. 9.4. Для ограничения пространства поиска состояний в нем используется редукция частичных порядков [139, 207]. Входной язык для системы SPIN, носящий название PROMELA, был разработан Жераром Гольцманом. В состав этого языка входят синтаксические конструкции нескольких различных языков программирования. Выражения языка Promela унаследованы от языка С [153]. В частности, в этом языке используются операции '==' (равно), '!=' (не равно),' II' (логическое или), '**' (логическое и),'%' (остаток от деления). Присваивание обозначается одинарным символом '='. Отрицание обозначается приписыванием в начале булевого выражения операции '!'. Синтаксис команд взаимодействия унаследован от CSP [137]. Посылка сообщения с тегом tg и значения vali, иа/г, ••-, valn по каналу ch обозначается ch! tg(vo/i, vah,..., vain) в процессе-отправителе. Прием сообщения с тегом tg по каналу ch обозначается ch?tg(uori, «агг,.. •, var„) в процессе-получателе. Сообщение состоит из п значений, которые заносятся в переменные vari,var2,... ,varn- В системе SPIN разрешается передача нетегированных сообщений. В языке применяется обмен сообщениями как с очередностью, так и с установлением соединения2. При обмене сообщениями с очередностью значения переменных первоначально поступают в канал некоторой фиксированной емкости, благодаря чему процесс-отправитель может перейти к следующей команде, несмотря на то что процесс-получатель еще не 2В оригинале handshaking. — Прим персе.
228 Глава 10. Редукция частичных порядков if do : guards —> Si : guards —> Эг : guardn —> Sn : guardi —> Si : диага\ —> 5г : guardn ~> &» fi od Рис. 10.9. Условные операторы и циклы в SPIN готов к обработке поступающих данных. Для обмена сообщениями с установлением соединения в SPIN вводится канал емкости 0, и команды посылки и приема по одному и тому же каналу с одним и тем же тегом (если таковой имеется) исполняются одновременно. Результатом является присваивание volt переменной vau, 1 ^ i ^ п. Условные операторы и операторы цикла основаны на охраняемых командах Дейкстры [95]; их синтаксис приведен на рис. 10.9. Каждый предохранитель состоит из условия, команды посылки- приема сообщений или их обоих. Предохранитель считается открытым, если содержащееся в нем условие выполнено и его команда посылки-приема сообщений не заблокирована. При обмене сообщениями с очередностью команда посылки сообщения заблокирована, если очередь канала исчерпана; команда приема сообщения заблокирована, если канал пуст. Обмен сообщениями с установлением соединения заблокирован, если всего лишь один из взаимодействующих процессов готов к посылке или приему. При исполнении оператора if и при каждой итерации оператора цикла do недетерминированно выбирается один из открытых предохранителей guardi и выполняется соответствующая ему команда 5». Цикл do выполняется до тех пор, пока либо команда goto не заставит совершить переход к метке за пределами цикла, либо команда break не вынудит обратиться к первой команде, следующей за циклом do. Редукцию, проводимую методом достаточных множеств, описанным в разд. 10.3, мы проиллюстрируем на примере алгоритма выбора лидера, предложенного Долевым, Клау и Роде [102]. Этот алгоритм работает на кольце из N процессов. Каждому процессу первоначально присвоен уникальный номер. Цель алгоритма — отыскать наибольший из номеров, присвоенных процессам. Кольцо процессов — однонаправленное; поэтому каждый процесс может принять сообщение от соседа слева и отправить сообщение соседу справа.
10.7. Редукция частичных порядков в системе SPIN 229 #define noLeader (number_leaders == 0) #define oneLeader (number.leaders ==1) byte number.leaders = 0; #define N 6 /* количество процессов в кольце */ (define L 12 /* 2xN */ byte Ij mtype = { one, two, winner }; chan q[N] = [L] of { mtype, byte }; proctype PCchan in, out; byte my_val) { bit Active = 1, know_winner = 0; byte number, max = my_val, neighbor; out!one(my_val); do :: in?one(number)-> /«Получить значение от актив, соседа слева*/ if :: Active -> if : number != max -> out!two(number); neighbor = number : else -> know.winner = 1; out!winner(number); fi :: else -> out!one(number) fi Рис. 10.10. Алгоритм выбора лидера на языке Pro me la Первоначально каждый процесс Pi является активным и хранит целое число в локальной переменной my_val. До тех пор пока процесс Pi активен, он ответственен за некоторую величину. Эта величина может изменяться при выполнении алгоритма. Текущая величина хранится процессом Pi в переменной шах. Процесс становится пассивным, как только он обнаруживает, что хранимая им величина не является наибольшей. Пассивный процесс способен лишь передавать сообщения слева направо. Каждый активный процесс Pi отправляет хранимую им величину направо и ожидает получения ве-
230 Глава 10. Редукция частичных порядков :: in?two(number)-> /«Получить 2-ое значение от соседа слева*/ if : Active -> if : neighbor > number fct neighbor > max -> max = neighbor; out!one(neighbor) : else -> Active = 0 /» Стать пассивным */ fi :: else -> out!two(number) fi : in?winner(number) -> if : know_winner :: else -> out!winner(number) fi; break od > Рис. 10.11. Алгоритм выбора лидера на языке Promela (продолжение) личины от ближайшего слева активного процесса Pj. Эта величина принимается при помощи команды взаимодействия с тегом one. Бели величина, полученная процессом Pi, совпадает с величиной, которую он отправил, то Pi приходит к выводу о том, что он единственный активный процесс и его величина является максимальной. Тогда процесс Р< отправляет эту величину направо с тегом winner. Всякий другой процесс получает это значение и переправляет его направо всего один раз, в результате чего все процессы могут узнать имя победителя. Если же величина, полученная процесом Pi, не совпадает с тем значением, которое он отправил, то процесс Pi ожидает поступления второго сообщения с тегом two, содержащего величину, которую хранил второй ближайший слева активный процесс Р*. После этого Pi сравнивает хранимую им величину с теми значениями, которые были им получены от Pj и Р*. Если значение, полученное от Pj, является наибольшим из трех, то процесс Р,- сохраняет эту величи-
10.7. Редукция частичных порядков в системе SPIN never { /* !(noLeader U [] oneLeader) */ TO.init: if :: (! ((noLeader))) -> goto T0_S28 :: (! ((noLeader)) kk ! ((oneLeader))) -> goto accept_all :: A) -> goto T0_S9 :: (! ((oneLeader))) -> goto accept_S1 fi; accept_Sl: if :: (! ((noLeader))) -> goto T0_S28 :: (! ((noLeader)) kk ! ((oneLeader))) -> goto accept_all :: A) -> goto T0_S9 : (! ((oneLeader))) -> goto TO.init fi; accept_S9: if :: (! ((noLeader))) -> goto T0_S28 :: (! ((noLeader)) kk ! ((oneLeader))) -> goto accept_&11 : A) -> goto T0_S9 :: (! ((oneLeader))) -> goto T0_init fi; accept_S28: if :: A) -> goto T0.S28 :: (! ((oneLeader))) -> goto accept.all fi; T0_S9: if :: (! ((noLeader))) -> goto T0_S28 :: (! ((noLeader)) kk ! ((oneLeader))) -> goto accept_S28 :: (! ((noLeader)) kk ! ((oneLeader))) -> goto accept.all :: (! ((oneLeader))) -> goto accept_S9 : A) -> goto T0_S9 :: (! ((oneLeader))) -> goto accept_S1 fi; T0.S28: if :: A) -> goto T0_S28 :: (! ((oneLeader))) -> goto accept.all fi; accept.all: } Рис. 10.12. Спецификация never claim
232 Глава 10. Редукция частичных порядков ну. Таким образом, Р< начинает играть роль ближайшего активного процесса Р,. В противном случае Pi становится пассивным. Выполнение алгоритма может быть разбито на этапы. На каждом этапе, за исключением последнего, все активные процессы получают сообщения с тегом one и two. На последнем этапе единственный уцелевший процесс получает свою собственную величину с сообщением, помеченным one, и это значение распространяется по кольцу. Протокол обеспечивает наименьшую сложность по обмену сообщениями 0(N х log(iV)). Эта оценка сложности соблюдается, поскольку по меньшей мере половина активных процессов становятся пассивными на каждом этапе3. Для того чтобы убедиться в этом, рассмотрим случай, когда Pi остается активным. Тогда величина процесса Pj должна превосходить величины процессов Р$ и Р*. Бели Pj также уцелел, то величина процесса Р* должна превосходить величину процесса Pj. Таким образом, мы приходим к противоречию. Это означает, что на каждом этапе, кроме последнего, если некоторый процесс остается активным, то его ближайший слева активный сосед должен стать пассивным. На каждом этапе количество отправленных сообщений ограничено величиной 2 х N, поскольку каждый процесс получает два сообщения от соседа слева. Программа на языке Promela, реализующая алгоритм выбора лидера, представлена на рис. 10.10-10.11. Мы не указываем фрагмент кода, инициализирующего процессы. Он включает присвоение различных чисел каждому процессу и запуск выполнения алгоритма. Канал q[(i + 1)V,N] используется для посылки сообщений от процесса Pi к процессу P(j+i)xjv, где V.N обозначает остаток от деления на N. Проверяемое нами свойство представлено формулой noLeader U G oneLeader. Эта формула утверждает, что при всяком исполнении лидер не объявляется до тех пор, пока спустя некоторое время он не будет выбран. Начиная с этого момента лидер всегда будет один. Предикаты noLeader и oneLeader определяются как number_leaders==0 и number_leaders==l соответственно. 33десь сложность по обмену сообщениями определяется как суммарное количество команд посылки сообщений, выработанных всеми процессами на протяжении вычисления. Поскольку пассивные процессы не вырабатывают новых команд посылки сообщений, а лишь ретранслируют полученные сообщения, то в приведнном примере сложность по обмену сообщениями просто равна суммарному числу команд посылки сообщений, выполненных активными процессами. — Прим. перев.
10.7. Редукция частичных порядков в системе SPIN 233 Отрицание проверяемого свойства автоматически преобразуется в автомат Бюхи по алгоритму, описанному в разд. 9.4. На дополнительном этапе минимизации вершины, имеющие одинаковые структуры ветвления, склеиваются. Автомат описывается при помощи специальной синтаксической конструкции Promela, которая называется never claim. Такое название объясняется тем, что автомат, полученный в результате трансляции отрицания проверяемого свойства, задает вычисления, которые никогда не должны произойти. Для указанного выше свойства конструкция never claim приведена на рис. 10.12. Метка каждой начальной вершины содержит слово init, а метка каждой допускающей вершины содержит слово accept. Система SPIN строит пересечение автомата never claim и автомата, выделенного из программы. Пересечение строится на лету посредством алгоритма DFS двойного поиска в глубину, представленного в разд. 9.3, и редукции частичных порядков. Если пересечение непусто, то выдается трасса ошибки. Результаты эксперимента приведены в таблице на рис. 10.13. Для проведения экспериментальных вычислений использовалась вычислительная машина SGI Challenge. Объем использованной памяти в таблице указан в мегабайтах. Верификация алгоритма с пятью и шестью процессами без использования редукции частичных порядков не завершилась. В таблице показано, что в случае пяти процессов верификация без использования редукции частичных порядков все еще продолжалась спустя сорок часов. Результаты этого эксперимента отчетливо показывают, насколько редукция частичных порядков способна смягчить эффект «комбинаторного взрыва». проц. 3 4 5 6 нередуцированные состояния память время 15929 1.801 13.8 сек 522255 15.727 9.3 мин >128 >40 ч редуцированные состояния 1435 8475 57555 434083 память 1.493 1.698 3.234 15.625 время 0.6 сек 3.5 сек 28.7 сек 4.1 мин Рис. 10.13. Результаты экспериментов с частичной редукцией порядков
л л Эквивалентности J. _1_ и квазипорядки на моделях В этой главе мы покажем, как избежать проблемы «комбинаторного взрыва» числа состояний с помощью методов, позволяющих замещать большие модели более мелкими моделями, которые обладают теми же самыми свойствами. В главе 10 мы уже ознакомились с одним из методов такого рода, использующим редукцию частичных порядков для сокращения размера моделей, сохраняя при этом истинность LTL-формул, в которых не задействован оператор next time. В более общем случае нам бы хотелось отыскать для заданной логики С и модели М некоторую модель М' меньшего размера, на которой выполняется в точности такое же множество формул логики С, что и на модели М. Для достижения этой цели нам потребуется такое понятие эквивалентности моделей, которое будет эффективно вычислимо и сможет гарантировать, что две эквивалентные модели выполняют одно и то же множество формул из С. Вначале мы рассмотрим логику CTL* и бисимуляционную эквивалентность [205]. Удобно присоединить множество начальных состояний So и множество атомарных высказываний АР ко всякой модели М. Таким образом, типичная модель будет иметь вид М = (AP,S,R,So,L). Бели к тому же учитывается и справедливость, то модель примет вид М = (АР, S, R, So, L, F). Иногда бывает необходимо преобразовать модель без допущений справедливости в такую, где они есть, сохраняя при этом множество путей, рассматриваемых как вычисления. Этого можно добиться, полагая F — {S}. Пусть М = (AP,S,R,S0,L,F) и М' = (АР, S', R', S'0, V, F') - две модели с одним и тем же множеством атомарных высказываний АР. Отношение В С S х S' называется отношением бисимуляции между М и М', если для любой пары состояний s и s' моделей М и М' соответственно, находящихся в отношении В(з, з'), выполняются следующие условия: 1) L(s) = L'(s'); 2) Для любого состояния 8\, для которого выполняется отношение R(s,8i), найдется состояние si, для которого выполняются отношения Я'(з',в1) и B(8i,s'1);
235 3) Для любого состояния s[, для которого выполняется отношение JZ(s',si), найдется состояние ei, для которого выполняются отношения R(s,si) и B(8i,a[). Модели М и М' считаются бисимуляционно эквивалентными (это отношение обозначим М = М'), если существует такое отношение бисимуляции В, что для всякого начального состояния во из So в модели М найдется начальное состояние в0 из S0 в модели М', для которого выполняется отношение 2?(во,«0). И, кроме того, для всякого начального состояния я'0 из 5q в модели М' найдется начальное состояние so из So в модели М, для которого выполняется отношение B(s0,s'0). На рис. 11.1 и 11.2 представлены простые примеры бисимуляционно эквивалентных моделей. Рисунки показывают, что развертка модели, а также копирование отдельных ее фрагментов могут привести к бисимуляционно эквивалентным моделям. На рис. 11.3, напротив, приводится пример моделей, не являющихся бисимуляционно эквивалентными. Для того чтобы убедиться в этом, следует заметить, что состояние, помеченное Ь в модели М', не соответствует никакому состоянию, помеченному о в модели М, поскольку ни одно из таких состояний не имеет двух последователей, один из которых помечен с, а другой — d. Лемма, которая приводится ниже, важна для установления взаимосвязи между логикой CTL* и бисимуляционной эквивалентностью. Будем говорить, что два пути тг = sq,si,. .. в модели М и 7г' = s'0,8i,... в модели М' соответствуют друг другу, если для любого г, i > 0, справедливо отношение B(«j,eQ. Лемма 31. Пусть вив' — два состояния, для которых выполняется B(s,s'). Тогда для всякого пути, начинающегося из в, найдется соответствующий ему путь, начинающийся из в', и наоборот, для всякого пути, начинающегося из в', найдется соответствующий ему путь, начинающийся из з. Доказательство. Допустим, что имеет место отношение В(в,з'). Рассмотрим произвольный путь ir = во, *i,... из во = в. Мы построим соответствующий ему путь ж' = в0, в[,... из s' = s'0 по индукции. Ясно, что отношение 2?(во,в0) выполняется. Допустим, что В(в<,в^) выполняется для некоторого i. Покажем, как выбрать s'i+1. Поскольку имеют место отношения Bfa, в?) и R(si, 8i+i), обязательно должен существовать такой последователь f состояния s\, что выполняется отношение B(si+i, f). В качестве e'i+l мы выбираем t'.
236 Глава 11. Эквивалентности и квазипорядки на моде Рис. 11.1. Развертка сохраняет бисимуляцню Рис. 11.2. Дублирование сохраняет бисимуляцню Рис. 11.3. Две бясимуляционно неэквивалентные модели
237 Построение по заданному пути ж' из а' соответствующего пути 7Г из s осуществляется аналогично. ? Следующая лемма показывает, что если два состояния бисимуляци- онно эквивалентны, то в них выполнятся одно и то же множество CTL*-формул состояния, и если два пути соответствуют друг другу, то на них выполняется одно и то же множество формул пути. Лемма 32. Пусть / — это либо формула пути, либо формула состояния. Предположим, что состояния я и в' бисимуляционно эквивалентны, а пути 7Г и я-' соответствуют друг другу- Тогда ¦ если / — это формула состояния, то * (= / & а' (= /; ¦ если / — это формула пути, то 7Г \= f & it' |= f. Доказательство. Воспользуемся индукцией по структуре формулы /. Базис: f = р, где р € АР. Из отношения В(з,а') следует, что L(a) = L(a'). Таким образом, s \= р тогда и только тогда, когда а' (= р. Индуктивный переход: рассмотрим ряд случаев. 1. Пусть / = -i/i — формула состояния. Тогда s(=/ & s^h «*• & в' fc fi (предположение индукции) & * «'И/- Те же самые рассуждения применимы и в случае, когда / — формула пути. 2. Пусть / = /i V /2 — формула состояния. Тогда 8 \= f <$ s ^= /1 или а [= /2 <$ <& s' (= /i или s' |= /2 (предположение индукции) •» * s'\=f. Мы можем воспользоваться теми же рассуждениями и в случае, когда / — формула пути. 3. Пусть / = /i Л /г — формула состояния. Этот случай подобен рассмотренному выше. И те же самые аргументы применимы, когда / — формула пути. 4. Пусть / = ЕД — формула состояния. Допустим, что a \= f. Тогда существует такой путь т, начинающийся из а, что щ (= Д. По лемме 31 в модели М' имеется соответствующий ему путь ir[,
238 Глава 11. Эквивалентности и квазипорядки на моделях начинающийся из з'. По предположению индукции tti р Д тогда и только тогда, когда п[ |= /i. Поэтому s' р Е Д. Те же рассуждения применимы для доказательства того, что из условия а' р / следует, что 8 р /. 5. Пусть / = А Д — формула состояния. Этот случай подобен рассмотренному выше случаю / = Б /i. 6. Пусть / — Д, где / — формула пути, а Д — формула состояния. Хотя длина формул / и Д одна и та же, мы вправе полагать, что / = path(/i), где path — специальный оператор, превращающий формулу состояния в формулу пути. Мы просто упрощаем запись /, опуская оператор path. Если so и s'0 — первые состояния путей тг и тг' соответственно, то тг р / 4* а0 (= Д <4> & s'o N Л (предположение индукции) <=> <* *'р/. 7. Пусть / = X Д — формула пути. Допустим, что тг (= /. По определению оператора nexttime1 имеем тг1 р Д. Так как тг и тг' соответствуют друг другу, пути тг1 и тг' также являются соответствующими. Поэтому, принимая во внимание индуктивное предположение, приходим к заключению, что тг' р Д, откуда следует, что тг' р /. Те же рассуждения применимы для доказательства того, что из тг' р / следует, что тг р /. 8. Пусть / = Д U Д — формула пути. Допустим, что тг (= Д U Д. По определению оператора until существует такое к, что тг* р Д и для всякого j, 0 < J < к мы имеем тг-7 р Д. Поскольку тг и тг' соответствуют друг другу, пути ttj и п'3 будут также соответствующими для всякого j. Поэтому, принимая во внимание индуктивное предположение, приходим к заключению, что тг'* р Д и тг'-7 р Д для всякого j, 0 ^ j < к. Отсюда следует, что тг' р /. Те же рассуждения применимы для доказательства того, что из тг' р / следует, что тг|=/. 9. Пусть / = Д R /а — формула пути. Этот случай подобен рассмотренному выше. D Из доказанной леммы вытекает следующая теорема. 1 Напомним, что запись тг' обозначает суффикс пути ir = во,«i,...,*{,..., начинающийся в состоянии *<. — Прим. ред.
239 Теорема 13. Если имеет место отношение В(з, з'), то для всякой CTL'-формулы / мы имеем » \= / «• •' N / • Если две модели бисимуляционно эквивалентны, то каждое начальное состояние одной из них бисимуляционно эквивалентно некоторому начальному состоянию другой. Ввиду того, что формула выполняется на модели тогда и только тогда, когда эта формула выполняется в каждом начальном состоянии модели, на обеих моделях будет выполняться одно и то же множество CTL*-формул. Теорема 14. Если выполняется отношение М — М', то для любой CTL*-/ формулы мы имеем М \= f & M'\=f. Обратная теорема также верна. Если две модели удовлетворяют одному и тому же множеству СТ1/-формул, то они бисимуляционно эквивалентны. На самом деле можно показать, что если две модели удовлетворяют одному и тому же множеству CTL-формул, то они бисимуляционно эквивалентны. Отсюда следует, что если две модели можно различить при помощи формулы CTL* (т. е. если существует CTL'-формула, которая истинна на одной модели, но ложна на другой), то эти модели различимы также и при помощи некоторой формулы из CTL. Эти результаты описаны в [32]. Нужно иметь в виду, что этот результат не подразумевает, что CTL* и CTL имеют одинаковые выразительные возможности. Для сравнения выразительной силы двух логик мы сопоставляем каждой формуле множество моделей, на которых эта формула верна. Чтобы CTL была так же выразительна, как и CTL*, каждой формуле CTL* должна соответствовать формула CTL, определяющая такое же множество моделей. Однако из [105] известно, что это не так. Напротив, из приведенной выше теоремы следует, что для всякой модели М существует CTL- формула, которая верна на этой модели, но не верна ни на какой модели, не эквивалентной модели М. Понятие бисимуляционной эквивалентности можно распространить на модели с ограничениями справедливости. Пусть М и М' — две модели с ограничениями справедливости. Предположим, что обе они определены над одним и тем же множеством атомарных высказываний АР. Отношение В С S х S' называется отношением
240 Глава 11. Эквивалентности и квазипорядки на моделях справедливой бисимуляции между М и М' тогда и только тогда, когда для всех в и s', находящихся в отношении B(s, s1), выполняются следующие условия: 1) L(s) = L'{s'); 2) для любого справедливого пути я- = sqSi ... из s = «о в М существует такой справедливый путь ж' = s'qS^ ... из s' = з'0 в М', что отношение B(si, sj) вьшолняется для любого г, г ^ 0; 3) для любого справедливого пути 7г' = воа1 • - • из а' = s0 в М' существует такой справедливый путь тг = во*1 • • • из а = «о в М, что отношение Bfa, aj) выполняется для для любого i, t ^ 0. В этом случае модели М и М' считаются бисимуляционно эквивалентными в справедливом смысле (это обозначается М =f М'), если существует такое отношение справедливой бисимуляции В, что для всякого начального состояния so 6 5о в Af найдется такое начальное состояние Sg 6 S'0 в М', для которого вьшолняется отношение B(so,8'0). Кроме того, для всякого начального состояния а0 € S'0 в М' должно существовать такое начальное состояние во € So в М, что вьшолняется отношение J3(so, а0). В случае когда семантика CTL* определяется относительно справедливых путей, мы получаем аналог теоремы 14 для справедливых моделей. Теорема 15. Если М =f М', то для всякой СТЬ*-формулы /, интерпретируемой на справедливых путях, мы имеем M\=Ff О M'\=F f. Обоснование этой теоремы подобно доказательству предыдущей теоремы и поэтому опускается. Иногда бисимуляционная эквивалентность не приводит значительному сокращению числа состояний. Налагая ограничения на логику и ослабляя требование того, чтобы на моделях выполнялось одно и то же множество формул, можно добиться большего сокращения. Для достижения этой цели мы введем понятие отношения симуляции. Симуляция тесно связана с бисимуляцией. Бисимуляции гарантирует, что две модели ведут себя одинаково. Симуляция же связывает модель с ее абстракцией. Поскольку абстракция позволяет скрыть некоторые особенности первоначальной модели, она может быть определена на более узком множестве атомарных высказываний. Симуляция гарантирует, что всякое поведение в исходной модели является также поведением в ее абстракции. Однако абстракция при этом может иметь поведения, которые невозможны в
241 исходной модели. Например, в существующей реализации некоторое событие всегда происходит не позднее двадцатого шага вычисления. А в рамках абстракции это же событие может случиться после произвольного числа шагов вычисления. Если для заданных моделей М и М' выполняется ввключение АР Э АР', то отношение Я С S х S' называется отношением симуляции [191] между М и М' в том и только том случае, когда для любой пары состояний * и s', находящихся в отношении Я(s, а'), выполняются следующие условия: 1) L(s) П АР' = L'(s'); 2) для любого состояния «1, для которого выполняется отношение R(s, si), найдется состояние si, для которого выполняются отношения R'fe'js'i) и H(si,s[). Мы будем говорить, что М' симулирует М (обозначим это отношение М ¦< М'), если существует отношение симуляции Я, при котором для всякого начального состояния 8о в М имеется такое начальное состояние s'0 в М', что выполняется отношение H(sa,s'0). Обратимся вновь к моделям, изображенным на рис. 11.3. Ранее мы убедились, что они не являются бисимуляционно эквивалентными. Теперь мы покажем, что модель М предшествует модели М' по квазипорядку симуляции (М ¦< М'). В качестве отношения симуляции ¦< возьмем отношение, сопоставляющее каждому состоянию из М состояние из М', которое помечено тем же символом. Отношение Ч обладает тем свойством, что если оно связывает состояние з с состоянием з', то любой последователь s имеет соответствующего ему последователя я'. При этом М не симулирует М', так как состоянию М', помеченному Ь, не соответствует никакое состояние в М. А теперь мы убедимся в том, что отношение симуляции является квазипорядком, т. е. рефлексивным и транзитивным отношением. ЛЕММА 33. Отношение < является квазипорядком на множестве моделей. Доказательство. Отношение Н — {(«,*)| s ? S} является отношением симуляции между М и М. Значит, отношение Ч рефлексивно. Таким образом, осталось лишь установить транзитивность отношения Ч. Предположим, что М Ч М' и М' ¦< М". Пусть Но — симуляция между М и М', а Я] — симуляция между М' и М". Обозначим символом Яг реляционное произведение отношений Щ и Hi, т. е. Я2 = {(s,s")\ 3s' [H0(s,s>) АНг(з',з")]}. 17 Зак. 271
242 Глава 11. Эквивалентности и квазипорядки на моделях Если so G Sq, то по определению симуляции существует такое состояние s0 е S0, что Ho(so,s'0). По тем же соображениям существует такое состояние s'0' € S0\ что #i(a0,s0'). Следовательно, ff2(so,s0'). Допустим, что имеет место отношение Д^г(з, з"), и пусть з' — такое состояние, что справедливы отношения Ho(s,s') и #i(s',s"). По определению симуляции мы располагаем равенствами L(s) Л АР' = Ь'(з') и L'(s') П ЛР" = L"{s"). Тогда в силу того, что АР' Э АР", мы получаем L(s) П АР" = L"(s"). Пусть Д(8,8Х) — переход из з в модели М. Тогда в модели М' существует переход R!{s',8\) такой, что выполняется Ho{si,s[). Поскольку Hi — симуляция, в модели М" существует переход R"{s", з") такой, что выполняется Н\ {з'х, з"). Следовательно, имеет место H2(si,s"), и Щ является симуляцией между М и М". Значит, М ^ М". ? Следующая лемма аналогична лемме 31 для отношения симуляции. Мы будем здесь также говорить о том, что пути 7г = soSi,... в модели М и я-' = s'qSi, ... в модели М' соответствуют друг другу, если для любого i, i ^ 0, выполняется отношение Н(з1,з[). Лемма 34. Предположим, что для состояний з и s' выполняется отношение Н(з,з'). Тогда для каждого пути 7г, выходящего из з, имеется соответствующий ему путь 7г', выходящий из з'. Теорема 16. Допустим, что М ¦< М'. Тогда для всякой ACTL*- формулы / (с атомарными высказываниями из АР') из соотношения М' \= f следует, что М ^= /. Здравый смысл подсказывает, что эта теорема верна, потому что формулы ACTL* описывают свойства, общие для всех возможных поведений модели. Поскольку всякое поведение модели М является поведением модели М', любая формула ACTL*, истинная на М', должна быть также истинна на М. Формальное доказательство можно получить на основе леммы 34, применяя рассуждения, подобные тем, которые были использованы для обоснования теоремы 14. Приведенная выше теорема чрезвычайно полезна для верификации моделей в тех случаях, когда модель М значительно более сложна, нежели М'. Бели удается установить ACTL*-свойство / для М', то / оказывается также истинным и для более сложной модели М. С другой стороны, если / не выполняется на М', то / может быть как истинным, так и ложным на М. Поэтому, построив контрпример в ходе проверки / на М', необходимо проверить, будет ли этот контр-
м М' Рис. 11.4. Модели, эквивалентные симуляционно, но не бисимуляционно пример свидетельствовать об ошибке в М. Эта теорема будет часто применяться в последующих главах. В чем состоит различие между симуляцией и бисимуляцией, показано на рис. 11.4. Модели, представленные на рисунке, не являются бисимуляционно эквивалентными, хотя каждая из них симулирует другую. Чтобы убедиться в том, что М симулирует М\ мы возьмем отношение симуляции, связывающее состояния 3 и 4 в М' с состоянием 1 в М. Каждое из остальных состояний М' соответствует множеству состояний М, помеченных тем же самым символом. Чтобы убедиться, что модель М' симулирует М, возьмем отношение симуляции, связывающее оба состояния 1 и 2 в М с состоянием 3 в М'. Каждое из остальных состояний модели М соответствует множеству состояний модели М', подобно тому как это было указано в предыдущем случае. Модели М и М' не являются бисимуляционно эквивалентными, так как никакое состояние в М нельзя сопоставить состоянию 4 в М'. В этом можно так же убедиться, воспользовавшись теоремой 13, гласящей, что на двух бисимуляционно эквивалентных моделях выполняются одни и те же формулы CTL. Легко видеть, что CTL-формула AG(ft -> EX с) истинна на М, но ложна на М'. Однако в силу теоремы 16, на обеих моделях выполняются одни и те же формулы ACTL. Это свидетельствует о том, что эквивалентность относительно ACTL отличается от эквивалентности относительно CTL. 17*
244 Глава 11. Эквивалентности и квазипорядки на моделях Симуляцию можно распространить на справедливые модели точно так же, как это было проделано для бисимуляции. Пусть М и М' — две модели с ограничениями справедливости. Предположим, что АР Э АР'. Отношение Н С S х S' называется отношением справедливой симуляции между М и М' тогда и только тогда, когда для любой пары состояний s и а', находящихся в отношении H(s, s'), выполняются следующие условия: 1) L(s) П АР' = L'(s'); 2) Для любого справедливого пути 7г = SoSi... из s = sq в М существует такой справедливый путь 7r' = s0si ... из s' = s'0 в М', что отношение #(я«> *<) выполняется для любого г, i^O. Мы будем использовать запись М -<f М' для обозначения того, что существует отношение справедливой симуляции Н, при котором для всякого начального состояния во G So в М найдется начальное состояние з'0 € S'0 в М', для которого будет выполняться отношение ff(so,s0). Нетрудно заметить, что отношение <f является отношением квазипорядка на справедливых моделях. В тех случаях, когда из контекста ясно, что мы имеем дело со справедливыми моделями, мы будем иногда использовать сокращенную запись ^. Всякое справедливое поведение модели М является также справедливым поведением модели М'. Таким образом, если семантика ACTL* определяется на справедливых путях, мы можем доказать следующую теорему. Теорема 17. Если М XF М', то для всякой АСТЬ*-формулы /, интерпретация которой проводится только на справедливых путях, из соотношения М' ^ / следует М \= /. 11.1. Алгоритмы эквивалентности и квазипорядка Теперь мы перейдем к алгоритмам, способным устанавливать, являются ли две модели бисимуляционно эквивалентными или верно ли, что одна модель предшествует другой по отношению симуляци- онного квазипорядка. Бисимуляционную эквивалентность легко проверить, если обе модели являются детерминированными, т. е. имеют единственное начальное состояние и обладают тем свойством, что из выполнимости отношений R(s,t) и Я(я,и) следует, что L(t) ф L(u). Назовем языком модели множество последовательностей пометок на всех путях, исходящих из начальных состояний. Можно показать, что две детерминированные модели бисимуляционно эквивалентны
11.1. Алгоритмы эквивалентности и квазипорядка 245 тогда и только тогда, когда их языки совпадают. Эффективные алгоритмы проверки эквивалентности языков детерминированных моделей известны [60]. Их можно использовать для проверки бисиму- ляционной эквивалентности детерминированных моделей. Мы рассмотрим здесь универсальный алгоритм, применимый к детерминированным и недетерминированным моделям при отсутствии ограничений справедливости. Пусть М и М' — две модели над одним и тем же множеством атомарных высказываний АР. Мы определим последовательность отношений Bq , В{,... на S х S' следующим образом: 1) отношение Bq(s,s') выполняется тогда и только тогда, когда имеет место равенство L(s) — L'(s'); 2) отношение В*+1 (в, з') выполняется тогда и только тогда, когда • выполняется отношение B*(s,s') и имеют место соотношения . WSl[R(s,Sl) =» gs'JJ^sVOAB^si.si)]] и . Vsi[#(«Vi) ^^[Ria^^AB^suS1,)}]. Воспользуемся записью B*(s,s') для обозначения того, что отношение Bf(s,s') имеет место для всякого i, г ^ 0. Отметим также, что по определению включение В* Э В*+1 верно для любого i, i ^ 0. Тогда ввиду конечности моделей М и М' существует такое п, что В* D В*+1. Легко видеть, что i?* — это как раз и есть В*. Две модели М и М' называются В*-эквивалентными, если для каждого начального состояния «о 6 So в М существует такое начальное состояние я0 6 5" в М', что B*(so,s0), и, кроме того, для каждого начального состояния s'0 € Sq в М' найдется такое начальное состояние во G S в М, что выполняется отношение B*(so,s0). Нетрудно видеть, что В* является бисимуляцией между М и АР. На самом деле мы покажем, что В* является наибольшей из таких бисимуляций между М и М', т. е. любая бисимуляция между М и М' вложена в В* (вложенность отношений бисимуляций понимается как теоретико-множественное включение). Таким образом, М и М' бисимуляционно эквивалентны тогда и только тогда, когда они 2?*-эквивалентны. Лемма 35. Отношение В* — это наибольшая бисимуляция (в теоретико-множественном смысле) между моделями М и М'. Доказательство. Достаточно доказать, что если В — бисимуляция между М и М', то В содержится в В? для всякого *, г ^ 0. Покажем это индукцией по i. Ясно, что В содержится в Bq, поскольку
246 Глава 11. Эквивалентности и квазипорядки на моделях всякая пара состояний из В несет одну и ту же пометку. Предположим, что В содержится в В* и выполняется отношение B(s,s'). Пусть R(a, 81) — переход в М. Поскольку В — бисимуляция, существует такое состояние s[, что Я^а',^) — переход в М' и при этом B(s\, si). Так как В содержится в В*, мы заключаем, что выполняется отношение 2?*(вь 8[). Третье условие доказывается совершенно аналогично. Таким образом, приходим к выводу о том, что выполняется отношение В„+1 (si, 8[). ? Как уже было отмечено выше, конечность рассматриваемых моделей обеспечивает существование такого п, при котором достигается равенство В* = 1?*. Значит приведенное выше определение предоставляет нам алгоритм вычисления наибольшей бисимуляции между двумя моделями. Если отношение переходов представлено явно, то алгоритм имеет полиномиальную по времени сложность относительно размеров рассматриваемых моделей. В таком случае можно воспользоваться более эффективным алгоритмом из [204]. Если же для представления отношения переходов используются OBDD, то это определение можно использовать непосредственно для вычисления наибольшей бисимуляции — ведь оно описывает вычисление наибольшей неподвижной точки соответствующей функции. Алгоритмы проверки справедливой бисимуляции еще недостаточно хорошо изучены. Если рассматриваются детерминированные модели, то в этом случае можно также привести эффективный алгоритм, опирающийся на эквивалентность языков. Единственное изменение, которое необходимо внести, состоит в том, что следует ограничить язык модели только справедливыми путями. Таким образом, здесь можно воспользоваться алгоритмом, проверяющим эквивалентность языков для моделей с ограничениями справедливости [60]. Универсальная процедура, применимая также и к недетерминированным моделям, приведена в [13]. Эта проблема является PSPACE-полной относительно размеров моделей [157]. Каждый из алгоритмов, упомянутых выше, можно приспособить для проверки квазипорядка симуляции между двумя моделями М и М'. В случае детерминированных моделей вместо эквивалентности языков нужно исследовать их включение. В общем случае при отсутствии справедливости мы определим последовательность #о,Hi,... на S х S' следующим образом: 1) Отношение Щ(8,а') выполняется тогда и только тогда, когда имеет место равенствоЬ(а) = L'(s');
11.2. Табличная конструкция 247 2) H*+l (s, s') тогда и только тогда, когда выполняется отношение H*(s,s') и имеет место соотношение V*i[*(e,*i) => 3s[[R!(a',s[) ЛЯ^вь*!)]]. Процедура вычисления обязательно завершится, поскольку модели конечны. Мы будем использовать запись Н*(з,а') для обозначения того, что отношение В* (s, s') выполняется для всякого i, t ^ 0. Как и в предыдущем случае, Н* является наибольшей симуляцией между М и М'. Значит, М' симулирует М тогда и только тогда, когда для всякого so € So в М существует такое состояние а'0 € 5' в М', что выполняется отношение H*(so,s'0). 11.2. Табличная конструкция В этом разделе речь пойдет о построении таблиц для ACTL- формул. Конструкции подобного вида для логики LTL были приведены в разд. 6.7 и в гл. 9. Мы покажем, что таблица 7/ ACTL- формулы / является максимальной моделью для этой формулы относительно <р. Это ключевое свойство табличной конструкции. Благодаря этому свойству таблицу можно использовать в качестве допущения в окружении процесса в ходе доказательства по схеме допущение-подтверждение (гл. 12), построив ее композицию с процессом непосредственно перед началом верификации модели. Чтобы освободиться от гипотезы, нужно всего лишь проверить, что внешнее окружение удовлетворяет этой формуле. Мы также коснемся вопроса о том, как использовать таблицу для темпорального доказательства. Таблицы, представленные здесь, немного отличаются от табличных конструкций, использованных для LTL. ¦ Для всякой модели М' таблица должна удовлетворять условию М' ^р / тогда и только тогда, когда М' -<fTj. В частности, необходимо, чтобы выполнялось соотношение 7/ f= /. Если / содержит подформулы происшествия (т. е. формулы вида A[jUft]), то этого можно добиться, вводя в таблицу ограничения справедливости и рассматривая только справедливые пути. Таким образом, 7/ должна быть справедливой моделью Крипке. ¦ Поскольку рассматриваемая модель М' также является справедливой, в ней могут оказаться состояния, из которых не исходит
248 Глава 11. Эквивалентности и квазипорядки на моделях ни одного справедливого пути (нужно иметь в виду, что такое может произойти даже в том случае, когда отношение переходов является тотальным). Такие состояния можно охарактеризовать формулой АХ False. Эта формула добавляется к множеству элементарных формул для / и будет входить в каждое состояние таблицы, симулирующего некоторое состояние М', из которого не исходит ни одного справедливого пути. Кроме формулы АХ. False будем включать в таблицу формулы True и False как подформулы формулы /. ¦ Непропозициональные элементарные формулы, используемые в нашей конструкции, имеют вид АХ.д, а не Хд. Далее в этом разделе мы будем полагать, что / — некоторая фиксированная формула ACTL. Опишем теперь подробно построение таблицы 7} для /. Обозначим через АР; множество атомарных высказываний, входящих в состав /. Таблица, соответствующая формуле /, представляет собой модель 7/ = (AP/,Sr, Дт,5о^Т)Рт)- Каждое состояние таблицы определяется множеством элементарных формул, извлеченных из /. Множество всевозможных элементарных подформул / обозначим записью el(f). Рекурсивное определение этого множества таково: 1) el(p) = eZ(-ip) = {р}, если р G АР, 2) el(gi V д2) = e/(pi Л д2) = el(gi) U el(g2), 3) el(AXgi) = {AX9l}\Jel(gi), 4) d(Afo U g2]) = {AX False, AX(A[ffl U g2])} U el(9l) U el(g2), 5) el{A[9l R &]) = {AX False, AX(A[ft R й])} U el(9l) U elfa). Множеством состояний St таблицы служит V(el(f)). Функция разметки определена так, что каждое состояние помечено множеством всех тех атомарных высказываний, которые содержатся в этом состоянии. Для определения множества начальных состояний и отношения переходов R? нам понадобится вспомогательная функция sat, которая сопоставляет всякой подформуле д формулы / некоторое множество состояний из St- Говоря содержательно, sat(g) обозначает множество состояний, на которых выполняется д: 1. sat(True) = St и sat(False) = 0, 2. sat(g) = {s\ g G s] для формул g из el(f), 3. sat(->g) = {s\ g ^ s} для атомарных высказываний g (напоминаем, что только атомарные высказывания могут находиться под знаком отрицания), 4. sat(g V h) = sat{g) U sat(h),
11.2. Табличная конструкция 249 5. sat(g Ah) = sat(g) П sat(h), 6. заЦА[д U Л]) = (аа*(Л) U {sat(g) П заЦАХ(А[д U Л]))))и Usat(AX False), 7. sat(A\g R h]) = (sat(h) П (sat(g) U *ot(AX(A^ R ft]))))u l)sat(AX False). Множество начальных состояний таблицы Sfi равно sat(f). Мы хотим, чтобы отношение переходов обладало тем свойством, что всякая элементарная формула, содержащаяся в состоянии, была истинна в этом состоянии. Ясно, что если АХд содержится в некотором состоянии я, то во всех последователях состояния з должна вьшолняться формула д. С другой стороны, если АХд не принадлежит з, то в з не должна вьшолняться формула АХ д. Следовательно, з может иметь таких последователей, в которых вьшолняется д, а также других последователей, в которых д не вьшолняется. Определение отношения переходов Rt таково: Дт(в1,Я2) = ЛАХв€е1(/) в1 € в0*(АХя) =>¦ *2 € заЦд). Отметим, что данное определение отношения Rt отличается от аналогичного определения отношения переходов, используемого при построении таблиц для LTL в разд. 6.7. Там предполагалось, что если состояние не содержит Хд, то в нем вьшолняется формула -iX</, которая эквивалентна формуле Х->д. Таким образом, во всех его последователях должна вьшолняться ->д. Это достигается за счет использования равносильности в определении Rt для LTL. Мы обязаны также ввести условие допущения, чтобы обеспечить выполнимость свойств происшествия. Условие допущения должно ограничить множество (справедливых) путей следующим образом: ¦ для каждого (справедливого) пути 7г, для всякой элементарной формулы АХ А\д U Л] из el(f), и для любого состояния з в -к, если 8 е sat{AX А\д U Л]), то найдется такое состояние t, следующее за з на пути 7Г, что t Е sat(h). Это требование может быть навязано множеством ограничений справедливости в силу следующих соображений. Пусть s — некоторое состояние из множества sat(AX А\д U Л]), a t — некоторый последователь состояния s по отношению переходов Rt- Тогда либо t € sat(h), либо t Е sat(AX A[g\Jh]). Таким образом, если s € sat(AXA\gUh]), то все последующие состояния должны принадлежать множеству sat(AX А[д U Л]), до тех пор пока не встретится состояние из sat(h). 16 Зак. 271
250 Глава 11. Эквивалентности и квазипорядки на моделях Единственная возможность того, чтобы состояние а принадлежало множеству sat(AX. А\д U Л]) и при этом в s не выполнялась формула АХA{gV Л], предполагает существование в таблице некоторого пути из в, каждое состояние которого содержится в множестве sat(AXA[g U Л]) П (St \ sai(ft)). Чтобы сделать такие пути несправедливыми, мы потребуем, чтобы бесконечно часто встречалось состояние, принадлежащее дополнению (St \ sat(AX A[gUh]))D sat(h) указанного множества. В результате мы приходим к следующему условию допущения: Ft = {(Eт \ sat(AX А\д U Л])) U заЩ) | АХ А\д U Л] е el(f)}. Приведенные ниже леммы обеспечивают корректность табличной конструкции. Мы ограничимся формулировкой лемм, не приводя их доказательств, поскольку они требуют глубокого изучения табличной конструкции. Доказательство соответствующей теоремы читатель может найти в работе [129]. Нужно предупредить, однако, что в доказательстве из [129] используется несколько иное понятие справедливости, нежели то, которое задействовано в этой главе. ЛЕММА 36. Для всякой подформулы д формулы /, если s € sat(g), ТО 8 t=F 9- Основное значение этой леммы состоит в том, что формула / выполняется на таблице для /. Чтобы убедиться в этом, нужно обратить внимание на то, что каждое начальное состояние таблицы 7/ принадлежит sat(f), и поэтому в каждом начальном состоянии таблицы 7/ выполняется формула /. Важная особенность нашей табличной конструкции состоит в том, что всякая модель, на которой выполняется формула /, уступает 7/ по квазипорядку -<*•. Чтобы продемонстрировать это, мы должны определить отношение симуляции между таблицей и произвольной моделью М', на которой выполняется формула /. А сделать это можно, полагая два состояния связанными отношением симуляции в том и только том случае, когда на них выполняется в точности одно и то же множество подформул формулы /. Бели мы определим Н равенством Н = {(8,а')\а = {д\дее1(/),8']г9}}, то указанное свойство будет соблюдаться для множества элементарных формул el(f). Следующая лемма свидетельствует о том, что это свойство соблюдается для всякой подформулы формулы /.
11.2. Табличная конструкция 251 Лемма 37. Если выполнено отношение Я(в,в'), то для каждой подформулы или элементарной формулы д для f из соотношения а' |= д) следует включение з G sat(g). А другая лемма показывает, что Н на самом деле является отношением справедливой симуляции между М' и 7/. Лемма 38. Отношение Н является отношением справедливой симуляции между М' и моделью 7/. Теорема 18. Для всякой модели М' соотношение М' (=j? / выполнено тогда и только тогда, когда М' Чр 7/. Доказательство. Допустим, что М' -<f Tj. По лемме 36 и определению таблицы в каждом начальном состоянии таблицы 7} выполняется формула /, т. е. 7/ ^f /• Тогда, учитывая симуляцию М' ^f Tf, приходим к выводу о том, что М' \=f /• Если же М' |=f /i то по определению на каждом начальном состоянии ad G S'0 выполняется формула /. Пусть Н — отношение, определенное выше. По определению отношения Н каждое такое состояние з'0 является напарником (единственного) состояния «о- Из леммы 37 вытекает, что зо € sat(f), а по определению таблицы s0 € So- Тогда по лемме 38 отношение И является отношением симуляции, откуда следует М' -<р 7/. ? Табличную конструкцию можно применять и для анализа формул. Довольно часто нам желательно знать, верно ли, что всякая модель формулы д является также моделью другой формулы /. Обозначим это семантическое отношение д ^ /. Следствие 3. Соотношение д ^ / имеет место тогда и только тогда, когда Тд\= f. Доказательство. Если д |= /, то всякая модель формулы д и, в частности, Тд является моделью формулы /. Предположим, что Тв \= /, и пусть М (= д. На основании последней теоремы имеем М Ч Тд. А по теореме 17 получаем М f= д. ? 16*
Композиционные доказательства Эффективные алгоритмы композиционной верификации могут расширить область применения формальных методов верификации, охватив значительно более сложные и интересные системы. Многие конечные системы переходов образованы из большого числа процессов, работающих параллельно. Спецификации для таких систем могут быть подчас разбиты на отдельные свойства, описывающие поведение небольших фрагментов системы. Тогда очевидна следующая стратегия: проверить каждое локальное свойство, используя только тот фрагмент системы, который описывается этим свойством. Если мы сможем прийти к заключению, что система удовлетворяет всем локальным требованиям, и если мы знаем, что конъюнкция локальных свойств влечет выполнимость всей спецификации, то мы сможем прийти к выводу о том, что вся система в целом также удовлетворяет этой спецификации. Рассмотрим в качестве примера задачу верификации коммуникационного протокола, который моделируется тремя процессами с конечным числом состояний: передатчиком, некоторой сетью и приемником. Предположим, что спецификация для системы предусматривает, что отправитель рано или поздно корректно передаст данные получателю. Такая спецификация может быть разбита на три локальных свойства. Во-первых, данные должны быть рано или поздно корректно переданы передатчиком в сеть. Во-вторых, данные должны быть когда-нибудь корректно переданы из одного конца сети в другой. В-третьих, данные должны быть в конце концов корректно переданы из сети приемнику. Мы могли бы проверить первое из этих локальных свойств, используя только передатчик и сеть, второе — используя только сеть, а третье — используя только сеть и приемник. Разбивая таким образом задачу верификации, мы никогда не будем вынуждены строить композицию всех процессов и поэтому сможем избежать явления «комбинаторного взрыва». В этой главе мы сосредоточим внимание на парадигме *допуще- ние—подтверждение* [115, 150, 198, 218], на которой основывается композиционное доказательство. Этот метод позволяет провести 12
253 верификацию всех компонентов системы по отдельности. Допустим, что имеются два процесса М и М'. Поскольку поведение процесса М зависит от поведения процесса М', пользователь формулирует ряд допущений, которые должны выполняться процессом М', для того чтобы гарантировать корректность процесса М. Поскольку поведение поведение М' также зависит от поведения процесса М, пользователь формулирует ряд допущений, которые должны выполняться процессом М, для того чтобы гаранировать корректность процесса М'. Построив должным образом комбинацию свойств допущения и подтверждения для М и Л/', можно установить правильность всей системы М || М', не строя глобальный граф переходов. Формулы, с которыми мы будем иметь дело, обычно представляют тройками (g)M(f), где д и / — темпоральные формулы, а М — программа. Хотя такая формула напоминает триплет Хоара, на самом деле она означает совсем иное. Эта формула верна в том случае, когда выполнимость допущения д для фрагмента системы М влечет выполнимость свойства / для всей системы. Типичное доказательство устанавливает истинность {g)M'(f) и {True)Af (/) и приводит к заключению о том, что истинна формула (True)Af || M'(f). Стратегию доказательства можно представить в виде правила вывода <True>M<s> (g)M'(f) <True)Af || M'(f) Важно избежать порочного круга в рассуждениях о допущениях и подтверждениях. Рассмотрим следующее правило вывода: (g)M(f) {f)M'(g) М\\М'\=/Лд Это правило, как легко заметить, некорректно. Пусть М имеет вид wait(y = 1); х := 1, а М' имеет вид wait(i = 1); у := 1. Рассмотрим д = AF(j/ = 1) и / = AF(i = 1). Тогда предпосылки для указанного правила вывода верны, в то время как его заключение неверно. Далее в этой главе мы покажем, как обосновывать корректность правил вывода «допущение—подтверждение». Имеется ряд трудностей, с которыми приходится сталкиваться при разработке системы верификации, поддерживающей подобный
254 Глава 12. Композиционные доказательства стиль доказательств. Прежде всего, мы должны уметь проверять, верно ли, что любая система, содержащая заданный компонент, обладает требуемым локальным свойством. Ввиду того что чаще всего локальное свойство соблюдается только при определенных условиях, в ходе верификации от нас потребуется умение вырабатывать допущения об окружении проверяемого компонента. Эти допущения, налагающие определенные ограничения на другие компоненты, должны быть также проверены, чтобы завершить верификацию. Кроме того, мы должны представить метод, позволяющий проверить, что конъюнкция определенных локальных свойств влечет за собой и всю заданную спецификацию. Грамберг и Лонг, а также Йошко разработали инструментарий, позволяющий автоматизировать подобный стиль доказательства [129,151,179]. Далее в этом разделе мы опишем один из возможных подходов к автоматизации доказательств такого вида. Мы будем использовать квазипорядок справедливой симуляции ^j? и логику ACTL, интерпретируемую на справедливых моделях Крипке. Как было показано в теореме 17 гл. 11, квазипорядок <f обладает той особенностью, что всякая формула ACTL, истинная на справедливой модели М', будет истинной и на любой такой модели М, что М -<f М'. Мы определим параллельную композицию так, чтобы система предшествовала по квазипорядку любому ее компоненту, т. е. М || М' -<р М. Кроме того, композиция с фиксированным компонентом будет сохранять отношение квазипорядка между компонентами, т. е. из условия М -<f М' должно следоватьсоотношение М \\ М" -<р М' || М". Наконец, напомним (см. разд. 11.2), что для всякой ACTL-формулы / можно построить специальную модель 7/, которая удовлетворяет/и называется таблицей. Таблица 7} обладает тем свойством, что всякая модель М удовлетворяет / в том и только том случае, когда М уступает 7/ по квазипорядку 4j?. Для построения таблицы, обладающей такой особенностью, нам приходится использовать ограничения справедливости. Этим объясняется, почему нами был выбран квазипорядок <р и справедливая ACTL. В таком контексте первое правило вывода в этой главе можно представить в виде M<FTa M'\\T,\=f M\\M'\=f
12.1. Композиция моделей 255 12.1. Композиция моделей Предположим, что имеются две модели М = (S,So,AP,L,R,F) иМ' = {S',S'Q,AP',L',R',F'), определенные так, как это описано в гл. 11. Параллельная композиция моделей М и М', которая обозначается М || М', — это модель М", определяемая следующим образом: 1) S" = {(а, в') | L(s) П АР = L'(*') П Ар}; 2) SZ = (S0xS'0)nS"; 3) АР" = АР U АР'; 4) L"((s,s'))=L(s)\JL'(S'); 5) R" ((s, s'), (*, *')) тогда и только тогда, когда R(s, t) и Д'(в', *'); 6) F" = {(Р х 5') П5" | Р е Р} U {E х Р») П5" | Р' е Р'}. Согласно приведенному определению композиция моделирует синхронное поведение. Состояниями модели-композиции служат пары состояний компонентов, согласованные по атомарным высказываниям. Каждый переход в композиции обеспечивается совместным переходом в двух ее компонентах. Это определение, за исключением ограничения справедливости, выглядят вполне естественно. Указанное ограничение сформировано таким образом, чтобы обеспечить свойство справедливого пути, гласящее, что всякий путь в М || М' будет справедливым тогда и только тогда, когда его проекция на каждый компонент также является справедливым путем. По сути дела первое множество пар в ограничении {(PxS')nS" |РеР} устроено так, что сужение пути в М" на его компонент 5 является справедливым путем в М. И второе множество пар {(SxP')nS" |Р'еР'} устроено так, что проекция пути в М" на его компонент S' является справедливым путем в М'. Поскольку множества Р х S' и S х Р* могут содержать пары, не являющиеся состояниями модели М", приходится рассматривать их пересечения с S". Можно доказать явно, хоть это и утомительно, что параллельная композиция коммутативна и ассоциативна (с точностью до изоморфизма). В последующих трех теоремах речь пойдет о взаимосвязи между параллельной композицией и квазипорядком симуляции
256 Глава 12. Композиционные доказательства ¦<f- Первая теорема гласит, что, осуществляя композицию моделей М и М', можно лишь ограничить возможные поведения модели М. Согласно этой теореме в ходе доказательства достаточно рассматривать саму модель М вместо произвольной системы, содержащей М. Более того, из данной теоремы, а также теоремы 16 вытекает, что стандартные методы верификации моделей на основе CTL [63] можно применять для проверки того, будет ли некоторая ACTL-формула истинной на всех системах, содержащих заданный компонент. Это ключевой момент композиционной верификации. Теорема 19. Для любых моделей М и М' имеет место соотношение М || М' If М. Доказательство. Обозначим символом S" множество состояний модели М || М'. Определим множество Н следующим образом: H = {((s,8'),8)\{s,8')eS"}. Если (*о> *о) — начальное состояние модели М \\ М', то «о € So. Состояние (s,s') помечено L(«) U L'(s'), и (L(a) U L'(s')) П АР = L(s). Бели же (во,«о), (si,«i)... является справедливым путем в М || М', то по свойству справедливого пути sq, Si ,... также является справедливым путем в М. По определению отношения Н мы получаем, что отношение Я((я<,з^),з<) выполняется для всякого г. Следовательно, Н является отношением симуляции, и М || М' -<р М. ? Вторая теорема позволяет замещать всякий компонент системы абстракцией этого компонента. Таким образом, для демонстрации того, что некоторое свойство действительно присуще модели М || М", мы можем подставить на место компонента М его абстракцию М' и затем проверить, что М' || М" обладает рассматриваемым свойством. Проверка условия М Ч/г М' гарантирует, что М' действительно является абстракцией компонента М. Теорема 20. Для любых моделей М, М' и М" из соотношения М <F М' следует, что М || М" ;</? М' || М". Доказательство. Обозначим символом Но отношение симуляции между М и М'. Определим множество Н\ следующим соотношени- 6MI H1 = {{(S,8'%(S',8"))\H0(8,81)}. Можно легко показать, что Hi является отношением симуляции. D
12.2. Обоснование по схеме «допущение—подтверждение» 257 Последняя теорема имеет чисто техническое назначение и необходима для использования многоуровневых доказательств по схеме «допущение-подтверждение». Как ее применять, мы покажем в разд. 12.2. Теорема 21. Для любых моделей М, М' имеет место соотношение М-<рМ\\ м. Доказательство. Прежде всего отметим, что для каждого состояния s модели М пара (s, s) является состоянием композиции М \\ М. Положим Н — \ (a,(s,s)) \ s € S\. Если во б So, то по определению композиции пара (s0,so) является начальным состоянием модели М || М. Состояние (s, s), очевидно, помечено так же, как и а. Используя свойство справедливого пути и определение композиции, мы обнаруживаем, что если Sq, *i, ... является справедливым путем в М, то («о, «о)> («1,8i),... является справедливым путем в М || М. Исходя из определения отношения Н, мы получаем, что H(si, (»<, а<)) выполнено для всех г. Значит Н является отношением симуляции, и М <р М || м. и 12.2. Обоснование доказательств по схеме «допущение-подтверждение» Парадигма «допущение—подтверждение» допускает много различных способов применения. Важно лишь быть уверенным, что конкретное применение этой парадигмы корректно. Теорию, разработанную нами в этой главе, можно использовать для обоснования правил доказательства по схеме «допущение-подтверждение». Мы покажем, как можно обосновать одно из правил вывода, на отдельном примере. Сначала опишем правило неформально в терминах расширенной системы обозначений Пнуели [218]. Это расширение позволяет задавать спецификации и допущения как в виде формул, так и непосредственно в виде моделей с конечным числом состояний, в зависимости от того, какой способ представляется более точным или удобным: (Тгие)М{А) {А)М'(д) {9)M{f) <Тгае>М || M'(f)
258 Глава 12. Композиционные доказательства Здесь А, Ми М' обозначают модели с конечным числом состояний, а / и д представляют формулы ACTL. В рамках обозначений, используемых ранее, это же правило будет выглядеть так. M<FA А || М' \=F д T3\\M\=Ff М || М' Hf / Корректность этого правила будет обоснована, если удастся показать, что его заключение должно быть истинным, при условии что истинна каждая из трех его предпосылок. A) B) C) D) E) F) G) (8) О) A0) (И) 12.3. M<FA М || М' -<F А || М' А || М' \=F д А || М' ±F Тд М || М' ±F Тд М || М || М' ±F Тд || М Тд \\M\=Ff M\\M\\M'\=f М <FM\\M М || М' <FM\\M || М' М || М' \=F f предпосылкаЖ строка A) и теорема 20; предпосылка; строка C) и теорема 18; строки B), D) и транзитивность -<F; строка E) и теорема 20; предпосылка; строки F), G) и теорема 17; теорема 21; строка (9) и теорема 20; строки (8), A0) и теорема 17. Верификация устройства управления центрального процессора Символьный верификатор моделей, в основу которого положена теория, разработанная ранее в этой главе, описан в работе Грам- берг и Лонга [129]. Он включает средства для проверки на модели, для темпорального вывода (на основе табличного метода) и для проверки того, что одна модель симулирует другую. Верификатор был применен для проверки простого устройства управления центрального процессора. Здесь мы ограничимся лишь кратким описанием процессора; подробности можно найти в [72]. Центральный процессор представляет собой простую стековую машину, т. е. часть памяти процессора выделена под стек, откуда извлекаются операнды и куда помещаются результаты. Устройство управления центрального процессора состоит из двух частей. Одна из них называется устройством
12.3. Верификация устройства управления 259 доступа; она отвечает за все обращения к памяти процессора. Вторая часть, которая называется устройством исполнения, интерпретирует команды, управляет арифметическим устройством, устройством сдвига и т. п. Обе части работают параллельно. Устройство доступа и устройство исполнения взаимодействуют посредством небольшого числа сигналов. Три таких сигнала, push, pop и fetch, поступают на вход устройства доступа и служат для обозначения того, что устройство исполнения собирается поместить или изъять что-либо из стека, или получить очередную команду. Для каждого из этих сигналов есть соответствующий сигнал готовности от устройства доступа. Прежде чем продолжить работу, устройство исполнения должно дождаться поступления подходящего сигнала готовности. Еще один дополнительный сигнал branch устанавливается устройством исполнения, когда оно совершает переход к новому месту в программе. Для того чтобы увеличить производительность, устройство доступа пытается сохранить значение, располагающееся в вершине стека, в специальном регистре, который называется TS-регистром. Это делается с целью избавить исполнительное устройство от простоя в ожидании данных из памяти. Например, когда TS-регистр содержит актуальные данные, операция их извлечения исполняется немедленно. При этом когда значение поступает в стек, оно сначала помещается в этот регистр и уже затем копируется в память. Кроме того, устройство доступа помещает команды в очередь, когда это возможно, чтобы выбор команды не требовал обращения к памяти. Очередь разрушается всякий раз, когда процессор сталкивается с ветвлением. Спецификации разбиваются на два класса. Условиями первого класса служат свойства безопасности, указывающие, какие последовательности операций считаются допустимыми. Они зависят от того, какие сигналы готовности генерируются устройством доступа в соответствующие моменты времени, и от того, насколько правильно вырабатываются сигналы подтверждения из памяти. Для проверки этих свойств была использована простая модель памяти. После композиции этой модели и устройства доступа стало возможным проверить все эти свойства, за исключением одного. Для проверки этого оставшегося свойства потребовалось дополнительное допущение AG(-ipuaftV-ipop). Верификатор модели проверил выполнимость этого свойства при заданном допущении следующим образом: сначала была сформирована таблица для этого допущения, затем построена композиция этой таблицы с устройством доступа и моделью памяти и в завершение проведена проверка указанного свойства.
260 Глава 12. Композиционные доказательства Второй класс состоит из одного единственного свойства живости AG AF(fetch Л fetchrdy). Эта формула устанавливает, что процессор бесконечно часто выбирает очередную команду. Один из способов проверки этого свойства предусматривает построение модели устройства исполнения. Мы опишем альтернативный способ проведения верификации, основанный на использовании ряда ACTL- допущений. Идея состоит в том, чтобы проверить это свойство для устройства исполнения. Чтобы формула была верна, устройство доступа должно постоянно откликаться на запросы pop и push, а также пополнять очередь команд, когда это необходимо. То, что устройство доступа непременно удовлетворяет этим условиям, обеспечивается тем, что устройство исполнения не пытается выполнить две операции одновременно и не снимает запроса, пока не завершится соответствующая операция. Обратимся сначала к этим свойствам: AG(-ifjetch Л push) Л ->{fetch Л pop) Л • • • Л ->{рор Л branch)), A2.1) AG(push -? A\pushedRpush]), A2.2) AG (pop -> A[poppedRpop]). A2-3) Первое из них указывает, что любые две операции, которые способно выполнить устройство исполнения, являются взаимоисключающими. Другие две формулы утверждают, что если устройство исполнения обратилось с запросом push или pop, то оно не отменит запрос, до тех пор пока операция не будет выполнена. Верификатор моделей проверил, что устройство исполнения само по себе обладает этими свойствами, и, применяя табличный метод, подтвердил, что первое из этих свойств влечет используемое ранее допущение AG(-iptMA V ->рор). Теперь, опираясь на формулы 12.1 и 12.2 как на допущения, он смог проверить, что система, состоящая из устройства доступа и модели памяти, удовлетворяет формуле AG(push -> A[p«aAU pushed]). A2.4) Эта спецификация утверждает, что всякая операция вставки push будет завершена. Аналогично, используя формулы 12.1 и 12.3 как допущения, верификатор смог проверить, что верна формула AG(pop -* А[рор U popped]). A2.5) Система, состоящая из устройства доступа и модели памяти, удовлетворяет также и формуле AG AF(fetchV branch) (в каждой точке
12.3. Верификация устройства управления 261 осуществляется по крайней мере одно из двух событий: либо устройство доступа когда-нибудь пополнит командную очередь, либо произойдет ветвление). Наконец, опираясь на эту формулу, а также используя формулы 12.4 и 12.5 как допущения, верификатор моделей проверил, что исполнительное устройство удовлетворяет условию AG AF{fetchAfetchrdy). Чтобы завершить верификацию и убедиться, что вся спецификация в целом справедлива для системы, необходимо проверить, что модель памяти адекватно соответствует реальному запоминающему устройству.
Абстракция Абстракция, вероятно, является самой важным методом упрощения проблемы «комбинаторного взрыва». В этой главе мы опишем два различных метода абстракции: редукцию по конусу влияния и абстракцию данных. Оба этих метода применяются к описаниям системы на высшем уровне, еще до того как построена ее модель. Тем самым мы избегаем построения нередуцированной модели, которая может оказаться слишком большой, чтобы поместиться в память. Суть метода редукции по конусу влияния состоит в том, что мы пытаемся сократить размер графа переходов, рассматривая только те переменные системы, которые задействованы в спецификации. Сокращение достигается за счет удаления переменных, которые не оказывают никакого влияния на переменные, фигурирующие в спецификации. Таким образом, проверяемые свойства сохранятся, но размер модели, которую нужно верифицировать, станет меньше. Абстракция данных, с другой стороны, предусматривает поиск отображения реальных значений данных, используемых в системе, в небольшое множество абстрактных значений данных. Распространив это отображение на состояния и переходы, можно построить абстрактную систему, которая симулирует исходную, но обычно имеет гораздо меньший размер. Из-за такого сокращения размера абстрактную систему подчас удается верифицировать гораздо легче, нежели исходную. 13.1. Редукция по конусу влияния Мы покажем, как редукция по конусу влияния может быть применена к синхронным схемам. Пусть V — множество переменных заданной логической схемы. Эта схема может быть описана системой уравнений «J = /i(V) для каждой переменной «< б V, где /< — булева функция (см. гл. 2 и разд. 6.6.1.). 13
13.1. Редукция по конусу влияния 263 Предположим, что задано множество переменных V С V, представляющих интерес в свете предъявленной спецификации. Нам хотелось бы упростить описание системы, сохранив в нем только эти переменные. Однако значения переменных из V могут зависеть от значений переменных, не входящих в V. Поэтому мы определяем конус влияния С для V и используем С для сокращения описания системы. Конусом влияния С для V назовем такое наименьшее множество переменных, что ¦ V С С, ¦ если для некоторой переменной vj G С ее функция /j зависит от Vj, то Vj е С. Мы построим новую (упрощенную) систему, удалив все те уравнения, у которых переменные в левой части не входят в С. Обратимся еще раз к нашему примеру счетчика по модулю 8 (см. рис. 2.1). Его система уравнений такова: v'0 = -ч>о ; v[ = v0 Ф «1 ; v'2 = (v0AVi)®V2 . Ясно, что если V = {г>о}> то С = {vo}, поскольку /о не зависит ни от какой другой переменной, кроме Vo- Если же V = {v\}, то С = {«o,Ui}, поскольку /i зависит от обеих переменных, но при этом vj ^ С, ибо никакая переменная из С не зависит от v2. И если, наконец, V = {v%}, то С — это множество всех переменных. Более развитые методы сокращения пространства состояний, основанные на тех же принципах анализа зависимости, описаны в работах [17] и [162]. Далее мы покажем, что редукция по конусу влияния сохраняет корректность спецификаций в логике CTL, если они определены над переменными (атомарными высказываниями) из С. Рассмотрим множество булевых переменных V — {v\,... ,«„} и модель синхронной схемы М = (S,R,So,L) над множеством V, где ¦ 5 = {0,1}п — множество всех возможных значений переменных из У; ¦ R = /\ti[v'i = fi(V)); • L(s) = {Vi | 8(Vi) = 1, 1 ^ i < n}; ¦ S0CS.
264 Глава 13. Абстракция Предположим, что мы редуцируем схему относительно конуса влияния С = {«1,..., Vk } для некоторого к ^ п. Упрощенная модель имеет вид М = (S,R,So,L), где ¦ S = {0,1}* — множество всех возможных значений переменных из С; • Ца) = {Vi | s{vj) = 1, 1 s$ * ^ *}; ¦ So = {(di,..., dfc) | существует такое состояние (di,..., dn), что di = di Л • • • Л djt = d*}. Отношение В С S x S определим следующим образом: ((di,... ,d„), (di,... ,dfc)) € В «=>• сЦ = d< для всех 1 < t < fc. Покажем, что В является отношением бисимуляции между М тиМ. Отметим прежде всего, что для каждого начального jCOCTOflHra из S есть соответствующее ему начальное состояние из S и наоборот. Пусть а = (di,..., d„) и в = (di,..., d*) таковы, что (в, в) G В. Тогда di = сЦ для всякого 1 ^ % ^ к. Таким образом, пометки этих состояний, ограниченные переменными из С = {щ,...,«*}, согласованы, т. е. L(8)nC = L(s). Возьмем произвольный переход в -> t в М. Мы покажем, что в М есть такой переход s-tt, что (?,f) 6 В. Пусть t = (ei,...,en). Из определения множества Я вытекает, что v\ = /»(V) для каждого 1 ^ i ^ п. Однако для 1 ^ i ^ к значение v't зависит только от переменных из С, и, следовательно, v'{ = /»(С). К тому же из включения (а, я) € В следует, что A.=i(d« = di). Поэтому для всякого 1 ^ i < к верно равенство e< = /<(di,...,djb) = /<(di,...,dt). Если выбрать t = (ei,..., е*), то а -» t и (t, t) G В, что и требовалось показать. И наоборот, пусть задан переход s -> t в Д, где ?= (ei,..., ei). Тогда ej = /t(di,..., djt) для каждого 1 < i ^ fc. Рассмотрим переход л <в Д для некоторого t = (ei,... ,еп). Поскольку выполняется соотношение A«=i(d» = di) и значение «j 6 С зависит только от значений переменных из С, мы получаем ei = fi(di,...,dk) = fi(di,...,dk,dk+i,...,dn) = е*.
13.2. Абстракция данных 265 Следовательно, (t, t) € В. Этим и завершается обоснование того, что В — бисимуляция между М и М. Значит, М = М. Следующая теорема вытекает непосредственно из приведенного выше результата и теоремы 14 из гл. 11. Теорема 22. Пусть задана CTL*-формула / с атомарными высказываниями из С. Тогда М (= / Ф>- М \= /. 13.2. Абстракция данных Методы верификации, основанные на абстракции, появились из- за необходимости анализа схем, содержащих передачи данных, или параллельных программ, содержащих сложные структуры данных. Традиционно методы верификации систем с конечным числом состояний применялись в основном для проверки систем управления. Символьные методы верификации позволяют справляться с некоторыми системами, в которых есть нетривиальные преобразования данных, но сложность верификации при этом все еще остается высокой. В основу абстракции данных положено следующее соображение: в спецификациях систем, включающих передачи данных, обычно задействованы весьма простые взаимосвязи между значениями данных. Например, при верификации операции сложения, выполняемой микропроцессором, может возникнуть необходимость потребовать, чтобы значение в одном из регистров рано или поздно оказалось равно сумме значений из двух других регистров. В таких случаях сложность верификации модели можно понизить, применяя технику абстракции. Абстракция, как правило, определяется отображением фактических значений данных системы в небольшое множество абстрактных значений данных. Распространив это отображение на состояния и переходы, можно построить абстрактный вариант анализируемой системы. Абстрактная система чаще всего гораздо меньше реальной системы, и поэтому на абстрактном уровне проверять свойства значительно проще. Кларк, Грамберг и Лонг [69,179] показали, что при использовании отображений подобного вида всякое свойство, выразимое в логике ACTL и выполнимое на абстрактной модели, будет соблюдаться и для реальной системы. Для применения этого метода на практике мы должны уметь строить OBDD для абстрактных моделей непосредственно, без предварительного создания полной модели. Это возможно, если начинать с описания модели на высоком уровне и сочетать процесс абстрак-
266 Глава 13. Абстракция ции с компиляцией. В главе 2 были введены средства высокоуров- него описания посредством формул «So и И, логики первого порядка, задающих множество начальных состояний и отношение переходов системы. Атомарные высказывания при этом имеют вид х = d для переменной х с областью значений D и значения d € D. К сожалению, из-за огромного (а порой и бесконечного) пространства состояний интересующих нас программ применять методы верификации моделей непосредственно просто невозможно. Если к тому же точные значения всех переменных программы видимы, то методы сокращения пространства состояний будут неэффективны. Таким образом, необходимо поступиться частью этой информации. Для этого удобно отобразить возможные значения каждой переменной программы в небольшое множество абстрактных значений. Допустим, например, что х — это переменная, областью значений Dx которой являются все целые числа. Предположим, что мы заинтересованы в том, чтобы выразить некоторое свойство, касающееся знака переменной х. Сформируем область Ах = {ао,а+,а_} абстрактных значений переменной х и введем отображение hx из Dx в Ах: {oq, если d — О, а+, если d > О, а_, если d < 0. Теперь абстрактное значение переменной х можно представить всего лишь при помощи трех атомарных высказываний. Обозначим эти высказывания 'х = оо', 'х = а+' и 'х = о_', где х соответствует обращению не к фактическому, а к абстрактному значению переменной х. Заметим, что в терминах этих атомарных высказываний теперь уже нельзя выразить свойства, касающиеся точных фактических значений переменной х. Тем не менее, во многих случаях за счет разумного выбора абстрактного отображения знания лишь абстрактного значения оказывается достаточно. Если применить этот процесс абстракции к некоторым переменным программы, то получившаяся в результате модель Крипке будет иметь меньшее число атомарных высказываний. Теперь методы сокращения пространства состояний могут оказаться применимыми для понижения сложности верификации. Те конкретные методы, котрые будут использоваться, основаны на отношениях симуляции, введенных в гл. 11. Идея состоит в том, чтобы объединить в одно целое все состояния, помеченные на абстрактном уровне одними и теми же атомарными высказываниями.
13.2. Абстракция данных 267 Таким образом, в сокращенной модели у каждого состояния будет уникальная пометка. Следовательно, эту пометку можно применять для идентификации состояний. В приведенном ранее примере все состояния, размеченные 'х = а+', сливаются в одно состояние, т. е. все состояния, для которых х > О, становятся единым состоянием. Образовавшееся объединенное состояние обозначается той же пометкой '? = а+'. По завершении слияния нужно убедиться, что редуцированная модель симулирует исходную. Так, если в М имеется переход между состояниями, соответствующими х = 0иж = 5, той в сокращенной модели нужно ввести переход между состояниями, помеченными 'х = oq и 'х = а+'. Подобным же образом, если состояние, соответствующее значению х = —7, является начальным, то и состояние, помеченное 'х = а_', будет начальным. Далее мы опишем более формально, как из заданной модели получить редуцированную модель. Процедура, которую мы опишем, дает «идеальную» абстракцию. Она не очень эффективна для практического применения, но зато позволяет пояснить те принципы, которые лежат в основе нашего метода абстракций. Потом мы покажем, как этот метод можно применять эффективно. Предположим, что нам дана модель с переменными, принимающими значения из множества D. Для построения редуцированной модели мы сначала изменим разметку исходной модели. Для этого выберем абстрактную область А и отображение Л из D в А. Тем самым определяется множество абстрактных атомарных высказываний АР, как это было неформально описано ранее. Теперь мы получаем новую модель М = (S,R,So,L), которая совпадает с исходной моделью во всем, за исключением того, что L помечает каждое состояние множеством абстрактных атомарных высказываний из АР. Модель М можно привести к редуцированной форме Мг, которая определяется так: 1) ST = {L(s) | s € 5}, т. е. состояниями редуцированной модели служат всевозможные пометки состояний модели М; 2) sr € 5J тогда и только тогда, когда существует такое состояние а, что ат ¦=¦ L(s) и s G So; 3) АР, = АР; 4) всякое аг представляет собой множество атомарных высказываний, и поэтому LT{sr) = sr; 5) Rr(sT,tr) тогда и только тогда, когда существуют такие s и t, что sr = L(a), t, = L(t) и имеет место отношение R{a,t).
268 Глава 13. Абстракция Исходная модель Модель М Модель Мт Рис. 13.1. Пример со светофором Модель Мг можно представить себе как абстрактный вариант модели Крипке для нашей программы. Каждое абстрактное состояние представляет собой множество конкретных состояний, совмещенных в одно состояние в процессе сжатия. Абстрактная модель Мт полностью определяется выбором отображения h и множеством абстрактных значений А. Выбирая различные отображения и множества абстрактных значений, мы будем получать разные редуцированные модели. Теперь нетрудно видеть, что редуцированная модель Мт симулирует исходную модель М, поскольку множество пар Н = {(s,sT) | sr = L(s)} задает отношение симуляции. Поэтому всякое АСТЪ*-свойство, которое можно доказать для Мт, будет верно и для М. Нужно иметь в виду, что при помощи этого метода мы можем всего лишь установить, будет ли формула, составленная из абстрактных атомарных высказываний, истинной на модели М. На практике АР выбирается так, чтобы были выразимы необходимые для проверки свойства модели М. Рисунок 13.1 иллюстрирует процедуру абстракции для простой системы управления уличным светофором. В исходной программе есть только одна переменнуя color, которая может принимать значения из множества D = {red, yellow, green}. Состояния программы помечены атомарными высказываниями 'color = гееГ, 'color = yellow', 'color = green'; на рисунке они представлены в сокращенной записи red, yellow и green, соответственно. Модель Мт получена за счет
13.2. Абстракция данных 269 выбора абстрактного множества значений А = {stop, до} и отображающей функции h, которая определена следующими соотношениями: h(red) = stop, h(yellow) = stop, h(green) — go. Множество абстрактных атомарных высказываний таково: АР = {'color = stop', 'color = до'}. На рисунке в качестве их сокращенной записи мы используем stop и до. Редуцированная модель Мг получается в результате слияния тех состояний М, которые помечены одинаковыми абстрактными атомарными высказываниями. Как было описано выше, Мг можно использовать для вывода свойств программы, поскольку Мт симулирует М. Основная трудность состоит в том, что для построения модели Мг нам нужно сначала построить М. Когда М невозможно построить явно, мы используем неявное задание М в терминах формул «So и 11. Вместо того чтобы строить М, мы конструируем модель Мг на основе этих формул. Бывает так, что модель Мг оказывается все еще слишком велика, чтобы заняться именно ее построением. Тогда мы строим аппроксимацию Ма, симулирующую Мг. Наша цель состоит в том, чтобы выбрать аппроксимацию Ма, достаточно близкую к Мг, и, таким образом, сохранить возможность проверки интересующего свойства заданной программы. 13.2.1. Вычисление аппроксимаций На протяжении этого раздела мы будем считать, что у, <fi и<р2~- формулы первого порядка, построенные из первичных отношений, представляющих операции программы. Для простоты предположим, что все переменные xi, xi,... принимают значения из одной и той же области D. Мы используем множество переменных хГ, хг,..., принимающих значения из абстрактной области А, причем х} представляет абстракцию значения х<. Будем считать также, что есть единственная функция абстракции h, представляющая собой сюръективное отображение множества элементов D на множество А. Мы воспользуемся формулами первого порядка So и Л, описанными в гл. 2, для определения модели Крипке М = (S,R,So,L) с множеством состояний S = D х • ¦ • х D. Здесь So — множество оценок, удовлетворяющих формуле So- Точно так же отношение переходов R извлекается из формулы И. Функция означивания L определяется над абстрактными атомарными высказываниями следующим
270 Глава 13. Абстракция образом. Пусть s = (di,..., dn), т. е. в состоянии а каждая переменная Xi имеет значение d<. Обозначим символом а; значение h(di). Мы введем в рассмотрение атомарное высказывание 'xj = сц' для обозначения того, что х% принимает абстрактное значение а*. Тогда L(s) = {'хТ = ai',..., 'iT; = a„'}. Для получения модели Мг над абстрактным множеством состояний А х • • • х А мы построим формулы над хГ, • • •, Хп и xj ,..., хЛ', которые будут задавать начальные состояния и отношение переходов модели Мт. Прежде всего заметим, что абстрактную модель Крипке Мг можно получить, вычисляя значения формул So = 3xi ...Зх„ (ft(xi) = хГЛ ¦••ЛЛ(х„) = xJiA«So(xi,...,xn)) и % = 3xi • • • Зхп3х[ ... Зх'п {h(xi) = хГ Л • • • Л Л(х„) = х^ Л Л /i(xi) = хГ' Л • • • Л h(x'„) =х^'л7г(х1,...,х„,х'1)...,х'п)). Для краткости обозначим символом [•] операцию экзистенциальной абстракции. Если формула ц> зависит от переменных Х\,..., хт, будем полагать [ip](xi,...,xm) = 3xi ...3xm (ft(xi) = хТл--ЛЛ(х„)=х^ Л Л v?(xi,...,xn)). Нужно иметь в виду, что свободными переменными [ф\ являются абстрактные варианты xi,... ,х„. Поэтому абстрактная модель, соответствующая модели Мг, задается формулами So = [«So] и К = [Щ. Идеальным решением для нас было бы извлечение Sq и 72* из [So] и [Щ. Однако чаще всего это требует больших вычислительных затрат. Для того чтобы обойти эту трудность, мы определим преобразование А на формуле <р. Суть преобразования А состоит в упрощении формул, к которым применяется [•]. Тем самым извлечение модели Крипке из формул становится проще. Предположим, что (р представлена в негативной нормальной форме, т. е. отрицание применяется только к первичным отношениям. Тогда 1) A(P(xi,..., xm)) = [Р](хГ,..., х^), если Р — первичное отношение. Аналогично A(->P(xi,...,xm)) = [-iP](x^,...,х^); 2) A(tpi А(р2) = A(<pi) Л A(<fi2); 3) %!V^) = ^i)V>l(v>2); 4) ACx <p) = Эх A((p); 5) .4(Vx <p) = Vx Л(ф). Иначе говоря, преобразование А продвигает кванторы существования вглубь так, чтобы операция абстракции применялась на самом
13.2. Абстракция данных 271 внутреннем уровне. Так как внутренние абстракции относительно просты, они могут быть легко вычислены. И поэтому, хоть мы и не можем вычислить [So] и [Я], мы обычно можем получить значения A(Sq) и А(И). Это дает нам модель Крипке Ма = (S^R^S^La). Оценка La определяется так. Пусть аа = (ai,...a„) G S&. Тогда La(sa) = {'жГ = ai',...,'x^ = ап'}. Заметим, что s = (di,. ..d,,) G 5 и sa будут помечены одинаково, если для всех i выполняется равенство h(di) = Oj. Цена за упрощение вычислений состоит в том, что в соответствующую модель, возможно, придется добавить новые начальные состояния и переходы. Это объясняется тем, что из формулы [ф] следует формула А((р), но эти формулы не обязательно эквивалентны. В результате Ма будет всего лишь аппроксимировать модель Мг. С другой стороны, чтобы быть уверенными в том, что Ма симулирует Мг, мы должны показать, что, применяя А, мы никогда не потеряем никаких начальных состояний или переходов. Это вытекает из следующей теоремы. Теорема 23. Из экзистенциальной абстракции [ф] следует формула А{<р). В частности, имеют место импликации [So] -*¦ A(Sq) и [И] -> А{П). Доказательство. Воспользуемся индукцией по структуре формулы <р. 1. Если ip = P{xi,... ,хт) или ц> = ->P(xi,..., xm), где Р — первичное отношение, то [<р] = А((р), и теорема доказана. 2. Пусть ip(xi,...,xm) = <pi Л <р2- Тогда [<р\ Л <^г] представляется формулой 3xi... Зжт (Д Kxi) = ?i Л <pi Л <р2). а Из этой формулы следует другая (вообще говоря, не эквивалентная ей) формула 3xi... Зхт (Л h(xt) =xt Л <pi)A3xi... Эхт(Д Л(х*) = х* Л <р2), i i которая есть в точности [pi] Л [<^г]- По определению преобразования А верно равенство А{ф\ Л у>г) = А(ч>\) Л А(^), а по индуктивному предположению из формула [v?i] следует A(<pi) и из формулы [ф] следует А{щ). Значит, из формулы [<р\] Л [рг] следует формула A(<pi) Л А(<р2), и поэтому формула [ipi Л <рг] влечет формулу A(tpi Atpt).
272 Глава 13. Абстракция 3. Случай <р = (pi V (fi2 рассматривается аналогично. 4. Пусть <р{х\,...,хт) =4xipi. Тогда [Vx v?i] имеет вид Зхх...Зхт (Д h(xi) = Xi Л Vx <pi(x,xi,...,xm)). i He ограничивая общности, будем считать, что связанная переменная х отлична от переменных Xj их*. Тогда указанная формула эквивалентна формуле 3xi...3xmVx (Дft(xj) = f; Л <pi(x,xi,...,xm)). i Из этой формулы следует другая (вообще говоря, не эквивалентная ей) формула Vx3xi...3xm (Дh(xi) = Xi Л vi(x,x1:...,xm)). i Поскольку отображение h сюръективно, для каждого абстрактного элемента из А найдется некоторый его прообраз из D. И вследствие этого, из полученной формулы следует другая формула Vx 3x[3xi... 3xm (h(x) = x А Д h(xi) = xj Л <p\ (x, x\,..., xm))]. i Но это и как раз есть Vx [tpi]. По индуктивному предположению из формулы [tpi] следует формула A(ipi), и поэтому из формулы Vx [ip\] следует формула Vx A{(pi). Последняя из этих формул эквивалентна .4(Vx tpi). 5. Случай if = Зх <fi рассматривается подобным же образом. ? Та же самая идея «продвижения абстракции вглубь» используется в абстрактных интерпретациях [20, 86, 87, 89, 201, 203]. Выбрав подходящую абстрактную область вычислений и интерпретируя затем программу в этой области, можно извлечь некоторую информацию о программе. Цель обычно состоит в том, чтобы получить данные, которые будут использоваться в ходе компиляции для оптимизации программ. Абстрактные интерпретации были определены для таких приложений, как анализ строгости и подсчет ссылок в функциональном программировании, обнаружение линейных зависимостей между переменными, вычисление областей активности переменных. Интерпретация строится на основе абстрактных вариантов операторов языка программирования. Абстрактные операторы соответствуют абстрактным вариантам первичных отношений.
13.2. Абстракция данных 273 Взаимосвязь между абстрактной интерпретацией и применением абстракций при верификации моделей более подробно обсуждается в работах [20, 89, 91]. И в завершении мы покажем, что Мл симулирует М. Это и составляет основу применения метода абстракции для проверки свойств программ. Теорема 24. Между моделью Л и ее абстрактным образом Ма имеет место отношение М ¦< Ма Доказательство. Мы укажем отношение симуляции между Ма и М. Пусть s = (di,..., d„) и sa = (oi,..., ап). Будем полагать, что отношение H(s, sa) имеет место тогда и только тогда, когда Н(сЦ) = а» для всякого г. Допустим, что отношение Н{а,зл) верно для а = (di,...,d„). Тогда зл = (h(di),. ..,h(dn)). Прежде всего отметим, что эти два состояния помечены одинаково. Напоминаем, что пометкой состояния s служит множество высказываний 'х» = а*', причем значение переменной х< отображается функцией h в а*. Допустим, что высказывания '?i = Qj' составляют пометку состояния s. Это возможно в том и только том случае, когда Oj = Н(сЦ). Состояние аа будет помечено 'xi = a^ тогда и только тогда, когда его z-й компонентой является Oj. Но i-я компонента состояния sa — это h(di), и, таким образом, равна h{di) = сц. Допустим, что верно отношение R(s,t), где t = (ej,... ,еп). Тогда положим t& = (h(ei),..., h(e„)). Нам необходимо показать, что имеет место отношение Ra(sa, Ьл). Согласно определению отношения R состояния s и t соответствуют оценкам, удовлетворяющим И. Теперь покажем, что будет выполняться отношение [7?](sa, ta). По определению операции [•] отношение [7?](sa, ta) имеет место в том и только том случае, когда Зх!... ЭхпЭх! ... Зх'п ( Л (h(Xi) = h(di) Л h(z'i) = Л(е*)) А *=i Aft(xi,...,x„,xi,...,x;,)). В связи с тем что выполняется ~R.(s,t), приведенная выше формула будет также выполняться, если в качестве значений переменных Xi взять di, а в качестве значений переменных х\ взять е». Тогда, зная о том, что верно отношение [7?](sa,<a), мы можем, воспользовавшись предшествующей теоремой, заключить, что ЛG?)(»а, ?а) также истинно. Но A(R) служит определением Да, и поэтому имеет 19 Зак. 271
274 Глава 13. Абстракция место отношение Яв(за, ta). Значит, Н является отношением симуляции между М и Ма. Применяя подобные же рассуждения, можно убедиться в том, что если s G So, то sa G So- Таким образом, каждому начальному состоянию модели М соответствует начальное состояние модели Ма, и, следовательно, М Ч Ма. ? 13.2.2. Точные аппроксимации В предыдущем разделе было показано, что М Ч Ма, и поэтому любая АСТЬ*-формула, выполнимая на модели Ма, будет также выполняться на модели М. В этом разделе мы рассмотрим некоторые дополнительные условия, которые позволят нам показать, что модель М бисимуляционно эквивалентна модели Ма. На основании результата, полученного в гл. 11 эти условия позволяют проверять всякую СТ1/-формулу, используя модель Ма, и делать вывод о том, что М также удовлетворяет этой формуле. Когда упомянутые условия выполняются, модель Ма называется точной аппроксимацией модели М. Вначале заметим, что каждое отображение абстракции hx для переменной х, входящей в программу, порождает отношение эквивалентности ~х, которое определяется следующим образом. Пусть di и а\ — элементы из Dx. Тогда di ~ efe в том и только том случае, когда /»x(di) = hx(d2). Основное условие для точной аппроксимации состоит в том, чтобы эти отношения эквивалентности были конгруенциями для первичных отношений, соответствующих базовым операциям, используемым в программе. Напомним определение конгруенции. Пусть P(xi,...,хт) — некоторое отношение, в котором ж,- принимает значения из DXi. Отношение эквивалентности ~Xi называется конгруенцией относительно Р в том и только том случае, когда m Vdi...VdmVe1...Vem(A4~.1e4->(P(dll...>dTO) & & Р(еи...,ет))). Доказательство точности аппроксимации в случае, когда эквивалентности ~1( являются конгруенциями относительно первичных отношений, основывается на следующей теореме, представляющей собой аналог теоремы 23. Эта теорема позволяет нам показать, что Мг и Ма бисимуляционно эквивалентны.
13.2. Абстракция данных 275 Теорема 25. Если эквивалентности ~г, являются конгруенция- ми относительно первичных отношений и ц> — формула, определенная над этими отношениями, то [ф\ & Л{ф). В частности, формулы [So] и [R] эквивалентны соответственно A(So) и А (К). Кларк, Грамберг и Лонг доказали бисимуляционную эквивалентность моделей М и Ма. Теорема 26. Если эквивалентности ~Xi являются конгруенция- ми относительно первичных отношений, то М = Ма- Доказательства этих теорем можно найти в [69]. 13.2.3. Простой язык Теперь мы перейдем к описанию системы верификации, основанной на тех идеях, которые были рассмотрены в предыдущих разделах. Система состоит из компилятора для языка систем с конечным числом состояний и верификатора, использующего OBDD. В этом разделе содержится краткое описание языка, предназначенного для спецификации реагирующих программ. Наиболее существенные черты этого языка таковы. 1. Язык является процедурным. Он содержит структурированные программные конструкции, наподобие оператора цикла while. Нерекурсивные процедуры также присутствуют. 2. В программе допускается лишь конечное число состояний. Пользователь должен указать фиксированное число бит для каждого входа и выхода программы. 3. Модель вычисления — синхронная. В начале каждого шага программа получает входные данные от ее окружения. Все вычисления программы выполняются мгновенно (не требуют никакого времени). Есть один специальный оператор wait, который применяется для обозначения продвижения времени. Когда вычисление доходит до оператора wait, все изменения выходных данных становятся видимыми для окружения программы и начинается новый шаг вычисления. Таким образом, вычисление осуществляется по следующей схеме: получить входные данные, выполнять операторы (за время 0), до тех пор пока не встретится оператор wait, показать изменения выходных данных, получить новые входные данные и т. д. Операторы wait обозначают точки управления в программе. Семантика опера- 19*
276 Глава 13. Абстракция input set: 1; input start: 8; output count: 8 := 0; output alarm: 1 := 1; loop if set = 1 then count = start] else if count > 0 then count = count — 1; end if; if count = 0 then alarm — 1; else alarm = 0; end if; wait; end loop; Рис. 13.2. Пример программы тора wait, которая используется здесь, типична для языков синхронного программирования. Следует обратить внимание на то, что она отличается от семантики того же оператора в модели асинхронных программ с разделяемой памятью, рассматриваемой в гл. 2 и 12. За исключением оператора wait большинство конструкций языка, используемых в примерах этой главы, не нуждаются в комментариях. Программу на этом языке можно скомпилировать в машину Мура [200] для аппаратной реализации. Машина Мура служит стандартной моделью для синхронных схем, и для целей верификации имеется стандартное преобразование машин Мура в модели Крипке. Когда абстракция не применяется, наш компилятор сразу строит эту модель Крипке. Поскольку модель может иметь большое число состояний, важно избежать порождения явного представления модели. Вместо него компилятор сразу выдает описание модели в виде OBDD. Оно подается впоследствии на вход верификатора моделей. Пользователь задает абстракции для некоторых переменных на этапе компиляции. Применяя методы, рассмотренные нами в преды-
13.2. Абстракция данных 277 дущих разделах, компилятор сразу строит абстрактную модель. В компилятор также встроен ряд абстракций, некоторые из которых будут описаны в следующем разделе. Кроме того, пользователь сам может определять новые абстракции, поставляя процедуры построения OBDD для их представления. Абстрактные варианты первичных отношений вычисляются компилятором автоматически. На рис. 13.2 приведен пример небольшой программы таймера обратного отсчета с возможностью перезапуска. Таймер наделен двумя входными переменными set и start размером в один и восемь бит соответственно. Есть также две выходные переменные: переменная count размером восемь бит, первоначально равная нулю, и переменная alarm размером один бит, первоначально равная единице. В каждый момент времени операции счетчика таковы. Если set равна единице, то счетчику присваивается значение start. В противном случае, если счетчик не равен нулю, то его значение уменьшается на единицу. На выходе alarm устанавливается единица, когда count обратился в ноль; в противном случае на выходе alarm устанавливается ноль. 13.2.4. Пример абстракций В этом разделе мы обсудим некоторые абстракции, оказавшиеся полезными на практике. Каждую из них проиллюстрируем на небольшом примере. Мы привнесем здесь немного «синтаксического сахара» в атомарные высказывания формул темпоральной логики, чтобы облегчить их прочтение. Например, если х — переменная, абстрагируемая посредством соотношения h(d) = / °et,en' если ^ четн°| * ' — \ a0dd, если d нечетно, то мы будем использовать запись even{x) вместо 'х = aeven\ 13.2.5. Конгруенция по модулю натурального числа Для верификации программ, в которых задействованы арифметические операции, полезной абстракцией оказывается конгруенция по модулю определенного натурального то: h(i) = i mod m. Выбор указанной абстракции объясняется следующими свойствами арифметики по модулю т. ((t mod m) + (j mod m)) mod m = (i + j) mod m,
278 Глава 13. Абстракция ((г mod m) - (j mod m)) mod m = (г - j) mod m, ((i mod m)(j mod m)) mod m = (ij) mod m. Иными словами, мы можем определить значение по модулю т для выражения, в котором имеются сложение, вычитание и умножение, вычисляя по модулю т значения его подвыражений. Эту абстракцию можно применять для проверки более сложных взаимосвязей, стоит только воспользоваться следующим результатом из элементарной теории чисел. Теорема 27 (Китайская теорема об остатках). Пусть даны п взаимно простых положительных целых чисел mi,m2,...,m„. И пусть т = mim2... mn, и пусть b, t'i, »2j • • • > *\» — целые числа. Тогда существует единственное такое целое число t, что Ь < i < Ь + т и i = ij (mod rrij) для 1 < j < п. Допустим, что мы обладаем возможностью убедиться в том, что в некоторой точке выполнения программы значение целой неотрицательной переменной х равно ij по модулю rrij для каждого из взаимно простых целых чисел тп\,т2, ¦ ..тпп. Предположим далее, что значение х ограничено величиной mini2 ¦ ¦. m„. Тогда, используя указанный результат, можно прийти к выводу о том, что значение переменной х в этой точке программы определено однозначно. Для иллюстрации этой абстракции мы рассмотрим умножитель размера 16x16 бит без сохранения знака, (см. рис. 13.3). Программа имеет входы req, inl и in?. Последние два входа предназначены для сомножителей, а первый вход — для сигнала о запуске операции умножения. По истечении некоторого числа моментов времени на выходе аск появится значение 1. В этот момент либо выход output выдаст 16-битовый результат умножения, либо overflow примет значение 1, если произошло переполнение. Затем умножитель ожидает, пока req не примет значение ноль, чтобы начать следующий цикл. Умножение само по себе реализовано в виде последовательности шагов сложений и сдвигов. На каждом шаге анализируется младший бит (бит 0) первого сомножителя; если он равен единице, то второй сомножитель добавляется к промежуточному результату. Затем для подготовки к следующему шагу первый сомножитель сдвигается вправо, а второй сомножитель — влево. Особенность нашего языка, которую использует программа, заключается в способности расширять размер операнд до заданного числа бит. Например, х : 5 расширяет размер а; до 5 бит, добавляя
13.2. Абстракция данных input inl: 16; input in2: 16; input req: 1; output factorl: 16 := 0; output factor2: 16 := 0; output output: 16 := 0; output overflow: 1 := 0; output ack: 1 := 0; procedure waitfor(e) while -ie wait; end while; end procedure; loop waitfor(req); factorl = inl; factor2 = in2; output = 0; overflow = 0; wait; loop if factorl = 0) V (overflow = 1) then break; if lsb(factorl) = 1 then (overflow, output) := (output: 17) + factor2 factorl := factorl ;» 1; wait; if (factorl = 0) V (overflow = 1) then break; (overflow, factor2) := (factor2: 17) < 1; wait; end loop; ack = 1; wait; waitfor(->req); ack = 0; end loop; Рис. 13.3. 16-битовый умножитель
280 Глава 13. Абстракция слева необходимое число нулевых бит. Этот прием используется для расширения output и factorS при сложении и сдвиге для обнаружения переполнения.Оператор (overflow, output) := (output: 17) + factor2 присваивает выходу output значение младших 16 бит суммы output и factor2, a overflow — значение разряда переноса. Запись х 4С 1 обозначает сдвиг х влево на один бит. Сдвиг вправо обозначается ^>. Оператор break служит для выхода из самого внутреннего цикла. Спецификация для умножителя задается формулами вида AG(waiting Л req Л (inl mod т = г) Л (in2 mod т = j) -> ->• A[-iackU (аскЛ (overflow^/ (output mod m = ij mod m)))]). Здесь i и j принимают целые значения от 0 до тп — 1, a waiting является атомарным высказыванием, обращающимся в истину, когда выполнение программы пребывает в операторе, помеченном 1. Заметим, что эта спецификация не исключает возможности того, что умножитель будет постоянно сигнализировать о переполнении. Мы проверим, что эта ситуация не реализуется, применяя другую абстракцию (см. разд. 13.2.6). Вход in2, а также выходы factor2 и output были подвергнуты абстракции по модулю тп. Выход factorl не абстрагировался, потому что его битовая структура регулирует добавление factor2 к output. Верификация проводилась для m = 5, 7, 9, 11 и 32. Эти числа являются взаимно простыми, и их произведения 110880 достаточно, чтобы охватить все 216 возможных значения output. Вся верификация требует немногим менее тридцати минут процессорного времени на Sun 4. Практика показывает, что проверять приведенные выше формулы на модели умножителя без использования абстракций просто невозможно. 13.2.6. Представление по логарифму Когда важно лишь знать порядок некоторой числовой величины, полезно представить величину ее логарифмом (с заданной степенью точности). Предположим, например, что i ^ 0. Положим Igi = (log3(t -I-1I, то есть Igi равен 0, если г равно 0, и для каждого t ^ 0 значение Igi равно наименьшему числу бит, необходимому для двоичного представления числа г. Возьмем Igi в качестве h(i). Для иллюстрации этой абстракции обратимся вновь к умножителю, представленному на рис. 13.3. Напомним, что программа, ко-
13.2. Абстракция данных 281 input in: 16; output parity: 1 := 0; output b: 16 := 0; output done: 1 := 0; b := in; wait; while 6 ф 0 do parity := parity ф lsb(b); b := 6»1; wait; end while; done := 1; Рис. 13.4. Программа вычисления четности торая всегда сообщает о переполнении, должна удовлетворять нашей предыдущей спецификации. Отметим, что если lgt + lg j ^ 16, то \gij ^ 16 и умножение t на j не приведет к переполнению. И наоборот, если lgi + lgj ^ 18, то lgij ^ 17 и умножение i на j даст переполнение. Если же lgi-f-lgj = 17, то определить, случится ли переполнение, невозможно. Приведенные соображения вынуждают нас усилить нашу спецификацию, включив туда следующие две формулы: AG(waiting Л гед Л (lg inl + lg in2 ^ 16) -J- -4 A[->ack U ackЛ -^overflow]), AQ(waiting Л reqЛ (lg inl + lg ini? ^ 18) ->¦ -4 A[-iacA U ack Л over/ftnu]). Все 16-битовые переменные программы представлены их логарифмами. Компиляция программы с этой абстракцией и проверка указанных свойств требуют менее одной минуты процессорного времени. 13.2.7. Абстракции одиночного бита и декартова произведения Для программ, в которых задействованы логические операции, очень часто полезна следующая абстракция: h(i) = j-й бит числа i, 18 Зак. 271
282 Глава 13. Абстракция где j — некоторое фиксированное число. Если /ii и Лг — отображения абстракции, то ft(i) = (fti(i),foW) также задает отображение абстракции. Применяя эту абстракцию, можно верифицировать свойства, которые недоступны для проверки при помощи hi и Лг по отдельности. В качестве примера использования абстракций указанных типов рассмотрим программу, изображенную на рис. 13.4. Эта программа считывает 16-ти битовое слово и вычисляет его четность. Выход done обращается в единицу, когда вычисление завершается; в этой точке parity дает окончательный результат. Пусть ft истинно, если слово i имеет нечетное число единиц. Одно из свойств, которое мы вправе потребовать от этой программы, таково: 1) значение, присвоенное переменной Ь, имеет ту же четность, что и in, и 2) начиная с этого момента f b(Bparity становится инвариантом программы. Все, что было сказано выше, можно выразить следующей формулой: -.ftnAAX(-1fbAAG -.(fbepartty)) Vf t'nAAX(-|bAAG(f b®parity)). Для проверки этого свойства была применена комбинированная абстракция для in и Ь. А именно, вместо возможных значений этих переменных была взята их абстракция, состоящая из младшего бита и показателя четности. Вся верификация при этом потребовала всего лишь нескольких секунд. 13.2.8. Символьные абстракции Использование компилятора в OBDD наряду с верификатором открывает возможность применения абстракций, зависящих от символьных значений. Подобный замысел может значительно повысить эффект отдельных типов абстракций. В качестве простого примера рассмотрим программу на рис. 13.5. Нам хотелось бы показать, что значение переменной Ь в следующем состоянии всегда равно значению переменной а в текущем состоянии. Это свойство можно выразить для фиксированного значения, например 42, при помощи формулы AG (a = 42 -> АХЬ = 42).
13.2. Абстракция данных 283 input а: 8; output b: 8 := 0; loop Ь := a; wait; end loop; Рис. 13.5. Простая программа Для проверки одного этого свойства можно воспользоваться следующей абстракцией для о и Ь: М., f 0, если г = 42, ' ( 1 в противном случае. Когда применяется эта абстракция ипрограмма компилируется, возникает отношение переходов R(a, а', Ь, Ы), определяемое соотношением V ¦=¦ а. Здесь штрихи указывают на то, что значение переменной берется в последующем состоянии и все переменные принимают значения из {0,1}. Теперь для проверки того, что наша программа работает правильно для числа 42, нужно проверить следующую формулу на абстрактном уровне: AG C = 0 ->• АХЬ = 0). Конечно, эта формула окажется выполнимой. Понятно, однако, что нам не хотелось бы повторять эту процедуру для всех возможных значений данных. А теперь представим себе, что наша функция абстракции видоизменена следующим образом: ¦«-{? если i = с, в противном случае. Полученная в результате абстракция зависит от нового символьного параметра. Предположим, что программ была скомпилирована с этой абстракцией; тогда сформируется отношение Rc(a,tf,b,i/,c) с параметром с. Взяв с = 42, мы получим отношение R, с которым уже имели дело ранее. Если бы нам удалось запустить алгоритм верификации моделей применительно к параметризованному отношению, мы получили бы параметризованное множество состояний, 18*
284 Глава 13. Абстракция на которых наша формула обращается в истину. Теперь наша спецификация AG (а = 0 -4 АХ 6 = 0) в сущности утверждает, что AG (а = с -? АХЬ = с). Если формула окажется истинной для всех значений с, исследуемая спецификация будет обоснована. Но теперь заметим, что, введя восемь дополнительных OBDD переменных для кодирования всех возможных вариантов с, мы сможем 1) представить hc в виде OBDD (от пользователя требуется всего лишь Лс); 2) скомпилировать программу с абстракцией Лс, для того чтобы получить OBDD, представляющую Rc(fl,a',b,V,c) (компилятор выполняет этот шаг автоматически); 3) провести верификацию модели, для того чтобы получить OBDD, представляющую параметризованное множество состояний (блок верификации моделей делает это автоматически; параметр с просто рассматривается как дополнительная компонента состояния, которая остается неизменной); 4) в случае необходимости выбрать специальным образом с и построить контрпример (что тоже может быть выполнено верификатором). Отметим далее, что в этом случае программа будет вести себя одинаково, независимо от^значения с, и поэтому полученная после компиляции OBDD для Д,. не будет зависеть от дополнительных переменных, введенных нами. И в конце концов проводить верификацию модели будет не сложнее, нежели в случае, когда мы просто проверяли формулу AG (о = 42 -> АХЬ = 42). Вообще говоря, мы обнаружили, что идея разделения, применяемая в OBDD, дает возможность осуществлять эффективно абстракцию, компиляцию и верификацию моделей. Мы будем называть абстракции, подобные Лс, «символьными абстракциями». Мы применяли символьные абстракции для верификации простого конвейера. Его схема изображена на рис. 6.6 и подробно описана в разд. 6.5. Она выполняет трехадресные арифметические и логические операции над операндами, помещенными в регистровый файл.
13.2. Абстракция данных 285 Мы использовали две независимые абстракции для проведения верификации. Во-первых, адреса регистров были абстрагированы так, что каждый адрес соответствовал либо одной из трех символьных констант (ra,rb,rc), либо некоторому отличному от них значению. Такая абстракция позволяет сократить весь регистровый файл до трех регистров, по одному на каждую константу. Во второй абстракции были задействованы отдельные регистры системы. Для верификации операций, скажем, операции сложения, мы вводим символьные константы са и cb и полагаем, что каждый регистр может быть либо одним из трех регистров са, cb, са + cb, либо некоторым отличным от них регистром. В рамках нашей спецификации нам удалось показать, что схема сложения работает правильно. Это свойство выражается следующей темпоральной формулой: AG ((srcaddrl = га) Л (srcaddr2 = rb) Л (destaddr = re) Л -istaW -? ->• АХ AX((regra = са) Л (regrb = cb) -? AX.(regrc = ca + cb))). Эта формула утверждает, что если адреса регистров источников — это га и rb, адрес регистра назначения — это гс и конвейер не заблокирован, то значения из регистров га и rb спустя два цикла будут сложены, и их сумма будет отправлена в регистр гс спустя еще один цикл. Причина, по которой значения регистров га и rb используются только спустя два цикла, связана с учетом задержки конвейера. Наибольший пример конвейера, который был нами опробован, имел файл из шестидесяти четырех регистров, и каждый регистр состоял из 64 битов. Схема имеет более 4000 битов состояния и около Ю1300 достижимых состояний. Для верификации потребовалось немногим менее шести с половиной часов процессорного времени. Вдобавок обнаружилось, что время верификации растет линейно как по числу регистров, так и по длине регистров. Для сравнения, наибольшая схема, которую удалось верифицировать без абстракции, имела восемь 32-битовых регистров, и верификация заняла около четырех с половиной часов процессорного времени на Sun 4. К тому же время верификации росло квадратично по размеру регистров и кубично по числу регистров. При помощи методов, совмещающих композиционные доказательства и абстракцию, можно добиться еще более качественных результатов. Эти методы более подробно рассматриваются в [179].
Симметрия Часто в параллельных системах с конечным числом состояний проявляется разнообразная симметрия. Ее можно обнаружить в устройствах основной памяти и кеш-памяти, в файлах регистров, в протоколах шин и сетевых протоколах — везде, где есть часто повторяющаяся структура. Совсем недавно использование симметрии при верификации моделей было исследовано сразу несколькими авторами [58,111,143,148]. В основу этих методов редукции положена идея о том, что проявление симметрии в такого рода системах влечет за собой существование нетривиальной группы перестановок, которая сохраняет как разметку состояний, так и отношение переходов. Такие группы можно использовать для определения отношений эквивалентности в пространстве состояний систем. Фактормодель, порожденная этим отношением, часто имеет меньший размер, нежели исходная модель. Кроме того, она бисимуляционно эквивалентна исходной модели. Поэтому ее можно использовать для верификации любого свойства исходной модели, выраженного С1Ъ*-формулой. 14.1. Группы и симметрия Мы начнем с того, что напомним некоторые понятия теории групп. Пусть задано некоторое множество G. Группой называется множество G с двуместной операцией (мы будем называть ее групповым умножением) на G, подчиняющееся следующим законам. ¦ Умножение ассоциативно, т. е. о о (Ь о с) = (а о Ь) о с. ¦ Существует такой единичный элемент е 6 G, что для любого элемента a?G выполняются соотношения еоа = а = аое. ¦ Для каждого элемента а € G существует такой обратный элемент о-1, что выполняются соотношения о о а-1 = о-1 о а = е. Обычно для обозначения группы мы будем использовать символ G, а знак операции умножения о будем опускать. Подгруппой Н группы G называется подмножество ЯСС, которое само является группой с той же самой операцией умножения, что и G. 14
14.1. Группы и симметрия 287 Пусть задана группа G с выделенными элементами <7i,..., о*, и пусть (<7ъ•¦•,</*) обозначает наименьшую подгруппу группы G, содержащую элементы д\,..., д^. Если Н = (д\,..., дъ), то мы будем говорить, что Н порождена множеством {gi,- ¦., </*}. Следует иметь в виду, что Н представляет собой замыкание множества {gi,-..,дн} относительно операций умножения и обращения группы G. Перестановкой о на конечном множестве объектов А называется всякая биекция (т. е. взаимно однозначное отображение на) о : А -? А. Множество всех перестановок на А, которое мы будем обозначать Sym А, наделено операцией функциональной композиции и образует группу. Чтобы убедиться в этом, обратите внимание на то, что тождественная перестановка е принадлежит Sym А; если о 6 Sym А, то обратное отображение о~1 тоже содержится в Sym А; и если о', о" € Sym А, то а = а" о о' G Sym А (выражение а" о а' означает, что сначала применяется а', а затем о"). Группа SymA называется полной симметрической группой. Всякая подгруппа G группы Sym А называется группой перестановок на А. Две перестановки о\, о^ не пересекаются тогда и только тогда, когда {г\а1(г)ф1}^Ц\о2а)фз} = 0. Перестановка, осуществляющая отображение »'i >-М2,*2 ^i3,...,ik-i •—> **,** "-Mi, называется циклом и обозначается (*i, *2» - - • ,»*—1, **)- Цикл длины два называется транспозицией. Можно показать, что каждая конечная перестановка может быть представлена в виде композиции непересекающихся циклов. Кроме того, каждую перестановку можно представить в виде композиции транспозиций, некоторые из которых могут пересекаться [182]. Рассмотрим, например, следующую перестановку <т на множестве А - {1,2,3,4,5}: 1i-»3,2i-»4,3h> 1,4h+5,5i->2. Перестановку о можно разложить на два непересекающихся цикла A 3) о B 4 5) или представить в виде композиции трех транспозиций A 3) о B 5) о B 4). Подгруппа группы Sym А, порожденная парой перестановок A 3) и B 4 5), состоит из шести элементов { е, A 3), B 4 5), B 5 4), A 3)B 4 5), A 3)B 5 4) }. Пусть задана модель Крипке М = E,i?, L). Рассмотрим группу перестановок G на пространстве состояний S модели М. Перестановка о € G называется автоморфизмом модели М в том и только том
288 Глава 14. Симметрия а) Модель процесса-компоненты Ь) Модель Крипке для Q || Р Рис. 14.1. Процессы кольца с маркерами случае, когда она сохраняет отношение переходов R. Строго говоря, а обязана удовлетворять следующему условию: Vj?i eSVs2eS ((sus2) € R =» {a{ai),a{s2)) € R). Группу G назовем группой автоморфизмов для модели Крипке М тогда и только тогда, когда каждая перестановка а б G является автоморфизмом на М. Обратим внимание, что в нашем определении группы автоморфизмов не упоминается функция разметки L. Кроме того, отметим, что, поскольку перестановка, обратная автоморфизму а ? G, также является автоморфизмом, нетрудно доказать, что перестановка а является автоморфизмом для модели Крипке тогда и только тогда, когда а удовлетворяет условию Vsi eSVs2€S ((s1,s2) € R «• (<t(si),o-(s2)) G R). Также легко видеть, что если каждый порождающий элемент группы G является автоморфизмом для М, то группа G будет группой автоморфизмов для М. Рассмотрим в качестве примера алгоритм простого кольца с маркерами; компонентами кольца являются процесс Q и несколько копий процесса Р. Структура обоих процессов Р и Q показана на рис. 14.1 а). Каждый компонент имеет три состояния: п (некритическая секция), t (обладание маркером), г (критическая секция). Каждый процесс выполняет два видимых действия: s (переслать маркер) и г (получить маркер). Имеется также невидимое внутреннее действие, обозначенное г. Для упрощения это действие не показано на рисунке. Процесс Q первоначально пребывает в состоянии t, а процесс Р — в состоянии п. Композиция процессов — синхронная.
14.1. Группы и симметрия 289 В композиции Q || Р процессы Р и Q могут быть синхронизированы либо по действию s процесса Q и действию г процесса Р, либо по действию г процесса Q и действию s процесса Р. В обоих случаях результатом будет внутреннее действие т. Кроме того, каждый из них может выполнять внутреннее действие т. Модель Крипке, соответствующая композиции Q || Р, изображена на рис. 14.1 Ь). Пусть Р' обозначает i-кратную композицию процесса Р. В кольце с маркерами Q || Р* действие s каждого процесса синхронизировано с действием г его правого соседа, а действие г — с действием s его левого соседа. Пусть задана перестановка <т, действующая на пространстве состояний Q || Р и меняющая местами (n, t) и (t, г»), а также (п,с) и (с,п). Чтобы убедиться, что а — автоморфизм для Q || Р, исследуем переход из (t,n) в (с, га). Мы увидим, что в системе есть переход из a((t,n)) = (n,t) в сг((с,п)) = (п,с). Анализ любого другого перехода в Q || Р даст такой же результат. Поскольку каждый переход сохраняется перестановкой а, она является автоморфизмом для Q || Р. Вообще говоря, поведение систем с конечным числом состояний часто определяется значениями какого-то семейства переменных состояния xi,жг, •.. ,х„ на некоторой конечной области D. Например, состояние композиции Q \\ Р* определяется набором из t + 1 переменной состояния, каждая из которых принимает значения на множестве {n,t,s}. Когда мы извлекаем модель Крипке из системы, значения переменных состояния определяют атомарные высказывания. Образующаяся в результате модель Крипке М = E, R, L) будет иметь следующие компоненты: ¦ 5 С Dn, где каждое состояние можно представить себе как оценку п переменных состояния; ¦ R С S х S, где R определяется поведением системы; ¦ функция оценки L определяется так, что сЦ € L(s) в том и только том случае, когда Xi = d. Часто случается так, что группа автоморфизмов задается как группа на множестве индексов переменных состояния. Например, перестановка а, определенная на множестве состояний композиции Q || Р, может быть описана транспозицией A 2), которая меняет местами компоненты состояний, относящиеся к первому и ко второму процессам.
290 Глава 14. Симметрия Перестановка а на множестве индексов {1,2,... ,п} задает новую перестановку а' на множестве состояний Dn следующим образом: a'((Xi,X2,...,Xn)) = {xa{i),XaB),...,Xa(n)). Легко видеть, что для любых двух различных состояний х и у из Dn выполняется неравенство а'(х) ф о{у). Таким образом, а' является перестановкой на Dn. Нетрудно показать, что всякая группа G на множестве {1,2,... ,п} индуцирует группу перестановок G\ на множестве Dn. Соответственно всякий автоморфизм на модели схемы порождает автоморфизм на пространстве состояний схемы. 14.2. Фактормодели Пусть задана группа перестановок G на множестве 5, и пусть 8 — это некоторый элемент множества 5. Тогда орбитой элемента s называется множество 0(s) = {t\ За ? G (ст(а) = t)}. Из каждой орбиты 0(a) мы выбираем по одному представителю, который будет обозначен гер(в(з)). Идея построения фактормодели состоит в том, чтобы объединить все состояния одной орбиты в одно единственное представительное состояние. Формальное определение таково. Пусть заданы модель Крипке М = (S, R, L) и группа автоморфизмов G на множестве S. Фактор- модель Mg = (Sg,Rg,Lg) определяется следующим образом: ¦ множеством состояний Sg = {в(з)\ » € 5} служат орбиты всех состояний из 5; ¦ отношением переходов служит До = { @(si),0(s2)) (8U82)€R}; A4.1) ¦ функция разметки Lq задается соотношением LG(9{s)) = Ь{гер{в(8))). Поскольку G является группой автоморфизмов, отношение Rg определено корректно и не зависит от выбора представителей. С другой стороны, определение разметки Lg зависит от выбора представителей. Во избежание этой проблемы ограничимся рассмотрением групп симметрии, которые являются также группами инвариантности. Группа G является группой инвариантности для атомарного высказывания р в том и только том случае, когда множество состояний, помеченных р, замкнуто относительно применения перестановок из G. Говоря более строго, группа автоморфизмов G для модели Крип-
14.2. Фактормодели 291 *> ntZZZZnc, n Рис. 14.2. Фактормодель Q || P. ке М = E, R, L) является группой инвариантности для атомарного высказывания р в том и только том случае, когда выполнено следующее условие: Уст ? G V« 6 5 (р G 1(e) «• р € I(<t(s))). Мы будем говорить тогда, что р инвариантно относительно G. Понятие инварианта и группы инвариантности распространяется на булевы формулы естественным образом. Проиллюстрируем некоторые из введенных понятий, обратившись к модели Крипке для Q \\ Р на рис. 14.1 Ь). Пусть G = {A 2)) — группа, порожденная транспозицией A2). Мы знаем, что G является группой автоморфизмов для Q || Р. Для того чтобы определить фактормодель для Q || Р, индуцированную группой G, мы заметим прежде всего, что орбиты, порожденные грппой G, таковы: {(t,n),(n,t)} и {(с,п),(п,с)}. Если выбрать состояния (t, п) и (с, п) в качестве представителей, то в результате мы получим фактормодель, изображенную на рис. 14.2. Модель Крипке, соответствующая Q || Р%, имеет 2(г + 1) достижимых состояний. Группа перестановок G = (A 2 ... i+1)) является группой автоморфизмов для Q || Р\ Как и в случае Q || Р, группа G порождает только две орбиты, а именно {(t.n'MM.n*-1),...,^1,*)} и {(с>и|I(я,е,я*-1),...,(п*,с)}. Таким образом, фактормодели для Q || Р* и Q II Р просто совпадают (см. рис. 14.2). Этот пример показывает, что учет симметрии может привести к значительной экономии. Обозначим символом с, булеву переменную с для »-й компоненты, т. е. если с< обращается в истину, то t'-й процесс пребывает в критической секции. Заметим, что G является группой инвариантности для булевой формулы те, описывающей взаимное исключение, те = (сх -> 1С2) Л (сг -> ->ci).
292 Глава 14. Симметрия Приведенная далее теорема утверждает, что если темпоральная спецификация / содержит только инвариантные высказывания, то / можно без опасения проверять на фактормодели. Но сначала обратимся к одной лемме, необходимой для доказательства теоремы. Лемма 39. Пусть даны модель М = (S,R,L) с множеством атомарных высказываний АР, группа G инвариантности для всех высказываний из АР и фактормодель Mq для М. Пусть отношение В С 5 х Sg таково, что В(з,в(а)) выполняется для всякого состояния а ? S. Тогда В — отношение бисимуляции между М и Mg- Доказательство. Чтобы убедиться в том, что В является биси- муляцией, мы сначала покажем, что L(a) = Lg@(s)). По определению фактормодели Mg имеем Ь<з@(а)) = L(rep@(s))). Поскольку rep@(s)) G 0(e), должна существовать такая перестановка о € G, что <т(в) = rep@(a)). А ввиду того что G — группа инвариантности для всех р € АР, получаем, что для любого р 6 АР выполнено условие р е L(rep@(s))) «» р Е L(s). Значит, L(s) = Ь(гер(в(з))) = Ьв(в(з)). Рассмотрим переход (в, t) € R. Тогда из определения отноения Rg следует @(*),0(*)) 6 Rg, а из определения отношения В следует выполнимость отношения B(t,d(t)). Предположим теперь, что t? — такое состояние из So, что есть переход @(s), t?) € Rg. Орбита состояния ¦в содержит по крайней мере один элемент, а именно rep(i?). Будем считать, что t совпадает с rep(t?). Тогда 0 = 0(f), и соотношение @(.s),t?) е Rg можно переписать в виде @(s),0(t)) € Rg- По определению Rg это означает, что существует пара таких состояний si и ti, что (*i,ti) G R, a\ G 0(e) и *i € 9(t). Поскольку в и «i принадлежат одной и той же орбите, существует такая перестановка о 6 G, что er(si) = а. По определению группы симметрии мы имеем (o(ai),o(t)) € R, или, иными словами, (a,o(t)) G R. Заметим, что t и o(t) принадлежат одной и той же орбите. Следовательно, o(t) 6 т?, и по определению отношения В получаем J3(a(t),t?). ? Теорема 13 позволяет извлечь из этой леммы такой результат. Следствие 4. Пусть М — модель над АР, a G — группа инвариантности над АР. Тогда для любого в € 5 и произвольной CTL*- формулы над АР мы имеем
14.3. Верификация моделей с использованием симметрии 293 Теорема 28. Пусть заданы модель Крипке М = (S,R,L), группа автоморфизмов G и CTL'-формула /. Если G является группой инвариантности для каждого атомарного высказывания р из /, то M,s\=f * MG,9{s)\=f, A4.2) где Mg представляет собой фактормодель, соответствующую М. Доказательство. Допустим, что модель М определена над АР, а / определена над АР' С АР. Назовем сужением модели М на множество атомарных высказываний АР1 модель М' = (S,R,L'), совпадающую с М во всем, за исключением того, что каждое состояния a € S имеет разметку L'(s) = L(s) П АР1. Ясно, что для всякой СТЬ*-формулы над АР' и для каждого состояния s е S выполняется равносильность M,s\=f <* М',з|=/. Пусть М'а — фактормодель модели М', порожденная группой G. Тогда согласно определению фактормодели Ма является сужением Mq на АР'. Значит, для любого д 6 Sg мы имеем MG,t?(=/ <* M'G,d\=f. Так как G — группа инвариантности для АР', применяя следствие 4, получаем м',5|=/ <* MG,e(s)\=f. В итоге приходим к заключению, что M,s\=f О MG,e(s)\=f. П 14.3. Верификация моделей с использованием симметрии В этом разделе мы опишем, как проводится верификация моделей при наличии симметрии. Вначале мы расскажем, как отыскать множество состояний модели Крипке, достижимых из заданного множества начальных состояний, используя явное представление состояний. В случае когда пространство состояний представлено явно, применяется один из алгоритмов поиска в глубину или в ширину, начинающий работу из множества начальных состояний. Обычно для этого заводятся два списка — список пройденных состояний и список неисследованных состояний. Вначале алгоритм помещает начальные состояния в оба списка. На каждом шаге поиска извлекается некоторое неисследованное состояние и обрабатываются все
294 Глава 14. Симметрия reached := 0; unexplored := 0; for all initial states s do append f(s) to reached; append ?(s) to unexplored; end for all while unexplored ф 0 do remove a state s from unexplored; for all successor states q of s do if ?(q) is not in reached append ?(q) to reached; append ?(g) to unexplored; end if end for all end while Рис. 14.3. Исследование пространства состояний при наличии симметрии его последователи. Алгоритм обхода пространства состояний модели Крипке при наличии симметрии рассматривался в [148]. Авторы этой работы предложили использовать функцию ?(д), которая отображает состояние q на единственное состояние, представляющее орбиту состояния q. При обходе пространства состояний только по одному представителю из каждой орбиты заносятся в списки пройденных и неисследованных состояний. Схема этого алгоритма представлен на рис. 14.3. Этот простой алгоритм анализа достижимости можно развить до полноценного алгоритма верификации моделей для CTL, применив методику, описанную в [63]. Но чтобы построить функцию ?(д), важно уметь эффективно вычислять отношение орбиты. Если представление модели основано на OBDD, то построить фактормодель гораздо труднее. Начнем с того, что если отношение R представлено с помощью OBDD R(vi,... ,Vk,v[,... ,v'k), и задана перестановка переменных состояния а, то нетрудно проверить, является ли а автоморфизмом. Это делается путем сравнения OBDD R(vi,..., vk, v[,...,v'k) с OBDD R(v„{1),..., vm, v'aA),..., t?(fc)), задающей отношение переходов в модели, подвергшейся перестановке. В нашем методе вычисления фактормодели OBDD используются для представления отношения орбит &(х,у) <=> [х € в{у)). Если
14.3. Верификация моделей с использованием симметрии 295 заданы модель Крипке М = (S,R,L) и группа автоморфизмов G на Мег порождающими элементами gi,g-z,. ¦ ¦ ,дг, то отношение орбит 0 есть наименьшая неподвижная точка уравнения Y(x,y) = (х = у V 3z(Y(x,z)A\/y = gi(z))). A4.3) t Этот результат обоснован в следующей лемме. Лемма 40. Наименьшая неподвижная точка уравнения A4.3) является отношением орбит 0, индуцированным группой перестановок G с порождающими элементами д\, д%,..., дг. Доказательство. Вначале покажем, что 0 — это неподвижная точка уравнения A4.3). Очевидным следствием транзитивности и рефлексивности отношения орбит 0 является соотношение 0(i,у) D (х = у V 3z(Q(x,z)A\/y = gi(z))). i Допустим, что имеет место отношение &(х,у); тогда выполняется также и отношение Q(y,x). Значит, по определению отношения орбит существует такой автоморфизм а € G, что у = а{х). Будем считать, что х ф у (если х = у, то доказательство очевидно). Это означает, что существует такая порождающая перестановка дк, к ^ г, что р*(<т'(ж)). Полагая z = о'{х), мы видим, что имеют место отношение 0(i,z) и равенство у = gk(z). Поскольку х и у — произвольные булевы векторы, получаем следующее включение: в(х,у) С (х = у V 3z(e(x,z)Ayy = gi(z))). i Следовательно, 0 — неподвижная точка уравнения A4.3). Покажем, что если Т — неподвижная точка уравнения A4.3), то имеется включение 0 С Г. Мы убедимся в том, что 0(ж, у) «¦ Т(х, у). Из определения отношения орбит Q(x,y) вытекает существование такой перестановки а = gim . ..д^д^, 1 ^ ij ^ г, что а(х) = у. Так как Г — неподвижная точка уравнения A4.3), воспользовавшись индукцией, можно установить, что отношение Т(х,д^д^ ...&,) будет иметь место для любого 1 ^ Z ^ т. Воспользовавшись этим результатом для случая I = т, мы увидим, что выполняется отношение Т(х,у). А поскольку Q(x,y) <= Т(х,у), мы получаем 0 С Г. Значит, 0 — наименьшая неподвижная точка. D Если мы располагаем подходящим кодированием состояний, то для решения уравнения неподвижной точки можно воспользоваться аппаратом OBDD [46]. А как только мы получим отношение орбит 0(х,у), возникает необходимость вычислить функцию ? : S -»¦ S,
296 Глава 14. Симметрия сопоставляющую каждому состоянию я уникального представителя его орбиты. Поскольку 0 является отношением эквивалентности, этот уникальный представитель может быть вычислен при помощи OBDD по методу Лина и Ньютона [175]. Предположим, что у нас есть OBDD, представляющая функцию ?. Тогда отношение переходов Rg фактормодели определяется так: Re(x,y) = 3x13y1(R(x1,y1)A(t{x1) = x)A(t(yi) = y)). 14.4. Вопросы сложности В этом разделе мы рассмотрим сложностные аспекты использования симметрии при верификации моделей. Мы покажем, что задача вычисления орбит не менее сложна, нежели проблема изоморфизма графов, о которой известно, что она содержится в NP, но неизвестно, является ли она NP-полной. Мы также приведем обоснованные оценки размера OBDD для отношения орбит. 14.4.1. Задача вычисления орбит и изоморфизм графов Наиболее важный этап верификации моделей с учетом симметрии заключается в определении того, принадлежат ли два состояния одной и той же орбите. Мы обсудим здесь сложность этой задачи. Рассмотрим группу перестановок G на множестве {1,2,...,п}. Предположим, что группа G определена в терминах конечного множества порождающих элементов. Пусть заданы два вектора х е Вп и у € Вп. Тогда проблема орбит состоит в выяснении вопроса о существовании такой перестановки а € G, что у = а{х). Пусть заданы два таких графа Гх = (Vi,Ei) и Гг = (Vb,^), что |Vi| = \Vz\. Тогда проблем изоморфизма графов — это вопрос о существовании такой биекции / : Vi -? Yz, которая удовлетворяла бы условию (•,»€ Si О (/(•),№)еЕг. ТЕОРЕМА 29. Проблема орбит столь же вычислительно трудна, как и проблема изоморфизма графов. Доказательство. Для обоснования утверждения теоремы мы покажем, как по произвольным графам Ti = (Vi,E\) и Г? = (Р^-Бг) построить группу G и два таких 0-1 вектора хну, что хм у принадлежат одной и той же орбите для группы G в том и только том случае, когда Ti и Гг изоморфны. Будем полагать, что |Vi| = \Vi\ = п.
14.4. Вопросы сложности 297 Пусть А = {ау} и В = {Ьу} — матрицы смежности графов Г* и Гг соответственно. Рассмотрим вектор х 6 {0,1}" , где Xn(i-l)+j = Оу, 1 ^ t < П, 1 < J < п. Вектор х представляет собой список элементов матрицы А, расположенных по строкам. Вектор у определяется аналогичным образом для матрицы смежности В. Пусть (г j) — транспозиция, определенная на множестве {1,2,..., п}. По существу, ее можно истолковывать как перестановку вершин г и j в графе Гх. Она соответствует перестановке строк с номерами i и j, а также столбцов с номерами i и j в матрице смежности и оказывает воздействие, в точности соответствующее тому, которое оказывает перестановка а на вектор х: о-гош = (n(i - 1) + 1, n(j - 1) + 1)... (n(i - 1) + п, n(j - 1) + п), о col = (i,j) • • • ((n - l)n + г, (n - l)ra + j), (J —= Ofov) Оcol~ Каждая перестановка на множестве мощности п = | V\ | соответствует биекции / : Vi i-> Уг- Мы предполагаем, что вершины занумерованы натуральными числами. Если биекция, соответствующая транспозиции (i j), является изоморфизмом между графами Ti и Т%, то, переставляя строки с номерами г и j, а также столбцы с номерами г и j в матрице А, мы получим матрицу В. Отсюда следует, что у = <т(х), поскольку матрицы А и В закодированы при помощи х и у. Верно и обратное, а именно, если у = а(х), то биекция, соответствующая транспозиции (i j), является изоморфизмом между графами Ti и Гг. Поэтому равенство у = а(х) выполняется тогда и только тогда, когда биекция, соответствующая транспозиции (i j), является изоморфизмом между графами Ti и Гг. Каждая биекция / : V\ >-> V? соответствует некоторой перестановке полной симметрической группы Sn. Ввиду того что группа 5„, действующая на множестве {1,2,... ,п}, порождается транспозициями A 2), A 3),..., A п), мы приходим к утверждению теоремы. Нам нужно всего лишь представить все такие транспозиции в терминах перестановок 0-1 векторов х и у. ? Рассмотрим в качестве примера два графа Ti и Гг, изображенные на рис. 14.4. Векторы х и у, приведенные ниже, кодируют матрицы смежности графов Гх и Гг соответственно: х = @11 100 100), у = @10 101 010). Перестановки arow и асо[, приведенные ниже, переставляют строки с номерами 1 и 2, а также столбцы с номерами 1 и 2 в матрице, соот-
298 Глава 14. Симметрия <: Gi W Рис. 14.4. Два изоморфных графа ветствующей вектору х. Их композиция задает перестановку вершин 1 и 2 в графе IV "гот — A 4)B 5)C 6), асо, = A 2)D 5)G 8), а = aTOVI a cot- Легко видеть, что у = сг(х), и биекция, отвечающая перестановке A2), задает изоморфизм между Г\ и Гг. 14.4.2. Отношение орбит и OBDD Схемы обычно формируются из отдельных компонентов, и биты состояний группируются в соответствии с иерархической структурой систем. На практике чаще всего приходится сталкиваться с двумя следующими разновидностями симметрических групп. 1. Группы вращения. Они соответствуют случаю, когда эквивалентные компоненты упорядочены по циклу и могут перемещаться по кругу на произвольное число шагов. Примером может служить протокол кольца с маркерами, используемый при решении распределенной проблемы взаимного исключения. Здесь проявляется симметрия относительно вращения. Группой перестановок G, действующей на множестве {1,2,..., п}, в этом случае будет группа вращения, порожденная циклом B 3 ... п 1). 2. Полная симметрическая группа. Она соответствует случаю, когда эквивалентные компоненты неупорядочены и могут меняться ролями произвольно. Такие группы возникают, например, в том случае, когда компоненты взаимосвязаны через общую шину (в многопроцессорных системах), или в системах с широковещательным обменом сообщениями. .<
14.4. Вопросы сложности 299 Мы обоснуем только нижнюю оценку размера OBDD для отношения орбит групп вращения. Обоснование аналогичного результата для полных симметрических групп может быть получено подобным же образом (см. [58]). Для простоты мы рассмотрим систему, представляющую собой композицию N копий однго и того же компонента; примером может служить кольцо или шина с N эквивалентными компонентами. Каждый компонент i характеризуется вектором afj, состоящим из к переменных состояний Xj,i,..., х^/ь. Такой вектор будет называться блоком. Состояние системы определяется набором {х\,..., &n). Перестановка о, воздействуя на компоненты {1,..., N}, порождает тем самым перестановку переменных состояния и, следовательно, перестановку на множестве состояний: o({Si,...,Sn)) = (xV(i),-. -,ха^). Отметим, что OBDD для отношения орбит в группы G зависит от переменных x*i,..., ?ц, х\,..., а?ы и определяется следующим соотношением: 0(fl,...,X,jV,fi,...,XAf) = 1 тогда и только тогда, когда Зет EG: <r((x*i, ... ,ЗД = <*!,•• •, Аг>- Обозначим символом |Э| размер OBDD, представляющей в. Лемма 41. Пусть булева функция /(xi,..., хдг, х\,..., x'N) представлена формулой Л (*< = *$)¦ »=1 Предположим, что F — OBDD для /, и F устроена так, что все нештрихованные переменные предшествуют штрихованным. Тогда \F\ 2 2П. Доказательство. Рассмотрим два набора (&i,..., Ь„) и (ci,..., с), задающих значения вектора (xi,..., х„). Различить эти наборы можно при помощи неравенства /(bi,.--ibjv,bi,...,bjv) Ф f(ci,...,CN,bi,...,bN). Рассмотрим вершины vi и^, достижимые из самой верхней вершины данной OBDD после прохождения двух путей, соответствующих наборам (bi,.. •, Ьп) и (ci,..., с). Поскольку это разные наборы, вершины «1 и «2 тоже должны быть разными. Имеются 2" различных наборов значений для булева вектора (xi,... ,х„), и каждое из них соответствует различным вершинам (на уровне п) в OBDD F. Поэтому число вершин на уровне п в OBDD F превосходит 2". D
300 Глава 14. Симметрия Теорема 30. Предположим, что система состоит из N эквивалентных компонентов, в каждом из которых содержатся к переменных состояний. Тогда для группы вращения G, действующей на множестве {1,..., N}, нижняя оценка сложности OBDD, представляющей отношение орбит 0, индуцированное группой G, такова: |0| > 2К, где К = minCN/JV^*-1). Доказательство. Предположим, что OBDD 0 представляет отношение орбит. Для доказательства нижней оценки рассмотрим первые переменные из каждого блока. Спустимся вниз из самой верхней вершины OBDD 0, до тех пор пока не будут пройдены К переменных Xiti или К переменных х[д. Отсечем нижнюю часть OBDD 0 на этом уровне. Не ограничивая общности, будем полагать, что в оставшейся части содержится К нештрихованных переменных с индексами *ь ••¦>*#• Рассмотрим множество J индексов штрихованных переменных вида x'j j в оставшейся верхней части OBDD. Множество J будет содержать менее К элементов. Рассмотрим множество Т = {а € G \ a(I)r\J Ф 0}. Для каждой перестановки а е Т существуют такие i?/, j ? J, что при этой перестановке i-й блок становится на место j'-ro блока. Поскольку перестановка а является вращением, она полностью определяется тем, что г отображается на j. Количество вариантов выбора г 6 I и j е J меныне,чем К2. Из определения величины К видно, что К2 ^ N, и поэтому \Т\ < N, а множество G \ Т непусто. Любое вращение г € G\T обладает свойством г(/)П J = 0. Иными словами, каждое такое вращение отображает нештрихованную переменную sct.i, расположенную в верхней части OBDD, в штрихованную переменную x'jtl из нижней части OBDD. Воспользуемся леммой 41 для оценки размера OBDD 0. Для этого построим такую OBDD 0' меньшего размера, в которой все нештрихованные переменные расположены выше штрихованных. Выберем вращение г € G \ Т. Подставим в качестве значений для векторов переменных (а^,2)... ,xijtk) и {x'ii+rt2,---,х\.+гк), где ij € /, двоичную запись числа j. (Так как 1 ^ j < К, нужно, чтобы К ^ 2*-1). Переменные xtj и х\ • получают значение 0 при % $ I. У получившейся в результате OBDD 0' свободными переменными будут Xiti,x'i+rl, i € I, причем все нештрихованные переменные расположены в верхней части OBDD, а все штрихованные переменные — в нижней части. Очевидно, 0' имеет меньший размер, нежели 0. Значения переменных были выбраны так, чтобы для вращения г
14.5. Практические результаты 301 штрихованные и нештрихованные переменные принимали попарно равные значения. Таким образом, в' представляет OBDD для следующей булевой формулы: A(*<.i=«S+r,i)- Поскольку переменные а^д расположены выше x'i+rl, из леммы 41 следует, что размер OBDD 0' превосходит 2К. А так как OBDD 0' меньше OBDD 0, неравенство |0| > 2К обосновано. ? Для отношения орбит, индуцированного полной симметрической группой или группой вращения, OBDD имеет размер, экспоненциально зависящий от наименьшего из двух параметров — числа компонентов и числа состояний в одном компоненте. Поэтому применение отношения орбит для полноценного использования симметрии такого рода при символьной верификации ограничено примерами систем, состоящих из небольшого числа процессов, или систем, каждый компонент которых имеет всего несколько состояний. Подход, позволяющий избежать вычисления отношения орбит, описан в [64]. Суть его такова. Для заданной модели Крипке М = (S,R,L) и множества представителей Rep С S строится модель Мцер, множеством состояний которой является Rep. Множество Rep может иметь более одного состояния из одной и той же орбиты. При таком подходе отпадает необходимость в построении OBDD для отношения орбит. 14.5. Практические результаты Чтобы проверить все эти идеи, рассмотрим простой протокол когерентности кеш-памяти для многопроцессорной системы с одной шиной, соответствующей стандарту IEEE Futurebus+ [147]. Мы уже обсуждали этот протокол в разделе 8.2. У системы есть шина, через которую обмениваются информацией процессоры и общая память. Каждый процессор снабжен локальной кеш-памятью, состоящей из некоторого фиксированного числа кеш-строк (см. рис. 14.5). На каждом цикле обмена сообщениями по шине арбитр шины назначает один из процессоров ведущим. Ведущий процессор выбирает адрес кеш-строки и команду, которые он собирается отправить в шину. Остальные процессоры и устройство памяти получают команду из шины и изменяют свое локальное окружение. В стандарте протокола описано, как должны реагировать компоненты системы для поддержания когерентности кеш-линий у разных процессоров, т. е. чтобы процессоры считывали только правильные значения дан-
302 Глава 14. Симметрия PI 1 cl 1,1 cl 1,2 ... cll,K 1 Р2 | cl 2,1 с12,2 ... с!2,К Mem mem 1 mem 2 ... mem К V ) Рис. 14.5. Структура системы ных, и никакие данные не терялись при записи. Для верификации протокол был формализован, а когерентность кеш-памяти и другие важные свойства были выражены в терминах темпоральной логики. Поведение процессоров, шины и устройства памяти можно описать при помощи машин с конечным числом состояний. Состояние процессора Pi определяется состояниями каждой кеш-строки кеш- памяти процессора и состоянием интерфейса шины. Описание глобальной шины включает команды шины, адрес активной кеш-строки, а также некоторые другие управляющие сигналы шины, предназначенные, например, для подслушивания и арбитража. В этой системе есть две очевидные симметрии. Во-первых, сами процессоры симметричны, то есть мы можем поменять окружение у любых двух процессоров в системе. Во-вторых, симметричными оказываются кеш-строки, то есть любые две кеш-строки можно одновременно поменять местами во всех процессорах и в устройстве памяти. Для поддержания корректности в ходе применения упомянутых симметрии нужно переименовать все кеш-строки и адреса процессоров. Обе симметрии обозначены на рис. 14.5 стрелками. Вся система в целом получается в результате синхронной композиции всех ее компонентов; будем полагать, что она описывается
14.5. Практические результаты 303 моделью Крипке М = (S,R,L). Поскольку значения данных можно закодировать двоичными наборами, каждое состояние можно представить двоичным вектором, а отношение переходов iR может быть представлено OBDD. Когда используется только симметрия процессоров, мы выбираем в качестве представителей те состояния, в которых процессор 1 играет роль ведущего процессора. Когда используется только симметрия кеш-памяти, мы выбираем в качестве представителей те состояния, в которых кеш-строка 1 активна. А когда используются обе симметрии, в качестве представителей выбираются те состояния, в которых процессор 1 играет ведущую роль и кеш-строка 1 активна. Рассмотрим ряд свойств, каждое из которых можно записать в виде пропозициональной формулы. Свойство р. Для каждой кеш-строки верно, что если один процессор пребывает в состоянии exclusive-modified, то все прочие процессоры находятся в состоянии invalid. Свойство q. Для каждой кеш-строки верно, что если память содержит неправильные данные, то либо все процессоры пребывают в одном из двух состояний shared memory или invalid, либо один из процессоров находится в состоянии unmodified. Свойство т. Все кеш-строки устройства основной памяти правильны. Свойство с. Одна из команд read-modified или invalidate проходит по шине. Некоторые из наиболее важных свойств протокола таковы: ¦ AG р и AG q — свойства р и q всегда выполняются; ¦ AG (m -> A[m U с]) — если в основной памяти содержатся правильные данные, то они остаются таковыми, до тех пор пока не будет вызвана подходящая команда; ¦ AG (EF т) — из любого достижимого состояния можно попасть в состояние, в котором каждая кеш-строка основной памяти содержит только правильные данные. В [64] симметрия была использована для проверки этих свойств применительно к модели протокола когерентности кеш-памяти, представленного OBDD. Для некоторых конфигураций удалось добиться эффекта понижения размеров OBDD на 15 порядков.
Бесконечные семейства конечных систем Научиться автоматически анализировать целые семейства систем с конечным числом состояний — это важная задача. Такие семейства часто возникают при проектировании как аппаратуры, так и программного обеспечения реагирующих систем. Как правило, схемы и протоколы параметризованы, т. е. они определяют бесконечное семейство систем. Например, схема умножения целых чисел имеет разрядность числа п в качестве параметра, шина параметризована относительно числа процессоров и устройств кэш-памяти, параметром алгоритма кольца с маркерами служит число процессов в кольце. Бблыная часть исследований в области верификации моделей сосредоточена на проверке правильности отдельных систем с конечным числом состояний. В этой главе мы опишем методы верификации параметризированных систем, рассматривая их как бесконечные семейства систем с конечным числом состояний. Эту задачу можно воспринимать как разрешение проблемы «комбинаторного взрыва» в пространстве состояний, так как множество состояний в этом случае неограничено. Более строго эта задача формулируется так. Для заданного бесконечного семейства систем Т = {Mi}^ и темпоральной формулы / проверить, что все системы из J- удовлетворяют /, то есть Vi [Mj f= /]. В общем случае эта задача неразрешима [12, 16, 237]. Мы приведем формальное обоснование этого результата в разд. 15.5 в конце главы. Для прочтения большей части главы нет необходимости вникать в детали этого доказательства. 15.1. Темпоральные логики для бесконечных семейств Традиционно темпоральные логики описывают свойства какой- либо конкретной модели Крипке. Эти логики можно расширить так, чтобы описывать свойства бесконечных семейств моделей Крипке. Два таких расширения обсуждаются далее. В работе Брауна, Кларка и Грамберг [33] введена разновидность CTL*, которая была названа индексированной CTL*, или ICTL*. Вы- 15
15.2. Инварианты 305 оказывания в ICTL* индексированы натуральными числами. Смысл индексов таков: если высказывание помечено индексом», то оно относится к »-му компоненту процесса. Для произвольной CTL'-форму- лы / обозначим симвлом /(») вариант формулы /, в котором все высказывания помечены индексом t. В индексированной логике ICTL* допускаются формулы вида A</(t) (формула / истинна во всех компонентах) и Vj/(») (формула / истинна хотя бы в одном компоненте). Также допустимы формулы вида t\&if{j) (все компоненты, кроме i, удовлетворяют /) и V&if(j) (некоторый компонент, отличный от *, удовлетворяет /). Например, рассмотрим бесконечное семейство колец с маркерами ^" = {^11 Р*}^. Приведенная ниже формула ICTL* выражает свойство взаимного исключения для семейства Т: AiAG(ci=»Ai,4,-.ci). В работе [68] была предложена другая разновидность CTL*, в которой атомарные высказывания замещены регулярными выражениями. Обратимся вновь к семейству Т = {Q || Р*}^ и положим 5 = {n,t,c}. Состояниями модели Крипке для Т могут быть векторы произвольной длины, компоненты которых принадлежат S. Иначе говоря, состояния моделей Крипке для семейства Т — это строки в алфавите S, т. е. элементы множества S*. Заметим, что регулярное выражение {п, t}*c{n, t}* описывает свойство взаимного исключения для некоторого состояния в одной из моделей семейства Т. Преимущество регулярных выражений состоит в том, что они применимы к векторам произвольной длины и характеризуют состояния любой модели Крипке, принадлежащей бесконечному семейству Т. Приведенная ниже формула описывает свойство взаимного исключения: AG({n,t}*c{n,t}*). 15.2. Инварианты Основу большинства методов верификации семейств моделей с конечным числом состояний составляет поиск инварианта. Формальное определение инварианта таково. Пусть задано семейство моделей Т — {Mi, Mi, • • •}, а также рефлексивное и транзитивное отношение >. Тогда инвариантом X называется модель, удовлетворяющая условию X > М для всех М в Т. Отношение > определяет, какого вида темпоральные свойства можно проверить. Наиболее широко используются отношения биси- муляционной эквивалентности (М = X) и симуляционного квази- 21 Зак. 271
306 Глава 15. Бесконечные семейства конечных систем порядка (М < X), сохраняющие истинность формул логик CTL и ACTL*, а также эквивалентности языков (М й X) и включения языков (М С X), сохраняющие истинность формул LTL. Как бисимуля- ционная эквивалентность, так и эквивалентность языков обеспечивают строгое сохранение, то есть для всех М из Т мы имеем Квазипорядок симуляции и включение языков обеспечивают лишь слабое сохранение, т. е. для всех М из Т верно, что х и / =» м |= /. Однако, если I ^ /, то заключить что-либо об истинности формулы / на всем семействе невозможно и требуется предложить новый инвариант. Для выработки нового инварианта может быть полезен контрпример, полученный при проверке истинности формулы / в X. В работе Брауна, Кларка и Грамберг [33] рассматривается семейство колец с маркерами. Показано, что кольцо размера п (п ^ 2) бисимуляционно эквивалентно кольцу размера 2. В таком случае, кольцо размера 2 — это инвариант X. Рассмотрим произвольную формулу / логики CTL*. Воспользовавшись теоремой 14, приходим к выводу о том, что X (= / тогда и только тогда, когда / истинна для всего семейства колец с маркерами. К сожалению, эта бисимуляция должна быть построена вручную. Кроме того, поскольку отношение бисимуляции = строже, нежели квазипорядок симуляции ^, для би- симуляции = труднее придумать инвариант. Другие методы анализа семейств моделей с конечным числом состояний предложены в работах [109, 110, 123]. Мак-Миллан и Куршан [165], а также Волпер и Левинфосс [250] предложили использовать правило инварианта как более систематичный метод поиска инварианта. Предположим, что каждый элемент Mi семейства Т является композицией некоторого количества примитивных моделей. Далее, предположим, что оператор композиции || монотонен относительно >, то есть, для любых моделей Pi, Р[, Р2, PJ из того, что Рх > Р{ и Р2 > Р'г следует, что Pi || Р2 > Р{ \\ Р'ч- В простейшем виде правило инварианта дается для семейства Т = {Р'}~х. В приведенной ниже лемме предложено правило инварианта и обоснована его корректность. Лемма 42. Пусть задано рефлексивное и транзитивное отношение >, а также оператор композиции ||, монотонный относительно >. Если I > Р и X > X || Р, то X > Pi для всех i ^ 1.
15.2. Инварианты 307 Доказательство. Мы докажем этот результат индукцией по г. По условию леммы соотношение верно для t = 1. Пусть г ^ 2. Предположим, что утверждение истинно для * — 1. Первое неравенство из приведенных ниже — предположение индукции. Второе неравенство следует из первого, если применить композицию с Р и воспользоваться монотонностью композиции относительно >: 1>Р*-\ X1| Р > Р\ Из условия X > X1| Р и транзитивности > получаем 1>Р*. ? Это правило можно легко распространить на семейства вида {Q || P'}?i для произвольных моделей Q и Р\ Если Т удовлетворяет указанным выше условиям, то X = Q || X' является инвариантом для указанного семейства. Это правило остается справедливым, если к процессам применять другие операции (такие как переименование и сокрытие) при условии, что они монотонны относительно >. В некоторых случаях трудно или даже невозможно отыскать такой инвариант I, что X > Р*. Однако если мы рассмотрим окружение, в котором выполняются Р* (например, Q в рассмотренном ранее семействе), то такой инвариант существует. Мы покажем, как можно применять этот метод для верификации примера кольца с маркерами, описанного в гл. 14. Процессы Р и Q из этого примера воспроизведены на рис. 14.1 а). Они почти одинаковы за исключением того, что начальным состоянием процесса Q является t, а начальным состоянием процесса Р является п. На рис. 14.1(b) изображена модель Q || Р, соответствующая композиции Q и Р. Оператор композиции || определен подобно оператору композиции из гл. 12, и он монотонен относительно квазипорядка симуляции. Мы утверждаем, что Q \\ Р — инвариант семейства {Q || Р'}~! относительно квазипорядка симуляции (У). Для обоснования этого нам необходимо лишь показать, что Q || Р >; Q || Р || Р. Из монотонности оператора || относительно У и транзитивности отношения У мы заключаем, что Q || Р У Q || Р* для всех г. Модель Q || Р || Р приведена на рис. 15.1. Отношение симуляции привязывает начальное состояние (t,n,n) модели Q || Р || Р к начальному состоянию (t,n) модели Q || Р. Оно также соотносит друг с другом (с, п,п) и (с, п). Состояния (п, <, п) и (п, п, <) ассоциируются с (n, i), а состояния (п,с,п) и (п,п,с) — с (п, с). Легко проверить, что это отношение является квазипорядком симуляции. В [165] и [250] обобщения правила инварианта применяются для специальных моделей вычислений с характерными квазипорядками. 21*
308 Глава 15. Бесконечные семейства конечных систем Рис. 15.1. Модель Крипке для Q || Р || Р 15.3. Пересмотренный пример Futurebus-f- Мы применим принцип индукции к непростому примеру рассмотренного в разд. 8.2 и 14.5 протокола когерентности кэш-памяти Futurebus+ для случая одной шины. Этот пример описывает бесконечное семейство Т = {Р1,Р2,...} моделей Крипке, где Р* представляет шину с t процессами на ней. Модель каждого компонента Р задана SMV-программой. На рис. 15.2 приведена часть программы, описывающая генерацию очередной команды для процесса Р. Мы обозначили статус кэш-памяти I (invalid), ЕМ (exclusive-modified), EU (exclusive-unmodified) и SU (shared-unmodified). У каждого процессора есть булева переменная master, которая истинна, если процессор обладает правом записи на шине. В каждый момент времени только у одного из процессоров переменная master равна 1.
15.3. Пересмотренный пример Futurebus+ 309 ASSIGN init(cmd) := idle; next(cmd) := case state=I к !master : {read_shared, read_modified, idle}; state=EH к ! master : {copy„back, idle}; state=EU к ! master : {copy_back, idle}; state=SU к ! master : {invalidate, copy.back, idle}; master : cmd; 1: idle; esac; Рис. 15.2. Часть процесса P Наше первое приближение для инварианта — это процесс Р. Согласно принципу индукции, для того чтобы Р был инвариантом, он должен удовлетворять условию PtP\\P, т. е. Р должен имитировать композицию Р || Р. К сожалению, это не так. Например, когда Р\\ Р имеет статус (exclusive-modified, invalid), система может выдать команды copy.back и read_shared. Ни в каком состоянии Р не может выдать обе эти команды. Для решения этой проблемы в качестве нового инварианта мы попробуем взять модификацию процесса Р, именуемую Р'. Процессы Р и Р' различаются, главным образом, тем, как они вырабатывают очередную команду. Фрагмент измененной программы Р' приведен на рис. 15.3. Для доказательства того, что Р' является инвариантом, мы должны проверить следующие условия: Р'УР, Р' У Р' || Р. Первое требование соблюдается, поскольку Р* получен из Р добавлением новых переходов. Для доказательства того, что второе требование соблюдается, мы установим соответствие между достижимыми состояниями процессов Р' и Р' || Р и покажем, что оно является симуляцией. Состояние в' процесса Р' соответствует состоянию (si, s^) процесса Р' || Р, если выполнены следующие условия. 1. Статусы кэш-памяти согласованы, то есть (а) если статус состояния а' — invalid, то статус состояний *i и ej — также invalid;
310 Глава 15. Бесконечные семейства конечных систем ASSIGN init(cmd) := idle; next(cmd) := case state=I ft !master : {copy.back, read.shared, read_modified, idle}; state=EM ft ! master : {copy.back, read.shared, read.modified, idle}; state=EU ft ! master : {copy.back, read_shared, read.modified, idle}; state=SU ft ! master : {invalidate, copy.back, idle}; master : cmd; 1: idle; esac; Рис. 15.3. Часть инварианта P1 (b) если статус состояния а' — shared-unmodified, то статус хотя бы одного из состояний з\ или «2 — shared-unmodified, а другого — invalid или shared-unmodified; (c) если статус состояния в' — exclusive-modified, то статус в точности одного из компонентов — exclusive-modified, а другого — invalid; (d) если статус состояния s — exclusive-unmodified, то статус в точности одного из компонентов — exclusive-unmodified, а другого — invalid. 2. В состоянии в бит master принимает значение 1 тогда и только тогда, когда только в одном из состояний а\ или «2 бит master содержит 1. 3. Значение переменной команд cmd в состоянии в совпадает со значением переменной cmd того состояния, в котором бит master принимает значние 1. Так, если master=l в состоянии ау, то значение cmd в состоянии а\ должно совпадать со значением cmd в состоянии е. Аналогично, если master=l в состоянии а%, то значение cmd в состоянии 82 должно совпадать со значением cmd в состоянии з. Непосредственной проверкой можно убедиться в том, что начальные состояния соответствуют друг другу и для любой пары соответствующих состояний 8 я (81,82) каждый возможный переход из (81,82) также возможен из а.
15.4. Графовые и сетевые грамматики 311 Проведем проверку для одной конкретной пары состояний. В остальных случаях проверка проводится аналогично. Рассмотрим случай, когда статус состояния s — exclusive-modified, статус состояния si — exclusive-modified, а статус состояния S2 — invalid. Тогда si € Р' может выдать либо copy_back, либо read_modif ied, либо read.shared, в то время как 82 & Р может выдать либо read.shared, либо read.modif ied. Мы рассмотрим некоторые переходы из состояния (si,«2) и докажем существование соответствующих переходов из состояния s. ¦ Пусть в состоянии яг master=l и cmd=read_shared. Напомним, что, выдав команду read.shared, процессор получает кэш-строку для чтения. Это происходит, когда второй процессор выдает команду read.shared. Рассмотрим (si,a2) — следующее состояние процесса Р' || Р. В s'2 статус кэш-памяти — shared-unmodified, а в s[ — shared- unmodified или invalid. Поскольку состояния $ и (в1,яг) соответствуют друг другу, значение cmd в состоянии а также read.shared. Пусть з' — последователь состояния s в Р'. Тогда в а' статус кэшпамяти — shared-unmodified. Следовательно, состояния s' и (sl,^) соответствуют друг другу. ¦ Пусть в состоянии »2 master=l и cmd=read_modif ied. Напомним, что, выдав команду read_modif ied, процессор получает кеш-строку для монопольного использования. Рассмотрим (si,s'2) — следующее состояние процесса Р' || Р. В s[ статус кэш-памяти — invalid, а в s2 — exclusive-modified или exclusive-unmodified. Процесс-инвариант Р' может выдать команду readjnodif ied и изменить статус на exclusive-modified или exclusive-unmodified. Поэтому следующее состояние s соответствует (ai,a2). ¦ Случаи, когда master=l в состоянии в\, и выдаются команды copy .back, read_shared или read.modif ied, рассматриваются аналогично. 15.4. Графовые и сетевые грамматики При изучении семейств моделей Кринке возникает важный вопрос: как порождаются бесконечные семейства? Большинство авторов рассматривает стандартные топологические конструкции, такие как кольца и звезды. Мы представляем формальный подход, основанный на графовых грамматиках, который позволяет порождать многие интересные топологические конструкции.
312 Глава 15. Бесконечные семейства конечных систем Правило 1: S Правило 2: А •••••- I Р Правило 3: А Рис. 15.4. Правила вывода графовой грамматики Правило 1 ГПравило 2 '. Правило 3 t Рис. 15.5. Вывод кольца размера 3
15.4. Графовые и сетевые грамматики 313 Наша методика основывается на работе [246]. Графом над алфавитом вершин Е и алфавитом ребер А называется тройка (N, ф, ф), где N — непустое множество вершин, ф: N -? Е — функция разметки вершин иф С N х Ах N — функция разметки ребер. Пусть Q — множество графов над Е и А. Тогда графовым языком над Е и Д называется подмножество множества Q. Контекстно-свободной графовой грамматикой (CFGG) называется пятерка (En,Et, A,S,Tl), которая состоит из алфавита нетерминальных вершин Е„, алфавита терминальных вершин Е< и алфавита ребер А — конечных непустных взаимно непересекающихся множеств, начальной метки S € ЕП) и непустого конечного множества И. порождающих правил, или продукций. Элементами множества TZ являются четверки г = (A, D, I, О), в которых 1) А € Е„; 2) D = (N, ф, ф) — связный граф над Е = Е„ U Et и Д; множество Е называется полным алфавитом вершин; 3) I G N — входная вершина; 4) О € N — выходная вершина. Из заданного графа с размеченными вершинами применением одного из правил грамматики получается новый граф. Вначале у нас есть граф, состоящий из единственной вершины, помеченной начальной меткой S. По ходу вывода вершина с меткой А замещается графом D в результате применения порождающего правила (A, D, I, О). При этом всякая дуга, входящая в вершину (исходящая из вершины) с меткой А, становится дугой, входящей в входную вершину / (исходящей из выходной вершины О соответственно). Пример. Рассмотрим грамматику G = (Е„,Е4,Д, S,R), для которой Еп = {S,A}, Et = {P,Q} и Д = {а}. Правила изображены на рис. 15.4. Эта грамматика порождает все кольца вида QP*. Входные вершины помечены входящей стрелкой, а выходные обведены двойным кружком. Вывод кольца размера 3 изображен на рис. 15.5. Рассмотрим второй шаг вывода. Поскольку вершина, помеченная Р, — входная, дуга из Q направлена в Р. Аналогично из вершины, помеченной А, дуга направлена в Q, потому что это выходная вершина. Сетевая грамматика подобна графовой грамматике, но здесь вершины графов, выведенных с использованием сетевой грамматики, соответствуют моделям Крипке. Семантика произвольного графа 20 Зак. 271
314 Глава 15. Бесконечные семейства конечных систем root S • •••#- *^ ^^^ SUB SUB inter SUB ••••*- ^s^ ^\^ SUB SUB inter SUB ....- ^^ ^\^ leaf leaf Рис. 15.6. Сетевая грамматика G двоичных деревьев представляет собой модель Крипке, полученную композицией моделей всех его вершин. В частности, если в приведенном на рис. 15.4 примере мы истолковываем Р и Q как процессы, представленные на рис. 14.1, а ребра — как операторы композиции, то при этом может быть порождено бесконечное семейство Т = {Q || -Р*}^ колец с маркерами. Сетевые грамматики использовались для проведения индукции по топологической структуре сети (см. [68, 187, 229]). В работах [68,187, 229] семейство Т определяется сетевой грамматикой. Правила этой грамматики индуктивно определяют допустимые конфигурации этого семейства, где всякая конфигурация задается в виде графа взаимодействия, вершинам которого сопоставлены основные процессы (модели Крипке). Для установления инварианта всего семейства применяется индукция по топологической структуре сети, основанная на правилах сетевой грамматики. Мы поясним этот метод на примере. Рассмотрим сетевую грамматику G на рис. 15.6, порождающую бесконечное семейство двоичных деревьев глубины 2 и более. Символами root, inter, leaf обозначе-
15.4. Графовые и сетевые грамматики 315 ны окончательные процессы. Далее в этой главе обсуждается система проверки четности, основанная на этой грамматике. Для простоты мы воспользуемся линейным представлением сетевых грамматик. Например, второе правило для SUB на рис. 15.6 будет записано в виде SUB —> inter || leaf || leaf. Для проверки семейства моделей Крипке, выводимого по правилам сетевой грамматики, мы расширим представленное в разд. 15.2 правило инварианта. С каждым нетерминалом сетевой грамматики мы ассоциируем инвариант, который должен превосходить по отношению симуляции < любую модель Крипке, выводимую из этого нетерминала. Как и прежде, мы будем предполагать, что операция || монотонна относительно >. Чтобы пояснить наш замысел, рассмотрим инвариант inu(SUB), ассоциированный с нетерминалом SUB в сетевой грамматике двоичных деревьев. Этот инвариант должен удовлетворять следующим условиям монотонности: inu(SUB) > inter || inu(SUB) || mu(SUB), A5.1) mu(SUB) > inter || leaf || leaf. A5.2) Отметим, что эти два неравенства соответствуют двум последним правилам рассматриваемой грамматики. Теперь мы докажем, что inu (SUB) превосходит по отношению симуляции > любой процесс, выводимый из нетерминала SUB. Для доказательства воспользуемся индукцией по числу Аг шагов в выводе. Рассматриваемое утверждение верно для к = 1 в силу неравенства A5.2). Пусть w выводимо из SUB за к шагов, где Аг > 1. Процесс w имеет вид w = inter || wi || W2- Процессы wi и W2 выводимы менее, чем за к шагов, поэтому по предположению индукции верны следующие неравенства: mu(SUB) >wi, mv(SUB) > w2, inter || mu(SUB) || inw(SUB) > inter || wx || w2. Третье неравенство получается из первых двух за счет монотонности операции композиции относительно >. Используя неравенство A5.1) и приведенное выше соотношение, получаем in«(SUB) > w. Следовательно, приведенный ниже процесс J является инвариантом (применительно к частичному порядку >) для бесконечного семейства систем, порождаемого нашей грамматикой: / = root || mu(SUB) || mv(SUB). 20*
316 Глава 15. Бесконечные семейства конечных систем Предшественник , , ¦ ¦ readyup readydown value value_l readyup_l . , 1 ¦ value_r readyup_r , i readyup readydown readyup readydown value value левый преемник правый преемник Рис. 15.7. Внутренняя вершина дерева В работе Штадлера и Грамберг [229] в качестве инварианта используется специальный процесс, порожденный нетерминалом SUB. Этот инвариант должен быть эквивалентен всем остальным моделям, которые могут быть выведены из SUB. Для построения инварианта в работе [68] используется абстракция на основе спецификации. Далее мы опишем предложенный в статье [68] метод конструирования инвариантов. Мы рассмотрим семейство двоичных деревьев, в которых каждая листовая вершина содержит один бит и подвергнем верификации алгоритм, вычисляющий четность суммы значений, приписанных листовым вершинам. Этот алгоритм заимствован из статьи [242] и работает следующим образом. Корневой процесс инициирует волну, посылая сигнал readydown своим преемникам. Каждая внутренняя вершина, получив этот сигнал, посылает его своим преемникам. Когда сигнал readydown достигает процесса листовой вершины, этот процесс посылает сигнал readyup и хранящееся в нем значение value своему предшественнику. Внутренняя вершина, получив сиг-
15.4. Графовые и сетевые грамматики 317 переменнные состояния root_ or_ leaf readydoum readyup_ I readyup_ r value readyup выходные переменнные readydoum readyup value входные переменнные readydoum readyup_ I readyup_ r value I value r Рис. 15.8. Сигналы процесса inter нал readyup и value от обоих своих преемников, посылает своему предшественнику сигнал readyup и сумму ф значений, полученных от ее преемников. Когда сигнал readyup достигает корня, одна волна вычислений завершается и корневой процесс может инициировать другую волну. На рис. 15.7 схематически изображена конфигурация сети, выводимой в грамматике G. Например, входы readyup_ I и value_1 внутренней вершины отождествляются с выходами readyup и value его левого преемника. Далее мы подробно опишем различные процессы и их сигналы. Сначала обратимся к процессу inter. Процесс inter соответствует внутренней вершине дерева. Различные сигналы для этого процесса представлены в таблице на рис. 15.8. Переменными состояния являются внутренние переменные, используемые для хранения значений входных переменных. Входные и выходные переменные обеспечивают взаимодействие с окружением. Следующие уравнения определяют инварианты переменных состояния: root_ or_ leaf = О, readyup = readyup_l A readyup_r. Отметим, что root_ or_ leaf = О, поскольку это внутренняя вершина. Выходные переменные в каждом состоянии имеют те же значения, что и соответствующие им переменные состояния. Например, выходная переменная readydoum имеет то же значение, что и переменная состояния readydoum. Приведенные далее уравнения показывают, как входные переменные влияют на переменные состояния. В этих уравнениях штрихованные переменные слева от равенства относятся к переменным последующего состояния, а переменные справа
318 Глава 15. Бесконечные семейства конечных систем относятся к входным переменным: readydown' = readydown, readyup_ t = readyup_ I, readyupr1 — readyup_r, value' = (readyup_lA value_l) Ф (readyup_r A value_r). Поскольку процесс root не имеет предшественников, у него отсутствует входная переменная readydown. Для корневого и листовых процессов сохраняется инвариант root_or_leaf = 1. Поскольку листовые процессы не имеют преемников, они не содержат выходных переменных readydown. Листовой процесс содержит единственную входную переменную readydown, и приведенное ниже уравнение связывает ее с переменными следующего состояния: readyup' = readydown. Для листовых вершин это соотношение всегда выполняется, поскольку они немедленно посылают сигнал readyup после получения сигнала readydown. Для каждого процесса leaf значение переменной состояния value определяется в начале работы недетерминированным образом, а далее на протяжении всего вычисления это значение поддерживается неизменным. Состояния основных процессов (root, leaf, inter) определяются значениями переменных состояния. Обозначим множество таких состояний символом Е. Заметим, что Е ? {О, I}6, так как имеются шесть переменных состояния. Пусть valuei, ..., value„ — значения, хранящиеся в п листьях. Вычисленное корнем значение обозначим value. Поскольку в конце вычисления корневой процесс должен получить четность битов valuei A ^ i ^ п), по окончании вычисления должно быть соблюдено равенство value 0 ф"=1 value, = 0. A5.3) Обозначим символом р новое высказывание, которое истинно во всех состояниях из Е, удовлетворяющих следующему условию: root_ or_ leaf A value. Высказывание р будет истинно во всякой корневой или листовой вершине, содержащей бит 1. Высказывание not(p) является дополнением высказывания р; оно истинно в состояниях внутренних вершин, а также в состояниях корневых и листовых вершин, содержащих бит 0. Заметим, что множество состояний inter || leaf || leaf равно Е3. В общем случае множество состояний дерева, состоящего из п процессов (взятых из множества {root, inter, leaf}), равно Е". Поэтому
15.4. Графовые и сетевые грамматики 319 not(p) readyup not(p) everything а) Автомат проверки четности b) Автомат проверки готовности Рис. 15.9. Автоматы, используемые при верификации множество состояний всего семейства деревьев проверки четности равно (J?i Е*> то есть является подмножеством множества Е*. Для анализа всего семейства деревьев проверки четности нам нужна формализация, в которой допустимы состояния из множества Е*. В разд. 15.1 мы показали, что для этого можно воспользоваться регулярными выражениями. Из соображений эффективности вместо них мы будем использовать детерминированные конечные автоматы над алфавитом Е. Эти конечные автоматы будут исполнять роль атомарных высказываний в логике ACTL. Автомат, изображенный на рис. 15.9 а), допускает строки из Е*, удовлетворяющие уравнению A5.3). Ввиду того что для внутренних вершин root_ от_ leaf = О, автомат полностью игнорирует значения, хранящиеся в этих вершинах. В отличие от обозначений для графовых грамматик, здесь стрелкой обозначается начальное состояние, а двойным кругом обозначаются принимающие состояния. Это стандартные обозначения, принятые в теории конечных автоматов. Мы также хотим объявить, что вычисление каждого процесса завершено. Признаком этого служит равенство readyup = 1 для всех процессов. Автомат, изображенный на рис. 15.9 Ь), допускает такие строки w ? Е*, что readyup истинно для каждой буквы из w (заметим, что каждая буква из w € Е* соответствует некоторому состоянию компонента), а это означает, что все процессы завершили свои вычисления. Произведение этих двух автоматов мы обозначим символом V и будем использовать в качестве атомарной формулы. Пусть Q — множество состояний автомата-произведения, 6: Q х Е -> Q — функция, определяющая
320 Глава 15. Бесконечные семейства конечных систем следующее состояние, a so = (m0,go) — начальное состояние. Смысл состояния (mo,qi) автомата V таков: вычисление завершилось, но показатель четности неверен. Назовем состояние (mo,<?i) «неудачным» и обозначим его bad. Мы хотим удостовериться, что всякое достижимое состояние G е S* семейства деревьев проверки четности удовлетворяет следующему условию: если вычисление завершилось в этом состоянии, то у процесса root правильная четность, то есть 6(so,<t) ф bad. Каждый автомат над алфавитом Е вводит абстракцию на множестве состояний Е* семейства деревьев проверки четности. Сначала мы опишем функцию абстракции h на множестве состояний Е основных процессов root, leaf и inter. Рассмотрим состояние а е Е. Абстракцией h(a) состояния о называется функция, которую о порождает на множестве состояний Q автомата-произведения. Таковой является функция h(a): Q -* Q, где Л(а)(д) = S(q,a) и S — функция перехода этого автомата. Теперь рассмотрим произвольное состояние а = (ao,ai,...,ajfe) из Е*. Абстракция h(a) состояния а определяется следующим уравнением: h(a) = ft(oo) о h(ai) о • • • о Л(а*), где символом о обозначена суперпозиция функций. Будем говорить, что состояние о\ эквивалентно 02 тогда и только тогда, когда их абстракции равны (как функции), то есть /i(cti) = h(p-i). Отметим, что количество различных функций, порождаемых некоторым состоянием системы а б Е*, ограничено величиной IQI'*". Таким образом, мы отобразили бесконечное пространство Е* в конечный абстрактный домен. На практике количество различных абстрактных значений, на которые отображаются достижимые состояния системы, будет гораздо меньше. Пример. Рассмотрим некоторое состояние системы oq 6 Е, в котором истинны р и readyup. Тогда функция Л(ао) определяется равенствами М°о)(9о,то) = (gi,m0), ^(ao)(gb,»"i) = (9b"*i), h(ao)(qi,mo) = (q0,mo), Hao)(qi,mi) = («b, mi). Чтобы понять, почему это так, рассмотрим, например, /t(ao)(<fo,mo). Автомат, изображенный на рис. 15.9(a), имеет переход по оо из со-
15.4. Графовые и сетевые грамматики 321 стояния q0 в qi. Точно так же во втором автомате есть переход по ао из состояния то в то- Поэтому h(ao)(qo,mo) равно (qi,mo). Рассмотрим другое состояние сц G Е, в котором истинны not(p) и readyup. Абстракция h(ai) определяется равенствами Mai)(9o,"»o) = (?о,m0), /i(ai)(g0,"»i) = {qo,mi), h(ai)(qi,m0) = {qlt m0), h(ai)(qi,mi) = {qi,mi). Абстракцией состояния (ao,Oi) будет Л(ао) °A(ai). Абстрактный процесс, соответствующий Р, обозначим Л(Р). В Л(Р) есть переход из абстрактного состояния hi в абстрактное состояние Лг тогда и только тогда, когда существует пара таких состояний si и S2 в Р, что h(si) = fti, h(s2) = h.2 и в Р есть переход из si в S2. Для двух процессов Pi и Рг мы будем говорить, что Pi ¦< Р2, тогда и только тогда, когда существует такое отношение ? между состояниями Pi и Рг, что для всех (s,s') ? ? выполнены следующие условия: ¦ h{s) = h(s'); ¦ для состояния si и перехода s A si в Pi существует такой переход s' A si в Рг, что (si, si) G S. Абстракция также может применяться к абстрактным состояниям h(hi) = hi, если hi — абстрактное состояние. Это определение отличается от определения, данного в гл. 11, следующими двумя особенностями: ¦ в соответствующих состояниях должны быть согласованы абстракции, а не атомарные высказывания; ¦ переходы помечены символами действий, и метки соответствующих переходов должны быть согласованы. Для заданного процесса Р и соответствующего ему абстрактного процесса h(P) определим отношение ?ь на множествах состояний процессов Р и Л(Р) следующим образом: (s,/ii)e?fc <=Ф h(s) = hi. Используя отношение ?\, мы можем доказать, что Л(Р) У Р. Абстрактная композиция двух процессов Pi и Рг определяется следующим образом: ft |U ft = Mft || ft) Рассмотрим функцию абстракции h, порожденную произведением автоматов V, оператор абстрактной композиции Ц/, и отношение си-
322 Глава 15. Бесконечные семейства конечных систем муляции Ч. Пусть 1\, 1% — абстрактные процессы, определения которых приведены ниже: h = /i(inter) |U ЛAва1) |U /»(leaf), h = h(inter) ||л h HfcJi. Следующие соотношения могут быть проверены автоматически: /i(inter) ||Л h \\hh ^ Л, /id/a, h(inter) Ц/, /2 ||k /2 d /2. Из первого соотношения следует, что процесс 1\ не может быть использован в качестве инварианта для нетерминала SUB. Если мы выберем inv(SUB) = 1\, то шаг индукции, соответствующий второму правилу грамматики, не будет выполнен: SUB -> inter || SUB || SUB. Заметим, что процесс J2 был выведен из второго правила грамматики заменой SUB на 1\ в правой части правила. Предположим, что мы используем inu(SUB) = /2 и inv(S) = ft(root) Ц/, J2 Ц/, h в качестве инвариантов для этих нетерминалов. Из приведенных соотношений могут быть выведены следующие неравенства: mv(SUB) У ft(inter) ||Л mv(SUB) ||fc inu(SUB), inu(SUB) У ft(inter) ||h /i(leaf) ||ft /i(leaf). После проверки условий монотонности мы можем заключить, что Я = /i(root) ||а. /2 ||ft h симулирует все сети, порождаемые контекстно-свободной грамматикой G. После того как построен Я, можно проверить, что все достижимые состояния в Я обладают желаемым свойством. По теореме 16 из гл. 11 получаем, что всякая сеть, полученная из G, обладает этим свойством, т. е. по завершении вычисления корневой процесс имеет правильную четность. Мы также проверили, что из всякого состояния всегда достижимо состояние, в котором вычисление завершается и является правильным, т. е. AF?\ 15.5. Неразрешимость семейства колец с маркерами В этом разделе мы докажем неразрешимость упомянутой в начале главы задачи верификации для бесконечного семейства систем с конечным числом состояний. Читатель благополучно может пропустить настоящий раздел при первом прочтении главы. Следуя Судзуки [237], мы покажем, как можно моделировать машину Тьюринга Т семейством двунаправленных колец. Кольцо
15.5. Неразрешимость семейства колец с маркерами 323 mien. outleft incolor sell St color inright outright outcolor Рис. 15.10. Процесс Pi размера n моделирует n шагов машины Тьюринга на пустой ленте. Бели машина Тьюринга останавливается спустя не более чем п шагов, то некоторый процесс на кольце попадает в специальное состояние halt и остается в нем навсегда. Бели машина Тьюринга не останавливается спустя п шагов, то ни один процесс никогда не войдет в состояние halt. Таким образом, машина Тьюринга не останавливается на пустой ленте тогда и только тогда, когда каждое кольцо семейства удовлетворяет формуле AG Д^-ihaftj, где Aattj истинно, если процесс i находится в состоянии halt. Машина Тьюринга Т — это пятерка (Q,Е,дь,halt,6,), где Q — множество состояний, S — ленточный алфавит, qo и halt — начальное и заключительное состояния, a<S:QxE-»(?x?x {left, right} — функция перехода. Кольцо, моделирующее п шагов машины Г, состоит из п процессов Ро,..., Pn-i, каждый из которых представляет одну ячейку ленты машины Тьюринга. Мы предполагаем, что машина Т имеет ленту, бесконечно расширяющуюся вправо. Поэтому за п шагов она может побывать не более чем в п ячейках своей ленты. Предположим, что Т обозревает символ а в ячейке i, пребывая в состоянии q. Тогда процесс Р< будет находится в определенном состоянии, которое характеризуется комбинацией символа а и состояния q. Процесс Pi будет моделировать один шаг машины Т и перешлет новое состояние q' одному из своих соседей в соответствии с направлением движения машины Т. Диаграмма процесса Pi изображена на рис. 15.10. Процесс Р< соединен с процессом Pj_i слева и с процессом Pj+i справа, где г + 1 и i — 1 вычисляются по модулю п. Вход inrightf соединен с outlefti+1. Выходы outrighti и ovtcolori соединены соответственно с inlefti+1 и ineolori+i.
324 Глава 15. Бесконечные семейства конечных систем Мы подразумеваем, что модель вычислений — синхронная; в ней все процессы совершают переходы в каждый момент времени, а значения выходов на том или ином шаге становятся значениями соответствующих входов на следующем шаге. Текущее состояние процесса Р< определяется значениями его переменных сей, st и color, пробегающими области Е, Q и {white, black] соответственно. В начальный момент все переменные cell хранят пустой символ (blank); sto = %; для всех i, i > 0, мы имеем sU = пиЩ coloro = black и для всех *, г > 0, мы имеем colon = white. Также outcoloro = white, в то время как остальные выходы (и соответствующие им входы) содержат пай. Вычисление на кольце состоит из двух этапов, которые выполняются жестко синхронизовано. Первый режим (он изображен на рис. 15.11) моделирует шаги машины Тьюринга Т на пустой ленте, тогда как второй режим (изображенный на рис. 15.12 и 15.13) отсчитывает до п, а затем останавливает моделирование. В режиме отсчета окрашенный маркер передается по кольцу. На протяжении каждого из п циклов этого этапа маркер переходит от Р0 обратно к Pq. Первоначально все процессы имеют окраску white, за исключением Ро, который имеет окраску black. К тому же для всех процессов outcolor = null, за исключением Ро, ДДя которого outcolor = white. Когда процесс получает маркер null, он передает этот маркер в неизменном виде своему правому соседу. Точно так же, если он получает маркер своего собственного цвета, он передает этот маркер направо без изменений. Бели процесс получает маркер black, в то время как его окраска — white, то он изменяет свой цвет на black и передает маркер white направо. Процесс Ро ведет себя несколько по-иному. Его цвет всегда black. На первом цикле он посылает маркер white своему правому соседу. Бели он получает маркер null, то он посылает null направо. Получив маркер white, он посылает направо маркер black. Наконец, получив маркер black, он переключается в холостой режим, в котором он всегда посылает маркер null. Таким образом, на каждом круге еще один процесс приобретает окраску black после получения сообщения black от своего соседа слева, окрашенного в black. Когда Ро получит сообщение black от Pn-i, будет промоделировано ровно п шагов машины Т и кольцо перейдет в холостой режим. Этап моделирования обеспечивает выполнение в точности одного шага на каждом цикле этапа отсчета, активизируя подходящий процесс, только когда тот получает маркер (black или white). Когда
15.5. Неразрешимость семейства колец с маркерами 325 while true do if incolor ф null and st = halt then while true do outright := outleft := null; end if; if incolor ф null and st ф null and 6(st, cell) = (g'^'jd) then cell := a'; outright := if d = right then q' else nufl; outleft := if d = Ie/C then ^ else nutf; else outright := outleft := nu//; end if; st := if inrigth ф null then inright else inleft; end while; Рис. 15.11. Моделирующая программа для процесса Pj, t > О while incolor ф black do if incolor = null then outcolor := null; if tricolor = w/itte then outcolor := black; end while; while true do outcoior := null; Рис. 15.12. Отсчитывающая программа для процесса Ро while true do if incolor ф null then outcolor := color; else outcolor := null; end if; if (incolor = black and color = white) then со/or := black; end while; Рис. 15.13. Отсчитывающая программа для процесса Р,, t > О
326 Глава 15. Бесконечные семейства конечных систем машина Тьюринга обозревает ячейку г в состоянии q, для процесса Pi выполняется равенство st = q, в то время как для остальных процессов st = null. Когда процесс Pi получает маркер, он моделирует команду S(st, celt) = (q, q', d), устанавливая cell := a', st := null и посылая q' левому или правому соседу в зависимости от направления d. Первый шаг Т, 8{%, blank) = (q1, a', right), моделирует Р0 вне зависимости от значения incolor^. Особо выделяется случай, когда st ф null и incolor ф null для некоторого Pi, и машина Тьюринга передвигается вправо. Тогда Pi моделирует один шаг машины Тьюринга, устанавливая outright = q1 для передачи нового состояния процессу Pi+i- Он также передает маркер процессу P<+i > устанавливая соответствующее значение для outcolor. Наша программа гарантирует, что Pi+i не выполнит еще один шаг машины Тьюринга до следующего цикла, обязывая Pi+\ вначале проверить значение incolor вместе со старым значением переменной st. Впоследствии Pj+i обновляет значение st в соответствии со значением inlefti+1 (которое совпадает с outright^. Далее мы опишем инварианты для установления корректности нашего моделирования. Все вычисление состоит из п циклов. Занумеруем их от 0 до п — 1. Каждый цикл состоит из п шагов, которые мы также занумеруем от 0 до п — 1. Цикл t моделирует г'-й шаг машины Тьюринга. Можно доказать следующие свойства нашего вычисления. ¦ На i'-м цикле после шага i — 1 процесс Р$ меняет окраску white на black. ¦ По окончании цикла » состояние процесса Р, равно q (q ф null) тогда и только тогда, когда после г шагов машина Тьюринга пребывает в состоянии q и обозревает ячейку j. ¦ Предположим, что процесс Р,- после i-го цикла находится в состоянии q. Все остальные процессы пребывают в состоянии null. На шаге j — 1 цикла t + 1 процесс Pj получает от своего соседа маркер, отличный от null. Процесс Р, посылает соответствующее состояние своему соседу слева или справа (в зависимости от того, перемещается ли машина Тьюринга влево или вправо) и переходит в состояние null. Заметим, что Р, может моделировать шаг машины Тьюринга, только если получит маркер, отличный от null. Несмотря на то что в общем случае эта задача неразрешима, для определенных семейств решение все же можно найти.
Дискретное реальное время и количественный временной анализ Компьютеры нередко используют в критических приложениях, где предсказуемое время реакции существенно для правильности работы. Такие системы называются системами реального времени. Примеры таких приложений — устройства управления для самолетов, промышленной техники и роботов. В силу самой природы этих приложений ошибки в системах реального времени могут быть чрезвычайно опасными, даже фатальными. Обеспечение корректности сложных систем реального времени является важной и весьма непростой задачей. Поэтому для разработки и реализации используются только консервативные подходы, которые обычно строго специализированы под конкретную задачу. Проверку систем реального времени делают особенно трудной и другие факторы. Архитектура компьютерных приложений становится чрезвычайно сложной. С увеличением сложности систем возрастает и вероятность ошибки. Кроме того, существенным условием успеха новых приложений становится производительность. Вследствие конкуренции новые продукты должны полностью использовать доступные ресурсы. Медленный компонент может влиять на производительность всей системы. Как следствие, задача проверки новых приложений на соответствие временным спецификациям стала еще более насущной. 16.1. Системы реального времени и планирование с монотонным режимом Поскольку системы реального времени используются в критических приложениях, для их разработки традиционно применялись консервативные подходы. Это часто приводило к простым, однако неэффективным реализациям. Примером подобного метода является статическое квантование времени, которое распределяет время равномерно между всеми задачами. Каждая задача выполняется на протяжении своего интервала времени, а затем освобождает процес- 16
328 Глава 16. Дискретное время и количественный анализ сор. В результате такую программу легко анализировать, однако она достаточно неэффективна, поскольку все задачи получают одинаковый доступ к ресурсам вне зависимости от их важности или занятости ресурсов. В последнее время были разработаны более мощные методы анализа поведения систем реального времени. Одним из них является теория монотонных расписаний (RMS, rate-monotonic scheduling) [172, 176, 228]. Теория RMS применима для систем, которые описываются множеством периодических задач. Каждая задача соответствует параллельному процессу этой системы и характеризуется своей периодичностью (как часто она исполняется) и своим временем во время каждого запуска. RMS состоит из двух частей. Первая — это алгоритм, назначающий более высокий приоритет процессам с более коротким периодом. Теория RMS обеспечивает оптимальное время реакции по сравнению с алгоритмами со статическими приоритетами, если приоритеты назначены согласно этому правилу [176]. Вторая составляющая теории RMS — это тест на существование расписания, основанный на суммарной доле занятости процессора; для множества процессов (с приоритетами, назначенными согласно RMS) существует расписание, если суммарная доля занятости процессора меньше некоторого вычисленного порога. Если же доля занятости больше этого порога, то существование расписания не гарантируется. RMS представляет мощный инструмент для анализа систем реального времени. Она проста в применении и при этом предоставляет разработчикам очень важную информацию. Однако этот метод анализа налагает ряд ограничений на проверяемую систему. Рассматривают лишь определенные типы процессов, с ограничениями, например, на периодичность и синхронизацию. Недавние работы распространили теорию на более общие классы процессов, но ограничения все еще существуют [131]. RMS применима только к системам, которые могут быть описаны в рамках этой теории. Более того, типы проверяемых свойств также ограничены только теми, которые можно моделировать в терминах времени выполнения задач. Верификация распределенных систем или систем, не имеющих регулярного шаблона взаимодействия, — в общем случае непростая задача. К тому же проверка свойств, которые не могут быть просто выражены в терминах времени выполнения задач, таких как количество произошедших в системе произвольных событий, также может быть сложна.
16.2. О верификации систем реального времени 329 16.2. О верификации систем реального времени Для верификации дискретных систем реального времени можно использовать символьные методы проверки на модели. Однако инструментальные средства проверки на модели, описанные ранее в данной книге, не подходят для решения этого типа верификации. Трудно, например, выразить некоторые сложные временные свойства. Можно выразить такое свойство, как «событие р произойдет в будущем», однако не так просто выразить свойство «событие р произойдет не позднее чем через п единиц времени» без использования вложенных операторов сдвига по времени. Кроме того, количественная информация, например, время реакции или количество произошедших событий, не может быть получена непосредственно с использованием этих методов. Проверку на модели с использованием темпоральных логик нельзя естественно и эффективно использовать для верификации многих типов систем реального времени, которые часто встречаются на практике. 16.2.1. Родственные методы верификации систем реального времени Другие подходы к анализу составления расписаний включают алгоритмы вычисления множества достижимых состояний для систем с конечным числом состояний [57, 117, 122]. Модель системы реального времени строится с дополнительным ограничением: при возникновении исключительной ситуации (например, пропущен директивный срок) система переходит в особое состояние исключения. Верификация состоит в вычислении множества достижимых состояний и проверке того, входит ли состояние исключения в это множество. В отличие от RMS, такой подход никаких ограничений на модель не налагает, однако сам алгоритм лишь проверяет, могут ли возникнуть исключительные ситуации или нет. Другие типы свойств нельзя проверить, если только не закодировать их в модели как исключительные. Хотя большинство свойств можно представить как исключительные, порой это сопряжено с большими трудностями и чревато ошибками. Символьные методы верификации моделей можно распространить на системы реального времени [76, 78, 251]. Однако эти, равно как и другие упомянутые методы всего лишь определяют, удовлетворяет ли система заданному свойству, но не предоставляют подробной информации о ее поведении. Для моделей с дис-
330 Глава 16. Дискретное время и количественный анализ кретным временем можно провести ограниченный количественный анализ [79], но лишь в том, что касается вычисления минимальных и максимальных задержек. В этой главе мы опишем метод спецификации и верификации дискретных систем реального времени, совместимый с методами символьной верификации моделей и способный работать с большими системами [49]. Кроме того, алгоритмы, заимствованные из символьной верификации моделей, применяют для вычисления количественной информации о модели. Важным достоинством этого подхода является то, что полученная информация позволяет пользователю проверять, удовлетворяет ли эта модель различным ограничениям реального времени: существование расписания для задач системы может быть определено вычислением времени их реакции; этот метод позволяет анализировать время реакции на события и некоторые другие параметры системы. Такие сведения помогают понять поведение системы, выявить узкие места и выбрать пути оптимизации проектируемой системы. Те же алгоритмы могут быть использованы для анализа производительности измененного проекта системы. Оценить степень влияния оптимизаций на проектируемую систему можно еще до начала ее настоящей реализации. Это существенно снижает расходы на разработку. Важной характеристикой этого метода является то, что он подсчитывает количество вычислительных шагов между событиями или количество событий, произошедших на протяжении некоторого интервала времени. Поэтому он находит применение в синхронных системах, таких как компьютерные микросхемы и протоколы. Системы реального времени обычно не выполняются в режиме жесткого параллелизма операций и могут показаться неподходящими для нашего метода. Однако зачастую на них налагаются жесткие временные ограничения, которые трудно соблюсти, используя методы асинхронного проектирования. К тому же, программисты часто стараются сократить асинхронность поведения в проектируемых ими системах, чтобы гарантировать предсказуемость. В результате системы реального времени обычно можно анализировать методами, основанными на дискретном времени. Некоторые системы, однако, существенно асинхронны по своей природе. Для таких систем необходимы более сложные методы верификации, основанные на непрерывном времени. Мы обсудим методы верификации систем непрерывного реального времени в следующей главе.
16.3. Проверка выполнимости на модели для RTCTL 331 16.3. Проверка выполнимости на модели для RTCTL Простой и эффективный способ, позволяющий верифицировать свойства с ограничениями по временем, состоит в том, чтобы внести эти ограничения в темпоральные операторы CTL. Расширенная таким образом логика называется RTCTL [108]. Выразительные возможности RTCTL — такие же, как и CTL, поскольку ограниченные операторы можно преобразовать в цепочки вложенных операторов БХ (или АХ). Однако это преобразование чаще всего невыгодно, и RTCTL предоставляет намного более компактный и удобный способ задания таких свойств. Основной темпоральный оператор в RTCTL — оператор ограниченного ожидания (bounded until), имеющий вид U[a,b], гДе [°,&] определяет отрезок времени, на протяжении которого это свойство должно быть истинно. Мы говорим, что формула / U[0)ftj g истинна на некотором пути 7г = во, «ъ • • •» если g выполнено в некотором состоянии 8 на этом пути, формула / истинна во всех состояниях, находящихся между «о и s, а расстояние от sq до s заключено в отрезке [о, Ь]. Ограниченный оператор EG может быть определен аналогичным образом. Другие темпоральные операторы могут быть определены посредством этих двух операторов. Говоря более строго, мы расширим CTL и включим ограниченные версии операторов EU и EG, добавив следующие предложения в описание формальной семантики CTL: 1) s (= Е[/ V[a,b] й] тогда и только тогда, когда существует путь я- = s0sis2..., начинающийся в s = s0, и существует такое i, что а^»^Ьи8*^=<7, а для всех j, j < i, верно соотношение Sj (= /; 2) s |= EG[0i6]/ в том и только том случае, когда существует путь 7г = soSis2..., начинающийся в s = «о, и существует такое г, что о ^ i ^ Ь и верно соотношение а< ^= /. Рассмотрим в качестве примера использования оператора ограниченного ожидания свойство «всегда верно, что за р последует q не позднее чем через 3 единицы времени». Это свойство можно выразить RTCTL-формулой AG(p -> EF[0K]g), где ограниченный оператор EF получается из EU так же, как и в случае неограниченного интервала, т. е. EF[0iJj/ = E[true V[a,b] /]• Для верификации свойств, записанных с использованием этих операторов, мы модифицируем процедуру вычисления неподвижной точки, используемую алгоритмами верификации моделей для CTL.
332 Глава 16. Дискретное время и количественный анализ Легко видеть, что для формулы Е[/ U[a>b] д] верны следующие тождества: Е[/ UM] д] = f А ЕХ Е[/ и^,^ д], если a > 0 и Ь > 0; Е[/ UM] д] = д V (/ Л EX Е[/ V[0,b-i] д]), если о s$ 0 и Ъ > 0; Е[/ U[e>6] д] = д, если Ь ^ 0. Аналогичные тождества справедливы и для других операторов. 16.4. Количественный временнбй анализ: минимальная и максимальная задержка Традиционные алгоритмы формальной верификации подразумевают, что временные ограничения заданы явно на каком-либо языке наподобие темпоральной логики. Обычно разработчик предусматривает некоторое ограничение на время реакции для той или иной операции, а верификатор автоматически проверяет, выполняется оно или нет. Эти методы не дают никакой информации о том, насколько значительно быстродействие системы отклоняется от ожидаемого. Тем не менее, подобные сведения могут быть чрезвычайно полезны при тонкой настройке поведения этой системы. В этом разделе мы опишем алгоритмы вычисления количественных временных характеристик, таких как минимальная и максимальная задержка (измеряемая в количестве переходов) между запросом и соответствующим ему откликом. Эти алгоритмы разработаны так, что они хорошо сочетаются с символьными методами, основанными на применении двоичных разрешающих диаграмм, и очень эффективны на практике. 16.4.1. Алгоритм вычисления минимальной задержки На вход этого алгоритма (рис. 16.1) поступает модель Крипке М = (S, R, L) и два множества состояний start и final. Он возвращает длину (количество дуг) наикратчайшего пути из произвольного состояния множества start в какое-нибудь состояние множества final Если такого пути нет, то алгоритм выдает в качестве результата бесконечность. В этом алгоритме функция T(S) вычисляет множество состояний, являющихся преемниками некоторого состояния из S. Другими словами, T(S) = {в' | R(s, «') для некоторого s 6 S]. Вдобавок в этом алгоритме переменные Z и Z' представляют множества состояний.
16.4. Количественный временной анализ 333 procedure min(start, final) г:=0; Z :— start; Z' := T(Z) U Z; whUe ((Z' ^ Z) Л (Z П final) = 0) do t := i + 1; Z := Z'; Z' := t[z') U Z'; end while; if (ZH final ф0) then return t; else return oo; end if; end procedure Рис. 16.1. Алгоритм вычисления минимальной задержки Наш первый алгоритм довольно прямолинеен. По сути дела, цикл в алгоритме вычисляет множество состояний, достижимых из start. Как только мы обнаруживаем некоторое состояние из множества final, выдаем в качестве результата число шагов, понадобившихся для достижения этого состояния. 16.4.2. Алгоритм вычисления максимальной задержки На вход этого алгоритма (рис. 16.2) также поступают start и final. Он выдает длину самого протяженного пути из произвольного состояния множества start в какое-либо состояние из final. Если существует бесконечный путь, начинающийся в некотором состоянии множества start, который никогда не достигает хоть какого- нибудь состояния из final, алгоритм выдает в качестве результата бесконечность. Функция Г-1 E') вычисляет множество состояний, являющихся предшественниками какого-либо состояния из 5', т. е. T_1(S') = {s | R(s,s') для некоторого s' 6 S'}. Переменные Z и Z', как и прежде, обозначают множества состояний. В завершение, мы обозначим not_final множество всех состояний, не входящих в final Алгоритм вычисления верхней границы более изощрен по сравнению с предыдущим алгоритмом. В частности, он должен выдать в качестве результата бесконечность, если существует путь, начина-
334 Глава 16. Дискретное время и количественный анализ procedure max(start, final) i:=0; Z := True; Z' := not_final; while ((Z' ?Z)A(Zn start) = 0) do t := * + 1; Z := Z'; Z':=T-1(Z')nnot_final; end while; if (Z = Z') then return oo; else return i; end if; end procedure Рис. 16.2. Алгоритм вычисления максимальной задержки ющийся в start и не выходящий за пределы not_final. Для решения этой задачи более удобен не алгоритм прямого поиска, а алгоритм обратного поиска из множества состояний not_final. На i-й итерации множество состояний, в которых начинаются пути длины t, целиком лежащие в not_final, образует текущий рубеж. Вначале t равно О, а рубеж — not_finaL Далее мы вычисляем множество предшественников (в not_final) текущего рубежа. В этих состояний начинаются пути длины t + 1, целиком лежащие в not final. Наш алгоритм останавливается в двух случаях. Во-первых, это случай когда множество Z' не содержит состояний из start на шаге i. Поскольку оно содержало состояния из start на шаге t — 1, длина самого протяженного отрезка в not_final из состояния start равна i — 1. Отношение перехода тотальное, и, следовательно, этот отрезок можно продолжить до состояния, лежащего вне notfinal, т. е. принадлежащего множеству final. Таким образом, существует путь длины J из start в final, и алгоритм возвращает г. В другом случае достигается неподвижная точка, a Z все еще содержит некоторое состояние из start. Поскольку множество Z конечно и из каждого состояния в нем исходит дуга в некоторое состояние самого Z, всякое состояние является началом бесконечного пути в Z, которое включается в not_final. Таким образом, существует бесконечный путь в
16.4. Количественный временной анализ 335 not final из состояния в start. В этом случае наш алгоритм выдает в качестве результата бесконечность. Далее мы докажем, что этот алгоритм завершается. Предположим, что условие Z'Hstari ф 0 никогда не нарушается. Мы покажем, что на некотором шаге будет выполнено равенство Z = Z'. Легко видеть, что если некоторое состояние входит в состав i-го рубежа, то оно также входит и в состав (г — 1)-го рубежа, поскольку состояния, с которых начинаются отрезки пути в notfinal длины г, также являются начальными и для отрезков пути в not_ final длины г — 1. Следовательно, рубеж каждой итерации включен в рубеже предыдущей итерации. Поскольку начальный рубеж — конечное множество, количество собственных включений между множествами состояний, определяющими рубежи, конечно. Поэтому обязательно найдется такое к, что рубеж к-й итерации совпадает с рубежом (к+1)-й итерации и цикл не может выполниться более чем к раз так, чтобы не стало истинным равенство Z = Z''. Во многих случаях нас интересует не только длина пути, ведущего из множества начальных состояний в множество финальных состояний, но и количество состояний пути, которые удовлетворяют заданным условиям. Так, мы можем вознамериться определить, какое наименьшее или наибольшее число раз условие cond выполняется на любом пути из start в final. Эти алгоритмы называются алгоритмами подсчета условий. Мы приведем два примера их применения для анализа производительности систем. Первый пример — оценка производительности шины в сложной аппаратной системе. Рассмотрим отрезок времени между выставлением запроса на шину и соответствующим предоставлением. Важно уметь вычислять количество других транзакций, которые были запущены на этом отрезке, поскольку это является мерой загруженности шины. Второй пример — определение количества инверсий приоритета в системе реального времени. Инверсия приоритета происходит, когда высокоприоритетный процесс блокируется выполнением процесса с более низким приоритетом [221]. В этом случае start соответствует состояниям, в которых высокоприоритетный процесс запросил выполнение, final соответствует состояниям, в которых он получил разрешение на выполнение, a cond описывает состояния, в которых выполняется низкоприоритетный процесс, блокируя процесс с более высоким приоритетом. Эффективные реализации этих алгоритмов, основанные на BDD, и дополнительные примеры приведены в [49, 52].
336 Глава 16. Дискретное время и количественный анализ 16.5. Пример: бортовая система управления Одно из наиболее важных приложений систем реального времени — управление летательными аппаратами. Чрезвычайно важно, чтобы в таких системах не нарушались временные ограничения. В этом разделе коротко описана бортовая система управления, используемая в военных самолетах. Наш пример демонстрирует, как можно проверить временные ограничения алгоритмами количественного анализа, описанными в разд. 16.4. 16.5.1. Описание системы Система управления самолетом может быть определена множеством датчиков и органов управления, соединенных с центральным процессором. На этом процессоре выполняется комплекс программ, анализирующих показания датчиков и контролирующих органы управления. Наша модель описывает эту управляющую программу и определяет требования, которые обеспечивают соблюдение условий функционирования самолета. Используемые требования подобны тем, что применяют для существующих военных самолетов; они были извлечены из работы [177]. Бортовой комплекс управления разделен на системы и подсистемы, выполняющие определенные задачи по управлению компонентами самолета. Моделируются наиболее важные системы, к числу которых относятся ¦ система навигации: вычисляет местоположение самолета исходя из таких данных, как скорость, высота и координаты местоположения, получаемые со спутников или наземных станций; ¦ система управления радарами: получает и обрабатывает данные от радаров, также определяет цели и их положение; ¦ приемник радарного предупреждения (RWR): эта система определяет возможные угрозы для самолета; ¦ система управления вооружением: наводит и активизирует бортовое вооружение; ¦ дисплей: обновляет информацию на экране пилота; ¦ система слежения: обновляет местоположение целей, данные от этой системы используются для наведения вооружения; ¦ шина данных: обеспечивает взаимодействие процессора с внешними устройствами.
16.5. Пример: бортовая система управления 337 система дисплей RWR радар навигация слежение вооружение шина данных подсистема обновление статуса пульт обновление захвата графический дисплей обновление памяти управл. столкновений обновление цели фильтр слежения обновление команды управления обновление цели протокол*"' наведение пуск(ь) опрос устройств период 200 200 80 80 200 25 50 25 50 200 100 200 50 200 40 вып. 3 1 2 9 1 5 5 2 8 3 5 1 3 3 1 %CPU 1.50 0.50 2.50 11.25 0.50 20.00 10.00 8.00 16.00 1.50 5.00 0.50 6.00 1.50 2.50 приор. 12 16 36 40 20 72 60 84 56 24 32 28 64 98 68 a) Протокол вооружения — апериодический процесс с директивным сроком 200 мс. b) Подсистема пуска имеет период 200 мс, но ее директивный срок составляет 5 мс. Рис. 16.3. Временные требования к бортовой системе Каждая система состоит из одной или более подсистем. Временные ограничения каждой из них определяются такими факторами, как необходимая точность, свойства человеческой реакции и аппаратные требования. Например, экран должен обновляться достаточно часто, для того чтобы движение казалось непрерывным. Для достижения этого обновление должно происходить по крайней мере каждые 50 мс. В таблице на рис. 16.3 приведены моделируемые подсистемы вместе с их основными временными ограничениями. Назначение приоритетов будет разъяснено далее. Для реализации каждой подсистемы используют параллельные процессы. Взаимодействие процессов осуществляется опосредованно. Никакие данные непосредственно не разделяются несколькими подсистемами. Процессы могут взаимодействовать только через серверы данных, называемые мониторами. Каждая система поддер- 23 Зак. 271
338 Глава 16. Дискретное время и количественный анализ живает процесс-сервер, принимающий запросы на данные и возвращающий требуемую информацию. Различные подсистемы в каждой системе обновляют данные в серверах. Мониторы лишь принимают запросы, отвечают на них, а затем переходят в состояние ожидания. Им назначены низкие приоритеты, а наследование приоритетов используется для поддержания предсказуемости [50, 221]. За исключением системы вооружения, все остальные системы состоят только из периодических процессов, выполнение которых запланировано в начале их периода. Когда некоторому процессу выделяют процессор, он запрашивает требуемые данные у монитора, выполняется, обновляет информацию на своем собственном сервере данных и блокируется, ожидая следующего периода выполнения. В системе вооружения сочетаются периодические и апериодические процессы. Ее активизируют, когда подсистема обслуживания приборной панели обнаруживает, что пилот нажал кнопку пуска. Это событие вынуждает активизироваться подсистему протокола вооружения. После этого она подает сигнал подсистеме наведения вооружения, которая была заблокирована. Далее работа подсистемы наведения вооружения должна осуществляться каждые 50 мс. Эта система наводит бортовое оружие, основываясь на текущем положении цели. Она также принимает решение, когда открыть огонь, и включает подсистему запуска вооружения. Применение вооружения может быть отменено, пока не запланировалась последовательность действий, связанная с пуском вооружения, но не позднее. Затем пуск вооружения выполняется периодически, и огонь открывается каждую секунду, пять раз подряд. Для соблюдения различных временных ограничений этих процессов используют планирование с приоритетами. Предсказуемость обеспечивается планированием процессов методом RMS. 16.5.2. Модель бортовой системы управления Бортовая система управления моделировалась при помощи инструментального средства VERUS [51]. Для проверки функциональной корректности использовалась проверка на модели, в то время как временные ограничения проверялись при помощи описанных выше алгоритмов количественного анализа. Была реализована большая часть характеристик, определенных выше, однако для упрощения была проведена некоторая абстракция. Далее следует более подробное описание реализации.
16.5. Пример: бортовая система управления 339 Длительность атомарного перехода в модели равна одной миллисекунде. Глобальный таймер управляет планированием периодических процессов. Как только приходит время, процесс обращается с запросом на выполнение и ожидает, пока ему не предоставят процессор. Для каждого процесса внутренний счетчик хранит время, истекшее с начала его выполнения. После завершения выполнения процесс освобождает процессор и блокируется в ожидании следующего периода. Время запроса данных у монитора и ожидания ответа предполагается малым по сравнению с общим временем выполнения. Это оправдано, если мы предполагаем реализацию эффективной. Посылка сообщений запроса и ответа занимает лишь малую долю времени. Обработка запросов монитором также выполняется быстро, учитывая ограниченный диапазон выполняемых функций. Это допущение может быть нарушено только в случае одновременного доступа к монитору со стороны многих процессов. Однако схема доступа к мониторам уменьшает возможность этой ситуации. Они просто принимают запросы, извлекают данные из памяти и возвращают их. Нет никаких вложенных критических секций. Более того, протоколы наследования приоритетов [50, 221] использовались для поддержания предсказуемости и устранения возможности неограниченной блокировки при синхронизации. Мы рассматриваем две стратегии планирования: планирование с приоритетами и планирование без приоритетов. Планировщик с приоритетами принимает запросы на исполнение и выбирает наиболее высокоприоритетный процесс, запрашивающий процессор. Бели после запуска приходит запрос от процесса с более высоким приоритетом, планировщик приостанавливает выполняющийся процесс и запускает вместо него более высокоприоритетный. Когда процесс завершает выполнение, он сбрасывает свой запрос, и планировщик выбирает другой процесс. Однако возможность планирования с приоритетами может быть не всегда доступна. С планировщиком без приоритетов процесс, начав свое выполнение, продолжает работать до тех пор, пока сам не освободит процессор. Бели более высокоприоритетный процесс обращается с запросом на выполнение, он должен дождаться завершения текущего процесса. Планировщики без приоритетов обычно служат причиной увеличения времени реакции высокоприоритетных процессов. Однако их проще реализовать, и они позволяют работать с более простыми программами. Моделирование обоих типов планировщиков позволяет нам сравнить поведение системы в различных условиях. Полученные результаты могут быть 23*
340 Глава 16. Дискретное время и количественный анализ время исполнения подсистема рок 5 25 25 40 50 50 50 80 80 100 200 200 200 200 200 вытесн. мин макс 3 2 7 1 10 12 20 10 14 26 1 35 36 37 40 3 5 10 11 14 19 34 44 46 51 21 85 95 96 99 невытесн. мин макс 3 9 2 10 7 15 1 14 2 18 12 19 20 27 10 43 14 47 26 51 3 46 36 74 37 97 38 98 41 101 пуск вооружения фильтр слежения радара управление столкновениями RWR опрос на шине данных наведение вооружения обновление цели радара обновление навигации графический дисплей обновление отображения захвата обновление цели слежения протокол вооружения команды навигации обновление отображения памяти отображение пульта обновление отображения статуса Рис. 16.4. Результаты планируемости бортового контроллера полезны при определении, есть ли в этом случае необходимость в использовании приоритетов для соблюдения корректности системы. 16.5.3. Результаты верификации Планируемость является одним из самых важных свойств систем реального времени. Оно утверждает, что ни один процесс не пропустит своего директивного срока. В этом примере директивные сроки совпадают с периодами (за исключением подсистемы пуска вооружения). В таблице на рис. 16.4 собрано время выполнения, вычисленное с помощью произведенного количественного анализа. Процессы расположены в порядке убывания приоритета. Указаны также директивные сроки, так что планируемость может быть легко проверена. Минимальное и максимальное время выполнения дано для обоих случаев с вытесняющим и невытесняющим планировщиком. Таблица на рис. 16.4 показывает, что наше множество процессов планируемо с использованием вытесняющего планировщика. Из наших результатов мы также можем определить многие важные па-
16.5. Пример: бортовая система управления 341 раметры этой системы. Например, время реакции обычно очень мало для удачных вычислений, но и для худших случаев оно также приемлемо. Большая часть процессов занимает менее половины времени, отведенного им на исполнение. Это указывает на то, что система все еще далека от насыщения, однако суммарная загруженность процессора высока. Заметим, что приоритетное прерывание исполнения не оказывает значительного влияния на время реакции. Исключая наиболее требовательные процессы, все остальные сохраняют свою планиру- емость при использовании планировщика без приоритетов. Хотя с таким планировщиком подсистема пуска вооружения и пропускает свой директивный срок, эта дополнительная задержка мала. Если планирование с приоритетами дорого, несущественное уменьшение времени использования процессора может сделать систему в целом планируемой без замены планировщика. Имея подобную информацию, разработчик может легко оценивать влияние различных вариантов на улучшение производительности. Для того чтобы продемонстрировать, как разработчик может использовать эти результаты, мы можем проанализировать время реакции подсистемы графического дисплея. Период этой подсистемы равен 80 мс, но для того чтобы движение выглядело непрерывным, может потребоваться более короткий период. Однако время реакции этого процесса может достигать 44 мс. Изменение периода до 40 мс может повлечь пропуск им своего директивного срока. Разработчик может предпочесть, например, уменьшить период до 50 мс. Для испытания результата этого изменения модель может быть снова подвергнута анализу с целью проверить планируемость. Этот вид анализа также может использоваться для определения времени выполнения более сложных последовательностей событий. Например, когда пилот нажимает кнопку «открыть огонь», многие подсистемы привлекаются к распознаванию и реагированию на это событие. Анализ нашей системы с помощью алгоритмов из разд. 16.4 показывает, что минимальный период времени между обнаружением нажатия кнопки и окончанием выполнения пуска вооружения составляет 120 мс, в то время как максимальный период времени составляет 167 мс. Сравнивая эти периоды, разработчик способен определить, достаточно ли быстро подсистема вооружения реагирует, чтобы она соответствовала требованиям военной авиации. В этом разделе мы продемонстрировали, как можно проанализировать систему со сложными временными ограничениями таким
342 Глава 16. Дискретное время и количественный анализ инструментальными средством, как VERUS. Мы смогли установить планируемость этой системы и детально понять ее поведение, а также получить сведения о ее поведении, такие как время реакции подсистемы вооружения, которые, быть может, трудно получить с использованием других методов.
Непрерывное реальное время В предыдущей главе мы предполагали, что время дискретно. В этом случае возможные показания часов задаются неотрицательными целыми числами и события могут происходить только в целочисленные моменты времени. Такие модели пригодны для синхронных систем, в которых все компоненты синхронизованы едиными глобальными часами. В качестве единицы измерения времени выбирается продолжительность времени между двумя последовательными тиками часов. Эти модели уже много лет успешно применялись для анализа корректности синхронных аппаратных схем. Непрерывное время, с другой стороны, является естественной моделью для асинхронных систем, поскольку промежуток времени, разделяющий события, может быть сколь угодно мал. Эта возможность желательна для представления причинно независимых событий в асинхронной системе. Более того, когда принимается такая модель времени, не нужно делать никаких предположений о быстродействии окружения [3]. Для моделирования асинхронных систем с использованием дискретного времени необходимо дискретизовать время, выбрав некоторый фиксированный квант времени так, чтобы задержка между любыми двумя событиями была кратна этому кванту времени. Такое предположение трудно сделать a priori, и оно может повлечь ограничение точности моделирования системы. Бржозовски и Се- джер [38] показали, например, что теоретически задача достижимости для асинхронных схем с ограниченными задержками не может быть корректно решена, если время полагается дискретным. Кроме того, выбор достаточно малого кванта времени для точного моделирования асинхронной системы может привести к эффекту «комбинаторного взрыва» в пространстве состояний, вследствие которого верификация будет невозможна (однако это может быть большей трудностью для алгоритмов верификации с явным пространством состояний, чем для символьных алгоритмов верификации). Несмотря на то что было предложено множество различных моделей непрерывного времени [8, 99,135,170, 222, 235, 252, 253], стан- 17
344 Глава 17. Непрерывное реальное время дартной стала модель временных автоматов, предложенная Алу- ром, Куркубетисом и Диллом [8, 99]. Бесспорно, ббльшая часть исследований по верификации с непрерывным временем основана на этой модели. В настоящей главе мы обсудим свойства временных автоматов и раскроем основные методы, разработанные для их верификации. Поскольку в этой области было проведено немало исследований, мы ограничим этот краткий обзор проблемой достижимости для таких автоматов [3, б]. Кроме того были предложены алгоритмы верификации моделей для формул CTL [8] и для формул LTL [7], а также проверки включения временных ш-автоматов [5, 9]. На основе этих алгоритмов были разработаны программные средства [10, 92], опробованные на реальных примерах. Заинтересованный читатель может обратиться к упомянутым ранее работам, чтобы узнать больше об этих методах. 17.1. Временные автоматы Временнбй автомат [8, 99] представляет собой конечный автомат, снабженный конечным набором часов, принимающих действительные значения. Считается, что переходы совершаются мгновенно. Однако течение времени не останавливается, пока автомат находится в состоянии, или позиции. Когда происходит переход, некоторые часы могут быть сброшены в ноль. В каждый момент показания часов отмечают период времени, прошедший с момента последнего сброса этих часов. Мы предполагаем, что темп времени одинаков для всех часов. Чтобы избежать патологического поведения, мы рассматриваем только автоматы, которые не удовлетворяют апории Зенона, т. е. лишь конечное количество переходов может произойти за конечный отрезок времени. С каждым переходом связано временное ограничение, или предохранитель. Переход может быть совершен, только если текущие показания часов удовлетворяют временнбму ограничению. Временное ограничение также связано с каждой позицией этого автомата. Это ограничение называется инвариантом позиции. Течение времени в позиции происходит, пока инвариант этой вершины истинен. Пример временнбго автомата приведен на рис. 17.1. У этого автомата две позиции «0 и el, двое часов х и у, переход «а» из s0 в si и переход «Ь» из el в зО. Автомат стартует в позиции яО. Он может оставаться в этой позиции, пока показания часов у не превосходят 5.
17.1. Временные автоматы 345 вО el ( > у <= 5 V S у >= 3 у := 0 b у >= 4 Л у := 0 х := 0 у <= 10 х <= 8 X. s Рис. 17.1. Простой временнбй автомат Как только показания часов у станут больше или равны 3, автомат может совершить переход «а» в позицию si и сбросить часы у в 0. Автомат может оставаться в позиции si пока у не больше 10, и х не больше 8. Когда показания часов у достигнут значения 4, а показания часов х достигнут значения 6, автомат получит возможность совершить обратный переход «Ь» в позицию зО и сбросить х. Далее приведем описание формальной семантики временных автоматов в терминах графов переходов с бесконечным числом состояний [3, 8]. Мы начнем с точного определения временных ограничений. Пусть X — множество переменных-часов, принимающих неотрицательные действительные значения из R+. Определим множество временных ограничений С(Х) следующим образом. ¦ Все неравенства вида х -< с и с -< х содержатся в С(Х), где -< обозначает < или ^, а с — неотрицательное рациональное число. ¦ Если ограничения <pi и (р2 принадлежат С(Х), то <pi Л у>г принадлежит С(Х). Заметим, что если X содержит к часов, то каждое временное ограничение определяет выпуклое подмножество ^-мерного евклидова пространства. Таким образом, если две точки удовлетворяют вре- меннбму ограничению, то и все точки отрезка, соединяющего эти точки, удовлетворяют этому временнбму ограничению. Временнбй автомат А — это шестерка (Е, 5, So, X, I, Г), где ¦ Е — конечный алфавит, ¦ S — конечное множество позиций, ¦ So С S — множество начальных позиций, ¦ X — множество часов, 22 Зак. 271
346 Глава 17. Непрерывное реальное время ¦ I: S -? С(Х) — отображение позиций во временные ограничения, называемое инвариантом позиций, ¦ Т С 5 х ? х С(Х) х 2х х 5 — множество переходов. Каждая пятерка (в, а, <р, А, в') соответствует переходу из позиции s в позицию а', который помечен символом а. Ограничение <р определяет, когда этот переход возможен, а показания часов из множества АСХ сбрасываются при совершении перехода. Мы потребуем, чтобы время могло продвигаться вперед до бесконечности, то есть в каждой позиции ограничения сверху, налагаемые на показания часов, либо равны бесконечности, либо меньше максимальной границы, определяемой инвариантом и переходами, исходящими из этой позиции. Другими словами, во всякой позиции можно либо оставаться бесконечно долго, либо инвариант вынудит автомат покинуть эту позицию, и в этот момент по крайней мере один из переходов будет возможен. Для временных автоматов эти ограничения могут быть наложены синтаксически. Моделью для временнбго автомата А служит граф переходов Т(Х) = (E,Q,Qo,R) с бесконечным числом состояний. Каждое состояние в Q — это пара (s, и), состоящая из позиции я 6 5 и показания часов v. X -» К+, придающего каждым часам неотрицательное действительное значение. Множество начальных состояний Qo Р&в- но {{a, v) | a € S0 Л Уж 6 X \u{x) = 0]}. Для того чтобы определить отношение перехода на состояниях графа Т{А), мы должны ввести некоторые обозначения. Для А С X определим v[X := 0] как показание часов, совпадающее с и для часов из X \ А и придающее часам из А значение 0. Для d € R определим v+d как показание часов, придающее каждым часам х € X значение v{x) + d. Показание часов v — d определяется таким же образом. Из краткого обсуждения во введении мы знаем, что временнбй автомат имеет два основных типа переходов. ¦ Переходи по задержке соответствуют течению времени, пока автомат остается в некоторой позиции. Мы будем использовать обозначение (a, v) —у (a, v + d), где d е R+, в том случае, если для всех е, 0 < е < d, инвариант /(*) истинен для v + е. ¦ Переходы по действию соответствуют выполнению перехода из Т. Мы условимся использовать обозначение (а, и) -^* (s',i/), где a G S, в том случае, если существует такой переход (*, а, <р, А, в'), что v удовлетворяет tp и i/ = v[\ := 0]. Отношение переходов R для Т(А) получается объединением переходов по задержке и по действию. Мы будем использовать запись
17.2. Параллельная композиция 347 (а, и) R (a', v1) или (a, v) =^ (a', i/), если существуют такие элементы а" и I/", что (а, I/) —> (a", I/") -^-> (a', i/) для некоторого d G R. В этой главе мы опишем алгоритм для решения задачи достижимости в Т(А), а именно, мы покажем, как для заданного множества начальных состояний Qq вычислить множество всех состояний q € Q, достижимых из Qo по переходам из R. Эта задача непроста, поскольку Т(А) имеет бесконечное число состояний. Для решения поставленной задачи необходимо использовать конечное представление бесконечного пространства состояний Т(А). Разработка подобных представлений и является главной темой следующих разделов. 17.2. Параллельная композиция Перед тем как приступить к изучению проблемы достижимости, мы покажем, как представить системы реального времени в виде параллельных композиций временных автоматов [3, 5]. Семантика этой операции может быть как интерливинговой, так и асинхронной. Пусть Аг = (Si,Si,Sh,XxJuTi) и A2 = (Еа.^^Х^Га) - два временных автомата. Предполагается, что множества часов этих автоматов не пересекаются, то есть Х\ f)Xi = 0. Тогда параллельной композицией А\ и А2 называется временнбй автомат Ai || А2 = <Ei U Е2,5х х S2,Sb х Sg,Xt U Х2,1,Г), где /(ai.aj) = /i(ai) Л /2(82), а отношение перехода Т определяется следующими правилами. 1. Для об Е1ПЕ2, если {ai,a,<pi,Xi,Si) € 7\ и (82,a,(p2,X2,s'2) € 6 Т2, тогда Т будет содержать переход ((аьвг),*»,^. Л y>2,AiU UA2,(ai,a2)); 2. Для а G Ei \ Е2, если (а, а, у?, A, a') G Т\ и t е S2, тогда Г будет содержать переход ((а, <), а, <?>, A, (a', *)); 3. Для а 6 Е2 \ Ei, если (а,о,у?, А,а') 6 Тэ и i G Si, тогда Г будет содержать переход ((?, а), а, ^?, A, (t, a'))- Таким образом, позициями параллельной композиции являются пары позиций составляющих автоматов, а инвариантом таких позиций служит конъюнкция инвариантов составляющих позиций. Для каждой пары переходов отдельных автоматов, помеченных одним и 22*
348 Глава 17. Непрерывное реальное время а D лента транспортера Робот D ® пункт контроля Робот G п обрабатывающее устройство Рис. 17.2. Пример из промышленного производства тем же действием, в параллельной композиции имеется переход. Исходной позицией этого перехода будет составная позиция, полученная из исходных позиций отдельных переходов. Его целевой позицией будет составная позиция, полученная из целевых позиций отдельных переходов. Предохранителем будет конъюнкция предохранителей этих переходов, а множеством сбрасываемых часов будет объединение множеств часов, сбрасываемых на этих отдельных переходах. Если действием некоторого перехода будет действие только одного из двух процессов, то для каждой позиции второго временнбго автомата в параллельной композиции будет совместный переход. Исходные и целевые позиции таких переходов будут получены из исходных и целевых позиций рассматриваемого перехода и позиции второго автомата. Все остальные компоненты этих переходов остаются теми же самыми.
17.3. Моделирование временными автоматами 349 Г D-Wait s-ready х := О D-Pick х <= 2 х := 0 5 <= х <= 6 d-turn-1 D-Turn-L х <= 6 N х := 0 N 1 <= х <= N. d-put 2 D-Put х <= 2 J d 5 <= J X -pick : <= 6 := 0 D-Turn-R /v. : = x <= 6 к J d-put <= x <= 2 0 Рис. 17.3. Временнбй автомат для робота D 17.3. Моделирование временными автоматами Чтобы показать, как можно использовать временные автоматы для моделирования систем реального времени, мы рассмотрим простой промышленный агрегат, заимствованный у Доуза и Йовай- на [93]. Этот агрегат состоит из движущейся слева направо ленты транспортера, обрабатывающего устройства и двух роботов, которые перемещают ящики между этим устройством и лентой транспортера, как изображено на рис. 17.2. Первый робот, называемый «робот О», снимает ящик с устройства и размещает его на левом конце транспортера. Второй робот, называемый «робот G», снимает ящик с правого конца транспортера и переносит его на устройство,
350 Глава 17. Непрерывное реальное время Г П-Тпв. Л Ч ) . middle у := 0 G-Pick х <= 8 Ч J у := 0 g-pick 8 <= х <= 10 3 <= х <= 8 g-turn-1 у := 0 G-Turn-L у <= 10 ч ) , у : = 1 <= g-put G-Put У < ч = 2 J ' G-Turn-R у <= 10 Ч ) 0 g-turn-r у <= 2 6 <= у <= 10 у := 0 s-empty у := 0 ¦ ( Л Ч ) Рис. 17.4. Временнбй автомат для робота G где ящики обрабатываются. Далее мы подробнее опишем каждый из компонентов. Временнбй автомат для робота D изображен на рис. 17.3. Робот ожидает (в вершине D-Wait), пока подготовят ящик (признаком готовности служит действие s-ready). Далее он поднимает ящик (D- Pick), поворачивается направо (D-Turn-R) и ставит ящик на движущуюся ленту (D-Put). Потом он поворачивается налево (D-Turn-L) и возвращается в исходное положение. Для того чтобы поднять ящик и поставить его на ленту, необходимо от одной до двух секунд. Поворот налево или направо отнимает от пяти до шести секунд. Временнбй автомат для робота G приведен на рис. 17.4. Робот находится напротив пункта контроля неподалеку от правого края
17.3. Моделирование временными автоматами 351 S-Busy z <= 10 s-busy 8 <= z <= 10 z := 0 V J Рис. 17.5. Временнбй автомат для обрабатывающего устройства ленты в ожидании (позиция G-Inspect), когда ящик пройдет через этот пункт. Робот должен забрать ящик (G-Pick), до того, как тот упадет в конце ленты. Далее робот поворачивается направо (G-Turn- R) и ожидает, пока устройство завершит обработку предыдущего ящика (G-Wait), а затем помещает ящик на устройство (G-Put). Наконец, он поворачивается налево (G-Turn-L) к пункту контроля. Для того чтобы забрать ящик, роботу требуется от трех до восьми секунд, а для поворота направо — от шести до десяти секунд. От одной до двух секунд нужно для того, чтобы поместить ящик на устройство, и от восьми до десяти — для возврата к пункту контроля. Временнбй автомат для обрабатывающего устройства представлен на рис. 17.5. Первоначально обрабатывающее устройство пусто (S-Empty). После того как ящик попадает на устройство, его обработка занимает от восьми до десяти секунд. Потом робот D может забрать ящик. Временнбй автомат для ящика приведен на рис. 17.6. Вначале ящик перемещается (B-Mov) по транспортеру от левого края до пункта контроля. Как только ящик пройдет пункт контроля (В- Inspect), он упадет с ленты транспортера (B-Fall), если не будет поднят роботом G (B-on-G). В этом случае ящик помещается на
352 Глава 17. Непрерывное реальное время устройство (B-on-S), снимается роботом D (B-on-D) и устанавливается обратно на левый край ленты. Чтобы ящик прошел по транспортеру от левого конца до пункта контроля, необходимо от 133 до 134 секунд. Ящик упадет с ленты, если его не снимут за время от 20 до 21 секунды после прохождения пункта контроля. Временным автоматом для всей системы является параллельная композиция четырех отдельных автоматов, описанных выше. 17.4. Часовые области В определении временнбго автомата мы допускали использование временных ограничений в качестве инвариантов позиций и предохранителей переходов, содержащих произвольные рациональные константы. Мы можем умножить константы каждого временнбго ограничения на наименьшее общее кратное т знаменателей всех констант, которые встречаются в ограничениях [3]. Это превратит все константы в целые числа. Показаниями часов по-прежнему могут быть любые неотрицательные действительные числа. Заметим, что применение этого преобразования может изменить показания часов в множестве достижимых состояний графа переходов Т{А). К счастью, это не вызовет серьезных затруднений. Достижимые состояния исходного автомата могут быть получены из состояний преобразованного автомата применением обратного преобразования, т. е. делением показаний всех часов на тп. В преобразованном автомате наибольшая константа равна произведению тп и наибольшей константы1 исходного автомата. Таким образом, в худшем случае это преобразование влечет квадратичное увеличение длины записи временных ограничений [3]. Такое увеличение сложности приемлемо, поскольку преобразование упрощает определенные операции на временных ограничениях, которые нам понадобятся далее в этой главе. Мы будем применять это преобразование ко всем временным ограничениям, которые встречаются в рассматриваемых нами временных автоматах. Следовательно, в дальнейшем, без потери общности, мы будем предполагать, что все константы во временных ограничениях, с которыми мы сталкиваемся, являются целыми числами. Для того чтобы получить конечное представление бесконечного пространства состояний временнбго автомата, мы определим часо- Точнее, наибольшего числителя констант. — Прим. перев.
17.4. Часовые области 353 B-Fall g-pick В-move b <= 134 b-mov 133 <= b <= 134 b := 0 B-On-D B-Inspect b <= 21 20 <= b <= 21 g-pick B-0n-G g-put middle Рис. 17.6. Временной автомат для ящика вые области [7, 8], которые описывают множества показаний часов. Если для двух состояний, которые соответствуют одной и той же позиции временнбго автомата А, целые части показаний всех часов одинаковы, а дробные части часов одинаково упорядочены, то такие
354 Глава 17. Непрерывное реальное время Y 1 0 , 1 2 Рис. 17.7. Пример часовых областей состояния будут вести себя сходным образом. Целая часть показаний часов определяет, удовлетворяют ли они временнбму ограничению инварианта позиции или предохранителя перехода. Порядок следования дробных частей показаний часов определяет, какие часы первыми изменят целочисленную часть своих показаний. Это обусловлено тем, что временные ограничения могут содержать только целые числа, а все часы идут в одинаковом темпе. Например, пусть А — временнбй автомат с парой часов х\ и х%. Рассмотрим позицию в в Л, из которой существует переход е в некоторую другую позицию. Рассмотрим два состояния (s, v) и (a, v') в Т(А), соответствующие позиции s. Предположим, что и{х\) = 5.3, 1/(хг) = 7.5, t^(xi) = 5.5, и v'fa) = 7.9. Допустим, что предохранитель перехода е равен х\ ^ 8 Л Х2 ^ 10. Легко видеть, что если (s, v) удовлетворяет предохранителю, то и (a, v') также удовлетворяет ему. Показания часов могут быть сколь угодно велики; однако, если часы никогда не сравниваются с константой, большей чем с, то их показания, если они превысят с, не повлияют на работу А. Предположим, что в инвариантах вершин и предохранителях переходов часы х никогда не сравниваются с константой, большей чем 100. Тогда, основываясь на поведении А, невозможно отличить ситуацию, в которой х равно 101, от ситуации, когда х равно 1001.
17.4. Часовые области 355 Алур, Куркубетис и Дилл показали, как можно формализовать эти рассуждения. Для всяких часов х € X обозначим символом сх наибольшую константу, с которой х сравнивается в инварианте позиции или предохранителе перехода. Для teR+ обозначим записью frit) дробную часть числа t, a \tj — целую часть числа t. Таким образом, t = [t\ +fr(t). Мы определим отношение эквивалентности ^ на множестве возможных показаний часов следующим образом. Пусть v и i/ — два показания часов. Тогда v ^ i/ в том и только том случае, когда выполнены три условия. 1. Для всех х € X либо выполняются неравенства v(x) ^ сх и i/'(x) ^ сх, либо верно равенство [v(x)j = L"'(X)J- 2. Для всех таких х, у € X, что v(x) ^ с, и и(у) < с„, неравенство friy{xj) ^ fiiyiy)) верно тогда и только тогда, когда верно неравенство friy'{x)) < Му'(у)). 3. Для всех таких х G X, что и{х) ^ сх, равенство fr(v(x)) = О верно тогда и только тогда, когда верно равенство fr(i/(x)) = 0. Нетрудно видеть, что 2 и в самом деле определяет отношение эквивалентности. Классы эквивалентности по отношению =? называются часовыми областями [7, 8]. Мы будем использовать запись [и] для обозначения области, которая содержит показание часов v. Каждая область может быть охарактеризована указанием следующих параметров: 1) одного временного ограничения из множества {х = С | С — 0, ...,Caj}U{c-l < X < С | C= l,...,Cx}\j{x > Сх) дня каждых часов х € X; 2) отношения равенства или неравенства между значениями fr(x) и fiiy) для каждой пары таких часов х,у ? X, что с—1 < х < с и d—1 <у <d — временные ограничения из первого условия. На рис. 17.7, заимствованном из [8], показаны часовые области временнбго автомата с парой часов х и у, для которых с* = 2 и Су = 1. Этот пример содержит всего 28 областей: 6 угловых точек (вида [A,0)]), 14 открытых отрезков (вида [1<»<2Лу = ж — 1])и 8 открытых областей (вида [1<х<2Л0<у<х- 1]).
356 Глава 17. Непрерывное реальное время Мы воспользуемся этим замечанием для доказательства того, что — имеет конечный индекс и, следовательно, количество областей конечно. Наше обоснование этого утверждения основывается на доказательстве, приведенном в [8]. Лемма 43. Число классов эквивалентности (т. .е. часовых областей), которые отношение ^ порождает на С(Х), ограничено величиной №2|х|-П*ехBс*+2). Доказательство. Класс эквивалентности [и] отношения ^ может быть описан тройкой кортежей (а, /?,7) следующего вида. Для любых часов х € X кортеж а указывает, какой из интервалов {[0,0], @,1), [1,1], -.., (сх - 1,сх), [сх,сх], (с*, со)} содержит значение v{x). Таким образом, кортеж а соответствует показанию часов v тогда и только тогда, когда для каждых часов х G X выполняется условие v{x) € а(х). Количество способов выбора а равно П,€хBс* + 2)- Пусть Ха — множество часов, для которых а(х) представляет интервал вида (i,i + 1) для некоторого i < d. Иными словами, Ха состоит из множества часов с ненулевой дробной частью. Кортеж /9: Ха -» {1,..., |XQ|} — это перестановка элементов множества Ха, которая задает порядок следования дробных частей часов в Ха относительно ^. Таким образом, /? определяет показание часов v тогда и только тогда, когда для каждой пары х,у Е Ха если ,9(х) < @(у), то Му{х)) < Му(у)). Для данного а количество способов выбора f) ограничено величиной |XQ|!, которая, в свою очередь, не превосходит величины \Х\\. Третья компонента 7 — это булев кортеж, позиции в котором соответствуют элементам множества Ха; он используется, чтобы отметить, какие часы в Ха имеют одинаковые дробные части. Для любых часов х значение у(х) указывает, равна ли дробная часть часов i/(x) дробной части их предшественника в последовательности /?. Таким образом, последовательность 7 соответствует показанию часов v в том и только том случае, когда для любых часов х ? Ха равенство 7(х) = 0 равносильно существованию таких часов у G Ха, что Р(у) = Р(*) +1 и /К"(*)) равно fr{v(y)). Количество способов, которыми можно выбрать 7, ограничено количеством булевых кортежей над Ха, которое, в свою очередь, не превосходит 2'*1.
17.4. Часовые области 357 Итак, а кодирует целые части показаний часов, а /? совместно с 7 кодируют порядок их дробных частей. Нетрудно видеть, что множества, представленные этими тройками, являются классами эквивалентности по отношению = и всякий класс эквивалентности определяется некоторой тройкой. Верхняя оценка, приведенная в формулировке этой леммы, — это произведение оценок для a, fi и 7- Доказательство леммы завершено. ? Далее в этой главы будут использоваться следующие свойства отношения эквивалентности ?2. Лемма 44. Пусть задана пара показаний часов vihu2, временное ограничение <р и множество часов А е X. Тогда 1) Если v\ Э V2 и t — неотрицательное целое число, то v\ +t a v^+t; 2) Если i/i S j/2, то Wi 6 K+ 3*2 G R+ [vx +ti**v2 +12]; 3) Если v\ S iaj, то v\ удовлетворяет (p тогда и только тогда, когда i/2 удовлетворяет <р; 4) Если их S t/2, то i/i[A := 0] a i/2[A := 0]. Заметим, что первое свойство может не выполняться, если t — не целое число. Например, @.2,0.8) = @.1,0.2), но @.2,0.8) + 0.3 не эквивалентно @.1,0.2) + 0.3. Доказательства всех свойств, за исключением второго, достаточно просты; оставим их для читателя. Далее приводится набросок доказательства второго свойства. Это доказательство не сложно, однако несколько громоздко. Оно может быть без ущерба пропущено при первом прочтении этой главы. Доказательство. Допустим, что vx a j/2. Мы можем предположить, что ti > 0, поскольку в противном случае можно положить <2 = 0. Пусть X = {х\,Х2,- ¦¦ ,хп}. Мы можем рассматривать v\ как вектор i/i = (ai,...,an), в котором а* — показания часов ж< в v\. Аналогично, мы полагаем v2 = (bi,...,bn). Поскольку соответствующие часы имеют равные целые части, мы без потери общности можем предположить, что 0^сц<1и0^Ь<<1. Предположим также, что показания часов упорядочены по возрастанию, так что ai ^ а2 ^ ... < о„ и &! ^ 62 < • • -^ &п- Случай 1. Допустим, что наибольший элемент в v\ +1\ меньше или равен 1. Этот случай тривиален. Мы легко можем выбрать t2 так, ЧТО V\ +tl а V<i -М2- Случай 2. Допустим, что 0 ^ t\ < 1. Пусть первым элементом вектора v\ +1\, который больше или равен 1, будет at + *i. Выберем е так, что ? = 0, если a* +1\ = 1, и 0 < е < bit - &*-i, если at+h > 1.
358 Глава 17. Непрерывное реальное время Заметим, что 6*_1 < Ьк- Если bk-i = bk, то a*_i = <ц и a* 4- ti — не является первым элементом вектора i/i -Mi, превосходящим или равным 1. Мы покажем, что vi + ti 2 1/2 + A + е - b*)- Для этого разобьем векторы на две части. Положим L\ = (ai+*i,...,a*_i + ti) и Li = (h + A + е - 6*).... А-1 + A + е - Ьк)). В каждом случае не составляет труда показать, что 1) все элементы положительны, 2) элементы упорядочены по возрастанию и 3) все элементы меньше 1. Из этих условий очевидным образом следует, что L\ ^ L2. Аналогично положим #i = (ak+ti,...,an + ti) и Д2 = (Ьк + A + е - Ьк),..., Ъп + A + е - Ък)). Все элементы векторов Hi и Л2 больше или равны 1. Их дробные части определяются как Ri - 1 и Я2 - 1, соответственно. Для этих векторов легко показать, что 1) все элементы положительны, 2) элементы упорядочены по возрастанию и 3) все элементы меньше 1. Более того, элемент в одном из векторов равен 0 тогда и только тогда, когда соответствующий элемент в другом векторе равен 0. Таким образом, Ri — 1 ^ Ri — 1. Отсюда следует, что Ri S R2. Нетрудно видеть, что дробные части вктора Ri предшествуют дробным частям вектора L%. Пусть i ^ к и j < к. Тогда очевидно, что неравенство bi + A + е - Ьк) - 1 ^ Ь, + A + е-Ьк). эквивалентно неравенству bi — bj ^ 1. Такое же соотношение выполняется для дробных частей векторов Ri и L\, т. е. Oi + t\ -1 < a,--Mi. Поэтому мы получаем R\ • L\ й R% ¦ Li, где «•> обозначает конкатенацию векторов. Это доказывает, что для всех t\, 0 ^ t\ < 1, существует такое ti, что vi +1\ й щ + ti, и доказательство случая 2 завершено. Случай 3. Наконец, допустим, что t% ^ 1. Пусть t[ = h - [*ij, где 0 ^ *i < 1- Найдем такое *2, что v\ +t[ 2 1/2 +1^. Тогда H + «l + L*ijs*i + ^ + L'iJ-
17.4. Часовые области 359 Если мы выберем t2 = t'2 + |_*ij> то получим требуемое соотношение v\ + t\ Si щ + *2- Этим завершается доказательство. ? Отношение эквивалентности Si на множестве показаний часов можно продолжить до отношения эквивалентности на множестве состояний Т(А) так, чтобы эквивалентные состояния имели одинаковые позиции и эквивалентные показания часов: (з, и) й (s', v') тогда и только тогда, когда s = s' и v Si и'. Основное свойство отношения эквивалентности = определяется следующей леммой (см. [5]). Лемма 45. Если v\ Si j/2 и (s, v\) =^» (s', v[), то существует такое показание часов и2, что ^ i/2 и (s,i^) ==> (s',i/2). Доказательство. Допустим, что i/i ? v2 и (s, i/i) =^» (s', i^)- Переход (з, о, <?>, Л, з') из состояния (s, vi) в состояние (s, i/() соответствует двум переходам временнбго автомата: ¦ переходу по задержке (з,щ) —h (в, vi 4- di) для некоторого вещественного d\ ^ 0 и ¦ такому переходу по действию (з, vi + d\) -^-> (з', i/J), что i/i + di удовлетворяет ip я v[ = (vi + di)[A := 0]. Поскольку i/i S i/2 и i/i удовлетворяет ограничению /(а), показание часов i/2 также удовлетворяет I(s). Кроме того, существует такое da ^ 0, что vi+di = i/2 + d2. Поскольку v\ + di удовлетворяет ограничению I(s), показания i/2 + d2 также удовлетворяет I(s). Так как временное ограничение 1(з) выпукло, и оба показания i*j и j/j + d2 удовлетворяют ему, показание часов i/2 + е должно удовлетворять 1(з) для всех е, 0 ^ е ^ d. Следовательно, правомерен переход по задержке (s, i>2) —^> (s, t>2 + d2). Поскольку ^i -(- d\ Si V2 + d2, оба показания i/i + di и i/2 -H tfc должны удовлетворять временнбму ограничению предохранителя tp. Таким образом, переход (з, a, tp, А, в') также должен быть возможен в состоянии (s, V2 + da)- Положим i/2 = {уъ + d2)[A := 0]. Тогда v'2 эквивалентно и[. Следовательно, существует переход по действию (я,  + ^) -^» (s',i/2). Совмещая переход по задержке с переходом по действию, мы получаем (з, i/s) =^ (з', Ц), что и требовалось. ? Основываясь на этой лемме, мы можем построить граф переходов с конечным числом состояний, который бисимуляционно эквивалентен графу переходов Т(А) с бесконечным числом состояний. Этот граф переходов с конечным числом состояний называется графом областей автомата А [7, 8] и обозначается И(А). Состояниями
360 Глава 17. Непрерывное реальное время графа областей являются области автомата А. Конструкция 71(A) обладает следующим свойством: если (a, v) является состоянием графа Т(А), то область (a, [v]) будет состоянием графа 71(A). Начальные состояния графа областей имеют вид (so, ["о])) где во — начальное состояние автомата A, a vq — вектор, в котором показания всех часов равны 0. Отношение переходов 71(A) определяется таким образом, чтобы обеспечить бисимуляционную эквивалентность. Из области (a, [v]) будет вести переход, помеченный а, в область (a', [v']) тогда и только тогда, когда существуют такие показания часов ы € [и] Hd/e [v'\, что возможен переход из (а,ш) в (в', а/). Теперь мы подведем итог процедуре построения графа 71(A). Пусть задан временнбй автомат А = (Е, 5, So, X, I, Т). Тогда ¦ состояния графа 71(A) имеют вид (а, [v]), где а € 5, а [и] — часовая область; ¦ начальные состояния имеют вид (зо, [v]), где зо € So, а vix) = 0 для всех х 6 X; ¦ в 71(A) есть переход ((з, [i/]),a, (s',[i/'])) тогда и только тогда, когда (з,ш) =*• (а',ш') для некоторых ш € [и] и и' € [v']. Для доказательства бисимуляционной эквивалентности мы можем воспользоваться леммой 45. Теорема 31. Граф переходов Т(А) и граф областей 71(A) биси- муляционно эквивалентны как системы переходов. Доказательство. Мы покажем, что Т(А) и 71(A) бисимуляцион- но эквивалентны. Определим отношение бисимуляции В, положив (s,v) В (з, [и]). Нетрудно видеть, что начальное состояние (зо,^) соответствует начальному состоянию (зо, [щ])- Далее мы покажем, что для каждого перехода в Т(А) существует соответствующий переход в 71(A) и наоборот. Сначала предположим, что (з, v) В (а, [и]) и (з, и) =$¦ (a1, i/). Из этого непосредственно следует, что есть переход (а, [и]) =^ (a', [i/]) и (a', v') В (а1, [v']). Предположим, с другой стороны, что (a, v) В (а, [v]) и (a, [v]) =^» (з', [и1]). Тогда существуют такие эквивалентные показания ы^ i/ иш' ^v1, что (a,w) =^» (а',ш'). Поскольку (з,ш) 5* (a, v), по лемме 45 существует такое (а1, и"), такое что (а',и') S (з',1/") и (s,i/) =^ (а', И). Значит, И 2 сУ =* i/, и поэтому [v") = [i/']. Согласно определению отношения В мы получаем (a', j/") В (а', [>]). Отсюда следует, что (a', i/") В (a', [i/]). D
17.5. Часовые пояса 361 17.5. Часовые пояса Альтернативный способ получить конечное представление бесконечного пространства состояний Т(А) заключается в определении часовых поясов [3], которые также описывают множества показаний часов. Часовой пояс — это конъюнкция неравенств, в которых показания часов или разница в показаниях часов сравниваются с целыми числами. Мы будем допускать неравенства следующих типов: х -< с, с -< х, х - у -< с, где -< обозначает < или ^. Введя особые часы хо, которые всегда показывают 0, можно получить более однородную запись часовых поясов. Поскольку показания часов всегда неотрицательны, мы будем предполагать, что ограничения, содержащие всего одни часы, имеют вид -Co,t -< Xi -< Cifi, где —co,t и С{^ неотрицательны. Используя наши особые часы х0, мы заменим это ограничение на конъюнкцию двух неравенств Хо — Х< -< CQ.i Л Xj — Хо -< Cj,o- Таким образом, общий вид часового пояса таков: ХО = О Л Ло<ц4Кп Xi - XJ ¦< СЬЗ- Для построения сложных часовых поясов из более простых будут использоваться следующие операции (см. [3]). Пусть <р — часовой пояс. Для множества часов А С X определим <р[А := 0] как множество всех показаний часов v{\ := 0], где v €ср. Для d € ЙГ*" определим tp+d как множество всех показаний часов v+d, где и G <р. Множество tp — d определяется аналогично. Пусть v — часовой пояс, который описан с использованием часов из множества X. Конъюнкция tp будет описывать множество показаний часов из X. Если X содержит к элементов, тогда <р является выпуклым подмножеством ^-мерного евклидова пространства. Следующая лемма показывает, что проекция часового пояса на подпространство меньшей размерности также является часовым поясом. ЛеммА 46. Если ip — часовой пояс со свободной переменной часов х, то Зх[<р) — также часовой пояс. Эта лемма весьма полезна при работе с часовыми поясами; она будет доказана в конце этого раздела. Заметим, что показание часов в начальном состоянии временного автомата А можно легко представить как часовой пояс, поскольку
362 Глава 17. Непрерывное реальное время + х2 Xl Рис. 17.8. Часовые пояса tpvup Sf и{х) = 0 для всех х Е X. Кроме того, всякое временное ограничение, которое используется в инварианте позиции автомата или в предохранителе перехода, является часовым поясом. Из этого наблюдения следует, что часовые пояса могут служить основой различных алгоритмов анализа достижимости состояний временных автоматов. Эти алгоритмы обычно описывают при помощи трех операций на часовых поясах (см. [3]). Пересечение Если (риф — два часовых пояса, то их пересечение tp Л ф — также часовой пояс. Это нетрудно понять. Поскольку (риф являются часовыми поясами, они могут быть выражены конъюнкцией временных ограничений. Поэтому <рЛф также является конъюнкцией временных ограничений и, следовательно, часовым поясом. Сброс часов Если ip — часовой пояс, а А — множество часов, то tp[\ := 0] — это часовой пояс. Мы покажем, что это так, в случае, когда Л содержит единственные часы х. Тогда условие ip[x := 0] эквивалентно тому, что
17.5. Часовые пояса 363 Зх[(р Л i = 0], и утверждение непосредственно следует из леммы 46. Это утверждение легко распространить по индукции на множества, содержащие более одних часов. Течение времени Вначале мы продемонстрируем эту операцию на геометрическом примере (см. рис. 17.8). Треугольная область представляет простой часовой пояс (р. Область над треугольником ip неограничена, а ее стороны (штриховые линии) составляют угол 45° с горизонтальной осью. Этот треугольник и область над ним представляют показание часов, которые могут быть получены из показания часов tp по прошествии времени. Обозначим эту область tp^. Приведем более строгие формулировки. Пусть <р — часовой пояс. Тогда показание часов и будет элементом; области <р^, если оно удовлетворяет формуле 3*^0 [{v — t) € tp], или, что то же самое, 3* ^ 0 [v G (<p+t)]. Такая область является часовым поясом. Для того чтобы продемонстрировать это, мы предположим, что t — это новые часы, и покажем, что <р +1 является часовым поясом, зависящим от часов из X и от t. Мы рассмотрим три вида неравенств: 1) —co,i -< хс. оно примет вид —со,» -< xt — t, а затем будет записано как t — Xi -< со,,-; 2) х^ -< с,,о: оно примет вид ж* — t -< — CjFo, который нам и нужен; 3) Xi — Xj -< Cjj-: оно примет вид (х,- — t) — (xj -1) -< aj. Так как два вхождения переменной t нейтрализуют друг друга, это неравенство также имеет необходимый вид. Поскольку <р + t является часовым поясом, мы можем воспользоваться леммой 46 и показать, что <рй = 3< > 0 [<р +1] — часовой пояс, зависящий от X. Эти три операции на часовых поясах, которые были только что определены, можно использовать для построения конечного представления графа переходов Т(А), соответствующего временнбму автомату. В следующем разделе мы опишем способ эффективной реализации этого алгоритма с использованием матриц разностных границ [3, 99]. В этом разделе состояния представляются поясами [3]. Пояс — это пара (s, ф), состоящая из позиции а временнбго автомата и часового пояса tp. Рассмотрим временнбй автомат А с переходом е = (з,а,ф, А,в'). Предположим, что его текущий пояс — (з,(р). Значит, s — вершина автомата А, а <р — часовой пояс. Часовой пояс succ(tp, е) будет обозначать множество таких показаний часов «/', что
364 Глава 17. Непрерывное реальное время для некоторого v € <р состояние (в', и') достижимо из состояния (в, и) по прошествии времени и совершении перехода е. Пара (a', sv.cc{ip, е)) будет описывать множество последователей состояния (a, <р) по переходу е. Часовой пояс зисс((р, е) получается после применения следующих шагов [3]. 1. Построить пересечение пояса <р и инварианта позиции а для вычисления множества возможных показаний часов текущего состояния. 2. Позволить времени продвигаться в позиции а, используя описанный выше оператор fr. 3. Снова вычислить пересечение с инвариантом позиции s, для того чтобы найти множество показаний часов, которые все еще удовлетворяют инварианту. 4. Вычислить пересечение с предохранителем гр перехода е, чтобы установить показания часов, которые допустимы после этого перехода. 5. Установить в 0 все часы из множества Л, сбрасываемые при переходе. Совмещая все указанные шаги в одну формулу, получим succ{tp,e) = ((ip Л /(a))* Л 1(a) Л 1р)[Х := 0]. Поскольку часовые пояса замкнуты относительно операций пересечения, течения времени и сброса часов, множество succ(ip, е) также является часовым поясом. Напоследок опишем способ построения системы переходов для временнбго автомата А. Эта система называется граф поясов и обозначается Z(A). Состояниями графа Z(A) служат пояса А. Если а — начальное состояние автомата А, то (а, [X := 0]) будет начальным состоянием графа Z{A). В Z(A) для каждого перехода е = (а, о, ф, А, в') временнбго автомата А из пояса (а, ф) будет переход в пояс (а', зисс(<р, е)), который помечен действием а. Поскольку каждый шаг построения графа поясов эфективно вычислим, это позволяет получить алгоритм для определения достижимости состояний в графе переходов Т(А). В следующем разделе мы покажем, как сделать это построение более рациональным. Перед тем как завершить этот раздел, мы докажем лемму 46, которая была ранее сформулирована без доказательства. Бе обоснование несложно и может быть без ущерба пропущено при первом прочтении этого раздела. -
17.5. Часовые пояса 365 Доказательство. Пусть часовой пояс <р задается формулой хо = О Л Ло<йу<п *< - *j -< а,з, где каждое вхождение -< обозначает < или ^. Без ограничения общности мы докажем, что Эхн[у?] является часовым поясом при п > 0. В частности, мы покажем, что 3xn[ip] определяется формулой Х0 = 0 Л Ло^Кп Х* ~ Xi ¦< °*,1 Л Ло$»#,<п Х* ~ XJ •< <*,п + °nJ- В ходе доказательства мы будем опускать ограничение хо = 0, потому что это равенство входит в состав любой формулы, а кванторы по хо не разрешены. Сначала мы покажем, что если показания часов хо,..., x„_i удовлетворяют формуле ЗХп [Ao<«/i^n Х* ~ Х3 "* ^.JJ ' то они также удовлетворяют формуле Ao<i#i<n X%-Xj < Cij Л Ло^цц<п х» _ xi ~* с»>« + cnJ- Чтобы понять, почему это так, мы запишем конъюнкцию Ло<ЭД-<п xi~xj ~< Ci,j в виде Д х{ - Xj ¦< aj Л Д Xi - хп ¦< Cj,„ Л Д х„ - х, -< Cnj и рассмотрим следующую цепочку импликаций: Ло^1<п xi~xn -< <Ч,п A Ло^;'<п хп ~xj ~< Cfij => => Ao^i#j<n *i - Жп "< Ci,„ Л Х„ - Xj -< Cnj =» =* Ло<ад<я(*< - *»») + (xn - xi) -< ««.n + Cn,i =*" => Ло<йЧ<"(*< - *i) -< <*.» + Спитак как последняя формула не содержит х„, мы понимаем, что из формулы ^"[Ло^^п^-^^Ч;] следует формула Ao<i#j<n х« - *i "^ ^о Л Ao$»#j<n ** ~~ ^з ~* °i,n + ^.i- Далее мы должны установить логическое следование в обратную сторону. Мы покажем, что всякое показание часов хо,... ,nn_i, для котором истинна формула Ao<i#j<n Х« - Х1 ~* °*>3 Л Ло<ЗД'<п xi~xj ¦< Cj,„ + С„,,-, также обращает в истину формулу Зхп I Ao$t#i<n г« ~* xi "* °«.i I •
366 Глава 17. Непрерывное реальное время Иными словами, мы должны найти такое неотрицательное значение переменной хп, чтобы соотношение Ao<i#j^n х« ~ х3 ~< °ij было истинно. Если верна формула Ao$*#j<n х» ~ xi ~* °ij Л Ло^мкп х» - xi "* °*,п + c„,j, то будет истинна и формула Ao^«#i<n х* ~ xi "* °*<п + °n<im Бе можно представить в виде Ao^»#j<n Х« — °i<n "^ XJ + C".J- Из этого следует, что maxo^i<„(ii - Cj,„) Ч mino$j<n(xj +cn,j). Мы выберем значение хп так, чтобы выполнялось соотношение maxo<i<n(art - <Ч,п) ¦< хп -< min0^,<„(a;j + c„,j). В частности, мы получим 0 —со,п -< жп -< 0 + сПH. Поскольку и —со,п, и Сп,о неотрицательны, значение хп также будет неотрицательно, как и требовалось. Из этого следует, что формула Ao<«/j<n х« ~~ °*,п "^ хп ~< xj + Cnj будет также истинна. Мы можем представить ее в виде Ло^кп х» — °*,п -< хпЛ Ao<j<n х" "* Х] "*" Cn'J' Проведя перегруппировку, получим Ло<«п хг — Хп -< Ci,n Л Ao<j<n Х" — X3 "* ^.i- Следовательно, если верно соотношение Aos$i?Sj<n Х« - Xj ~* C»J Л Ло^ЗД<п xi~xj -< Cj,n + с„^, то верно также и соотношение Д а;< - а;, -« cjj Л Д х< - х„ -« с<,„ Л Д аг„ - х, Ч с,,,,. 0^»#j<n 0<t<n 0<j<n Последняя формула сокращается до Ao^»#j<n х» — хз "* ^.i- Это доказывает, что формула Зхп [Ло^уу^п х» - xi ~* ^J'J также истинна, и тем самым доказательство второй половины леммы завершено. ?
17.6. Матрицы разностных границ 367 17.6. Матрицы разностных границ Всякий часовой пояс, как описано Диллом в [99], может быть представлен матрицей разностных границ. Строки и столбцы этой матрицы соответствуют часам из X, включая особые часы хо, показания которых всегда равны 0. Эти часы играют ту же роль, что и часы хо в предудущем разделе. Всякий элемент T>ij матрицы V имеет вид (dij,-<ij) и представляет неравенство х< — Xj -<ij dij, где -<ij обозначает < или ^, или (оо, <), если ограничение не задано. Поскольку переменная хо всегда равна 0, ее можно использовать для выражения ограничений, содержащих единственную переменную. Так, Vjjq = (djfl, -<) обозначает ограничение Xj •< djto- Точно так же Z>o,j = (doj,-<) обозначает ограничение 0 — Xj -< doj, или -doj -< Xj. Чтобы проиллюстрировать использование матриц разностных границ, рассмотрим часовой пояс, заданный формулой xi - х2 < 2 Л 0 > х2 < 2 Л 1 < xi. В этом случае мы получим следующую матрицу D: 0 1 2 0 @,^) (-1,^) @,<) 1 (оо,<) @,<) B,<) 2 B,^) (оо,<) @,^) Представление часового пояса матрицей разностных границ не единственно. В приведенном выше примере некоторые ограничения, являющиеся следствиями других ограничений, не отражены в матрице D. Например, из неравенств х\ — хъ < 2 и х2 — хо ^ 2 следует, что xi — хо < 4. Поскольку хо = 0, мы получаем Xi < 4. Таким образом, мы можем заменить Т>1$ на D, <) и получить другую матрицу разностных границ для того же часового пояса: 0 12 0 @,^) (-1,<) @,<) 1 D,<) (О,*0 B,<) 2 B,<0 (оо, <) @, <) Несомненно, новая матрица представляет такое же множество показаний часов, что и исходная матрица D. Вообще говоря, сумма верхних границ расхождений часов Х{—xj и Xj — xjt является верхней границей расхождений часов Xj — х*. Это
368 Глава 17. Непрерывное реальное время обстоятельство можно использовать для постепенного стягивания матрицы разностных границ. Если Xi-Xj -<i,j dtj и Xj —Xk <j,k dj.fc, то можно прийти к заключению о том, что Xi — х* -<<,* djj, где , _ f < » еСЛИ -<i,j = <: И ^j,fc = <, *'* \ < иначе. В результате если (dj к, -<[ к) будет более тесной границей, нежели (dj,*,-^,*), то эту последнюю границу нужно заменить на вновь вычисленную, что приводит к соотношению 2\* = (djj-, -<<0-)- Эта операция называется стягиванием матрицы разностных границ. Мы можем многократно применять стягивание к матрице разностных границ, до тех пор пока дальнейшие применения не будут давать никаких изменений. Полученная в результате матрица задает каноническое представление рассматриваемого часового пояса. Следуя этой процедуре применительно к часовому поясу из приведенного выше примера, мы получим каноническую матрицу разностных границ ^ О 1 2 о (о, <) (-1,^) (о,<) 1 D,<) @, <) B,<) 2 B, «О A,^) (<U) Следует заметить, что каноническая матрица разностных границ будет удовлетворять неравенству d*,* -<<,* d<j + d,,* для всех возможных значений индексов i,j и к. Приведение матрицы разностных границ к каноническому виду можно автоматизировать при помощи алгоритма Флойда-Уоршалла [80] кубичной сложности. Алгоритм гарантирует, что все возможные комбинации индексов будут систематично проверены для определения того, возможно ли дальнейшее стягивание. Мы узнаем, можно ли получить более тесную границу для Т)^, проверяя неравенство di,* -<<,* di,j + djtk для всех возможных значений j. Если для некоторого J оно не выполняется, то мы замещаем 2\* новой границей (d<j-, -<<j), как было указано в предыдущем разделе. После того как матрица разностных границ приведена к каноническому виду, мы можем установить, будет ли соответствующий часовой пояс пустым, анализируя элементы главной диагонали этой матрицы. Если часовой пояс, описанный нашей матрицей, непуст, то
17.6. Матрицы разностных границ 369 все элементы главной диагонали будут иметь вид @, ^). Если же часовой пояс пуст или невыполним, то на главной диагонали найдется по крайней мере один отрицательный элемент. Теперь мы опишем три операции над матрицами разностных границ (см [3, 99]). Эти операции соотвествуют трем операциям над часовыми поясами, опредленными в предыдущем разделе. ¦ Пересечение. Определим V = V1 Л V2. Пусть заданы ограничения V1 = (ci, -<i) и V2 = (с2, -<2). Тогда Viti = (min(ci,c2), -<), где -< определено следующими соотношениями: . если с\ < С2, то -< = -<i; . если с2 < ci, то -< = -<2; • еЕсли С2 = ci и -<i = -<2> то -< = -<i; . если С2 = С\ и -<1 ф -<2, то -< = <. ¦ Сброс часов. Определим ТУ = Р[А : щими образом: . если Xi,Xj G А, то ТУ^ = (О, ^); . если xt € A, Xj $ А, то ТУ4j = V0,j; . если Xj ? A, Xi $ А, то V^ = 2\о; • если Xj,X{ ? А, то V^ = "Dij- ¦ Истечение времени. Определим V зом: . Щ 0 = (со, <) для всякого t ф 0; . Vitj = Vitj, если i = 0 или j ф 0. В каждом из этих случаев может оказаться так, что полученная в итоге матрица не будет иметь канонического вида. Поэтому последним шагом должно быть приведение матрицы к каноническому виду. Все три операции можно реализовать эффективно. И более того, реализация этих операций осуществляется программой сравнительно просто. Теперь мы увидим, как можно сделать более эффективным построение графа поясов, описанного в предыдущем разделе. Часовые пояса будут представлены матрицей разностных границ, а множество succ(<p,e) вычисляется при помощи трех операций, но не над часовыми зонами, а над матрицами разностных границ, как было показано выше. Проиллюстрируем эту процедуру, воспользовавшись временным автоматом на рис. 17.1. Начальное состояние задается = 0], где А С Л", следую- = 2?* следующим обра- 25 Зак. 271
370 Глава 17. Непрерывное реальное время парой (во, Zq): где Zq — часовой пояс z = О Л у = 0, которому соответствует матрица разностных границ хо х у хо @, <) @, <) ((U) ж @, <) @,?) @, <) У @, <) (О, «О @, <) Выполним последовательность из пяти шагов, которая была указана в разд. 17.5. Мы будем представлять только нормализованные матрицы разностных границ, полученные в конце каждого шага. 1. Инвариант /(во) задатся соотношением 0 < хЛО < j/ ^ 5 и представляется матрицей х0 х у хо @,<) @,<) @, <) х (оо,<) @,^) (оо,<) У E, <) E, <) @,<) Мы находим пересечение Do и /(во) и вновь получаем нулевую матрицу. 2. Далее мы допускаем продвижение времени в позиции во, применяя оператор ft. Матрица для (Do А /(во))^ такова: хо х у хо @,$) @,*$) @,<) z (оо, <) (О, <) ((),?) у (оо, <) @, <) @, <) 3. Мы снова строим пересечение с /(во)> чтобы отыскать показания часов, все еще удовлетворяющие указанному инварианту. Матрица для (Do Л /(во))^ Л /(во) такова: х0 х у хо @,$) @, <) ((U) х (Ь,0 @,0 (<U) I/ E,$) (IU) @, <) 4. Предохранитель р0 для перехода а из позиции во в позицию з\ таков:
17.6. Матрицы разностных границ 371 х0 х у *о @,0 @,0 (-3,^) х (оо,<) @,0 (оо,<) у (оо, <) (оо, <) @,0 Мы находим пересечение текущего множества состояний и предохранителя да и получаем (D0 Л /(во)I*Л J(*o) Л да- х0 х у хо @,0 (-3,0 @,0 х E,0 @,0 @,0 У E,0 @,0 @,0 5. Наконец, мы сбрасываем в ноль часы у и приходим к матрице D\ вида Х0 х у хо @,0 (-3,0 @,0 х E,0 @,0 E,0 у @,0 (-3,0 @,0 Отметим, что последняя матрица разностных границ соответствует часовому поясу Zl = 3<x^5A3<x-j/^5Aj/ = 0. Значит, последующим состоянием в автомате пояса будет (si,Zi). Повторяя ту же последовательность шагов, мы получим все остальные состояния автомата пояса, а именно 1) (яО,4^y<5A4<j/-xs$5Ax = 0), 2) (81,0^х^1А0^х~у^1Ау = 0), 3) (зО,5^у^8Л5^у-х^.8Лх = 0), 4) (*1,х = 0Лу = 0). Вычисление достижимых состояний завершается в этой точке, поскольку состояние («1,х = 0Лу = 0) содержится в (я1,0<х^1Л0^х-у ^1Лу = 0) Поэтому никаких новых состояний графа Т(А) не будет получено при вычислении последующих состояний автомата пояса. 25*
372 Глава 17. Непрерывное реальное время 17.6.1. Вопросы сложности Вследствие леммы 43 сложность проверки достижимости при помощи построения графа областей экспоненциальна по числу часов, а также по диапозону часов. Аналогичные результаты можно получить для верификации с использованием темпоральной логики. На практике построение графа областей можно сочетать с символьными методами проверки на модели: основанными на BDD. В таком случае число переменных состояния может быть весьма велико. При реализации матриц разностных границ обычно используют явное представление состояний. Соответственно при таком подходе число состояний, которые можно обработать, будет гораздо меньше. Количество часов, как правило, связано с числом компонентов, работающих параллельно, и также невелико. Преимущество этого подхода состоит в том, что ограничения представлены при помощи алгебраических неравенств и поэтому с ними можно легко обращаться. Различные методы, которые обсуждались в этой книге, можно применять для того, чтобы избежать проблемы «комбинаторного взрыва» для систем реального времени. В ряде исследований уже была предпринята попытка совместить метод редукции частичных порядков с описанными в этой главе алгоритмами [222, 252, 253]. Кроме того, в работе [130] был исследован метод аппроксимаций, который можно применять в сочетании с этими алгоритмами. Композиционные доказательства должны быть также полезны, но, по- видимому, они еще не были исследованы достаточно основательно.
Заключение Методы, описанные в этой книге, уже были применены для отыскания нетривиальных ошибок в схемах и протоколах. Была исследована корректность реальных сложных систем, наподобие протокола когеррентности кеш-памяти Futurebus+, описанного в разд. 8.2. Мы убеждены, что современные инструментальные средства верификации моделей работают достаточно хорошо, для того чтобы найти применение в индустрии, и действительно, ряд фирм, таких как AT&T, Fujitsu, Intel, ШМ, Lucent, Motorola и Siemens, приступили к использованию средств верификации моделей в рамках процесса разработки их проектов. Так как проверка на модели не требует построения сложных доказательств и предоставляет в качестве контрпримера трассу вычисления, когда некоторая спецификация не выполняется, мы полагаем, что схемотехники сочтут этот метод сравнительно простым для изучения и применения. Эти инструментальные средства адаптируются для использования совместно со стандартными промышленными языками, наподобие VHDL и Verylog. Тем не менее существует несколько направлений, по которым можно улучшить верификаторы, чтобы упростить их использование инженерами. Некоторые из таких улучшений предусматривают относительно простое развитие имеющихся систем. Например, очевидная проблема, с которой сталкиваются существующие системы, состоит в том, чтобы сделать языки спецификаций более выразительными и простыми в применении. Отдельные разновидности временных диаграмм могут быть более естественными для инженеров, нежели CTL (см. [227]). Представляется возможным либо систематично транслировать временные диаграммы в формулы темпоральной логики, либо проверять их непосредственно, применяя алгоритмы, подобные тем, которые используются верификаторами. Аналогичная проблема возникает и с выбором хорошего способа показа контпримеров, которые генерируются, когда формула неверна. Это неоценимое средство для обнаружения настоящего источника неявных ошибок в схемах. Однако большинство существующих систем просто выдают распечатку пути в графе переходов, чтобы пока- 18
374 Глава 18. Заключение зать, каким образом возникает ошибка. Нетрудно придумать более наглядные способы отображения этой информации. Другие направления развития требуют дополнительной теоретической работы. Одно из очевидных направлений — разработка более компактных способов представления булевых функций. Методы верификации, которые обсуждались в этой книге, не существенно зависят от свойств двоичных разрешающих диаграмм. На самом деле здесь пригодно всякое представление булевых функций, поддерживающее булевы операции и обладающее хорошими алгоритмами упрощения. По мере того как разрабатываются лучшие представления, их можно встраивать в алгоритмы верификации моделей. Те же методы кодирования, которые используют в символьной верификации моделей, можно применять и для других задач теории графов. Например, нетрудно написать формулу ^-исчисления первого порядка, которая будет истинной, когда граф сильно связан. Алгоритм верификации моделей для этой логики представлен в работе [46]. Один из важных вопросов состоит в том, насколько полезны OBDD и метод неподвижных точек для задач наподобие минимального остовного дерева, изоморфизма графов и т. п. В конце концов, мы ожидаем, что сможем обрабатывать более сложные системы, применяя методы абстракции и композиционные доказательства. Ясно, что обе эти темы нуждаются в еще ббльших дополнительных исследованиях. Было предпринято несколько попыток автоматизировать методы абстракций для аппаратуры (см [181]), хотя и неясно, насколько общими являются эти методы. Не так давно появилась работа [54], посвященная автоматическому применению композиционных методов. В последнее время был достигнут некоторый успех в применении абстрактных областей данных для верификации схем процессоров [40,88,127], хотя эти методы все еще не были скомпонованы гладко с методами обследования пространства состояний. При верификации программного обеспечения абстракция еще более насущна, как для сокращения пространства состояний, так и для того, чтобы совладать с бесконечным пространством состояний (см. [149]). Анализ программного обеспечения становится все более важным, особенно в связи с возрастающим интересом к совместному аппаратно-программному проектированию [156] для приложений в производстве потребительской электроники, а также в сложных критических по безопасности системах, наподобие медицинских устройств с компьютерным управлением и систем управ-
375 ления воздушным транспортом [241]. Недавно разработанные программные протоколы в таких областях, как электронная коммерция и аутентификация, также подчиняются требованиям очень высокой надежности [47, 70, 180, 188, 193, 194, 199]. И совмещенные аппаратно-программные системы, и протоколы компьютерной безопасности обычно моделируются как асинхронные системы. Методы редукции частичных порядков [126,139, 209, 244] показали свою эффективность при вериифкации асинхронных систем, наподобие коммуникационных протоколов. Мы полагаем, что эти методы также окажутся эффективными и для этих новых приложений. Много работ в настоящее время посвящено методам верификации параллельных систем реального времени [134]. Такие системы особенно трудно верифицировать, поскольку их корректность зависит от действительных моментов времени, в которые происходят события. Верификаторы, основанные на семантике дискретного времени, уже показали свою пригодность; например, они были применены для проверки свойств шины PCI [53]. Похоже, что эти методы можно расширить также и для проведения анализа производительности, например для вычисления наибольшей и наименьшей задержки между двумя заданными событиями. Методы, основанные на непрерывном времени, снискали репутацию вычислительно сложных, но последние работы наводят на мысль о том, что эти методы также имеют перспектву (см. [10]). Все еще неясно, какая семантика в конце концов подтвердит свою практичность, но, вероятно, обе они отыщут свое место. Как было показано Берчем [41], эти две семантики в действительности могут быть взаимосвязаны, поэтому, вероятно, можно будет осмысливать систему в терминах той из семантик, которая представляется наиболее естественной, а затем применять либо дискретный, либо непрерывный алгоритм верификации. Другие возможные направления исследований затрагивают применение менее точных, но потенциально более быстрых алгоритмов. Например, при проверке интерфейсных временных ограничений, которые не касаются многих сложных зависимостей между состояниями, можно применять более эффективные методы (см. [192]). Другой замысел состоит в том, чтобы попробывать сочетать алгоритмы статического временнбго анализа [204] и методы обследования пространства состояний в попытке отыскать нарушение временных ограничений. В гл. 15 мы показали, как применять индукцию к системам, которые можно описать контекстно-свободными графовыми грамматиками. Однако многие важные топологии, такие как квадратные
376 Глава 18. Заключение ячейки или произвольные двухточечные или арендуемые сети, не относятся к этой категории. Поэтому такие схемы, как Масштабируемый Когерентный Интерфейс или протокол SCI (стандарт ШЕЕ 1596-1992), в настоящее время не поддаются индуктивной верификации на основе методов проверки на модели. Не исключено, что подход на основе сетевых грамматик можно распространить и на более выразительные типы грамматик. Другое направление исследований — это вероятностная верификация [14, 15, 85]. Ведь можно говорить не только о том, что в системе возможен отказ, но также и о том, какова вероятность того, что отказ случится. Если провести такой анализ, отказы с ничтожно малой вероятностью осуществления можно было бы спокойно игнорировать. Анализ такого рода можно было бы также применять для оценки среднего периода времени между отказами системы. В настоящее время символьная верификация моделей используется для установления корректности системы и вычисления таких мер производительности, как планируемость, время отклика и загрузка системы. Можно развивать существующие инструментальные средства верификации моделей, с тем чтобы вычислять меры надежности системы, как то среднее время для отказа, устойчивой работы, доступности, минимального и максимального наблюдаемого времени для сбоя, задавая проценты отказа для компонентов системы. Конечной целью является создание единой среды проектирования, которая позволяющей пользователю получать оценки производительности и надежности на ранних стадиях проектирования. И наконец, мы полагаем важным изучение того, как методы верификации моделей можно сочетать с доказательством теорем. Мы предполагаем, что и верифкаторы моделей, и системы доказательства теорем будут необходимы для установления корректности сложных схем. Процедуры доказательства теорем необходимы, по- видимому, для анализа тех фрагментов сложного микропроцессора, наподобие блока арифметических операций с плавающей точкой, которые требуют сравнительно глубоких математических знаний. С другой стороны, системы автоматического доказательства теорем вряд ли превзойдут в ближуйшем будущем методы верификации моделей при анализе сложных аппаратных контроллеров. Проблема в том, как совместить эти два очень разных стиля анализа в единых рамках так, чтобы пользователь мог плавно объединить результаты, полученные за счет каждого из них. Некоторая предварительная работа в этом направлении уже начата [24, 100,152,163, 220].
Литература 1. S. Aggarwal, R. P. Kurshan, and K. Sabnani. A calculus for protocol specification and validation. In H. Rudin and С. H. West, eds., Protocol Specification, Testing and Verification, North Holland, 1983, p. 19-34. 2. A. V. Aho, J. E. Hopcroft, and J. D. Uliman. The Design and Analysis of Computer Algorithms. Addison Wesley, 1974. 3. R. Alur. Timed automata. NATO ASI Summer School on Verification of Digital and Hybrid Systems, 1998. (Available at www.cis.upenn.edu/alur/Nato97.ps.gz.) 4. R. Alur, R. K. Brayton, et al. Partial-order reduction in symbolic state space explosion. In O. Grumberg, ed., 9th International Conference on Computer Aided Verification, LNCS, Springer, 1997, V. 1254, p. 340-351. 5. R. Alur and D. L. Dill. Automata-theoretic verification of real-time systems. In C. Heitmeyer and D. Mandrioli, eds., Formal Methods for Real-Time Computing, Wiley, 1996, p. 55-80. 6. R. Alur, T. A. Henzinger, eds. Proceedings of the 1996 Workshop of Computer-Aided Verification, LNCS, Springer, 1996, V. 1102. 7. R. Alur. Techniques for automatic verification of real-time systems. PhD thesis, Stanford University. 1991. 8. R. Alur, С Courcoubetis, and D. L. Dill. Model-checking for realtime systems. In Proceedings of the 5th Annual Symposium on Logic in Computer Science. IEEE Computer Society Press, 1990, p. 414-425. 9. R. Alur and D. L. Dill. A theory of timed automata. Theoretical Computer Science, V.126, N 2, p. 183-235. 10. R. Alur and R. P. Kurshan. Timing analysis in COSPAN. In R. Alur, T. A. Henzinger, and E. D. Sontag, eds., Hybrid Systems III: 24 Зак. 271
378 Глава 19. Литература Verification and Control, LNCS, Springer, 1995, V. 1066. p. 220- 231. 11. H. R. Andersen. Model checking and boolean graphs, In B. Krieg- Bruckner, ed., Proceedings of the Fourth European Symposium on Programming, LNCS, Springer, 1992, V. 582, p. 1-19. 12. K. Apt and D. Kozen, Limits for automatic verification of finite- state systems, IPL, V. 15, p. 307-309. 13. A. Aziz, V. Singhal, F. Balarin, R. K. Brayton, and A. L. Sangiovanni-Vincentelli. Equivalences for fair Kripke structures. In Proceedings of the 21st International Colloquium on Automata. Languages and Programming, LNCS, Springer. 1994, V. 820, p. 364-375. 14. A. Aziz, V. Singhal, F. Balarin, R. K. Brayton, and A. L. Sangiovanni-Vincentelli. It usually works: The temporal logic of stochastic systems. In Wolper [249], p. 155-166. 15. C. Baier, С Clarke, V. Hartonas-Garmhausen, M. Kwiatkowska, and M. Ryan. Symbolic model checking for probabilistic processes. In P. Degano, R. Gorrieri, and A. Marchetti-Spaccamela, eds., 24th International Colloquium on Automata, Languages, and Programming (ICALP'97), LNCS, Springer. 1997, V. 1256, p. 43(M40. 16. F. Balarin and A. Sangiovanni-Vincentelli. On the automatic computation of network invariants. In Dill [97]. p. 235-246. 17. F. Balarin and A. L. Sangiovanni-Vincentelli. An iterative approach to language containment. In Courcoubetis [83], p. 29- 40. 18. D. L. Beatty, R. E. Bryant, and C-J. Seger, Formal hardware verification by symbolic ternary trajectory evaluation. In Proceedings of the 28th ACM/IEEE Design Automation Conference, IEEE Computer Society Press. 1991. 19. M. Ben-Ari, Z. Manna, and A. Pnueli, The temporal logic of branching time. Acta Informatica, 1983, V. 20, p. 207-226.
379 20. S. Bensalem, A. Bouajjani, C. Loiseaux, and J. Sifakis, Property preserving simulations. In von Bochmann and Probst [243], p. 260- 273. 21. W. Bernard and P. Wolper. Partial-order methods for model checking: From linear time to branching time. In 11th Annual IEEE Symposium on Logic in Computer Science, IEEE Computer Society. 1996, p. 294-303. 22. W. Bernholtz, M. Y. Vardi, and P. Wolper. An automata theoretic approach to branching time model checking. In Dill [97], p. 142- 155. 23. C. Berthet, O. Coudert, and J. C. Madre. New ideas on symbolic manipulations of finite state machines, In IEEE International Conference on Computer Design, 1990. 24. N. Bjorner, et al. Step: The Stanford Temporal prover-user's manual. Technical Report STAN-CS-TR-95-1562, Department of Computer Science, Stanford University, November 1995. 25. G. von Bochmann. Hardware specification with temporal logic. An example. IEEE Transactions on Computers, C-31 C). 26. S. Bose and A. L. Fisher. Automatic verification of synchronous circuits using symbolic logic simulation and temporal logic. In L. Claesen, ed., Proceedings of the IMEC-IFIP International Workshop on Applied Formal Methods for Correct VLSI Design, 1989. 27. K. S. Brace, R. L. Rudell, and R. E. Bryant. Efficient implementation of a BDD package. In Proceedings of the 27th ACM/IEEE Design Automation Conference, IEEE Computer Society Press. 1990. 28. M. C. Browne and E. M. Clarke. SML: A high level language for the design and verification of finite state machines. In IFIP WG 10.2 Working Conference from HDL Descriptions to Guaranteed Cozzect Circuit Designs, 1FDP, 1987, p. 269-292, 29. M. С Browne, E. M. Clarke, and D. Dill. Checking the correctness of sequential circuits. In Proceedings of the 1985 International Conference on Computer Design, IEEE, 1985, p. 545-548. >4*
380 Глава 19. Литература 30. М. С. Browne, Е. М. Clarke, and D. L. Dill. Automatic circuit verification using temporal logic: Two new examples. In G. J. Milne and P. A. Subrahmanyarn6 eds., Formal Aspects of VLSI Design, Eisevier, 1986. 31. M. С Browne, E. M. Clarke, D. L. Dill, and B. Mishra. Automatic verificalion of sequential circuits using temporal logic. IEEE Transactions on Computers, C-35A2), p. 1035-1044. 32. M. C. Browne, E. M. Clarke, and O. Grumberg. Characterizing finite Kripke structures in propositional temporal logic. Theortical Computer Science, V. 59, JVU-2, p. 115-131. 33. M. C. Browne, E. M. Clarke, and 0. Grumberg. Reasoning about networks with many identical finite-state processes. Information and Computation, V. 81, №1, p. 13-31. 34. R. E. Bryant. Graph-based algorithms for boolean function manipulation. IEEE Transactions on Computers, C-35(8), p. 677- 691. 35. R. E. Bryant. On the complexity of VLSI implememations and graph representations of boolean functions with application to integer multiplication. IEEE Transactions on Computers, V. 40, N 2, p. 205-213. 36. R. E. Bryant. Symbolic boolean manipulation with ordered binary decision diagrams. ACM Computing Surveys, V. 24, Л*3, p. 293- 318. 37. R. E. Bryant and C-J. Seger. Formal verification of digital circuits using symbolic ternary system models. In Clarke and Kurshan [71], p. 33-43. 38. J. A. Brzozowski and С J. H. Seger. Advances in asynchronous circuit theory. Part П: Bounded inertial delay models, MOS circuits, design techniques. Bulletin of the European Association for Theoretical Computer Science, V. 43, Л*3, p. 199-263. 39. J. R. Biichi. On a decision method in restricted second order arithmetic. In Proceedings of the International Congress on Logic, Methodology and Philosophy of Science, Stanford Universily Press, 1960, p. 1-11.
381 40. J. Burch and D. L. Dill. Automalic verification of pipelined microprocessor control. In Dill [97], p. 68-81. 41. J. R. Burch. Trace Algebra for Automatic Verification of Real- Time Concurrent Systems, PhD thesis Carnegie Mellon University, 1992. 42. J. R. Burch, E. M. Clarke, and D. E. Long. Representing circuits more efficiently in symbolic model checking. In Proceedings of the 28th ACM/IEEE Design Automation Conference, IEEE, 1991, p. 403-407. 43. J. R. Burch, E. M. Clarke, and D. E. Long. Symbolic model checking with partitioned transition relations. In A. Halaas and P. B. Denyer, eds., Proceedings of the 1991 International Conference on VLSI, 1991, p. 49-58. 44. J. R. Burch, E. M. Clarke, D. E. Long, K. L. McMillan, and D. L. Dill. Symbolic model checking for sequential circuil verification. IEEE Transactions on Computer-Aided Design of Integrated Circuits, V. 13, Л>4, p. 401-424. 45. J. R. Burch, E. M. Clarke, K. L. McMillan, and D. L. Dill. Sequential circuit verification using symbolic model checking. In Proceedings of the 27th ACM/IEEE Design Automation Conference, IEEE, 1990, p. 46-58. 46. J. R. Burch, E. M. Clarke, K. L. McMillan. D. L. Dill, and L. J. Hwang. Symbolic model checking: 1020 states and beyond. Information and Computation, V. 98, №2, p. 142-170. 47. M. Burrow, M. Abadi, and R. M. Needham. A logic of authentication. A CM Transactions on Computer Systems, V. 8, J4*l, p. 18-36. 48. R. M. Burstall. Program proving as hand simulation with a little induction, bi IFIP Congress Ц, North Holland, 1974, p. 308-312. 49. S. V. Campos. A Quantitative Approach to the Formal Verification of Real-Time System. PhD thesis, Carnegie Mellon University, 1996.
382 Глава 19. Литература 50. S. V. Campos and Е. М. Clarke. Real-time symbolic model checking for discrete time models. In First AMAST Intenational Workshop in Real-Time Systems, Springer, 1993. 51. S. V. Campos, E. M. Clarke, W. Marrero, and M. Minea. Verus: a tool for quantitative analysis of finite-state real-time systems. In ACM Workshop on Languages Compilers and Tools for Real-Time Systems, 1995. 52. S. V. Campos. E. M. Clarke, W. Marrero, M. Minea, and H. Hiraishi. Computing quantitative characteristics of finite state real-time systems In Real-Time Systems Symposium, IEEE, 1994. 53. S. V. Campos, E. M. Clarke, and M. Minea. Verifying the performance of the PCI local bus using symbolic techniques. In Proceedings of the IEEE International Conference on Computer Design, IEEE, 1995, p. 73-79. 54. M. Chiodo. T. R. Shiple, A. L. Sangiovanni-Vincentelli, and R. K. Brayton. Automatic compositional minimization in CTL model checking. In ICCAD98 [146], p. 172-178. 55. C-T. Chou and D. Peled. Verifying a model-checking algorithm. In Tools and Algorithms for the Construction and Analysis of Systems, Spnnger, 1996, p. 241-257. 56. L. Claesen. ed. Proceedings of the 11th International Symposium on Computing Hardware Description Languages and their Applications, North Holland, 1993. 57. D. Clarke, H. Ben-Abdallah, I. Lee, H. Xie. and O. Sokolsky. XVERSA: an integrated graphical and textual toolset for the specification and analysis of resource-bound real-time systems. In Computer-Aided Verification, Springer, 1996, p. 402-405. 58. E. Clarke, R. Enders. T. Filkorn, and S. Jha. Exploiting symmetry in temporal logic model checking. Formal Methods in System Design, V. 9, p. 77-104. 59. E. M. Clarke and I. A. Draghicescu. Expressibility results for linear lime and branching time logics. In Linear Time, Branching Time, and Partial Order in Logics and Models for Concurrency, LNCS, Springer, 1988, V. 354, p. 428-437.
383 60. Е. М. Clarke, I. A. Draghicescu, and R. P. Kurshan. A unified approach for showing language containment and equivalence between various types of ш-automata. In A. Arnold and N. D. Jones, eds.. Proceedings of the 15th Colloquium on Trees in Algebra and Programming, LNCS, Springer, 1990, V. 407, p. 103-116. 61. J. E. M. Clarke and E. A. Emerson. Design and synthesis of synchronization skeletons using branching time temporal logic. In Logic of Programs: Workshop, Yorktovm Heights, NY, May 1981, Springer, 1981, LNCS, V. 131. 62. E. M. Clarke, E. A. Emerson, and A. P. Sistla. Automatic verification of finite-state concurrent systems using temporal logic specifications. In Proceedings of the 10th Annual ACM Symposium on Principles of Programming Language, January 1983. 63. E. M. Clarke, E. A. Emerson, and A. P. Sistla. Automatic verification of finite-state concurrent systems using temporal logic specificalions. ACM Transactions on Programming Languages and Systems, V. 8, Л» 2, p. 244-263. 64. E. M. Clarke, T. Filkorn, and S. Jha. Exploiting symmetry in temporal logic model checking. In Courcoubetis [83], p. 450-462. 65. E. M. Clarke, O. Grumberg, and H. Hamaguchi. Another look at LTL model checking. Formal Methods in System Design, V. 10, Л* 1, p. 47-71. 66. E. M. Clarke, O. Grumberg. H. Hiraishi, S. Jha, O. E. Long, K. L. McMillan, and L. A. Ness. Verification of the Futurebus+ cache coherence protocol. In Claesen [56]. 67. E. M. Clarke, O. Grumberg, and S. Jha. Parametrized networks. In S. Smolka and I. Lee. eds., Proceedings of the 6th International Conference on Concurrency Theory, LNCS, Springer, 1995, V. 962, p. 395-407. 68. E. M. Clarke, O. Grumberg, and S. Jha. Verifying parametrized networks. ACM Transactions on Programming Languages and Systems (TOPLAS), V. 19, J05, p.726-750. 69. E. M. Clarke, O. Grumberg, and О. E. Long. Model checking and abstraction. ACM Transactions on Programming Languages and Systems, V. 16, №5, p. 1512-1542.
384 Глава 19. Литература 70. Е. М. Clarke, S. Jha, and W. Marrero. Using state space exploration and a natural deduction style message derivation engine to verify security protocols. In Proceedings of the IFIP Working Conference on Programming Concepts and Methods (PROCOMET), 1998. 71. E. M. Clarke and R. P. Kurshan, eds. Workshop on Computer- Aided Verification. 2nd International Conference. CAV'90. Proceedings, LNCS, Springer, 1990, V. 531. 72. E. M. Clarke, O. E. Long, and K. L. McMillan. A language for compositional specification and verification of finite state hardware controllers. In J. A. Derringer and P. J. Rammig, eds.. Proceedings of the 9th International Symposium on Computer Hardware Description Languages and Their Applications, North Holland, 1989, p. 281-295. 73. R. Cleaveland, M. Klein, and B. Steffen. Faster model checking for the modal mu-calculus. In V. Bochmann and Probst [243], p. 410- 422. 74. R. Cleaveland and B. Steffen. A linear-time model-checking algorithm for the alternation-free modal mu-calculus. Formal Methods in System Design, V. 2, №2, p. 121-147. 75. R. W. Cleaveland. Tableau-based model checking in the propositional mu-calculus. Acta Informatica, V. 27, p. 725-747. 76. R. W. Cleaveland, P. Lewis, S. Smolka, and O. Sokolsky. The concurrency factory: a development environment for concurrent systems. In Alur and Henzinger [6], p. 398-401. 77. R. W. Cleaveland, J. Parrow, and B. Steffen. The concurrency workbench. In Sifakis [231], p. 24-37. 78. R. W. Cleaveland and S. Sims. The NCSU concurrency workbench. In Alur and Henzinger [6], p. 394-397. 79. P. Clements, C. Heitmeyer. G. Labaw, and A. Rose. MT: a toolset for specifying and analyzing real-time systems. In IEEE Real-Time Systems Symposium, 1993. 80. T. H. Corman, C. E. Leiserson, and R. L. Rivest. Introduction to Algorithms. McGraw Hill, 1989.
385 81. О. Coudert, С. Berthet. and J. С. Madre. Verification of synchronous sequential machines based on symbolic execution. In Sifakis [231], p. 365-373. 82. O. Coudert, J. C. Madre, and C. Berthet. Verifying temporal properties of sequential machines without building their state diagrams. In Clarke and Kurshan [71], p. 23-32. 83. C. Courcoubetis, ed. Proceedings of the 5th Workshop on Computer-Aided Verification. June/July 1993. 84. C. Courcoubetis, M. Y. Vardi, P. Wolper, and M. Yannakakis. Memory efficient algorithms for the verification of temporal properties. Formed Methods in System Design, V. 1, p. 275-288. 85. C. Courcoubetis and M. Yannakakis. The complexity of probablistic verification. Journal of the ACM, V. 42, N 4, p. 857- 907. 86. P. Cousot and R. Cousot. Abstract interpretation: A unified lattice model for static analysis of programs by construction of approximation of fixpoints. In Proceedings of the 4th Annual ACM Symposium on Principles of Programming Language. January 1977, p. 238-252. 87. P. Cousot and R. Cousot. Systematic design of program analysis frameworks. In Proceedings of the 6th Annual ACM Symposium on Principles of Programming Language. January 1979, p. 269-282. 88. O. Cyrluk and P. Narendran. Ground temporal logic: A logic for hardware verification. In Dill [97]. p. 247-259. 89. D. Dams. Abstract Interpretation and Partition Refinement for Model Checking. PhD thesis. Technical University of Eindhoven. Eindhoven. 1995. 90. D. Dams, R. Gerth, and O. Grumberg. Generation of reduced models for checking fragments of CTL. In 5th Conference on Computer-Aided Verification. LNCS, Springer, 1993, V. 697, p. 479-490.
386 Глава 19. Литература 91. D. Dams, R. Gerth, and 0. Grumberg. Abstract interpretation of reactive systems. ACM Transactions on Programming Languages and Systems (TOPLAS), V. 19, №2, p. 253-291. 92. С Daws, A. Olivero, S. Tripakis, and S. Yovine. The tool KRONOS. In Hybrid Systems III: Verification and Control, LNCS, Springer, 1996, V. 1066, p. 208-219. 93. C. Daws and S. Yovine. Two examples of verification of multirate timed automata with KRONOS. In Proceedings of the 16th Real- Time Systems Symposium. IEEE Computer Society Press, 1995, p. 66-75. 94. J. W. de Bakker, W. P. de Roever, and G. Rozenberg. eds. Proceedings of the REX Workshop on Stepwise Refinement of Distributed Systems, Models, Formalisms, Correctness. LNCS, Springer, 1989, V. 430. 95. E. W. Dijkstra. Guarded commands, nondeterminacy and formal derivation of programs. Communications of the ACM, V. 18, N 8, p. 453-457. 96. D. L. Dill. Trace Theory for Automatic Hierarchical Venfication of Speed-Independent Circuits. ACM Distinguished Dissertations. MIT Press, 1989. 97. D. L. Dill. ed. Proceedings of the 1994 Workshop on Computer- Aided Venfication. LNCS, Springer, 1994, V. 818. 98. D. L. Dill and E. M. Clarke. Automatic verification of asynchronous circuits using temporal logic. IEEE Proceedings, part E, 1986, V. 133, N 5. 99. D. L. Dill. Timing assumptions and verification of finite- state concurrent systems. In J. Sifakis. ed.. Proceedings of the International Workshop on Automatic Venfication Methods for Finite State Systems. LNCS, Springer, 1989, V. 407, p. 197-212. 100. J. Dingel and T. Filkorn. Model checking for infinite state systems using data abstraction, assumption commitment style reasoning and theorem proving. In Wolper [249]. p. 54-69. 101. P. Dixon. Multilevel cache architectures. Minutes of the Futurebus+ Working Group Meeting. December 1988.
387 102. D. Dolev, M. Klawe, and M. Rodeh. An 0(n log n) unidirectional distributed algorithm for extrema finding in a circle. Journal of Algorithms, V. 3, p. 245-260. 103. E. A. Emerson. Branching Time Temporal Logic and the Design of Correct Concurrent Programs. PhD thesis, Harvard University, 1981. 104. E. A. Emerson and E. M. Clarke. Characterizing correctness properties of parallel programs using fixpoints, In Automata, Languages and Programming LNCS, Springer, 1980, V. 85, p. 161- 181. 105. E. A. Emerson and J. Y. Halpern. "Sometimes"and "Not Never"re- visited: On branching time versus linear time. Journal of the ACM, V. 33, p. 151-178. 106. E. A. Einerson and C-L. Lei. Modalities for model checking: Branching time strikes back. In 12th Symposium on Principles of Programming Languages, New Orleans. La., ACM Press, January 1985, p. 84-96. 107. E. A. Emerson and C-L. Lei. Efficient mode] checking in fragments of the prepositional mu-calculus. L1CS [174], 1986, p. 267-278. 108. E. A. Emerson, А. К. Мок, A. P. Sistla, and J. Srinivasen. Quantitative temporal reasoning. In Clarke and Kurshan [71]. p. 136-145. 109. E. A. Emerson and K. S. Namjoshi. Reasoning about rings. In Proceedings of the 22nd ACM Symposium on Principles of Programming Languages. ACM Press, 1995, p. 85-94. 110. E. A. Emerson and K. S. Namjoshi. Automated verification of parameterized synchronous systems. In Ahir and Henzinger [6], p. 87-98. 111. E. A. Emerson and A. P. Sistla. Symmetry and model checking, In Courcoubetis [83], p. 463-478. 112. E. A. Emerson, С S. Jutla, and A. P. Sistla. On model-checking for fragments of mu-calculus. In Courcoubetis [83], p. 385-396.
388 Глава 19. Литература 113. J. С. Fernandez, С. Jard, Т. Jeron, and a. Viho. Using on-the-fly verification techniques for the generation of test suites. In Alur and Henzinger [6], p. 348-359. 114. R. W. Floyd. Assigning meaning to programs. In J. T. Schwartz, ed., Mathematical Aspects of Computer Science, American Mathematical Society, 1967, p.19-32. 115. N. Francez. The Analysis of Cyclic Programs. PhD thesis, The Weizmann Institute of Science, 1976. 116. N. Francez. Fairness. Springer, 1986. 117. A. N. Fredette and R. W. Cleaveland. RTSL: a language for real-time schedulability analysis. In IEEE Real-Time Systems Symposium. IEEE Computer Society Press, 1993. 118. M. Fujita, H. Fujisawa, and N. Kawato. Evaluation and improvements of boolean comparison method based oo binary decision diagrams. In Proceedings of the IEEE International Conference on Computer Aided Design. IEEE Computer Society Press, 1988. 119. M. Fujita, H. Tanaka, and T. Moto-oka. Logic design assistance with temporal logic. In Proceedings of the IFIP WG10.2 International Conference on Hardware Description Languages and their Applications. 1985. 120. D. Gabbay, A. Pnueli, S. Shelah, and J. Stavi. On the temporal analysis of fairness. In Proceedings ofthe 7th ACM Symposium on Principles of Programming Languages, ACM, 1980, p. 163-173. 121. M. R. Garey and D. S. Johnson. Computers and Intractability: A Guide to the Theory of NP-Completeness. W. H. Freeman, 1979. 122. R. Gerber and I. Lee. A proof system for communicating shared resources. In IEEE Real-Time Systems Symposium. IEEE Computer Society Press, 1990. 123. S. M. German and A. P. Sistla. Reasoning about systems with many processes. Journal of the ACM, V. 39, p. 675-735.
389 124. R. Gerth, D. Peled, M. У. Vardi, and P. Wolper. Simple on-the- fly automatic verification of linear temporal logic. In Protocol Specification Testing and Verification, Chapman & Hall, 1995, p. 3-18 125. P. Godefroid. Using partial orders to improve automatic verification methods. In Proceedings of the 2nd Workshop on Computer-Aided Verification, LNCS, Springer, 1990, V. 531, p. 176-185. 126. P. Godefroid and D. Pirottin. Refining dependencies improves partial-order verification methods. In Proceedings ofthe 5th Conference on Computer-Aided Verification, LNCS, 697, p. 438- 449. Springer, 1993. 127. S. Graf. Verification of a distributed cache memory by using abstractions. In Dill [97], p. 207- 219. 128. S. Graf and B. Steffen. Compositional minimization of finite state processes. In Clarke and Kurshan [71], p. 186-196. 129. O. Grumberg and D. E. Long. Model checking and modular verification. ACM Transactions on Programming Languages and Systems, V. 16, p. 843-872. 130. N. Halbwachs, Y. E. Proy, and P. Roumanoff. Verification of realtime systems using linear relation analysis. Formal Methods in System Design, V. 11, №2, p. 157-185. 131. M. G. Harbour, M. H. Klein, and J. P. Lehoczky. Timing analysis for fixed-priority scheduling of hard real-time systems. IEEE Transactions on Software Engineering, V. 20, №1, p. 13-28. 132. R. Hardin, Z. Har'El, and R. P. Kurshan. COSPAN. In Alur and Henzinger [6], p. 423-427. 133. Z. Har'El and R. P. Kurshan. Software for analytical development of communications protocols. AT&T Technical Journal, V. 69, N 1, p. 45-59. 134. С Heitmeyer and D. Mandrioli. Formal Methods for Real-Time Computing. Wiley, 1996.
390 Глава 19. Литература 135. Т. A. Henzinger, X. Nicollin, J. Sifakis, and S. Yovine. Symbolic model checking for real-time systems. Information and Computation, V. 3, №2, p. 193-244. 136. C. A. R. Hoare. An axiomatic approach to computer programming. Communications of the ACM, V. 12, ЛП0, p. 322-329. 137. C. A. R. Hoare. Communicating Sequential Processes. Prentice Hall. 1985. 138. G. J. Holzmann. Design and Validation of Computer Protocols. Prentice Hall. 1991. 139. G. J. Holzmann and O. Peled. An improvement in formal verification. In Formal Description Techniques, 1994, Chapman & Hall. 1994, p. 197-211. 140. G. J. Holzmann aad O. Peled. The state of spin. In CA V'96: 8th International Conference on Computer Aided Verification. LNCS, Springer. 1996, V. 1102, p. 385-389. 141. G. J. Holzmann. O. Peled. and M. Yannakakis. On nested depth first search. In 2nd SPIN Workshop. AMS. 1996, p. 23-32. 142. J. E. Hopcroft and J. O. UUman. Introduction to Automata Theory. Languages, and Computation. Addison Wesley. 1979. 143. P. Huber. A. Jensen. L. Jepsen. and K. Jensen. Towards reachability; trees for high-level Petri nets. In G. Rozenberg. ed.. Advances on Petri Nets, 1984, p. 215-233. 144. G. E. Hughes and M. J. Creswell. Introduction to Modal Logic. Methuen. 1977. 145. IEEE Computer Society. 1992 Proceedings of the IEEE International Conference on Computer Aided Design. IEEE Computer Society Press. 1992. 146. IEEE Computer Society. IEEE Standard for Futurebus+ - Logical Protocol Specification. IEEE Computer Socity Press. 1992. IEEE Standard 896.1-1991. 147. C. W. Ip and O. L. Dill. Better verification through symmetry. In Claesen [56].
391 148. О. Jackson. Abstract model checking of infinite specifications. In Proceedings of Formal Methods Europe. Barcelona, Oct. 1994. 149. С. B. Jones. Specification and design of (parallel) programs. In Proceedings of IFIP'83, North-Holland, 1983, p. 321-332. 150. B. Josko. Verifying the correctness of AADL-modules using model checking. In de Bakker et al. [94]. 151. J. J. Joyce and C-J. H. Seger. Linking BDD-based symbolic evaluation to interactive theorem proving. In Proceedings of the 30th Design Automation Conference. Association for Computing Machinery, 1993. 152. S. Katz and O. Peled. An efficient verification method for parallel and distributed programs. In Workshop on Linear Time, Branching Time and Partial Order in Logics and Models for Concurrency. LNCS, Springer, 1988, V. 354, p. 489-507. 153. B. W. Keraighan and O. M. Ritchie. The С Programming Language. Prentice Hall, 1978. 154. Y. Kesten, O. Maler, M. Marcus, A. Pnueli, and E. Shahar. Symbolic model checking with rich assertional laguages. In 0. Grumberg. ed.. 9th International Conference on Computer Aided Verification (CA V'97). LNCS, Springer, 1997, V. 1254, p. 424-435. 155. K. Keutzer. Hardware-software co-design and ESDA. In Proceedings of the 31th Design Automation Conference. June 1994, p. 435-436. 156. O. Kozen. Results oo the propositional mu-calculus. Theoretical Computer Science, V. 27, p. 333-354. 157. P. Kroger. LAR: A logic of algorithmic reasoning. Acta Infonnatica, V. 8, №3. 158. O. Kupferman and M. Y. Vardi. Verification of fair transition systems. In Alur and Henzinger [6], p. 372-382. 159. R. P. Kurshan. Analysis of discrete event coordination. In de Bakker et al. [94], pp. 414-453.
392 Глава 19. Литература 160. R. P. Kurshan. Computer-Aided Verification of Coordinating Processes: The Automata-Theoretic Approach, Princeton University Press, 1994, p. 170-174. 161. R. P. Kurshan and L. Lamport. Verification of a multiplier: 64 bits and beyond. In Courcoubetis [83], p. 166-180. 162. R. P. Kurshan, Y. Levin, M. Minea, O. Pejed, and H. Yenigun. Static partial order reduction. In Tools and Algorithms for the Construction and Analysis of Systems. LNCS, Springer, 1998, V. 1384, p. 345-357. 163. R. P. Kurshan and K. L. McMillan. A structural induction theorem for processes. In Proceedings of the 8th Annual ACM Symposium on Principles of Distributed Computing. ACM, 1989, p. 239-247. 164. L. Lamport, "Sometimes"is sometimes "Not Never". In Annual ACM Symposium on Principles of Programming Language. ACM, 1980, p. 174-185. 165. L. Lamport. What good is temporal logic. In Information Processing 83. Elsevier, 1983, p. 657-668. 166. K. G. Larsen. Modal specifications. In Sifakis [231], p. 232-246. 167. K. G. Larsen. Efficient local correctness checking. In v. Bochmann and Probst [243], p. 30-43. 168. K. G. Larsen, P. Pettersson, and W. Yi. Compositional and symbolic model-checking of real-time systems. In Proceedings of the 16th Real-Time Systems Symposium. IEEE Computer Society Press, 1995, p. 76-87. 169. J. P. Lehoczky. Fixed priority scheduling of periodic task sets with arbitrary deadlines. In IEEE Real-Time Systems Symposium. IEEE Computer Society Press, 1990. 170. J. P. Lehoczky, L. Sha, J. K. Strosnider, and H. Tokuda. Fixed priority scheduling theory for hard real-time systems. In Foundations of Real-Time Computing-Scheduling and Resource Management. Kluwer Academic, 1991.
393 171. О. Lichtenstein and A. Pnueli. Checking that finite state concurrent programs satisfy their linear specification. In Proceedings of the 12th Annual ACM Symposium on Principles of Programming Language. ACM, 1985, p. 97-107. 172. Proceedings of the 1st Annual Symposium on Logic in Computer Science. IEEE Computer Society Press, 1986. 173. B. Lin and A. R. Newton. Efficient symbolic manipulation of equivalence relations and classes. In Proceedings of the 1991 International Workshop on Formal Methods in VLSI Design. January 1991, p. 46-61. 174. C. L. Liu and J. W. Layland. Scheduling algorithms for multiprogramming in a hard real-time environment. Journal of the ACM, V. 20, ЛН, p. 46-61. 175. C. O. Locke, O. R. Vogel, and T. J. Mesler. Building a predictable avionics platform in Ada: a case study. In IEEE Real-Time Systems Symposium. IEEE Computer Socity Press, 1991. 176. 0. Long, A. Browne, E. Clarke, S. Jha, and W. Marrero. An improved algorithm for the evaluation of fixpoint expressions. In Dill [97], p. 338-350. 177. О. E. Long. Model Checking, Abstraction, and Compositional Reasoning. PhD thesis, Carnegie Mellon University, 1993. 178. O. Lowe. Breaking and fixing the Needham-Schroeder public-key protocol using FDR. In Tools and Algorithms for the Construction and Analysis of Systems, LNCS, Springer, 1996, V. 1055, p. 147- 166. 179. E. Macii, B. Plessier, and F. Somenzi. Verification of systems containing counters. In ICCAD92 [146], p. 179-182. 180. S. MacLane and O. Birkhoff. Algebra. MacMillan, 1968. 181. A. Mader. Tableau recycling. In v. Bochmann and Probst [243]. p. 330-342. 182. Y. Malachi and S. S. Owicki. Temporal specifications of self-timed systems. In H. T. Kung, B. Sproull, and O. Steele, eds.. VLSJ Systems and Computations. Computer Science Press, 1981.
394 Глава 19. Литература 183. S. Malik, A. Wang, R. Brayton, and A. Sangiovanni-Vincenteli. Logic verification using binary decision diagrams in a logic synthesis environment. In International Conference on Computer- Aided Design. 1988, p. 6-9. 184. Z. Manna and A. Pnueli. Temporal Verifications of Reactive Systems — Safety. Springer, 1995. 185. R. Marelly and O. Grumberg. GORMEL-Grammar ORiented ModEL checker. Technical Report 697. The Technion, October 1991. 186. W. Marrero, E. M. Clarke, and S. Jha. A model checker for authentication protocols. In Proceedings of the DIM ACS Wiorkshop on Design and Formal Verification of Security Protocols, 1997 187. A. J. Martin. The design of a self-timed circuit for distributed mutual exclusion. In H. Fuchs, ed., Proceedings of the 1985 Chapel Hill Conference on VLSI, 1985. 188. K. L. McMillan. Using unfolding to avoid the state explosion problem in the verification of asynchronous circuits. In v. Bochmann and Probst [243], p. 164-177. 189. K. L. McMillan. Symbolic Model Checking: An Approach to the State Explosion Problem. Kluwer Academic, 1993. 190. K. L. McMillan and D.L. Dill. Algorithms for interface timing verification. In ICCAD92 [146], p. 48-51. 191. C. Meadows. A model of computation for the NRL protocol analyzer. In Proceedings of the 1994 Computer Security Foundations Workshop. IEEE Computer Society Press, 1994. 192. J. Millen. Tbe Interrogator model. In Proceedings of the 1995 IEEE Symposium on Security and Privacy. IEEE Computer Society Press, 1995, p. 251-260. 193. R. Milner. An algebraic definition of simulation between programs. In Proceedings of the 2nd International Joint Conference on Artificial Intelligence, 1971, p. 481-489. 194. R. Milner. A Calculus of Communicating Systems. Springer, 1980.
395 195. В. Mishra and E.M. Clarke. Hierarchical verification of asynchronous circuits using temporal logic. Theoretical Computer Science, V. 38, p. 269-291. 196. J. Misra and К. M. Chandy. Proofs ofhetworks ofprocesses. IEEE Transactions on Software Engineering SE-7, N 4, p. 417-426. 197. J. С Mitchell, M. Mitchell, and U. Stem. Automated analysis of cryptographic protocols using mur^. In Proceedings of the 1997 IEEE Symposium on Security and Privacy. IEEE Computer Society Press, 1997. 198. E. P. Moore. Gedanken experiments on sequential machines. In Automata Studies. Princeton University Press, 1956. 199. A. Mycroft. Abstract Interpretation and Optimizing Transfomations for Applicative Programs. PhD thesis, University of Edinburgh, 1981. 200. G. J. Myers. The Art of Software Testing. Wiley, 1979. 201. P. Nielson. A denotational framework for data flow analysis. Acta Informatica, V. 18, p. 265-287. 202. J. K. Ousterhout. A switch-level timing verifier for digital MOS VLSI. IEEE Transactions on Computer-Aided Design, V. 4, №3, p. 336-349. 203. W. T. Overman. Verification of Concurrent Systems: Function and Timing. PhD thesis, University of California at Los Angeles, 1981. 204. R. Paige and R. E. Tarjan. Three efficient algorithms based on partition refinement. SIAM Journal on Computing, V. 16, №6, p. 973-989. 205. D. Park. Concurrency and automata on infinite sequences. In 5th Gl-Conference on Theoretical Computer Science, Springer, 1981, p. 167-183. 206. D. Peled. All from one, one for all: on model checking using representatives. In Courcoubetis [83], p. 409-423. 207. D. Peled. Combining partial order reductions with on-the-fly model-checking. In Dill [97], p. 377-390.
396 Глава 19. Литература 208. D. Peled. Verification for robust specification. In Elsa Gunter, ed., Conference on Theorem Proving in Higher Order Logic. Springer, 1997, p. 231-241. 209. D. Peled and T. Wilke. Stutter-invariant temporal properties are expressible without the nexttime operator. Information Processing Letters, 1997. 210. D. Peled, T. Wilke, and P. Wolper. An algorithmic approach for checking closure properties of w-regular languages. In CONCUR'96, 7th International Conference on Concurrency Theory, LNCS, Springer, 1996, V. 1119, p. 596-610. 211. C. Pixley. Introduction to a computational theory and implementation of sequential hardware equivalence. In Clarke and Kurshan [71], p. 54-64. 212. C. Pixley, G. Beihl, and E. Pacas-Skewes. Automatic derivation of FSM specification to implementation encoding. In Proceedings of the International Conference on Computer Design, Cambridge, MA, October 1991, p. 245-249. 213. С Pixley, S-W. Jeong, and G. O. Hachtel. Exact calculation of synchronization sequences based on binary decision diagrams. In Proceedings of the 29th Design Automation Conference, June 1992, p. 620-623. 214. A. Pnueli. The temporal logic of programs. In 18th IEEE Symposium on Foundation of Computer Science, IEEE Computer Society Press, 1977, p. 46-57. 215. A. Pnueli. A temporal logic of concurrent programs. Theoretical Computer Science, V. 13, p. 45-60. 216. A. Pnueli. In transition for global to modular temporal reasoning about programs. In K. R. Apt, ed., Logics and Models of Concurrent Systems, NATO ASI13, Springer, 1984. 217. J. P. Quielle and J. Sifakis. Specification and verification of concurrent systems in CESAR. In Proceedings of the 5th International Symposium on Programming, p. 337-350. 218. S. Rajan, N. Shankar and M. K. Srivas. An integration of model checking with automated proof checking. In Wolper [249], p. 84-97.
397 219. R. Rajkumar. Task Synchronization in Real-Time Systems. PhD thesis, Carnegie Mellon University, 1989. 220. T. G. Rokicki and C. J. Myers. Automatic verification of timed circuits. In Dill [97], p. 468-480. 221. A. W. Roscoe. Model-checking CSP. In A. W. Roscoe, ed., A Classical Mind: Essays in Honour of С A. R. Hoare, Prentice Hall, 1994, p. 353-378. 222. Y. Roy and R. de Simone. Auto/Autograph. In Clarke and Kurshan [71], p. 235-250. 223. R. Rudell. Dynamic variable ordering for ordered binary decision diagrams. In International Conference on Computer Aided Design, Santa Clara, Ca., November 1993. 224. S. Safra. On the complexity of omega-automata. In Proceedings of the 29th IEEE Symposium on Foundations of Computer Science, IEEE Computer Society, 1988, p. 319-327. 225. R. Schlor and W. Oamm. Specification and verification of system- level hardware designs using timing diagrams. In ED AC 93, 1993. 226. L. Sha, M. H. Klein, and J. B. Goodenough. Rate monotonic analysis for real-time systems. In Foundations of Real- Time Computing-Scheduling and Resource Management. Kluwer Academic, 1991. 227. Z. Shtadler and O. Grumberg. Network grammars, communication behaviors and automatic verification. In Sifakis [231], p. 157-165. 228. G. Shurek and O. Grumberg. The modular framework of computer- aided verification: Motivation, solutions and evaluation criteria. In Clarke and Kurshan [71], p. 214-223. 229. J. Sifakis, ed. Proceedings of the 1989 International Workshop on Automatic Verification Methods for Finite State Systems, LNCS, Springer, 1989, V. 407. 230. A. P. Sistla. Theoretical Issues in the Design and Verification of Distributed Systems. PhD thesis, Harvard University, 1983.
398 Глава 19. Литература 231. А. P. Sistla and Е. М. Clarke. Complexity of prepositional temporal logics. Journal of the ACM, V. 32, №3, p. 733-749. 232. A. P. Sistla, M. Y. Vardi, and P. Wolper. The complementation problem for Biichi automata with applications to temporal logic. Theoretical Computer Science, V. 49, p. 217-237. 233. R. H. Sloan and U. Buy. Stubborn sets for real-time Petri nets. Formal Methods in System Design, V. 11, №1, p. 23-40. 234. C. Stirling and D. J. Walker. Local model checking in the modal mu-calculus. Theoretical Computer Science, V. 89, №1, p. 161-177. 235. I. Suzuki. Proving properties of a ring of finite-state machines. IPL, V. 28, p. 213-214. 236. N. Suzuki, ed. Symbolic Computation Algorithms on Shared Memory Multiprocessors. MIT Press, 1992. 237. R. E. Tarjan. Depth first search and linear graph algorithms. SIAM Journal of Computing, V. 1, p. 146-160. 238. A. Tarski. A lattice-theoretical fixpoint theorem and its applications. Pacific Journal of Mathematics, V. 5, p. 285-309. 239. (TCAS) Minimum operational performance standards for traffic alert and collision avoidance system (TCAS) airborne equipment, V. II. Radio Technical Commission for Aeronautics, 1990. 240. J. D. Ullman. Computational Aspects of VLSI. Computer Science Press, 1984. 241. G. von Bochmann and D. K. Probst, eds. Workshop on Computer- Aided Verification. Fourth International Workshop, CAV'92. Proceedings, LNCS, Springer, 1992, V. 663. 242. A. Valmari. A stubborn attack oo state explosion. In Proceedings of the 2nd Workshop on Computer Aided Verification, LNCS, Springer, 1990, V. 531, p. 156-165. 243. M. Y. Vardi and P. Wolper. An automata-theoretic approach to automatic program verification. In LICS86 A74], p. 332-344. 244. P. D. Vigna and C. Ghezzi. Context-free graph grammars. Information and Computation, V. 37, p. 207-233.
399 245. G. Winskel. Model checking in the modal д-calculus. In Proc. of the 16th International Colloquium on Automata, Languages, and Programming, LNCS, Springer, 1989, V. 372, p. 761-772. 246. P. Wolper. Expressing interesting properties of programs in pro- positional temporal logic. In Proceedings of the 13th Annual ACM Symposium on Principles of Programming Language, 1986. 247. P. Wolper, ed. Proceedings of the 1995 Workshop on Computer- Aided Verification, LNCS, Springer, 1995, V. 939. 248. P. Wolper and V. Lovinfosse. Verifying properties of large sets of processes with network invariants. In SLfakis [231], p. 68-80. 249. J. Yang, A. Мок, and F. Wang. Symbolic model checking for event- driven real-time systems. In IEEE Real-Time Systems Symposium. IEEE Computer Society Press, 1993. 250. T. Yoneda and B. Schlingloff. Efficient verification of parallel realtime systems. Formal Meth. in Syst. Design, V. 11, №2, p. 197-215. 251. T. Yoneda, A. Shibayama, B. Schlingloff, and E. M. Clarke. Efficient verification of parallel real-time systems. In Courcoubetis [83], p. 321-332.
/u-исчисление (^-calculus), 141 ACTL (Универсальная CTL), 61, 244, 247, 254, 265 справедливая (fair ACTL), 254 ACTL* (Универсальная ACTL*), 61, 242, 244, 268, 274, 305 CTL, (Computation Tree Logic, Логика деревьев вычислений), 59, 64, 102, 154, 157, 234 CTL*, (Обобщенная логика деревьев вычислений), 56, 79, 239, 265, 274, 292, 306 DFS (Depth First Search, Поиск в глубину с возвратом), 182 Futurebus+ 162 ICTL* (Индексированная CTL*), 304 LTL (Linear Temporal Logic, Темпоральная логика линейного времени), 59, 72, 32, 128, 186, 227 LTL_x Темпоральная логика линейного времени без оператора сдвига по времени (nexttime), 204, 205 OBDD (Ordered Binary Decision Diagram, Упорядоченная двоичная разрешающая диаграмма), 29, 83, 85, 87, 102, 117, 128, 152, 282, 294, PROMELA (PROMELA language), 227 PSPACE-полнота (PSPACE-completeness), 195 RMS (Rate-Monotonic Scheduling, Монотонное расписание), 328 RTCTL (логика CTL реального времени), 331 SMV (Symbolic Model Verifier, Символьный верификатор моделей), 157 SPIN,227 Абстракция (Abstraction), 35, 240, 262, 265 данных (data abstraction), 262, 265
декартова произведения (product abstraction), 281 модели (of a structure), 240 одиночного бита (single bit abstraction), 281 символьная (symbolic), 282 состояния (of a state), 320 экзистенциальная (existential), 269 Автомат и/-автомат (ш-automaton), 172 Бюхи (Buchi automata), 174 Бюхи, обобщённый (Generalized Buchi automata), 181 включение языков (Language containment), 195 временнбй (Timed automaton), 344, 345 детерминированный (deterministic), 180 над бесконечными словами, (automaton over infinite words), 172 недетерминированные (nondeterministic), 180 пересечение и дополнение (intersection and complementation), 178 проверка пустоты (emptiness checking), 182 Автоморфизм (Automorphism), 287 Алгоритм (Algorithm) Apply (Apply algorithm), 89 анализа достижимости (reachability algorithm), 293 верификации моделей для CTL (CTL model checking algorithm), 64 верификации моделей для CTL* (CTL* model checking algorithm), 79 верификации моделей для LTL (LTL model checking algorithm), 72, 220 верификации моделей для /i-исчислени (model checking algorithm for the /i-calculus), 146 выбора лидера (leader election algorithm), 228 вычисления максимальной задержки (maximum delay algorithm), 333 вычисления минимальной задержки (minimum delay algorithm), 332 вычисления наибольшей бисимуляции (for computing the largest bisimulatioa), 245 вычисления пересечения (for computing intersection), 180 глобальный (global), 141 двойного поиска в глубину с возвратом, DFS (double depth first search algorithm), 182
жадный (greedy), 124 квазипорядка (preorder algorithm), 244 количественного анализа (quantitative algorithm), 336 кольца с маркерами (token-ring algorithm), 288 Лихтенштейн-Пнуели (Lichtenstein-Pnueli algorithm), 77 локальный (local), 141 подсчета условий (condition counting algorithm), 336 поиска в глубину с редукцией частичных порядков (depth-first search with partial order reduction), 200 символьная верификация моделей для CTL (CTL symbolic model checking algorithm), 103 символьной верификации моделей для LTL (LTL symbolic model checking algorithm), 128 Тарьяна поиска в глубину с возвратом (Tarjan depth first search algorithm), 182 трансляции LTL в автоматы (for translating LTL into automata), 186 Флойда-Уоршалла (Floyd-Warshall algorithm), 368 эквивалентности (equivalence algorithm), 244 Эмерсона-Ли (Emerson and Lei algorithm), 151 Алфавит (Alphabet), 172, 345 вершин (Node alphabet), 311 нетерминальных вершин (Nonterminal node alphabet), 313 рёбер (Edge alphabet), 311 терминальных вершин (Nonterminal node alphabet), 313 Анализ дедуктивный (Deductive verification), 23 Анализ (Analysis) количественный временной (quantitative temporal), 327 Аппроксимация (Approximation), 269 вычисление (approximations, computing), 269 неподвижной точки (fixpoint approximation), 146 точная (exact), 274 Архитектура шины (Bus architecture), 163 Асинхронное выполнение (Asynchronous execution), 43 Асинхронные системы (Asynchronous systems), 32, 343 Atom (Atom), 73 Аттрибут булев (Boolean attribute), 166 Бесконечные семейства (Infinite families of)
грамматик, графовых и сетевых (grammars, graph and network), 311 систем с конечным числом состояний (finite-state systems), 304, 345, 346, 359 Бесконечные слова (Infinite words), 174 Бисимуляция (Bisimulation), 234, 265 наибольшая (largest), 244 справедливая (fair), 239 фактор-модели (of the quotient model), 292 Блок (Block), 203, 298 Блокировать (To block), 228, 336 Булевы (Boolean) аттрибуты (attributes), 166 вектора (vector), 91, 152 значения (values), 29, 37 константы (constants), 190 кортежи (arrays), 356 отношения (relations), 91, 103, 158 переменные (variables), 50 связки (connectives), 55, 152 тождества (equivalences), 186 условия (conditions), 47 флаги (flags), 183 формулы (formulas), 29, 43, 95, 102 формулы, кваитифицированные (quantified boolean formulas), 102 функции (functions), 83, 85 Верификация (Verification), 21, 26 аппаратуры и программного обеспечения (of hardware and software), 21 асинхронных программных систем (of asynchronous software systems), 227 вероятностная (probabilistic), 376 комбинационных логических схем (of combinational logic), 83 композиционная (compositional), 252 систем с конечным числом состояний (of finite state systems), 24 параллельных систем (of concurrent systems), 21 систем реального времени (real-time system verification), 329 Верификация моделей (Model checking) 24, 64 ?«*
для /i-исчисления (model checking for the /i-calculus), 146, 155 для CTL (CTL model checking), 64, 102 для CTL* (CTL* model checking), 79 для LTL, табличная (LTL model checking by tableau), 72, 128 для RTCTL (RTCTL model checking), 331 «на лету» (on-the-fly model checking), 193, 199 при помощи автоматов (using automata), 174 символьная symbolic verification, 95 Вершина, узел (Node, vertex) в алгоритме трансляции LTL в автоматы (node), 187 в двоичных разрешающих деревьях (vertex, in binary decision trees), 85 внутренняя (nonterminal vertex), 85 входная (input node), 313 выходная (output node), 313 нетерминальная (nonterminal), 84 помеченная (flagged node), 183 терминальная (terminal), 84 хэшированная (hashed node), 183 Взаимная блокировка (Deadlock), 171, 227 Взаимное исключение (Mutual exclusion), 50 Временнбй анализ, количественный (Temporal analysis, quantitative), 332 Встроенные системы (Embedded systems), 22 Вход в критическую секцию (Trying region), 52 Выражение, регулярное (Regular expression), 173 Высказывание (Proposition) атомарное (atomic), 38, 40 Вычисление (Computation), 37 Вычислимость, теория вычислимости (Computability, theory of), 23 Глубина чередований (Alternation depth), 142,145 Грамматики (Grammars), 313 бесконечные семейства и (infinite families and), грамматики (graph grammars), 313 контекстно-свободная графовая (context-free graph grammar), 313 сетевая (network grammar), 313 Гранулярность (Granularity), 41 Граф (Graph), 1
областей (region graph), 359 ориентированный ациклический граф (directed acyclic graph), 85 переходов (state graph), 38, 56 переходов, сокращённый (reduced state graph), 199 часовых поясов (zone graph), 364 Группа (Group), 286 автоморфизмов (automorphysm group), 288 инвариантности (invariance group), 290 перестановок (permutation group), 287 полная симметрическая (full symmetric group), 287, 298 вращений (rotation groups), 298 Диаграмма (Diagram) временная (timing), 373 двоичная разрешающая (binary decision (BDDs)), 29, 83, 85 изоморфные (isomorphic), 85 упорядоченная двоичная разрешающая (ordered binary decision, OBDDs), 29, 83 Дерево (Tree) двоичное разрешающее (binary decision), 83 вычислений (computation), 56 Длина пути (Length, of a path), 332 Доказательство правильности программы (Deductive verification), 23 Домен (Domain), 39 Дополнение (Complementation), 178 Допущение-подтверждение (Assume-guarantee), 35, 252 Достаточные множества (Ample sets), 34 Достижимости задача (Reachability problem), 214, 346 Дуга возврата (Back edge), 215 Единичный элемент (Identity), 286 Задача (Problem) верификации моделей (model checking problem), 64 об изоморфизме графов (graph isomorphism problem), 296 орбит (orbit problem), 296 Замыкание (Closure) формулы (of a formula), 73 множества элементов группы (of a set of elements), 287 Захват данных (Snarfling), 164
Значение (Value) абстрактное (abstract), 266 неопределённое (undefined), 47 Инвариант (Invariant), 23, 290 бесконечного семейства моделей (for infinite family of structures), 305 дислокации (of the location), 344, 345 Инверсия приоритетов (Priority inversion), 336 Индукция (Induction), 36 Интерпретация часов (Clock interpretation), 346 Исключающее ИЛИ (Exclusive OR), 45 Истощение (удушение) (Starvatiuon), 54 Каноническое представление (Canonical representation), 83, 85 Квазипорядок симуляции (Simulation preorder), 240, 305 Квантование времени, статическое (Time-slicing, static), 327 Кванторы пути (Path quantifiers), 56 Кеш результатов (Result cache), 90 Кеш-строка (cache line), 163 Китайская теорема об остатках (Chinese remainder theorem), 278 Кольцо с маркерами Token ring, 288, 306, 322 Комбинаторный взрыв в пространстве состояний (State explosion), 21, 34 Коммутативность, перестановочность (Commutativity), 201 Композиция (Composition) абстрактная (abstract), 321 синхронная (synchronous), 157 интерливинговая (interleaving), 157 параллельная (parallel), 255, 347 последовательная (sequential), 49 Композиционные доказательства (Compositional reasoning), 252 Компонент (Component), 35 Конгруентность (Congruence), 274 Контрпример (Counterexample), 26,109, 178 Конус влияния (Influence cone), 262 Ложное опровержение (False negative trace) 26 Логика (Logic) деревьев вычислений (Computation Tree Logic), 56, 59
линейного времени (Linear Temporal Logic, LTL), 59 темпоральная (temporal), 26, 55 59 Маркер (Token), 324 Матрица разностных границ (Difference bound matrix), 363, 367 Машина Мура (Moore machine), 276 Тьюринга (Turing machine), 322 Мера стоимости (Cost metrics), 124 Метка (Label), 46, 47 начальная (Start label), 313 Метод абстракции (abstraction technique), 265 верификации моделей (model checking algorithm), 64, 95, 172 имитационного моделирования (simulation technique), 23 индукции (induction technique), 308 подмножеств (subset construction), 180 представления модели Крипке (Kripke structure encoding), 91 развертки (unfolding technique), 34 Микроволновая печь, пример (Microwave oven example), 68 Множество (Set) выпуклое (convex set), 345 достаточное (ample), 34, 205 оцепеневшее (sleep), 34 упорное (stubborn), 34 устойчивое (persistent), 34 Моделирование имитационное (Simulation), 22 Модель вычислений (Model) формальная (formal), 37 чередования (interleaving), 32 частичного порядка (partial order), 32 Модель Крипке (Kripke structure), 27, 38 бисимуляционно эквивалентная (bisimulation equivalent), 234, 239 бисимуляционно эквивалентная в справедливом смысле (fair bisimulation equivalent), 239 в /^-исчислении (/t-calculus modification), 143 детерминированная (deterministic), 244 максимальная (maximal), 247 недетерминированная (nondeterministic), 244
справедливая (fair), 254, 62 Модуль, в SMV (Module, in SMV), 157 Модульная структура (Modular structure), 34 Монитор (Monitor), 337 Монотонность (Monotonicity), 96 композиции (of composition), 306 синтаксическая (syntactic), 143 Монотонности условие (Monotonicity condition), 315 Монотонное расписание (Rate-monotonic scheduling (RMS)), 328 Мост, между шинами (Bus bridge), 163 Невидимость (Invisibility), 201 Нормальная форма (Normal form), 83 дизъюнктивная (disjunctive), 83 конъюнктивная (conjunctive), 83 негативная (negative), 61, 186 Неподвижная точка (Fixpoint), 95, 96 в /х-исчисление (/i-calculus), 143 наименьшая (the least fixpoint), 96 наииболыпая (the greatest fixpoint), 96 Непрерывное реальное время (Continuous real time), 343 Неразрешимость (Undecidability), 36, 322 Область (Domain, Universe, Region) абстрактных згначений (domain of abstract values), 266 действия квантора (scope of quantification), 121 значений перемнной (domain, Universe), 265 конечная (finite), 91 определения прохода (domain of a run), 174 часовая (clock regions), 353, 355 Обмен сообщениями (Message exchange), 43 Обратный элемент (Inverse element), 286 Ограничение (Constraint) справедливости (fairness constraints), 62, 70 временное (timing constraint, clock constraint), 331, 336, 344, 345 Окружение (Environment), 143 Оператор (Operator) абстракции (abstraction operator), 269 неподвижной точки (fixpoint operator), 141, 143
Оператор программы If-then-else (If-then-else statement), 49 Lock (Lock statement), 52 Skip (Skip statement), 47 Unlock (Unlock statement), 52 Wait (Wait statement), 50 While (While statement), 49 ожидания по условию (Busy waiting statement), 50 присваивания (Assignment statement), 47 размеченный (labelled statement), 46 Оператор темпоральный (Temporal operator), 56 сдвига по времени (next time, X), 56 происшествия (eventually, F), 56 инварианности (globally, G), 57 ожидания (until, U), 57 ожидания, ограниченный (bounded until), 331 разблокировки (release, R), 57 Операция (Operation) логическая (logical), 88, 89 сброса часов (clock reset operation), 362 Орбита (Orbit), 290 Отказ, вероятность отказа (Failure, probability of), 21 Отношение (Relation) бисимуляции (bisimulation), 234, 239 булево (boolean), 91, 103, 158 дизъюнктивно расщеплённое (disjunctive partitioned), 119 зависимости (dependency), 197 конъюнктивно расщеплённое (conjunctive partitioned), 119 независимости (independence relation), 201 орбит (orbit relation), 294 переходов (transition), 40, 158, 172, 197 расщеплённое (partitioned), 119 тотальное (total), 57 симуляции (simulation), 240, 321, 266 справедливой бисимуляции (fair bisimulation), 239 справедливой симуляции (fair simulation), 244, 254 цельное (monolithic), 119 Отрицание (Negation), 90
Оценка (Valuation), 39, 102 Перебор исчерпывающий (Exhaustive exploration), 23 Переменная булева (boolean), 50 общая, разделяемая (shared variable), 43, 50 пропозициональная (propositional), 102 реляционная (relational), 143 свободная (free), 143 связанная (bounded), 143 следующего состояния (next state), 40 текущего состояния (present state), 40 часов (clock), 345 Пересечение (Intersection) матрицы разностных границ (of difference bound matrices), 368 автоматов (of automata), 178 часовые пояса (of clock zones), 362 Перестановка, в теории групп (Permutation, in group theory), 287 Перестановочность (Commutativity), 201 Переупорядочение динамическое (Dynamic reordering), 88 Переход (Transition), 37, 143, 197 атомарный (atomic), 41 видимый (visible), 203 детерминированный (deterministic), 198 допустимый (enabled), 198 запрещённый (disabled), 198 мгновенный (instantaneous), 344 невидимый (invisible), 203 недетерминированный (nondeterministic), 157 по действию (action transition), 346 по задержке (delay transition), 346 Планируемость (множества процессов) (Schedulability), 340 Поведение (Behaviour), 26, 37 Подгруппа (Subgroup), 286 порожденная множеством элементов (generated by a set of elements), 287 Подформула максимальная (maximal), 80 верхнего уровня (top-level), 145 Подслушивание (Snoop), 163
Позиция (Location), 344, 345 Поиск (Search) в глубину с возвратом (depth first search, DFS), 182 в ширину (breadth first search), 199, 293 Полнота спецификации (Specification completeness), 26 Пороговая секция (Trying region), 158 Последовательность (Sequence) происшествий (eventuality sequence), 74 чередования (interleaving sequence), 32 Последовательная программа (Sequential program), 45 Пояс часовой (Clock zone), 361 Правило (Rule) вывода (inference rule), 253 инварианта (invariant rule), 306 порождающее (production rule), 313 преобразований (transformation rules), 87 Предикат (Predicate), 96 Представление моделей Крипке (Kripke structure representation), неявное (implicite), 29 первого порядка (first-order), 39 явное (explicite), 64 Преобразователь предикатов (Predicate transformer) , 29, 96 монотонный (monotonic), 96 непрерывный (continuous), 96 Предохранитель (Guard), 228, 344 открытый (passable), 228 Представители (Representatives), 197 Проблема (Problem) достижимости reachability problem, 344, 346 орбит (orbit problem), 296 изоморфизма графов (graph isimorphism problem), 296 Проверка на модели (Model checking), 21, 24 «на лету» (on-the-fly), 193 на представительной модели (using representatives), 197 с использованием автоматов (Model checking using automata), 174 Проверка пустоты автомата Бюхи (Emptiness checking of Buchi automata), 182 Проход автомата (Run of automaton), 172 допускающий (accepting), 173, 174
Программы (Programs), параллельные (concurrent), 49 последовательные (sequential), 46 Продукция (Production rule), 313 Прореживание (Stuttering), 203 Пространство состояний (State space), 21, 24, 29, 34 Протокол (Protocol) когерентности кэш-памяти (cache coherence protocol), 162, 301, 308 кольца с маркером (token ring protocol), 298 защиты (security protocol), 23 коммуникационный (communication protocol), 37 синхронной взаимосвязи (handshaking protocol), 43 шины (bus protocol), 163 Проход автомата (Run of automaton), 172 допускающий (accepting), 173 Процесс (Process), 49, 228 активный (active), 228 апериодический (aperiodic), 338 инвариантный (invariant), 36 пассивный (passive), 228 периодический (periodic), 338 Путь (Path), 38, 57, 198 справедливый (fair), 62, 239, 255 Разложение Шеннона (Shannon expansion), 89 Разметка (Labeling) программы (labeling transformations), 46 вершин (node labeling), 64, 311 рёбер (edge labeling), 311 Расщепление (Partitioning) дзъюнктивное (disjunctive), 120 конъюнктивное (conjunctive), 120 Редукция (Reduction) на лету (on-the-fly), 199 по конусу влияния (cone of influence reduction), 262 частичных порядков (partial order reduction), 32, 197 Реляционное произведение (Relational product), 103 Рубеж (Frontier), 334
Сборка мусора (Garbage collection), 192 Свидетельства, подтверждающие вычисления (Witnesses), 109 Связки булевы (Connectives), 55 Секция (Region), критическая (critical), 52, 158 некритическая (noncritical), 52, 158 Семантика (Semantics) временных автоматов (timed automata semantics), 345 логики CTL*, 57 справедливая (fair), 62 чередования (interleaving semantics), 45 Сильно связная компонента (Strongly connected component, SCC), 66 нетривиальная (nontrivial), 66 самодостаточная (self-fulfilling), 76 справедливая (fair), 70 Символьная верификация моделей (Symbolic model checking), 95,103 для CTL, 95, 103 для LTL, 128 Симметрия (Symmetry), 35, 286, 293 Симуляция (Simulation), 240 наибольшая (largest), 247 справедливая (fair), 251, 254 Синхронизация процессов (Process synchronization), 50 Система (System) SPIN (SPIN system), 227 абстрактная (abstract), 35 аппаратная (hardware), 21 верификации, верификатор (verification system), 21, 30, 61 встроенная (embedded), 22 построения доказательств (proof system), 24 ключевая (critical), 23 параллельная (concurrent systems), 23, 38 переходов (transition system), 198,158 программная (software), 21 реального времени (real-time systems), 327 реального времени, дискретная (discrete real-time systems), 329 реагирующая (reactive), 37, 55 с конечным числом состояний, конечная (finite state system), 21, 24
с бесконечным числом состояний (infinite state system), 24 Слово (Word) бесконечное (infinite), 174 входное (input), 173 конечное (finite), 173 пустое (empty), 173 События (Events), 25 независимые (independent), 32 параллельные (concurrent), 32, 198 частично упорядоченные (partial ordered), 32 Состояние (State), 37, 39 автомата (of automaton), 172 бисимуляционно эквивалентное (bisimulation equivalent), 237 вполне раскрытое (fully expanded), 205 допускающее (accepting), 174 заключительное (final), 172 начальное (initial), 39, 56, 64, 172, 346 освобождённое (invalid), 164 Сохранение, строгое и слабое (Preservation, strong and weak), 306 Спецификация (Specification), 24, 26, 55 Справедливость (Fairness), 27, 45, 61 Статическое квантование времени (Static time-slicing), 327 Строка, как последовательность переходов (String, as sequence of transitions), 221 Структура времени (Time structure) линейная (linear) 27 ветвящаяся (branching) 27 дискретная (discrete) 343 непрерывная (real-time) 343 Стягивание (Tightening), 368 Сужение модели (restriction of a model), 293 последовательности (restriction), 131 Суффикс (Suffix), 58 Схема вывода «допущение-подтверждение» (Assume-guarantee reasoning), 257 Схема цифровая электронная (Digital circuits), 23, 43 Счетчик команд (Program counter), 47, 216 Таблица (Tableau), 254
Табличная конструкция (Tableau construction), 73 при композиционных рассуждениях (under compositional reasoning), 254 для ACTL (for ACTL), 247 для LTL (for LTL), 73, 128 Теория групп (Group theory), 286 Тестирование (Testing), 22 Точка (Point) входа в оператор (entry point), 46 выхода из оператора (exit point), 46 Транзакция (Transaction), 163 разделяемая (split transaction), 163 Трансляция (Translation) /а-исчисления в OBDD (of /i-calculus into OBDDs), 152 CTL в ^-исчисление (of CTL into /i-calculus), 154 LTL в автоматы (of LTL into automata), 186 Транспозиция (Transposition), 287 Трасса ошибочная (Error trace), 26, Умножение, в группе (Group multiplication), 286 Универсальные кванторы пути (Universal path quantifiers), 61 Универсум (Universe), 39 Условие (Condition), 160, 336 булево (boolean), 47, 50 Фактор-модель (Quotient models), 290 Флаг (Flag), 183 Формула (Formula) /i-исчисления (/i-calculus formula), 143 булева (boolean), 29, 43, 95 булева, квантифицированная (quantified boolean), 102 инвариантная относительно прореживания (invariant under stuttering), 203 замкнутая (closed formula), 143 пути (path formula), 57 пути, ограниченная (restricted path formula), 128 синтаксически монотонная (syntactically monotone), 143 состояний (state formula), 57 элементарная (elementary formula), 130, 248 Функция (Function)
абстракции (abstraction function), 269 булева (boolean), 83, 85 характеристическая (characteristic function), 91 Цикл, в теории групп (Cycle, in group theory), 287 Часы (Clocks), 344 Эквивалентность (Equivalence) автоматов (automata equivalence), 180 бисимуляционная (bisimulation equivalence), 234, 274, 305, 359, 360 моделей (equivalent structures), 244 по прореживанию (stuttering equivalence), 203, 204 Язык (Language) автомата (of an automaton), 173 графовый (graph language), 313 модели (of a structure), 174, 244