Forall 1 <= a和2 <= b存在k,其中(b ^ k)除a,但(b ^(k + 1))不除a;我想在coq中计算k:
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 factor (a/b) b (divgt0 a b agt0 bgt1 (Zdivide_dec b a)) bgt1
else 0.
Next Obligation.
如何在if的一部分中使用(b | a)的证明?
答案 0 :(得分:2)
Program
会记住此类信息。如果您将下划线代替所需的证明,则系统可以自行解决。
Program Fixpoint factor ( a b : Z ) ( agt0 : 0 < a ) ( bgt1 : 1 < b ) {measure (Z.abs_nat a)} :=
if Zdivide_dec b a
then factor (a/b) b (divgt0 a b agt0 bgt1 _) bgt1
else 0. (* ^ here *)
Next Obligation.
这时,您所需要做的就是证明您的度量降低了,这并不困难。