Coq 在模块类型中指定极性
Coq接受以下关于Coq 在模块类型中指定极性,coq,Coq,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 : Ty
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在其定义中出现任何非严格正的情况。这种U
类型可被视为M.T
的最小不动点。另一种常见的编码是
Definition Mu (T : Type -> Type) := forall A, (T A -> A) -> A.
Definition U := Mu M.T.
假设T
是一个函子(严格正性可能意味着什么?)
我们有一个构造函数和析构函数:
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
是函子的上述要求是严格正性条件的语义替换/近似,这是句法上的
也可以使用此新插件关闭积极性检查:
Hmmm。。。这很有趣,但我不太确定它是否回答了我的问题。
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).