如何在Coq中明确提供隐式参数?

时间:2017-12-18 18:33:21

标签: coq

假设我有一个定义f : x -> y -> z,其中x可以很容易地推断出来。 因此,我选择使用x使Arguments成为隐式参数。

考虑以下示例:

Definition id : forall (S : Set), S -> S :=
fun S s => s.

Arguments id {_} s.

Check (id 1).

显然,S = nat可以由Coq推断,而Coq回复:

id 1
     : nat

但是,稍后,我想明确隐含参数,例如,为了便于阅读。

换句话说,我想要像:

Definition foo :=
 id {nat} 1. (* We want to make it clear that the 2nd argument is nat*)

这有可能吗? 如果是,那么适当的语法是什么?

2 个答案:

答案 0 :(得分:6)

您可以在@前添加名称以删除所有含义并明确提供:

Check @id nat 1.

您还可以使用(a:=v)按名称传递隐式参数。这既可以澄清传递的参数,也可以传递一些含义,而不会将_传递给其他参数:

Check id (S:=nat) 1.

Definition third {A B C:Type} (a:A) (b:B) (c:C) := c.
Check third (B:=nat) (A:=unit) tt 1 2.

答案 1 :(得分:2)

一种可能的方法是将@添加到定义中。 例如:

Definition id : forall (S : Set), S -> S :=
fun S s => s.

Arguments id {_} s.

Check @id nat 1.

结果是:

id 1
     : nat