我有一个用Coq术语编写的“枚举”函数(它叫做什么?)。此函数使用起来很烦人,因为它要求在使用A
函数时显式提供l
(列表enumerate
中元素的类型)。有没有办法避免需要明确地将A
作为参数传递?
(* [a, b] -> [(0,a), (1,b)] *)
Fixpoint enumerate (A : Type) (l : list A) : list (nat * A) :=
let empty : (list (nat * A)) := nil in
let incr_pair xy := match xy with
| (x, y) => ((S x), y)
end in
match l with
| nil => empty
| (x :: xs) => (O, x) :: (map incr_pair (enumerate A xs))
end.
我希望能够写出类似
的内容Fixpoint enumerate (l : list A) : list (nat * A) := ...
可能还有一些额外的语法来确定A
到底是什么。
答案 0 :(得分:3)
将参数放在括号中以使其默认为隐式(请参阅第2.7.4节here)。此外,您应该使用nat
累加器以非二次方式编写此函数。
Require Import Lists.List.
Import ListNotations.
Fixpoint enumerate_from {A : Type} (n : nat) (l : list A) : list (nat * A) :=
match l with
| [] => []
| x :: xs => (n, x) :: enumerate_from (S n) xs
end.
Definition enumerate {A} l : list (nat * A) := enumerate_from 0 l.
Compute (enumerate [3; 4; 5]). (* prints [(0, 3); (1, 4); (2, 5)] *)