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

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

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


person joemoe    schedule 27.01.2010    source источник
comment
Я не совсем понимаю, что вы имеете в виду, говоря о побочных эффектах.   -  person ldog    schedule 27.01.2010
comment
См. Это: en.wikipedia.org/wiki/Side_effect_%28computer_science%29   -  person joemoe    schedule 27.01.2010
comment
См. stackoverflow.com/questions/476959/why-cant- программы-будьте-проверены, на которые есть несколько хороших ответов.   -  person Jason Orendorff    schedule 28.01.2010
comment
Очень практичной программой, которая выполняет проверку (с другими инструментами), является frama-c, посмотрите демонстрационное видео screentoaster.com/watch/stUk9UQEZPTFxZSFtZWVNZ/frama_c_demo   -  person Elazar Leibovich    schedule 28.01.2010


Ответы (11)


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

Вот курс, в котором используется COQ и рассказывается о проверке алгоритмов.
И вот руководство по написанию научных статей в COQ.

person nlucaroni    schedule 27.01.2010

  1. Обычно намного проще проверить / доказать правильность, когда нет побочных эффектов, но это не абсолютное требование.
  2. Возможно, вы захотите ознакомиться с документацией по формальному языку спецификаций, например Z. Формальная спецификация сама по себе не является доказательством, но часто является его основой.
person Jerry Coffin    schedule 27.01.2010
comment
И если вам нравится Z, будьте уверены, вы найдете инструменты, чтобы включить его в процесс написания формально правильного алгоритма: bmethod.com/php/methode-b-en.php - person Pascal Cuoq; 28.01.2010

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

Формальные методы - это особый вид математически обоснованных методов спецификации, разработки и проверки программных и аппаратных систем.

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

person brabster    schedule 27.01.2010

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

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

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

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

person ldog    schedule 27.01.2010
comment
Сокращение алгоритмов (особенно описанное в предложенной вами ссылке) - это теоретический инструмент, демонстрирующий, что проблема не менее сложна, чем другая. Эти доказательства, часто выполняемые в вычислительной модели машины Тьюринга, представляют собой сложную задачу и не имеют ничего общего с формальными (проверяемыми машиной) доказательствами. Они часто выполняются для проблем, которые сложно использовать на практике (пример в вашей ссылке относится к проблеме остановки; также популярно показать, что проблема является NP-сложной путем сведения к ней известной NP-сложной проблемы). Короче говоря, я не уверен, что связанное сокращение проблемы имеет какое-либо отношение к формальной корректности. - person Pascal Cuoq; 28.01.2010
comment
Хм, может быть, сокращение - это не тот термин, который я должен здесь использовать. Когда я говорю о сокращении, я имел в виду что-то вроде следующего примера. Предположим, у вас есть алгоритм, который вычисляет пересечение N прямоугольников, что, как вы знаете, является правильным. Предположим, у вас есть другая проблема, для которой существует нетривиальный перевод этой проблемы на задачу вычисления пересечения N прямоугольников. Затем вы используете первый алгоритм для вычисления решения второй проблемы. Остается только показать, что перевод правильный. - person ldog; 29.01.2010
comment
Но я вижу, что это сбивает с толку, это уловка, основанная на том факте, что вы используете хорошо известный алгоритм, который, как известно, является правильным (в данном случае тот, который вычисляет пересечение N прямоугольников). где возникает путаница относительно того, является ли это методом доказательства или предоставления правильного алгоритма. - person ldog; 29.01.2010

Купите эти книги: https://rads.stackoverflow.com/amzn/click/com/0387964800

Книга Гриса «Научное программирование» - отличный материал. Терпеливый, тщательный, полный.

person S.Lott    schedule 27.01.2010

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

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

person mcdowella    schedule 27.01.2010
comment
Формальные методы охватывают все указанные вами цели. Я занимаюсь проверкой правильности программ и должен признать, что до сих пор большие промышленные успехи были достигнуты в других подобластях (просто подождите до следующего года!). Такие конференции, как FMWEEK, несколько озадачивают, потому что собирают людей со всеми этими разными подходами и целями, но у нас действительно много общего и есть чем поделиться. - person Pascal Cuoq; 28.01.2010

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

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

person Pascal Cuoq    schedule 28.01.2010

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

person redtuna    schedule 04.02.2010

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

person D. E. Evans    schedule 14.08.2013

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

person raaghav    schedule 16.10.2013

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

person interestedparty333    schedule 21.07.2014