Coq 为示例提供节参数

Coq 为示例提供节参数,coq,Coq,考虑这一节: Section MyMap. Variables D R : Type. Fixpoint mymap (f : D -> R) (l : list D) : list R := match l with | nil => nil | d :: t => f d :: mymap f t end. End MyMap. 在这里,我使用了变量来声明我的域和范围类型。作为对我的函数定义的合理性检查,我想包括一个示例: Example examp

考虑这一节:

Section MyMap.

Variables D R : Type.

Fixpoint mymap (f : D -> R) (l : list D) : list R :=
  match l with
  | nil => nil
  | d :: t => f d :: mymap f t
  end.

End MyMap.
在这里,我使用了
变量
来声明我的域和范围类型。作为对我的函数定义的合理性检查,我想包括一个
示例

Example example_map_S : mymap S [0; 1; 2] = [1; 2; 3].
Proof.
  simpl; trivial.
Qed.
然而,似乎我不能在我的区域内这样做。相反,我得到:

Error: The term "S" has type "nat -> nat" while it is expected to have type "D -> R".
这并不奇怪,让我们换一种方式试试:

Example example_map_S : @mymap nat nat S [0; 1; 2] = [1; 2; 3].
Proof.
  simpl; trivial.
Qed.
产生:

Error: The term "nat" has type "Set" while it is expected to have type "D -> R".
我想这是公平的,变量与隐式参数不是一回事。但问题仍然存在

在结束本节之前,如何向术语提供具体的
变量
,以便创建有用的
示例

Section MyMap.
...
如果我们在节中检查
mymap
的类型,就会得到

Check mymap.
(* mymap : (D -> R) -> list D -> list R *)
当然,我们不能将
D
R
nat
统一起来,因为
D
R
是一些局部假定的类型

但是,我们可以在这个通用设置中模拟您的示例,显示
mymap
函数的预期属性:

Example example_nil (f : D -> R) :
  mymap f [] = [] := eq_refl.

Example example_3elems (f : D -> R) (d0 d1 d2 : D) :
  mymap f [d0; d1; d2] = [f d0; f d1; f d2] := eq_refl.

End MyMap.

恐怕你不能。您必须先关闭该部分,以获取要lambda-lifted.Boooooo的
参数。这显然不是一个大问题,但是将我的示例远离它们的定义会损害它们的有用性。顺便说一句,我认为您需要
变量
而不是
参数
,因为
参数
Axiom
的另一个名称。关闭部分并发出
checkmymap.
命令后,可以看到差异。实际上,使它们隐式化是
Context{rss:Type}.
,但这不必要地使问题复杂化。