gpt4 book ai didi

coq - `list_rec` 的第一个输入什么时候不是常量函数?

转载 作者:行者123 更新时间:2023-12-04 13:40:33 24 4
gpt4 key购买 nike

list_rec 函数具有以下类型:

list_rec
: forall (A : Type) (P : list A -> Set),
P nil ->
(forall (a : A) (l : list A), P l -> P (a :: l)%list) ->
forall l : list A, P l

在我提出的所有示例中,P 只是一个忽略输入列表并无论如何返回相同类型的常量函数。例如,P 可能是 fun _ : list A => natfun _ : list A => list B。使 P 的输出依赖于输入的一些用例是什么?为什么 P 的类型 list A -> Set 而不是 Set

最佳答案

例如,我们可以使用 list_rec 和非常量 P 函数来实现将列表转换为向量(长度索引列表)的函数.

Require List Vector.
Import List.ListNotations Vector.VectorNotations.
Set Implicit Arguments.

Section VecExample.
Variable A : Set.
Definition P (xs : list A) : Set := Vector.t A (length xs).

Definition list_to_vector : forall xs : list A, Vector.t A (length xs) :=
list_rec P [] (fun x _ vtail => x :: vtail).
End VecExample.

您可以将它与 Vector.of_list 的标准定义进行比较函数,它的作用完全相同(t 在以下代码中表示 Vector.t),使用显式递归而不是将其隐藏在递归原则后面:

Fixpoint of_list {A} (l : list A) : t A (length l) :=
match l as l' return t A (length l') with
|Datatypes.nil => []
|(h :: tail)%list => (h :: (of_list tail))
end.

一个简单的测试:

Eval compute in list_to_vector [1;2;3].
Eval compute in Vector.of_list [1;2;3].

两个函数调用返回相同的结果:

= [1; 2; 3]
: Vector.t nat (length [1; 2; 3])

关于coq - `list_rec` 的第一个输入什么时候不是常量函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41411940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com