Coq 从Nat到Rat的证据翻译

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

我试图用一个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 - ('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.