Functional programming ode>和ys具有相同的长度。我们可以在引理中添加一个额外的假设,也可以使用长度索引列表。以下是一个可能的定义: Definition vec A n := {l : list A | length l = n}.

Functional programming ode>和ys具有相同的长度。我们可以在引理中添加一个额外的假设,也可以使用长度索引列表。以下是一个可能的定义: Definition vec A n := {l : list A | length l = n}.,functional-programming,coq,dependent-type,refinement-type,Functional Programming,Coq,Dependent Type,Refinement Type,{..|..}是Coq的求精符号或子集类型。然后,我们可以将一些函数重新打包到列表中,以处理vec。例如,我们可以显示map将vecan转换为vecbn。如果您不使用需要更改长度索引n的许多函数,这种方法是值得的,因为在这些情况下,您需要对类型上复杂长度表达式的相等性进行推理,而Coq并不擅长这一点。特别是对于vec,我建议您看看mathcomp的tuple库(可用),它提供了一个很好的示例,说明如何在规模上使用此模式 编辑 更多关于easy策略的信息: 调用策略代码以生成术语: 非常好的

{..|..}
是Coq的求精符号或子集类型。然后,我们可以将一些函数重新打包到列表中,以处理
vec
。例如,我们可以显示
map
vecan
转换为
vecbn
。如果您不使用需要更改长度索引
n
的许多函数,这种方法是值得的,因为在这些情况下,您需要对类型上复杂长度表达式的相等性进行推理,而Coq并不擅长这一点。特别是对于
vec
,我建议您看看mathcomp的
tuple
库(可用),它提供了一个很好的示例,说明如何在规模上使用此模式

编辑

  • 更多关于
    easy
    策略的信息:

  • 调用策略代码以生成术语:


非常好的解释,非常感谢!如果您有时间,可以链接到有关
ltac:(简单)
部分代码的文档吗?@fakedrake done!非常感谢,我很感激!非常好的解释,非常感谢!如果您有时间,可以链接到有关
ltac:(简单)
部分代码的文档吗?@fakedrake done!非常感谢,我很感激!
Require Import Coq.Lists.List.
Import ListNotations.

Fixpoint zip_pre {A B} (xs : list A) (ys : list B) : list (A * B) :=
  match xs, ys with
  | x :: xs, y :: ys => (x, y) :: zip_pre xs ys
  | _, _ => []
  end.

Definition zip {A B} (xs : list A) (ys : list B) (_ : length xs = length ys) :=
  zip_pre xs ys.
Fixpoint zip' {A B} (xs : list A) (ys : list B) :
    length xs = length ys -> list (A * B) :=
  match xs, ys with
  | x :: xs, y :: ys =>
    fun H : S (length xs) = S (length ys) =>
      (x, y) :: zip' xs ys ltac:(congruence)
  | [], [] => fun _ => []
  | x :: xs, [] => fun H : S (length xs) = 0 => ltac:(easy)
  | [], y :: ys => fun H : 0 = S (length ys) => ltac:(easy)
  end.
let xys := zip xs ys in
(map fst xys, map snd xys) = (xs, ys)
Definition vec A n := {l : list A | length l = n}.