假设我有一个定义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*)
这有可能吗? 如果是,那么适当的语法是什么?
答案 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