В дополнение к ответу @ larsr: плагин Equations предлагает несколько полезных функций, таких как автоматическое создание упрощенных лемм, аналогичных normalize_0_l
и т. Д. Например. для примера ниже у нас есть normalize_equation_1
, normalize_equation_2
и т. д.
Более того, как и плагин Function
, Equations
предоставляет функциональные индукционные схемы, которые делают доказательства свойств функций довольно элегантными.
From Equations Require Import Equations.
Definition integer : Type := prod nat nat.
Equations normalize (i : integer) : integer by wf (fst i) :=
normalize (0, b) := (0, b);
normalize (S a', 0) := (S a', 0);
normalize (S a', S b') := normalize (a', b')
.
(* see Coq's response for the list of auto generated lemmas *)
Давайте докажем некоторые свойства normalize
, используя функциональную индукцию. Уравнения обеспечивают некоторую тактику, которая делает использование этого легче. Я буду использовать funelim
в этом случае.
From Coq Require Import Arith.
Lemma normalize_sub_lt a b :
a < b -> normalize (a, b) = (0, b - a).
Proof.
funelim (normalize (a, b)); simpl in *.
- now rewrite Nat.sub_0_r.
- now intros []%Nat.nlt_0_r.
- intros a_lt_b%Nat.succ_lt_mono; auto.
Qed.
Вторая часть спецификации normalize
может быть доказана таким же образом.
Lemma normalize_sub_gte a b :
b <= a -> normalize (a, b) = (a - b, 0).