Types Gallina中是否有任何非类型但有效的术语?

Types Gallina中是否有任何非类型但有效的术语?,types,coq,Types,Coq,我认为每一个有效的术语都有一个相关的类型。 但是,有没有一个术语是Coq接受的,而不是打字的 这主要是关于一些翻译的东西,但(我认为)也是一件有趣的事情。不,微积分的每个术语都必须是好的类型。不,微积分的每个术语都必须是好的类型。正如Yves和gallais所说,除了系统中的bug,Coq接受的每个Gallina术语都有一个类型。这几乎是定义上的;Coq接受术语t就是说Check t没有失败,我们可以观察到Check t总是打印一种t。现在,可能是由于Check t本身打印的类型不正确,但这也是

我认为每一个有效的术语都有一个相关的类型。 但是,有没有一个术语是Coq接受的,而不是打字的


这主要是关于一些翻译的东西,但(我认为)也是一件有趣的事情。不,微积分的每个术语都必须是好的类型。

不,微积分的每个术语都必须是好的类型。

正如Yves和gallais所说,除了系统中的bug,Coq接受的每个Gallina术语都有一个类型。这几乎是定义上的;Coq接受术语
t
就是说
Check t
没有失败,我们可以观察到
Check t
总是打印一种
t
。现在,可能是由于
Check t
本身打印的类型不正确,但这也是系统中的一个缺陷,我从未见过这种情况发生(只要符号不妨碍打印的可逆性)

然而,有两件事与你的要求很接近,你可能会感兴趣

宇宙

在Coq中,我们可以写

Universe i.
Check Type@{i}.
postulate foo : (i : Level) → Set i
然而,尽管
i
是一个有效的宇宙,
Check i
失败,并且
i
没有一个类型,即Gallina术语有类型

请注意,在Agda中,我们可以编写

Universe i.
Check Type@{i}.
postulate foo : (i : Level) → Set i
Agda检查人员接受这一点,但如果我们写

bar = (i : Level) → Set i
我们得到错误消息
Setω不是有效类型
。Coq没有这个问题,因为Coq中的宇宙不是术语,Coq中的宇宙多态性是prenex

主题减少的损失

Coq有一些角落案例(可能也被称为bug),其中主题减少丢失了。也就是说,有些类型良好的术语在减少它们时会变得不正确。例如,请参见,其中给出了代码

CoInductive I := C : I -> I.
CoFixpoint infty := C infty.
Definition unfold : infty = C infty :=
  match infty as x return match x with C n => x = C n end with
  | C n => eq_refl (C n)
  end.
Fail Definition nf_unfold : infty = C infty := Eval lazy in unfold.
请注意,即使没有类型注释,我们也会出现这样的错误,例如

Axiom id : forall {T}, T -> T.
Definition nf_unfold := Eval lazy in id unfold.
(*Error: Illegal application:
The term "@id" of type "forall T : Type, T -> T"
cannot be applied to the terms
 "(cofix infty : I := C infty) = C (cofix infty : I := C infty)" : "Prop"
 "eq_refl"
   : "C (cofix infty : I := C infty) = C (cofix infty : I := C infty)"
The 2nd term has type
 "C (cofix infty : I := C infty) = C (cofix infty : I := C infty)"
which should be coercible to
 "(cofix infty : I := C infty) = C (cofix infty : I := C infty)".
*)
这并不完全是你要问的,但它似乎是相关的

自指类型

所有术语都有类型,但并非所有术语都有您想要的类型。例如,给定
A:Type
B:A->Type
,您可能希望写下具有类型的术语
f

forall b : bool, if b then A else B (f true)
当然,Coq不接受这一点,但我们可以定义具有这种类型的术语。例如,给定
A
B
x:@sigT A B
,Coq接受

Definition f := fun b : bool => if b return if b then _ else _
                                then projT1 x else projT2 x.
Check f : forall b : bool, if b then A else B (f true).
无法陈述的定理的证明

在Coq有显式宇宙变量之前,我想证明函数的可扩展性是向下闭合的。也就是说,我想证明这个定理

Set Universe Polymorphism.
Definition funext_at@{i} := forall (A B : Type@{i}) (f g : A -> B),
    (forall x, f x = g x) -> f = g.
