Coq 如何查找配对列表的长度

Coq 如何查找配对列表的长度,coq,Coq,我已经通过函数长度计算了列表的长度,现在我想找到natprod对列表的长度,并从列表中每对的第一个元素生成一个列表。我在计算pair列表的长度时遇到了一个问题,因为列表末尾没有nil/[]可用于终止循环。 澄清我观点的一个例子是[2,51,53,7]->[2,1,3]。 请引导我 Fixpoint length (l: natlist) : nat := match l with | [] => O | _ :: l' => S (length l') end. 每

我已经通过函数长度计算了列表的长度,现在我想找到natprod对列表的长度,并从列表中每对的第一个元素生成一个列表。我在计算pair列表的长度时遇到了一个问题,因为列表末尾没有nil/[]可用于终止循环。 澄清我观点的一个例子是[2,51,53,7]->[2,1,3]。 请引导我

Fixpoint length (l: natlist) : nat :=
  match l with
  | [] => O
  | _ :: l' => S (length l')
  end.
每个列表都有一个[],包括对的列表。 您不需要计算列表的长度,但是

你要找的是map函数。 基本上,映射f[x1;…;xn]是[fx1;…;fxn]。 它的类型将是map:forall{ab:type}f:A->bl:list A,list B。 或者如果你真的想坚持你的natprod、natlist等等: 映射:natprod->nat->list natprod->natlist


在您的例子中,您希望映射snd函数,该函数返回一对中的第二个元素:map snd l。

我希望以这种方式创建密钥列表,但存在错误消息Definition mymap:=list nat*V。Definition empty1:mymap:=nil。固定点查找1 x:key m:mymap:list nat:=将m与| a、v::al=>匹配,如果x=?a然后cons a nil else lookup x m | nil=>nil end。我在map中有一个对的列表,想要得到每个对的第一个元素的natlist。我只有很少的行代码,我不知道这有什么问题。Plz引导me定义t:=N。定义A:=类型。定义ad:=类型。定义键:=N。归纳图:=|M0:Map | M1:ad->A->Map | M2:Map->Map->Map。定义为空:ta:=m0a。@WinterhalterI添加了map函数。如果你想添加更多你所写的例子,请通过编辑你的原始文章来完成。谢谢你的建议,但我想解决上面映射函数中的错误,这样我就可以执行它了行定义为空:t A:=M0 A.gives error。
Fixpoint map {A B : Type} (f : A -> B) (l : list A) : list B :=
  match l with
  | [] => []
  | x :: l => f x :: map f l
  end.