我想证明Use proof of if expression = true in then part coq中的因子函数正确性
Require Import ZArith Znumtheory.
Local Open Scope Z_scope.
Require Coq.Program.Tactics.
Require Coq.Program.Wf.
Lemma divgt0 ( a b : Z ) ( agt0 : 0 < a ) ( bgt1 : 1 < b ) (dvd : (b|a) ) : 0<a/b.
Proof.
apply Zdivide_Zdiv_lt_pos.
auto.
auto.
auto.
Qed.
Program Fixpoint factor ( a b : Z ) ( agt0 : 0 < a ) ( bgt1 : 1 < b ) {measure (Z.abs_nat a)} :=
if Zdivide_dec b a
then 1+factor (a/b) b (divgt0 a b agt0 bgt1 _) bgt1
else 0.
Next Obligation.
assert ( 0 < a / b < a ).
apply Zdivide_Zdiv_lt_pos.
auto.
auto.
auto.
apply Zabs_nat_lt.
omega.
Qed.
Lemma factor_div ( a b : Z ) ( agt0 : 0 < a ) ( bgt1 : 1 < b ) : (b ^ (factor a b agt0 bgt1) | a).
Proof.
unfold factor.
展开后,我希望看到一个if并破坏其条件,但是现在我看到了:
1 subgoal
a, b : Z
agt0 : 0 < a
bgt1 : 1 < b
______________________________________(1/1)
(b
^ factor_func
(existT (fun a0 : Z => {b0 : Z & {_ : 0 < a0 & 1 < b0}}) a
(existT (fun b0 : Z => {_ : 0 < a & 1 < b0}) b
(existT (fun _ : 0 < a => 1 < b) agt0 bgt1))) | a)
我如何完成证明?
答案 0 :(得分:2)
Program
为您提供了难以使用的术语,因此您应证明factor
等于其主体的引理,然后用它重写,而不是展开。 (我使用match
而不是if
来掌握dvd
证明词。)
Lemma factor_lemma a b agt0 bgt1:
factor a b agt0 bgt1 =
match Zdivide_dec b a with
| left dvd => 1+factor (a/b) b (divgt0 a b agt0 bgt1 dvd) bgt1
| right notdvd => 0 end.
Proof.
unfold factor at 1.
unfold factor_func; rewrite Program.Wf.Fix_eq; fold factor_func.
- reflexivity.
- intros.
destruct Zdivide_dec; auto.
congruence.
Qed.
展开并用Fix_eq
重写时,您会发现一个可怕的目标术语,那就是最好将其快速折叠! :-)无论如何,都可以使用reflexivity
或auto
进行处理。
第二个目标通常要求使用omega
或类似方法进行代数运算,以证明LHS等于RHS,但在这种情况下,使用congruence
就足够了。
我怎么知道使用Fix_eq
?展开factor_func
时,我看到其中包含Wf.Fix_sub
,所以我用Search (Wf.Fix_sub).
搜索引理,并发现了其中的几个。
现在,您应该通过引理重写来继续证明:
Lemma factor_div ( a b : Z ) ( agt0 : 0 < a ) ( bgt1 : 1 < b ) : (b ^ (factor a b agt0 bgt1) | a).
Proof.
rewrite factor_lemma.
destruct Zdivide_dec.
2: now rewrite Z.pow_0_r;apply Z.divide_1_l.
现在您的目标状态是
a, b : Z
agt0 : 0 < a
bgt1 : 1 < b
d : (b | a)
============================
(b ^ (1 + factor (a / b) b (divgt0 a b agt0 bgt1 d) bgt1) | a)
这可能更有意义。