Короткий ответ: «нет, никто не пытался доказать Z3, используя сам Z3»: -)
Предложение «мы доказали, что программа X верна» очень вводит в заблуждение.Основная проблема: что значит быть правильным.В случае Z3 можно сказать, что Z3 является правильным, если, по крайней мере, он никогда не возвращает «sat» для неудовлетворительной задачи и «unsat» для удовлетворительной.Это определение может быть улучшено за счет включения дополнительных свойств, таких как: Z3 не должен падать;функция X в API Z3 имеет свойство Y и т. д.
После того, как мы договоримся о том, что мы должны доказать, мы должны создать модели семантики языка времени выполнения (C ++ в случае Z3)и т. д. Затем инструмент (он же верификатор) используется для преобразования фактического кода в набор формул, который мы должны проверить с помощью средства проверки теорем, такого как Z3.Нам нужен верификатор, потому что Z3 не «понимает» C ++.Верифицирующий компилятор C ( VCC ) является примером такого рода инструмента.Обратите внимание, что подтверждение правильности Z3 с использованием этого подхода не дает однозначной гарантии того, что Z3 действительно является правильным, поскольку наши модели могут быть неверными, верификатор может быть неправильным, Z3 может быть неправильным и т. Д.
Для использованияверификаторы, такие как VCC, нам нужно аннотировать программу теми свойствами, которые мы хотим проверить, зацикливать инварианты и т. д. Некоторые аннотации используются для указания того, что должны делать фрагменты кода.Другие аннотации используются для «помощи / руководства» в доказательстве теоремы.В некоторых случаях количество аннотаций превышает проверяемую программу.Итак, процесс не полностью автоматический.
Другая проблема - это стоимость, процесс будет очень дорогим.Это было бы гораздо больше времени, чем реализация Z3.Z3 имеет 300 тыс. Строк кода, часть этого кода основана на очень тонких алгоритмах и хитростях реализации.Еще одной проблемой является техническое обслуживание, мы регулярно добавляем новые функции и улучшаем производительность.Эти изменения могут повлиять на доказательство.
Хотя стоимость может быть очень высокой, VCC использовался для проверки нетривиальных фрагментов кода, таких как гипервизор Microsoft Hyper-V.
Теоретически любойВерификатор для языка программирования X может быть использован для подтверждения себя, если он также реализован на языке X. Примером такого инструмента является верификатор Spec # .Spec # реализован в Spec #, и несколько частей Spec # были проверены с использованием Spec #.Обратите внимание, что Spec # использует Z3 и предполагает, что это правильно.Конечно, это большое предположение.
Более подробную информацию об этих проблемах и приложениях Z3 вы можете найти на бумаге: http://research.microsoft.com/en-us/um/people/leonardo/ijcar10.pdf