放宽Coq严格的积极性检查器以不查看被定义的归纳类型的类型索引会不一致吗?

时间:2018-01-10 15:40:50

标签: coq

书写

Inductive Foo : Type -> Type :=
| foo : Foo Bar
with
Bar := .

给出

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

(旁白:如果相反,消除器是

,会出现什么问题
Fix_rect : forall (P : Fix -> Type) (v : forall f, (forall x, P x -> P (f x)) -> P (fFix f)) (f : Fix), P f

?)

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

1 个答案:

答案 0 :(得分:0)

与错误消息相反,这似乎不是一个积极性问题。相反,由于你有相互索引,这是一种归纳归纳型(一种奇怪的"大型#34;其中一种),而Coq并不支持。

您可以尝试定义非索引类型,并分离递归定义的"格式良好"编码正确索引的关系。 E. g。

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

这类似于你如何为类型理论或具有单独键入关系的外在预先语法索引内在语法。