Coq:添加隐式变量

时间:2015-04-23 14:20:26

标签: coq

假设我有一组函数,每个函数都可以依赖于一个或两个隐式变量A B: Type。我怎么指定这个?即将这些变量添加到它们的变量列表中并将它们设置为隐式变量。

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

我可以在一个部分或模块中包含所有函数并在开头编写Variables (A B: Type) etc,但这不会使变量隐含,我将不得不在部分末尾为所有函数手动设置参数。更糟糕的是,这将使所有变量共享。即如果我宣布

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只需要一个任意类型的家庭。

我可以制作一个部分并声明Context {A B: Type}。这将使这些变量隐含在所有函数中,但是像以前一样的共享问题仍将存在。因此,我必须随意将我的函数分成几个部分,以便我可以使用隐式参数的不同值来调用Sect.1中的函数。这很有效,但是很难看,而且我很容易想象每个部分必须有2-3个函数才能正常调用它们。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

有两件事你可以做的不那么困难:

Generalizable All Variables.

Definition g `(t: A -> Type) `(s: B -> Type) := G (f t) (f s).

现在您可以使用反引号,它会自动插入使定义有效所需的隐式变量。这是我引入隐含的最常见方式。

另一种方法是按照以下部分进行操作:

Arguments g : default implicits.

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