为示例提供节参数

时间:2017-02-02 07:34:46

标签: 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.

这里我使用Variables来声明我的域名和范围类型。作为对我的函数定义的完整性检查,我想包含Example

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

我认为这是公平的,分段化的Variables与隐式参数不同。但它仍然存在问题!

如何在关闭该部分之前为术语提供具体的Variables,以便创建有用的Examples

1 个答案:

答案 0 :(得分:4)

Section MyMap.
...

如果我们在部分检查mymap 的类型,我们就会

Check mymap.
(* mymap : (D -> R) -> list D -> list R *)

当然,我们无法将DRnat统一起来,因为DR是一些本地假定的类型。

但是,我们可以在此通用设置中模拟您的示例,显示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.