“ list_rec”的第一个输入何时不是常量函数?

蘑菇

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

安东·特鲁诺夫(Anton Trunov)

例如,我们可以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])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为特定组件创建意图时,何时“ this”不是构造函数的第一个参数?

当iterable不是函数的第一个参数时

为什么fputs()需要常量作为第一个参数而不是fputc()?

如何使 apply() 在函数的一个参数(不是第一个)中传递对象?

何时在GraphQL-resolver函数中使用“ parent”以及何时将“ root”用作第一个参数

仅返回列表的第一个输入但不继续输入的函数超出范围

如何从第一个输入标签的函数运行第二个输入标签的输入函数

函数求和与第一个值的3倍,而不是其他2个值

如何更新特定输入字段的值而不是td第一个孩子?

将参数初始化为构造函数,而不是第一个

整数错误(第一个输入参数必须是函数句柄。)

R c()“组合函数”,不通过第一个输入设置类

Matlab 集成拟合“linearinterp”返回错误“第一个输入参数必须是函数句柄”

函数只返回输入变量的第一个值

MATLAB-积分2-第一个输入参数必须是函数句柄

是否有类似lower_bound的函数返回最后一个值而不是第一个值?

List.IndexOf()-返回最后出现的索引,而不是第一个?

为什么我的程序要求输入2个符号而不是2个符号(忽略第一个符号)?

为什么我只将第一个输入导出到 .txt 文件而不是所有输入?

根据第一个ajax函数的输入触发第二个ajax函数

以第一个值不是数字滚动窗口

R - 条件标签,但不是第一个

不是:第一个孩子选择器

选择第一个合并值,而不是全部

第一个参数不是开放的RODBC通道

onCreate 不是第一个事件

如果不是第一个,则设置日期列

防止删除第一个输入行

Javascript仅验证我的第一个输入