放松Coq';s严格的正性检查程序,不查看定义的归纳类型的类型索引?

放松Coq';s严格的正性检查程序,不查看定义的归纳类型的类型索引?,coq,Coq,书写 给予 我知道为什么严格的积极性是必要的标准例子;如果我有 Error: Non strictly positive occurrence of "Bar" in "Foo Bar". 用消除器 Inductive Fix := | fFix : (Fix -> Fix) -> Fix. 然后我就可以证明荒谬了 Fix_rect : forall (P : Fix -> Type) (v : forall f, (forall x, P (f x)) -> P (

书写

给予

我知道为什么严格的积极性是必要的标准例子;如果我有

Error: Non strictly positive occurrence of "Bar" in "Foo Bar".
用消除器

Inductive Fix :=
| fFix : (Fix -> Fix) -> Fix.
然后我就可以证明荒谬了

Fix_rect : forall (P : Fix -> Type) (v : forall f, (forall x, P (f x)) -> P (fFix f)) (f : Fix), P f
(旁白:如果取而代之的是消除器,有什么问题吗

Fix_rect (fun _ => False) (fun f H => H (fFix id)) (fFix id) : False
?)


然而,我看不到一种方法来利用只出现在索引中的事件。如果在类型索引中允许出现非严格正的情况,是否有办法得出类似的矛盾?

这似乎不是一个正问题,与错误消息相反。相反,因为有相互索引,所以这是一种归纳类型(一种奇怪的“大”类型),Coq不支持这种类型

您可以尝试定义非索引类型,并分离递归定义的“格式良好”关系,这些关系编码正确的索引。例如

Fix_rect : forall (P : Fix -> Type) (v : forall f, (forall x, P x -> P (f x)) -> P (fFix f)) (f : Fix), P f
这类似于为类型理论的内在语法或具有单独类型关系的外在前语法编制索引的方式

Fix_rect : forall (P : Fix -> Type) (v : forall f, (forall x, P x -> P (f x)) -> P (fFix f)) (f : Fix), P f
Inductive PreFoo : Type :=
| foo : PreFoo.

Inductive Bar : Type :=.

Fixpoint FooWf (f : PreFoo) (t : Type) : Prop :=
  match f with
  | foo => (t = Bar)
  end.

Definition Foo (t : Type) := sig (fun f => FooWf f t).