在部分coq中使用if expression = true的证明

时间:2018-06-24 18:46:24

标签: coq

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)的证明?

1 个答案:

答案 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.

这时,您所需要做的就是证明您的度量降低了,这并不困难。