Gallina中有没有任何无效但有效的术语?

时间:2018-06-03 04:23:42

标签: types coq

我认为Gallina langauage的每个有效术语都有相关的类型。 但有没有任何术语,Coq接受,而不是键入?

这主要是关于一些翻译事物,但(我认为)也是一个值得思考的事情。

2 个答案:

答案 0 :(得分:4)

正如Yves和Gallais所说,除了系统中的错误外,Coq接受的每个Gallina术语都有一种类型。这几乎是定义;要说Coq接受一个词t就是说Check t没有失败,我们可以发现Check t将始终打印一种t。现在,可能是由Check t本身打印的类型是错误的类型,但这又是一个系统中的错误,我从未见过它(只要符号不在&# 39;妨碍印刷的可逆性。

但是,有一些事情与您提出的问题很接近,您可能会感兴趣。

<强>宇宙

在Coq,我们可以写

Universe i.
Check Type@{i}.

但是,虽然i是有效的Universe,但Check i失败,i在Gallina术语具有类型的意义上没有类型。

请注意,在Agda中,我们可能会写

postulate foo : (i : Level) → Set i

并且Agda检查员接受了,但如果我们写

bar = (i : Level) → Set i

我们收到错误消息Setω is not a valid type。 Coq没有这个问题,因为Universe不是Coq中的术语,Coq中的Universe多态是prenex。

主题减少的丢失

Coq有一些极端情况(可能也称为错误),其中主题减少丢失。也就是说,当你减少它们时,有一些类型很好的术语变得不合适。例如,请参阅bug #6768,其中提供了代码

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 : TypeB : A -> Type的情况下,您可能希望记下类型为

的术语f的类型
forall b : bool, if b then A else B (f true)

当然,Coq不接受这一点,但我们可以定义具有此类型的术语。例如,给定ABx : @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}.

然而,没有办法陈述这个定理。我只能写

Theorem funext_downward_closed : funext -> funext.

我仍然设法证明了这个定理(参见this commit库中的this committhis issueHoTT/HoTT),但是,记下证明词,并检查之后的定理,看宇宙约束是否正确。我开玩笑说我已经证明了一个无法形容的定理。

答案 1 :(得分:1)

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