Coq 用级数证明定理

Coq 用级数证明定理,coq,Coq,我想证明一个关于两个序列的定理 forall (a1,a2,...,an ∈ A), (b ∈ B) , (d1,d2,...,dn,d* ∈ D), a1+b=d1 AND a2+b=d2 AND ... AND an+b=dn AND ô(a1,a2,..,an)+b=d* -> σ(d1,d2,...,dn) = d* +、ô、σ是在归纳数据类型A、B、D上定义的运算符。我应该如何在Coq中对该定理进行编码 您可以使用list来编写定理,并使用对来获得与D相

我想证明一个关于两个序列的定理

forall (a1,a2,...,an ∈ A), (b ∈ B) , (d1,d2,...,dn,d* ∈ D), 
a1+b=d1 AND a2+b=d2 AND ... AND an+b=dn AND ô(a1,a2,..,an)+b=d*  ->
          σ(d1,d2,...,dn) = d*

+、ô、σ是在归纳数据类型A、B、D上定义的运算符。我应该如何在Coq中对该定理进行编码

您可以使用
list
来编写定理,并使用对来获得与
D
相同数量的
A

Require Import Coq.Lists.List.
Goal forall (ad : list (A * D)) (b : B) (dstar : D),
  List.Forall (fun '(ai, di) => ai + b = dstar) ad
  /\ ô(List.map (@fst A D) ad) + b = dstar ->
    σ(List.map (@snd A B) ad) = dstar.

谢谢你,杰森。这很有帮助。在应用了一些定制并试图证明定理之后,我在上下文中得到了这个假设:H:Forall(fun)(pol_I,ans_I)=>FinalDecision(Evaluation pol_I q)=ans_I)[(T,Used)]。我应用了简单或展开策略,使其成为最终决定(评估Tq)=使用,但它们都不起作用。那么我应该如何减少这种假设呢?谢谢。试试
反转
这个方法,只有一个例外。当假设为:H:Forall(fun)(pol_i,ans_i)=>pol_i nil/\FinalDecision(Evaluation pol_i q)=ans_i)[]时,也就是说当Listofpairs等于[]时,我不能将此假设简化为False。有没有办法把这个表达式简化为False?我使用了简单和倒置的H战术,没有任何改变,埃利姆H增加了另一个目标,但没有任何东西可以帮助我证明目前的目标。谢谢。你的假设是正确的,所以你不能把它简化为
False
。通过
构造函数
很容易证明
对于所有ap,对于所有P(@nila)