Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq 在模块类型中指定极性_Coq - Fatal编程技术网

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

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在其定义中出现任何非严格正的情况。

这种
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).