Functional programming 在给定规范的情况下,如何证明Coq中函数的唯一性?

Functional programming 在给定规范的情况下,如何证明Coq中函数的唯一性?,functional-programming,coq,Functional Programming,Coq,给定一个函数的规格,例如,sum的规格,我如何在Coq中证明只有一个这样的函数存在 我正在学习数学,我可以证明这一点,但我在Coq方面的技能有限(使用重写和应用进行证明) 我找到了下面的代码片段,我已经挣扎了一段时间了 我试图在校样中展开规范,但使用我的老朋友rewrite似乎不能让我走得更远 有人能解释一下如何使用简单的语法来解决这个问题吗 Definition specification_of_sum (sum : (nat -> nat) -> nat -> nat) :

给定一个函数的规格,例如,sum的规格,我如何在Coq中证明只有一个这样的函数存在

我正在学习数学,我可以证明这一点,但我在Coq方面的技能有限(使用
重写
应用
进行证明)

我找到了下面的代码片段,我已经挣扎了一段时间了

我试图在校样中展开规范,但使用我的老朋友
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.

您需要使用
n
上的归纳法来证明这一点。想想看,您的规范涵盖了
0
n.+1
的情况,因此使用归纳法是很自然的

你可以在你选择的Coq书中阅读归纳法

有关如何使用您的规范的示例如下:

intros sum1 sum2 s1_spec s2_spec f n.
specialize (s1_spec f) as [s1_spec0 s1_specS].
specialize (s2_spec f) as [s2_spec0 s2_specS].

您需要使用
n
上的归纳法来证明这一点。想想看,您的规范涵盖了
0
n.+1
的情况,因此使用归纳法是很自然的

你可以在你选择的Coq书中阅读归纳法

有关如何使用您的规范的示例如下:

intros sum1 sum2 s1_spec s2_spec f n.
specialize (s1_spec f) as [s1_spec0 s1_specS].
specialize (s2_spec f) as [s2_spec0 s2_specS].

下面的开始与前面描述的基本相同

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 *)

我已经包括了一些更基本的命令,使它更慢,但更简单。其余的证明只需要
重写
自反性

以下开始基本上与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 *)

我已经包括了一些更基本的命令,使它更慢,但更简单。其余的证明只需要
重写
自反性

,但我找不到使用规范的语法。如何用它重写或应用它?你能给我看看吗?我建议你使用
specialize(specialize)(spece1 f)
,其中
spec1
sum1
的规范。您也可以在spec1中展开sum的规范,但这不是必需的,定义通常在Coq中自动展开。但是我找不到使用规范的语法。如何用它重写或应用它?你能给我看看吗?我建议你使用
specialize(specialize)(spece1 f)
,其中
spec1
sum1
的规范。你也可以在spec1中展开求和的规格说明,但这不是必需的,定义通常在Coq中自动展开。谢谢,这是启动我的证明所需要的:-)是否可以用“更简单”的东西来代替反转清除?事实上,反转清除不是处理假设的正确方法,你在我的答案中有正确的方法(介绍模式)。谢谢,这是我开始证明的必要条件:-)是否可以用“更简单”的东西来代替倒装清晰?事实上,倒装清晰不是处理假设的正确方法,你在我的答案中有正确的方法(介绍模式)。