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}.