
- •Верификация и синтез эффективных программ стандартных функций в технологии предикатного программирования
- •Введение
- •1. Дедуктивная верификация и программный синтез предикатных программ
- •2. Синтез программ вычисления целочисленного квадратного корня
- •3. Генерация программы вычисления целой части плавающего числа
- •4. Обзор работ
- •5. Опыт дедуктивной верификации и синтеза программ
- •Список литературы
4. Обзор работ
Методы верификации и синтеза, предлагаемые в настоящей работе, базируются на концепции логической семантики и принципиально отличаются от классических методов верификации Флойда и Хоара [15, 16], определяющих построение формул частичной корректности императивных программ.
Наиболее популярным методом синтеза является извлечение программы из конструктивного (интуиционистского) доказательства (метод proofs-as-programs) [6] с применением правил резолюции и унификации. Синтез предикатных программ проводится в классической логике и, в соответствии с обзором [5], реализуется по шаблонам формул (метод schema-guided); в качестве шаблонов используются правила доказательства корректности. Метод шаблонов применяется в основном для синтеза логических программ. В работе [10] метод шаблонов применяется для синтеза императивных программ. В предикативном программировании Э. Хехнера [7] программа синтезируется как результат последовательных уточнений (refinements):
Q(x, y) Q1(x, y) Q2(x, y) …
Qn(x, y) LS(S)(x: y).
Однако вывод LS(S)(x: y) Q(x, y) гарантирует лишь частичную корректность программы S. Данная формула – часть универсальной формулы корректности (2).
В работе [9] представлен синтез (методом proofs-as-programs) трех программ вычисления целочисленного квадратного корня применением трех разных схем доказательства по индукции теоремы тотальности: xm. Isqrt(x, m). В отличие от [9] метод синтеза, предлагаемый в настоящей работе, является универсальным и позволяет синтезировать произвольный алгоритм. Построение эффективного алгоритма вычисления целочисленного квадратного корня, модификации алгоритма sq3, описано в работе [8]. Исходная программа на языке Standard ML верифицирована автоматическим доказательством условий корректности в системе Nuprl. Конечная программа – результат серии оптимизирующих трансформаций, переводящих программу на язык HML, а затем на язык интегральных схем. Корректность трансформаций доказывается в Nuprl. Версия алгоритма в разделе 2 сопоставима с реализацией в [8]. Ее можно было бы оттранслировать на язык интегральных схем. Однако процесс построения программы в разделе 2 представлен на одном языковом уровне и значительно проще, чем в [8].
5. Опыт дедуктивной верификации и синтеза программ
Первоначально каждая из трех стандартных функций была запрограммирована на языке P, причем для isqrt и ilog2 реализовано по три версии алгоритмов разной сложности и эффективности. Наиболее эффективные версии алгоритмов преобразованы на язык C++ применением оптимизирующих трансформаций. Итоговые программы для функций floor и isqrt оказались почти тождественными с исходными. Программа для функции ilog2 существенно быстрее исходной программы на C++.
Далее для каждой программы на языке P были сгенерированы условия корректности в соответствии с системой правил для однозначных спецификаций. Сгенерированные формулы оттранслированы на язык спецификаций известной системы автоматического доказательства PVS [4]. Доказательство на PVS оказалось нетривиальным и трудоемким процессом, требующим времени на порядок больше по сравнению с программированием без формальной верификации. Трудности возникали не столько при доказательстве самих условий корректности, сколько при доказательстве используемых математических свойств, особенно для битовой арифметики.
В процессе верификации обнаружено 5 ошибок. Из них четыре – чисто технические. Принципиальной является ошибка, обнаруженная для функции floor: результат функции floor для аргумента в формате 32 может не поместиться в формате 32. Это опасная ошибка, приводящая к неверным вычислениям.
Позднее в исследовательских целях был проведен программный синтез всех алгоритмов для трех функций. Оказалось, что в режиме синтеза процесс построения соответствующих теорий и логического вывода в системе PVS реализуется более естественным образом, более вариативно и с большей согласованностью между теориями. Это дает возможность сократить суммарный объем доказательств примерно в полтора раза по сравнению с режимом верификации. Работа в режиме синтеза оказывается более предпочтительной.
Методы верификации и синтеза, предлагаемые в настоящей статье, опробованы примерно для 20 небольших программ. Разработанный алгоритм генерации формул корректности специализирован для разных видов операторов языка P, что обеспечивает построение адекватного набора формул корректности практически идеальным образом. Узким местом дедуктивной верификации остается автоматическое доказательство формул корректности. Доказательство на PVS формул корректности оказалось сложным и требовало времени в 7-10 раз больше времени обычной разработки программы без формальной верификации. Разумеется, современные системы автоматического доказательства, такие как Z3 и CVC3, базирующиеся на мощных SMT-решателях, позволят ускорить процесс доказательства.
Представленные методы верификации и синтеза целесообразны для применения в приложениях с высокими требованиями к надежности и безопасности программ.
Пятый год в Новосибирском государственном университете читается курс по предикатному программированию. Издано учебное пособие [11], которое может быть также использовано для подготовки инженеров-верификаторов. Опыт преподавания курса показал, что сопутствующей нетривиальной задачей является обучение студентов методам формальной спецификации программ.