如何在规范中证明Coq函数的唯一性?

时间:2016-11-17 16:58:42

标签: functional-programming coq

给定函数的规范,例如specification_of_sum,如何在Coq中证明只存在一个这样的函数?

我正在学习数学,我可以证明这一点,但我在Coq方面的技能有限(证明使用rewriteapply)。

我在下面找到了代码片段,我现在已经苦苦挣扎了一段时间。

我尝试在证明中展开规范,但是使用我的老朋友rewrite似乎并没有让我走得更远。

有人可以解释如何使用简单的语法来解决这个问题吗?

Definition specification_of_sum (sum : (nat -> nat) -> nat -> nat) :=
  forall f : nat -> nat,
    sum f 0 = f 0
    /\
    forall n' : nat,
      sum f (S n') = sum f n' + f (S n').

(* ********** *)

Theorem there_is_only_one_sum :
  forall sum1 sum2 : (nat -> nat) -> nat -> nat,
    specification_of_sum sum1 ->
    specification_of_sum sum2 ->
    forall (f : nat -> nat)
           (n : nat),
      sum1 f n = sum2 f n.
Proof.  
Abort.

2 个答案:

答案 0 :(得分:1)

您需要使用Text="{Binding ClickCount1, ElementName=myusercontrol, Mode=Default} 上的归纳来证明这一点。考虑一下,您的规范涵盖了n0的案例,因此使用归纳是很自然的。

你可以在你选择的Coq书中阅读有关感应的内容。

如何使用您的规范的示例是:

n.+1

答案 1 :(得分:1)

以下开始基本上就像ejgallego已经描述的那样。

intros sum1 sum2 H1 H2 f n. (* introduce all the hypotheses *)                                     
unfold specification_of_sum in *. (* unfold definition in all places *)                            
specialize H1 with (f := f). (* narrow statement to be about f *)                                  
specialize H2 with (f := f). (* narrow statement to be about f *)                                  
inversion_clear H1.  (* split up the AND statements *)                                             
inversion_clear H2.                                                                                
(* induction on n, and do rewrites *)

我已经包含了一些更基本的命令,以使其更慢但更简单。证明的其余部分仅需要rewritereflexivity