Как проверить, почему 3 выводят доказательства обязательств

#frama-c #why3

Вопрос:

Я верю, что могу генерировать доказательства, используя why3 с различными доказательствами,

  1. frama-c -wp -wp-prover cvc4 -wp-rte -wp-out proof swap.c
  2. frama-c -wp -wp-prover z3-ce -wp-rte -wp-out proof swap.c
  3. frama-c -wp -wp-prover alt-ergo -wp-rte -wp-out proof swap.c

Это создает различные файлы «почему». Я хотел бы подтвердить обязательства по доказательству с помощью внешней программы. Похоже, что каждое обязательство по доказательству находится в другом формате; ШепелявитьКлоджур и ОКамл? Что именно это за формат? Правильно ли, что это доказательства и их достаточно, чтобы показать, что контракт/доказательство верны, не доказывая, что Z3, alt-ergo и т. Д. Верны?

своп.c

Для руководства по wp,

 int h = 42;
/*@
  requires valid(a) amp;amp; valid(b);
  assigns *a, *b;
  ensures *a == old(*b) amp;amp; *b == old(*a);
*/
void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    int a = 24;
    int b = 37;

    //@ assert h == 42;

    swap(amp;a, amp;b);

    //@ assert a == 37 amp;amp; b == 24;
    //@ assert h == 42;
    
    return 0;
}
 

Это прекрасно работает, и графический интерфейс frama-c показывает мне, как разрабатывать контракты и аннотации.

Альтер-эрго

 (* WP Task for Prover Alt-Ergo,2.4.1 *) (* this is the prelude for Alt-Ergo, version >= 2.4.0 *) (* this is a prelude for Alt-Ergo integer arithmetic *) (* this is a prelude for Alt-Ergo real arithmetic *) type string

logic match_bool : bool, 'a, 'a -> 'a

axiom match_bool_True :   (forall z:'a. forall z1:'a. (match_bool(true, z, z1) = z))
 

Полное доказательство усечено для краткости.

z3-ce

 (* WP Task for Prover Z3,4.8.11,counterexamples *) ;;; generated by SMT-LIB2 driver ;;; SMT-LIB2 driver: bit-vectors, common part ;;; generated by SMT-LIB strings ;;; generated by SMT-LIB strings (set-option :produce-models true) ;;; SMT-LIB2: integer arithmetic ;;; SMT-LIB2: real arithmetic (declare-sort uni 0)

(declare-sort ty 0)

(declare-fun sort (ty uni) Bool)

(declare-fun witness (ty) uni)
 

Полное доказательство усечено для краткости.

Комментарии:

1. ZMT-LIB находится по адресу smtlib.cs.uiowa.edu . Похоже, что и Z3, и CVC4 используют этот формат в качестве вывода. Все еще не уверен насчет Альт-Эрго.

2. Удалив первую строку (* WP Task for Prover...) , я смогу использовать cvc4 --lang smt2 file.why и z3 -smt2 file.why обрабатывать файлы, где ‘файл. почему » был создан с помощью этой пословицы. Например, я не могу проверить вывод z3 с помощью cvc4… грамматика smtlib в flex/bison

Ответ №1:

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

Похоже, что каждое обязательство по доказательству находится в другом формате; Lisp и OCaml? Что именно это за формат?

Эти файлы представляют формулы, которые выдаются проверяющим, которых вы просите запустить Frama-C. Формат зависит от проверяющего. Если я правильно помню, для многих проверяющих это будет smtlib или tptp, но некоторые проверяющие, такие как Alt-Ergo, также могут получать пользовательский вывод. Создание файла описано в файлах драйверов Why3, как упомянуто (довольно кратко) в разделе 12.4 руководства Why3.

Правильно ли, что это доказательства ?

Нет, это формулы, которые должны быть проверены проверяющим, для которого они были сгенерированы.

и достаточно ли, чтобы показать, что контракт/доказательство верны, не доказывая, что Z3, alt-ergo и т. Д. Верны?

Нет. Если в проверяющих, которые вы используете, есть ошибка, они могут ошибочно сообщить вам, что данное обязательство по доказательству является действительным. Некоторые проверяющие могут предоставить трассировку проверки (например, если вы настроите драйвер для использования get-proof команды smtlib), но, насколько я знаю, формат такой трассировки зависит от проверяющих, так что, вероятно, будет сложно проверить ее внешним инструментом.

Комментарии:

1. Поэтому просто для уточнения обязательства по доказательству-это внутренний формат для проверяющего. Я надеялся на существование файла, который можно было бы независимо проверить. В этом и заключается суть математического доказательства. Любой может проверить, что это правда, различными способами, даже если механика создания доказательства неизвестна. Это механизм, используемый «кодом, несущим доказательства» (на устройстве должна быть предусмотрена только проверка), но меня просто интересовала внешняя проверка доказательств.

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

3. вас может заинтересовать Дедукти ( deducteam.github.io ), которая направлена на обеспечение единой основы для проверки доказательств. Однако я не уверен, что инструменты, которые могут выводить доказательства дедукции, могут быть легко использованы в качестве бэк-эндов Why3.

4. черт возьми, статья Спрингера … это для решателей SAT, а не для SMT.