Почему проверка кода требуется в коде переноса доказательства


9

В классической статье PLDI'98 Necula «Разработка и реализация сертифицирующего компилятора» верификатор высокого уровня использует:

  1. VCGen для генерации условий проверки (предикаты безопасности)
  2. Доказательство логической теоремы первого порядка для доказательства условий
  3. LF proof checker для проверки доказательства с шага (2)

Я немного смущен шагом (3). Зачем это вообще нужно? Только (1) и (2) не будет достаточно? Почему бы нам просто не доверять доказательству, созданному доказателем теорем?

Ответы:


19

Целью проверки корректности является минимизация базы доверенных компьютеров .

Имея средство проверки, ни компилятор, ни доказатель теоремы не должны быть правильными. В документе говорится об этом на странице 3:

Neither the compiler nor the prover need to be correct in order to be guaranteed to   
detect incorrect compiler output. This is a significant advantage since the VCGen and  
the  proof checker are significantly simpler than the compiler and the prover.

Проверка корректности - это всего лишь пара строк кода, и ее можно проверить вручную на правильность. В отличие от этого, автоматический проверяющий, который хорошо работает, чрезвычайно сложен и вряд ли будет корректным, хотя в случае хорошо проверенных и широко используемых проверок ошибки будут в крайних случаях, которые может быть нелегко вызвать. Взгляните на 30- килограммовый код LOC C, который составляет Lingeling , современный SAT-решатель, чтобы увидеть, насколько сложными могут быть автоматизированные средства доказательства теорем. Без проверки вы должны были бы доказать правильность этой теоремы. Это выше того, что мы можем сделать экономически в 2015 году.


Я удивлен, что доказательства, построенные с помощью ATP, могут содержать ошибки. (Я думал, что АТФ могут быть неполными, но не несостоятельными / глючными). Здесь я менее информирован. Я буду рад узнать, есть ли какие-либо известные случаи дорогостоящих ошибок в доказательствах, генерируемых ATP.
Рам

3
@Ram В истории любого серьезного автоматического тестера теорем есть тысячи крошечных ошибок. См., Например, stackoverflow.com/questions/12281085/… или историю изменений любого такого инструмента на github.
Коди

@Ram В дополнение к отличному совету Коди, я рекомендую учиться на собственном опыте: написать немного ATP, например, базовый SAT-решатель. Это можно сделать в несколько строк кода. Затем попытайтесь заставить его работать хорошо, добавив, например, изучение предложений, наблюдаемые литералы или интересные эвристики выбора переменных. Тогда подумайте об опыте ...
Мартин Бергер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.