Coq:添加隐式变量

Coq:添加隐式变量,coq,Coq,假设我有一组函数,每个函数都依赖于一个或两个隐式变量ab:Type。我如何指定这一点?即,将这些变量添加到其变量列表中,并将其设置为隐式 最明显的方法是将{ab:Type}添加到它们的定义中。然而,在现实生活和中等复杂的开发中,此类隐式的共享列表很容易有6-10个条目,并且包含复杂的类型,因此函数定义很难阅读,甚至更难理解它们的相似性或对所提到的类型进行更改。因此,此解决方案不适用 我可以在一个节或模块中包含所有函数,并在开始时编写变量(ab:Type)等,但这不会使变量隐式,我必须在节末手动设

假设我有一组函数,每个函数都依赖于一个或两个隐式变量
ab:Type
。我如何指定这一点?即,将这些变量添加到其变量列表中,并将其设置为隐式

最明显的方法是将
{ab:Type}
添加到它们的定义中。然而,在现实生活和中等复杂的开发中,此类隐式的共享列表很容易有6-10个条目,并且包含复杂的类型,因此函数定义很难阅读,甚至更难理解它们的相似性或对所提到的类型进行更改。因此,此解决方案不适用

我可以在一个节或模块中包含所有函数,并在开始时编写
变量(ab:Type)等
,但这不会使变量隐式,我必须在节末手动设置所有函数的参数。更糟糕的是,这将使所有变量共享。即如果我申报

Section sect.
  Variable A B: Type.

  Definition f (t: A -> Type) := (..).

  Definition g (t: A -> Type) (s: B -> Type) := G (f t) (f s).
End sect.
G
是一些双变量函数)则不接受
G
,因为
s
不在
A->Type
中,即使本质上
f
只需要任意类型族

我可以创建一个节并声明
上下文{ab:Type}
。这将使这些变量对所有函数都是隐式的,但像前面的例子一样,共享问题仍然存在。因此,我必须任意地将我的函数分成几个部分,这样我就可以使用不同的隐式参数值调用Sect.1中的函数。这是可行的,但很难看,我可以很容易地想象这样一种情况:每个部分都必须有2-3个函数长,这样我才能正确地调用它们


有更好的解决方案吗?

有两件事你可以做,难度更小:

Generalizable All Variables.

Definition g `(t: A -> Type) `(s: B -> Type) := G (f t) (f s).
现在可以使用backtick,它将自动插入使定义有效所需的隐式变量。这是我介绍隐式的最常见的方式

另一种方法是按照您的章节进行:

Arguments g : default implicits.

您需要对每个定义的术语重复此操作,但至少不需要命名所有参数。

我不确定是否理解共享问题。使用
Context{A:Type}
并同时声明
f
g
来获取
A->Type
参数会有什么问题?很抱歉,但我仍然感到困惑。难道你不能改变
G
的定义,让它也采用
A
参数化的类型,而不是
B
?我认为现在它应该可以正常工作了。Backtick的行为通常非常怪异。有时,它无法在看似应该的时候解析不合法的类型,原因是它依赖于绝对严格的解析。例如,如果某个类型变量出现多次,通常会假定它表示几种不同的类型。但是我想这是我能得到的最好的结果。是的,它把隐式放在论点顺序中的确切位置也会有问题。在这些情况下,您必须退回到显式隐式