Maps 字符串映射和外接程序Coq

Maps 字符串映射和外接程序Coq,maps,add,coq,Maps,Add,Coq,在我的证明中,我达到了一个类似以下的目标:(实际的类型是不同的(zm:StringMap.string.string,key和elt是string.string))。在我的代码中,如果我在环境中有H:z1kz2k,那么通过直觉一致性很容易,但是如果我没有这样的假设,那么我就无法证明我的目标。此外,我也不能证明v1=v2,这有助于证明目标。如果有人指导我解决这种情况,请告诉我。谢谢 Parameter t : Type -> Type. Variable key : Type. Variab

在我的证明中,我达到了一个类似以下的目标:(实际的类型是不同的(zm:StringMap.string.string,key和elt是string.string))。在我的代码中,如果我在环境中有
H:z1kz2k
,那么通过
直觉一致性很容易,但是如果我没有这样的假设,那么我就无法证明我的目标。此外,我也不能证明v1=v2,这有助于证明目标。如果有人指导我解决这种情况,请告诉我。谢谢

Parameter t : Type -> Type.
Variable key : Type.
Variable elt : Type.
Implicit Type m: t elt.
Implicit Type x y z: key.
Implicit Type e: elt.

Require String.

Record id : Type :=
build_id {
         id_v : String.string;
         id_k: key
        }.

Parameter add : key -> elt -> t elt -> t elt.
Parameter MapsTo : key -> elt -> t elt -> Prop.

Lemma MyTest: forall v1 v2 (z1k z2k zk: key) (ze z1 z2: elt) zm, 
build_id v1 z1k <> build_id v2 z2k ->
MapsTo zk ze (add z1k z1 (add z2k z2 zm)) -> 
MapsTo zk ze (add z2k z2 (add z1k z1 zm)).
Proof.
参数t:Type->Type。
变量键:类型。
变量elt:类型。
隐式类型m:t英语。
隐式类型x y z:key。
隐式e型:英语教学。
需要字符串。
记录id:类型:=
生成id{
id_v:String.String;
身份证:钥匙
}.
参数添加:按键->英语教学->英语教学->英语教学。
参数映射到:键->elt->t elt->道具。
引理MyTest:forall v1 v2(z1k z2k zk:key)(ze z1 z2:elt)zm,
构建id v1 z1k构建id v2 z2k->
MapsTo zk ze(添加z1k z1(添加z2k z2 zm))->
映射到zk ze(添加z2k z2(添加z1k z1 zm))。
证据

是否可以假定
键上的可判定相等?然后,您可以通过案例分析进一步了解记录元素是否成对相等。例如,使用Adam Chlipala的CPDT策略,我得到以下结果:

Add LoadPath "~/dev/cpdt/src".

Require String.    
Require Import CpdtTactics.

Variable key : Type.    

Record id : Type := build_id {    
  id_v : String.string;    
  id_k : key    
}.

Axiom key_dec : forall a b : key, {a = b} + {a <> b}.

Lemma unpack_build_id_ineq : forall a b x y, build_id a x <> build_id b y ->    
  (a <> b) \/ (x <> y).    
Proof.    
  intros.    
  set (H1 := String.string_dec a b).    
  set (H2 := key_dec x y).    
  crush.    
Qed.
添加加载路径“~/dev/cpdt/src”。
需要字符串。
需要导入CPDT策略。
变量键:类型。
记录id:Type:=生成id{
id_v:String.String;
身份证:钥匙
}.
公理key_dec:forall ab:key,{a=b}+{ab}。
引理解包\u build\u id\u ineq:forall a b x y,build\u id a x build\u id b y->
(a b)\/(x y)。
证据
介绍。
设置(H1:=String.String\u dec a b)。
设置(H2:=键_dec x y)。
压坏
Qed。
换句话说,假设两个记录不相等,则有两种情况:
id\u v
id\u k
组件不相等。希望这有帮助


免责声明:我是Coq的初学者,我希望您在这里获得更多合格的帮助,或者您也可以尝试Coq俱乐部的邮件列表。

如果
v1 v2
但是
z1k=z2k
z1 z2
呢?另外,你能列出适用于
add
MapsTo
的定理吗?我想你有一些类似mapstoke(add u v s)->mapstokes\/(k=u/\e=v)?如果我在这方面给出了一个问题的详细版本来解决这个问题,我们需要
id\uk1id\uk2
,或者
id\uv1=id\uv2
。我尝试了你的建议,但当
id\u v1 id\u v2
时,我无法解决这个问题。下面是问题的详细版本。谢谢