Я следую за книгой Software Foundation, и я нахожусь в главе под названием «Imp».Профилактическая автоматизация в Coq как разложить фактор
Авторы выставляют небольшой язык является следующее:
Inductive aexp : Type :=
| ANum : nat -> aexp
| APlus : aexp -> aexp -> aexp
| AMinus : aexp -> aexp -> aexp
| AMult : aexp -> aexp -> aexp.
Вот функция, чтобы оценить эти выражения:
Fixpoint aeval (a : aexp) : nat :=
match a with
| ANum n ⇒ n
| APlus a1 a2 ⇒ (aeval a1) + (aeval a2)
| AMinus a1 a2 ⇒ (aeval a1) - (aeval a2)
| AMult a1 a2 ⇒ (aeval a1) × (aeval a2)
end.
Упражнение заключается в создании функции, оптимизировать оценку. Например:
APlus a (ANum 0) --> a
Здесь есть моя оптимизируют функция:
Fixpoint optimizer_a (a:aexp) :aexp :=
match a with
| ANum n => ANum n
| APlus (ANum 0) e2 => optimizer_a e2
| APlus e1 (ANum 0) => optimizer_a e1
| APlus e1 e2 => APlus (optimizer_a e1) (optimizer_a e2)
| AMinus e1 (ANum 0) => optimizer_a e1
| AMinus e1 e2 => AMinus (optimizer_a e1) (optimizer_a e2)
| AMult (ANum 1) e2 => optimizer_a e2
| AMult e1 (ANum 1) => optimizer_a e1
| AMult e1 e2 => AMult (optimizer_a e1) (optimizer_a e2)
end.
И сейчас, я бы доказать, что функция оптимизации звука:
Theorem optimizer_a_sound : forall a, aeval (optimizer_a a) = aeval a.
Это доказательство довольно сложно. Поэтому я попытался разложить доказательство, используя некоторые леммы.
Вот одна лемма:
Lemma optimizer_a_plus_sound : forall a b, aeval (optimizer_a (APlus a b)) = aeval (APlus (optimizer_a a) (optimizer_a b)).
У меня есть доказательство, но скучный. Я индукция на, а затем, для каждого случая, я б и уничтожить уничтожение ехра обрабатывать случай, когда б 0.
мне нужно сделать, потому что
n+0 = n
не уменьшает автоматически, нам нужна теорема, которая равна плюс_0_r.
Теперь, интересно, как я могу построить лучшее доказательство с Coq, чтобы избежать некоторых скучных повторений во время доказательства.
Вот мое доказательство этой леммы:
Я думаю, что я должен использовать «Подсказка Перепишите plus_0_r», но я не знаю, как.
Кстати, мне также интересно узнать несколько советов, чтобы показать исходную теорему (смысл моей функции оптимизации).
В '| APlus e1 e2 => APlus (optimizer_a e1) (optimizer_a e2) ', что, если' optimizer_a e1' возвращает 'ANum 0'? – gallais