Если вы знакомы с проверкой программы, вы, скорее всего, предпочтете прочитать Вопрос перед тем, как начать . Если вы не знакомы с проверкой программы, возможно, вы все равно сможете ответить на этот вопрос, но, скорее всего, вы предпочтете сначала прочитать справочную информацию .
Фон
Часто утверждается, что проверка частичной правильности неразрешима. Для обсуждения давайте выберем один очень конкретный способ сделать это утверждение точным, в стиле Флойда-Хоара. Блок- схема - это орграф с выделенным начальным узлом, из которого достижимы все узлы. Программа является 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 может использовать любые другие функции и константы, упомянутые в программе. (Обратите внимание, что добавление предположений в начале программы эквивалентно введению нелогических аксиом.)
Теперь, если программа с утверждениями о ходе выполнения все еще частично верна, то мы знаем, что исходная программа завершается.
Вопрос
Учитывая завершающую программу, она чувствует, что сложно придумать вариантные функции для утверждений о ходе выполнения. Но как тяжело? (Я знаю, что даже с огромным фоном выше, я все еще оставлял этот вопрос как открытый или плохо определенный, в зависимости от того, как вы хотите посмотреть на него.)
Иными словами: я ищу ссылку, которая формализует проблему сведения терминации к частичной корректности, а затем что-то говорит о ее сложности. Ответ, который делает все это, конечно, будет приветствоваться.