Universes i j.
Constraint j <= i.
Theorem funext_downward_closed : funext_at@{i} -> funext_at@{j}.

尽管如此,我还是设法证明了这个定理(参见和,在图书馆中),写下证明项,然后检查定理,看看宇宙约束是否正确。我开玩笑地说,我已经证明了一个无法言喻的定理。

正如Yves和gallais所说,除了系统中的bug,Coq接受的每个Gallina术语都有一个类型。这几乎是定义上的;Coq接受术语
t
就是说
Check t
没有失败,我们可以观察到
Check t
总是打印一种
t
。现在,可能是由于
Check t
本身打印的类型不正确,但这也是系统中的一个缺陷,我从未见过这种情况发生(只要符号不妨碍打印的可逆性)

然而,有两件事与你的要求很接近,你可能会感兴趣

宇宙

在Coq中,我们可以写

Universe i.
Check Type@{i}.
postulate foo : (i : Level) → Set i
然而,尽管
i
是一个有效的宇宙,
Check i
失败,并且
i
没有一个类型,即Gallina术语有类型

请注意,在Agda中,我们可以编写

Universe i.
Check Type@{i}.
postulate foo : (i : Level) → Set i
Agda检查人员接受这一点,但如果我们写

bar = (i : Level) → Set i
我们得到错误消息
Setω不是有效类型
。Coq没有这个问题,因为Coq中的宇宙不是术语,Coq中的宇宙多态性是prenex

主题减少的损失

Coq有一些角落案例(可能也被称为bug),其中主题减少丢失了。也就是说,有些类型良好的术语在减少它们时会变得不正确。例如,请参见,其中给出了代码

CoInductive I := C : I -> I.
CoFixpoint infty := C infty.
Definition unfold : infty = C infty :=
  match infty as x return match x with C n => x = C n end with
  | C n => eq_refl (C n)
  end.
Fail Definition nf_unfold : infty = C infty := Eval lazy in unfold.
请注意,即使没有类型注释,我们也会出现这样的错误,例如

Axiom id : forall {T}, T -> T.
Definition nf_unfold := Eval lazy in id unfold.
(*Error: Illegal application:
The term "@id" of type "forall T : Type, T -> T"
cannot be applied to the terms
 "(cofix infty : I := C infty) = C (cofix infty : I := C infty)" : "Prop"
 "eq_refl"
   : "C (cofix infty : I := C infty) = C (cofix infty : I := C infty)"
The 2nd term has type
 "C (cofix infty : I := C infty) = C (cofix infty : I := C infty)"
which should be coercible to
 "(cofix infty : I := C infty) = C (cofix infty : I := C infty)".
*)
这并不完全是你要问的,但它似乎是相关的

自指类型

所有术语都有类型,但并非所有术语都有您想要的类型。例如,给定
A:Type
B:A->Type
,您可能希望写下具有类型的术语
f

forall b : bool, if b then A else B (f true)
当然,Coq不接受这一点,但我们可以定义具有这种类型的术语。例如,给定
A
B
x:@sigT A B
,Coq接受

Definition f := fun b : bool => if b return if b then _ else _
                                then projT1 x else projT2 x.
Check f : forall b : bool, if b then A else B (f true).
无法陈述的定理的证明

在Coq有显式宇宙变量之前,我想证明函数的可扩展性是向下闭合的。也就是说,我想证明这个定理

Set Universe Polymorphism.
Definition funext_at@{i} := forall (A B : Type@{i}) (f g : A -> B),
    (forall x, f x = g x) -> f = g.
Universes i j.
Constraint j <= i.
Theorem funext_downward_closed : funext_at@{i} -> funext_at@{j}.

尽管如此,我还是设法证明了这个定理(参见和,在图书馆中),写下证明项,然后检查定理,看看宇宙约束是否正确。我开玩笑地说,我已经证明了一个无法描述的定理。

那将是软件中的一个缺陷。@gallais我很高兴得出结论,无效术语是非类型术语,非类型术语都是无效的。但准确地说,有什么例外吗?那将是软件中的一个缺陷。@gallais我很高兴地得出结论,无效术语是非类型术语,非类型术语