2014-04-03 3 views
1

У меня довольно большой срок foo. Когда я типаОт «значения» до «леммы»

value "foo" 

затем Isabelle оценивает foo до значения, скажем foo_value. Теперь я хотел бы доказать следующую лемму.

lemma "foo = foo_value" 

Какой метод доказательства следует использовать? Я попробовал try, но это приурочено. Наверное, я мог бы продолжить вручную, разворачивая различные определения, которые встречаются в foo, но, безусловно, я должен использовать любой механизм, который использует команда value, правильно?

ответ

4

Есть три способа доказательства, которые соответствуют различным механизмам оценочных value:

  • eval использует генератор кода; он соответствует value [code]. Доказательство успешно выполняется, если генерируемый код ML оценивается в True.
  • normalization компилирует заявление в механизм символической нормализации в ML. Он имитирует value [nbe].
  • code_simp использует упроститель Изабель в качестве оценщика. Он соответствует value [simp].

tutorial on code generation более подробно описывает эти методы доказательства. eval и normalization действуют как оракулы, т. Е. Обходят ядро ​​Изабеллы, тогда как каждый этап оценки code_simp проходит через ядро. Обычно eval быстрее, чем normalization и normalization быстрее, чем code_simp.

+0

Спасибо, Андреас, это очень интересно и полезно. Мне любопытно: если первые два метода обходят ядро, можно ли сказать, что лемма была правильно доказана? Можно ли, например, представить теорию, содержащую «by eval» в Архив официальных доказательств? –

+1

Если вы используете один из первых двух методов, то вы надеетесь, что настройка генератора кода будет звуковой. Не должно быть проблем с отправкой доказательств «eval» в AFP, их уже есть пара. На самом деле все методы рефлексивного доказательства также основаны на оценке. Примером может служить метод 'regexp' в записи AFP Regular Sets and Expressions http://afp.sourceforge.net/entries/Regular-Sets.shtml. –

1

Я не уверен, работает ли он во всех случаях, но вы можете попробовать:

lemma "foo = foo_value" 
    by eval 

Во многих случаях by simp также должны работать, и я думаю, eval вроде оракула (в том смысле, что не полностью проверено ядром, пожалуйста, кто-нибудь поправьте меня, если я ошибаюсь).

Смежные вопросы