Насколько сложно свести окончание к частичной корректности?


14

Если вы знакомы с проверкой программы, вы, скорее всего, предпочтете прочитать Вопрос перед тем, как начать . Если вы не знакомы с проверкой программы, возможно, вы все равно сможете ответить на этот вопрос, но, скорее всего, вы предпочтете сначала прочитать справочную информацию .

Фон

Часто утверждается, что проверка частичной правильности неразрешима. Для обсуждения давайте выберем один очень конкретный способ сделать это утверждение точным, в стиле Флойда-Хоара. Блок- схема - это орграф с выделенным начальным узлом, из которого достижимы все узлы. Программа является Flowgraph, узлы которого являются командами. Существует три типа команд: (1) предположения предполагают, что q , (2) утверждения утверждают q , и (3) назначения v: = e. Здесь q - формула фол (логики первого порядка), e - фолм, а v - переменная.

Мы говорим, что программа частично верна, когда есть способ аннотировать каждый узел x с предварительным условием a (x) и дополнительным условием b (x) , так что (1) предварительное условие исходного узла является действительным, (2) { a (x) } x { b (x) } выполняется для всех команд x , а (3) ( b (x) подразумевает, что a (y) ) действует для всех ребер от x до y . Здесь тройки Хоара определяются следующим образом:

  • { p } asser q { r } означает, что ( p подразумевает ( q и r )), допустимо
  • { p } предположим, что q { r } означает, что (( p и q ) подразумевает, что r ) является действительным
  • { p } v: = e { r } означает, что (( p с e, замененным на v ) подразумевает, что r ) является действительным

Вот волнообразный аргумент о том, почему проверка этой частичной корректности неразрешима: как только вы заполните некоторые a (x) и некоторые b (x), вам нужно проверить, являются ли некоторые следующие формулы допустимыми, и это неразрешимо.

Типичный способ кодирования завершения в частичной корректности состоит в добавлении некоторых специальных утверждений, которые по существу говорят: «с тех пор, как в последний раз меня казнили, был достигнут прогресс в завершении». Эти утверждения о прогрессе должны быть размещены так, чтобы все бесконечные обходы потокового графа (которые начинаются в начальном узле) содержали бесконечно много утверждений о прогрессе. Чтобы быть более конкретным, скажем, что утверждения прогресса всегда имеют форму assert u < v , где u и v - положительные целые числа, перед которыми присваивается u : = f , а затем присваивается v : = u . Здесь F являетсяВариант функции , u это его текущее значение, а v это его предыдущее значение. Теперь, поскольку мы говорим о «положительных целых числах» и сравниваем их, мы должны убедиться, что доступно немного больше, чем указано ниже: допустим , доступна арифметика Пеано . (Я не очень уверен в этом выборе. Не стесняйтесь игнорировать, если это удобно.) Конечно, f может использовать любые другие функции и константы, упомянутые в программе. (Обратите внимание, что добавление предположений в начале программы эквивалентно введению нелогических аксиом.)

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

Вопрос

Учитывая завершающую программу, она чувствует, что сложно придумать вариантные функции для утверждений о ходе выполнения. Но как тяжело? (Я знаю, что даже с огромным фоном выше, я все еще оставлял этот вопрос как открытый или плохо определенный, в зависимости от того, как вы хотите посмотреть на него.)

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


Позвольте мне проверить, понимаю ли я это. То, о чем вы просите, дало бы нам, среди прочего, алгоритм, который берет программу, которая вычисляет полную рекурсивную функцию и выводит доказательство утверждения о том, что функция является полной (в форме вариантов функций и доказательств того, что они подходят )? Это звучит ужасно неисчислимо для меня.
Андрей Бауэр

Андрей, это тоже звучит неисчислимо. То, что я прошу, является доказательством того, что оно неисчислимо.
Раду GRIGore

Ответы:


7

Один из способов ответить на это - рассмотреть вычислительную сложность решения задач для классов частичной корректности и запросов завершения, о которых известно, что они разрешимы. Абстрактная интерпретация с использованием полиэдральной области может вывести аннотации частичной корректности, которые вы упоминаете в тех случаях, когда требуемые аннотации являются соединениями линейных неравенств. Вычисление абстрактного постусловия является экспоненциальным по количеству переменных. Тогда есть накладные расходы на поиск фиксированной точки. Посмотрите ранние статьи Кузо для получения дополнительной информации об этом и библиотеке Apron, если вы хотите поиграть с ней напрямую.

Поиск вариантных функций разрешим, когда вариантные функции линейны. Я не смог найти полную характеристику сложности этого, но «Завершение линейных программ» Тивари имеет раздел, в котором обсуждается сложность. См. Также «Полный метод синтеза функций линейного ранжирования» Подельского и Рыбальченко. Кроме того, Байрон Кук проделал работу по использованию абстрактной интерпретации, чтобы помочь построить аргументы завершения. См., Например, «Ранжирование абстракций» и «Анализ отклонений от анализа инвариантности». Это может дать дополнительное понимание взаимосвязи между частичной правильностью и прекращением.

Ссылки:


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

4

Существует очевидное сокращение от необходимого прекращения до частичной корректности, а именно:

P никогда не завершается, когда запускается в начальном состоянии, удовлетворяющем условию φ тогда и только тогда, когда φ { P } ложно.

Я знаю, что это еще один не ответ. Его преимущество в том, что он короче, чем те, что указаны выше.


3

Существует стандартная технология - обычно неразрешимая, конечно, - для заполнения вашего графа его предварительными и постусловиями , а именно, слабейшей либеральной семантикой предусловий , которая является формой семантики предикатного преобразователя, которая дает самые слабые предварительные условия для удовлетворения спецификации или без нее. -termination. По сути, это полная теория частичной корректности для таких языков и, действительно, полная корректность

Мел и сыр решают, какая из окончаний и частичной правильности лежит в основе тяжелой работы, поскольку оба они так плохо решаемы. Но частичная корректность связана с проблемами проектирования языков, как для программных, так и для языков спецификаций, в то время как сложность завершения является чистой: для любой теории, используемой для доказательства завершения, найдутся алгоритмы, которые завершают, но не доказано, что они заканчиваются относительно к этой теории. Например, вычисления в чистом полиморфном лямбда-исчислении должны завершаться, но арифметика Пеано не может этого доказать.

У меня сложилось впечатление, что работа по абстрактной интерпретации, впервые разработанная Патриком Кузо, была самой динамичной в этой области, но я не претендую на звание эксперта.


Я пытался спросить о сложности определения вариантов функций. Извините за непонятность! Любопытно, что прошлым вечером Рустан Лейно (Rustan Leino) предложил пример (в пабе), который убедительно показал мне, что wlp не работает так же хорошо, как wp & sp для тех программ, которые я здесь описываю. Мне придется перепроверить, когда я доберусь до места, более подходящего для работы :)
Раду GRIGore

@Radu: Там была проделана работа по автоматическому доказательству завершения, и с Прологом была проделана хорошая работа. Я могу найти некоторые ссылки, когда найду время.
Чарльз Стюарт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.