Coq接受以下U
的归纳定义,因为它可以看出U
中M.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出现。
答案 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).
显示它们是逆的需要参数,因此没有直接的方法可以证明这一点。如果您不希望公理它,则可以充实T
和U
来携带参数化证据。
从本质上讲,T
是函子的上述要求是严格阳性条件的语义替换/近似,这是句法上的。
还可以使用此新插件关闭阳性检查: