在模块类型中指定极性

时间:2018-06-29 19:43:57

标签: coq

Coq接受以下U的归纳定义,因为它可以看出UM.T U -> U的出现严格为正。

Module M.

Definition T (A : Type) : Type := unit -> A.

End M.

Module N.

Inductive U : Type :=
| c : M.T U -> U.

End N.

另一方面,Coq不接受以下U的归纳定义,因为根据M.T的定义,它可能有非严格的正出现。

Module Type S.

Parameter T : Type -> Type.

End S.

Module N (M : S).

Fail Inductive U : Type :=
| c : M.T U -> U.

End N.

如何在签名S中指定T的参数应仅出现严格的负值?因此可以防止在其定义中任何非严格的U出现。

1 个答案:

答案 0 :(得分:0)

U类型可以看作M.T的最小固定点。另一个常见的编码是

Definition Mu (T : Type -> Type) := forall A, (T A -> A) -> A.
Definition U := Mu M.T.

提供了T是一个函子(严格的积极性可能暗示着?):

Parameter map : forall A B, (A -> B) -> T A -> T B. (* in module M *)

我们有一个构造函数和析构函数:

Definition c : M.T U -> U := fun x A f =>
   f (M.map _ _ (fun y => y _ f) x).

Definition d : U -> M.T U := fun y => y _ (fun x => M.map _ _ c x).

显示它们是逆的需要参数,因此没有直接的方法可以证明这一点。如果您不希望公理它,则可以充实TU来携带参数化证据。


从本质上讲,T是函子的上述要求是严格阳性条件的语义替换/近似,这是句法上的。


还可以使用此新插件关闭阳性检查:

https://github.com/SimonBoulier/TypingFlags