Coq 从Nat到Rat的证据翻译
我试图用一个CoQ/SSReflect证明,使用Coq 从Nat到Rat的证据翻译,coq,ssreflect,Coq,Ssreflect,我试图用一个CoQ/SSReflect证明,使用nat来证明rat中的一个非常类似的语句。开放范围环\u范围内的当前验证状态为 (price bs i - price bs' i <= tnth bs i * ('ctr_ (sOi i) - 'ctr_ (sOi i')))%N → (price bs i)%:~R - (price bs' i)%:~R <= (value_per_click i)%:~R * (('ctr_ (sOi i))%:~R - ('ct
nat
来证明rat
中的一个非常类似的语句。开放范围环\u范围内的当前验证状态为
(price bs i - price bs' i <= tnth bs i * ('ctr_ (sOi i) - 'ctr_ (sOi i')))%N
→ (price bs i)%:~R - (price bs' i)%:~R <=
(value_per_click i)%:~R * (('ctr_ (sOi i))%:~R - ('ctr_ (sOi i'))%:~R)
我一直在尝试使用各种重写
,例如ler_nat
,PoszM
,intrM
,但没有太大成功。有谁能给我一些关于如何进行的提示吗
PS:我不能提供一个最低限度的工作示例,因为我没有完全掌握我在这里所做的;) 您可能已经注意到,从nat
到rat
有两种嵌入:首先从nat
到int
,然后从int
到rat
。后者是一个环态射,因此您可以使用一般态射定理,如rmorphM
和rmorphB
,在您的例子中,您可以从重写开始!rmorphB-rmorphM ler_int.
前一种嵌入(Posz:nat->int
)虽然不是环态射,但实际上仍然可以使用PoszM
(Posz
是乘法的),但主要问题是Posz(m-n)!=一般来说,poszm-poszn
(强制的无声插入使问题变得复杂)。因此,您似乎需要假设这两个(price bs'i正如你可能已经注意到的,从nat
到rat
有两个嵌入:首先从nat
到int
,然后从int
到rat
。后者是一个环态射,因此你可以在你身上使用一般的态射定理,比如rmorphM
和rmorphB
r情况下,您可以从重写开始
然而,前面的嵌入(Posz:nat->int
)并不是一个环态射,实际上你仍然可以使用PoszM
(Posz
是乘法的),但主要的问题是,Posz(m-n)!=PoszM-poszn
(强制的无声插入使问题变得复杂)。因此,您似乎需要假设这两个(price bs'i这就像一个符咒:谢谢,西里尔。我假设rmorph*
重写推断态射是强制函数。我猜我的思维定势也是一个错误,从nat
到rat
,而不是相反。这就像一个符咒:谢谢,西里尔。我假设rmorph*
r我推断态射是强制函数。我猜我的思维定势是从nat
到rat
,而不是相反。
forall
_ : is_true
(leq (subn (price bs i) (price bs' i))
(muln (@nat_of_ord p (@tnth n bid bs i))
(subn (@nat_of_ord q (@tnth k ctr cs (sOi i)))
(@nat_of_ord q (@tnth k ctr cs (sOi i')))))),
is_true
(@Order.le ring_display (Num.NumDomain.porderType rat_numDomainType)
(@GRing.add rat_ZmodType
(@intmul (GRing.Ring.zmodType rat_Ring) (GRing.one rat_Ring) (Posz (price bs i)))
(@GRing.opp rat_ZmodType
(@intmul (GRing.Ring.zmodType rat_Ring) (GRing.one rat_Ring) (Posz (price bs' i)))))
(@GRing.mul rat_Ring
(@intmul (GRing.Ring.zmodType rat_Ring) (GRing.one rat_Ring)
(Posz (value_per_click i)))
(@GRing.add (GRing.Ring.zmodType rat_Ring)
(@intmul (GRing.Ring.zmodType rat_Ring) (GRing.one rat_Ring)
(Posz (@nat_of_ord q (@tnth k ctr cs (sOi i)))))
(@GRing.opp (GRing.Ring.zmodType rat_Ring)
(@intmul (GRing.Ring.zmodType rat_Ring) (GRing.one rat_Ring)
(Posz (@nat_of_ord q (@tnth k ctr cs (sOi i')))))))))
Lemma test (p p' v c c' : nat) : (c' <= c)%N -> (p - p' <= v * (c - c'))%N ->
p%:~R - p'%:~R <= v%:~R * (c%:~R - c'%:~R) :> rat.
Proof.
rewrite leq_subLR => le_c'c le_pp'_vMcc'. (* Removing the first subn. *)
rewrite -!rmorphB -rmorphM ler_int. (* Changing rat goal into int goal. *)
by rewrite ler_subl_addl subzn. (* Changing int goal into nat goal. *)
(* The rest of the proof was actually carried out using conversion. *)
Qed.