为什么我不能在Coq中使用`app`和`fol​​d_right`?

时间:2016-10-06 18:40:35

标签: coq

我在以下程序的最后一行收到类型错误:

Require Import List.
Import ListNotations.

(* This computes to 10 *)
Compute (fold_right plus 0 [1;2;3;4]).

(* I want this to compute to [5;6;7;8] but it gives a type error instead *)
Compute (fold_right app [] [[5;6]; [7;8]]).

这是我得到的错误:

Error:
The term "app" has type "forall A : Type, list A -> list A -> list A" while it is expected to have type
 "Type -> ?A -> ?A" (cannot instantiate "?A" because "A" is not in its scope).

我真的不明白为什么我会收到这个错误。 appplus之间的区别是什么?在app是单态plus函数时,它是否与nat -> nat -> nat具有多态性有关吗?

如果重要,我的Coq版本是8.5。

1 个答案:

答案 0 :(得分:6)

你猜对了:它确实与app具有多态性有关。问题是Coq允许根据相应的术语是否应用于参数来推断隐式参数。更确切地说,非最大含义仅在术语应用于某些内容时插入,但如果该术语单独使用(例如app)则不插入。有两种方法可以解决这种情况:

1-强制Coq为该实例推断某些内容,如fold_right (@app _) [] [[5; 6]; [7; 8]]

2-使用一个全局声明,使最大限度地插入类型参数:Arguments app {_} _ _.。有关这方面的详细信息,请查看reference manual