“嵌套”匹配的正确实例

时间:2018-06-22 13:26:51

标签: coq coq-tactic

我有一个FnEquivInner f g形式的引理 outer t (bind t f) === outer t (bind t g)(完整示例在下面发布)。

我想了解我需要为Proper写什么样的outer实例,以便在这种情况下可以执行rewrite,用{{替换f 1 {}中的1}}。

一般来说,如何写g实例不是很简单的实例?

outer

1 个答案:

答案 0 :(得分:3)

如果先Set Typeclasses Debug.然后try setoid_rewrite EQUIVINNER,然后查找包含looking for的行,这些行紧接在提到proper_subrelation的行之前,您将看到

Debug: 1.1-1: looking for (Proper (?R ==> FnEquivInner ==> ?r) bind) with backtracking
Debug: 1.1-1.2-2.1-1: looking for (Proper (?R --> FnEquivInner --> Basics.flip ?r) bind) with backtracking
Debug: 1.3-2.1-1: looking for (Proper (FnEquivInner --> Basics.flip ?r) (bind t)) with backtracking

这基本上是Proper实例的列表,您可以添加这些实例以进行setoid_rewrite的类型分类解析。

例如,如果我写

Global Instance: Proper (eq ==> FnEquivInner ==> eq) bind. Admitted.

然后setoid_rewrite完成。

不过,我认为您会想要类似的东西

Global Instance bind_Proper : Proper (eq ==> FnEquivInner ==> FnEquivInner) bind. Admitted.

如果我写这个,那么setoid_rewrite会失败。让我们再次浏览类型分类日志,这一次是在应用bind_Proper之后寻找解析出问题的地方。遵循与上述相同的规则,我们看到符合上述条件的第一行是

Debug: 2.1-1: looking for (Proper (?R ==> FnEquivInner ==> ?r) outer) with backtracking

如果我添加

Global Instance outer_Proper: Proper (eq ==> FnEquivInner ==> equiv) outer. Admitted.

然后setoid_rewrite再次通过。

请注意,您需要使用自己想要的任何反身关系来填写?前缀的关系(?R?r等)。


您可能会问:“这种黑魔法为什么起作用?”答案是proper_subrelation是Coq通常出错的地方。这大致意味着:“我的数据库中没有与您要查找的内容匹配的东西;让我盲目尝试数据库中的所有内容,看看它们是否足够接近可以工作。” *(其中“足够接近”的意思是因此,我们寻找Coq在搜索中出了差错的地方,我们在此之前立即查看了它的内容。 (partial_application_tactic通常有很多步骤,这些函数剥去了函数中的参数;这就是为什么对于Proper只需要一个bind实例,而对于bind t只需要一个{} fun t => bind t f的另一个。)

*有时这实际上是有用的,因为eq是每个自反关系的子关系,因此当您仅使用eq时就可以避免不输入关系。但是大多数时候,proper_subrelation并不是您想要的。