Формальная проверка правильности алгоритма

прежде всего, возможно ли это только на алгоритмах, которые не имеют побочных эффектов?

во-вторых, где я могу узнать об этом процессе, какие-либо хорошие книги, статьи и т. д.?

11 ответов


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

вот курс это использует COQ и говорит о доказательстве алгоритмов.
И вот учебник о написании научных работ в COQ.


  1. это вообще много легче проверить / доказать правильность когда никакие побочные эффекты не включенны, но нет абсолютного требования.
  2. вы можете посмотреть на некоторые документы для формального языка спецификации, например Z. Формальная спецификация сама по себе не является доказательством, но часто является основой для него.

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

однако есть несколько хорошо известных трюков, которые используются и повторно используются снова. Например, с рекурсивными алгоритмами вы можете использовать инварианты циклов.

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

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


купить эти книги:http://www.amazon.com/Science-Programming-Monographs-Computer/dp/0387964800

книга Gries, научное Программирование-отличный материал. Терпеливый, тщательный, законченный.


Я думаю, что проверка правильности алгоритма будет проверять его соответствие спецификации. Существует отрасль теоретической информатики под названием Формальные Методы что может быть тем, что вы ищете, если вам нужно как можно ближе к доказательству. Из Википедии,

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

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


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

ACM Computing Surveys Vol 41 выпуск 4 (октябрь 2009) является специальным выпуском по проверке программного обеспечения. Похоже, вы можете добраться хотя бы до одной из статей без учетной записи ACM, выполнив поиск "формальные методы: практика и опыт".


инструмент Frama-C, для которого Elazar предлагает демо-видео в комментариях, дает вам язык спецификации,ACSL, для записи контрактов функций и различных анализаторов для проверки того, что функция C удовлетворяет свойствам контракта и безопасности, таким как отсутствие ошибок во время выполнения.

расширенный учебник,ACSL на примере, показывает примеры фактических алгоритмов C, указанных и проверенных, и разделяет побочных эффектов от effectful те (побочный эффект-бесплатно считаются легче и прийти первым в учебнике). Этот документ также интересен тем, что он не был написан дизайнерами инструментов, которые он описывает, поэтому он дает более свежий и дидактический взгляд на эти методы.


Если вы знакомы с LISP, то вы должны обязательно проверить ACL2:http://www.cs.utexas.edu / ~moore/acl2/acl2-doc.html


Дейкстры дисциплина программирования и его EWDs заложили основу для формальной проверки как науки в программировании. Более простая работа Вирта Системное Программирование, который начинается с простого подхода к использованию проверки. Вирт использует pre-ISO Pascal для языка; Dijkstra использует Algol-68-подобный формализм, называемый Guarded (GCL). Формальная проверка созрела после Дийкстры и Хоара, но эти старые тексты все еще могут быть хорошим началом точка.


инструмент PVS развитый парнями Stanford система спецификации и проверки. Я работал над ним и нашел его очень полезным для доказательства Theoram.


WRT (1), вам, вероятно, придется создать модель алгоритма таким образом, чтобы "захватывать" побочные эффекты алгоритма в программной переменной, предназначенной для моделирования таких побочных эффектов на основе состояния.