Types 关于Coq的HoTT变体语法的教程

Types 关于Coq的HoTT变体语法的教程,types,coq,homotopy-type-theory,Types,Coq,Homotopy Type Theory,我想学习Coq的同伦类型理论(HoTT)变体。我正在浏览网站,我已经安装了Coq的变体,我想玩一下,写下这本书的例子,等等。。。但是我找不到解释基本语法的pdf/html文件。当我在hoqide(coqide的HoTT变体)中尝试时,这段代码 Require Import HoTT. Inductive circle:Type1 := | ZERO : circle | loop : ZERO = ZERO. 我得到错误“error:reference ZERO未在当前环境中找到”。我想我没有

我想学习Coq的同伦类型理论(HoTT)变体。我正在浏览网站,我已经安装了Coq的变体,我想玩一下,写下这本书的例子,等等。。。但是我找不到解释基本语法的pdf/html文件。当我在hoqide(coqide的HoTT变体)中尝试时,这段代码

Require Import HoTT.
Inductive circle:Type1 := | ZERO : circle | loop : ZERO = ZERO.
我得到错误“error:reference ZERO未在当前环境中找到”。我想我没有加载足够的库,或者
ZERO=ZERO
不是从零到自身的路径类型的正确表示法。
在博客中,也使用了
ZERO~~>ZERO
路径ZERO
,但它们在这里不起作用。我在哪里可以找到一个教程开始?

我不知道您正在寻找的样式中有任何教程,但据我所知,HoTT并没有真正改变Coq中归纳类型的语法。相反,除了公理之外,他们还使用一种称为私有归纳类型的特性来定义更高的归纳类型,同时保持一致性。例如,请参见HoTT库本身中的操作

我不熟悉启用HoTT的Coq变体,但是当您定义一个像
circle
这样的归纳类型时,您的所有构造函数都必须实际构造该类型的元素。你不会写字

Inductive mytype : Type :=
  | foo1 : mytype        (* ok *)
  | foo2 : nat -> mytype (* ok *)
  | foo3 : nat -> False  (* urk! Not ok. *)
  | foo3 : nat -> 0 = 1  (* urk! Not ok. *)
  .
否则,逻辑很快就会变得不一致。现在,你可能认为既然
ZERO=ZERO
是一个定理,假设存在的证明是无害的,但是Coq不能自动实现这一点。此外,这样的证明肯定不是
ZERO
的构造函数。也许更好的选择是使用

Variable foo3 : ZERO = ZERO .
或者一个类似的命令(
Axiom,假说,
)。

有一个命令允许大致类似的语法。例如,请参见:

唉,这个版本的Coq自2015年末以来一直没有更新过,当前版本的Coq中也没有这种本机支持

更高归纳类型的编码方式是随着私人归纳的扩展。例如,我们可以看到:

Module Export Circle.

Private Inductive S1 : Type1 :=
| base : S1.

Axiom loop : base = base.

Definition S1_ind (P : S1 -> Type) (b : P base) (l : loop # b = b)
  : forall (x:S1), P x
  := fun x => match x with base => fun _ => b end l.

Axiom S1_ind_beta_loop
  : forall (P : S1 -> Type) (b : P base) (l : loop # b = b),
  apD (S1_ind P b l) loop = l.

End Circle.
关键字告诉Coq在当前模块外禁用模式匹配;这允许我们强制用户仅使用给定模块中定义的消除/归纳原则。然后,我们对路径构造函数进行公理化,对其计算规则进行公理化,并定义消除器。请注意,消除器必须在其主体中使用path参数(
l:loop#b=b
),否则Coq将假定作为该参数传递的内容无关紧要

~~~~~

在哪里可以找到教程开始


我目前还不知道有任何这样的教程,但我可能会建议看一下HoTT书籍/练习和HoTT/HoTT库之间的链接。看看这些定理和练习是如何陈述和证明的可能是有用的(并且可以自由地为尚未与任何内容关联的问题/定理提供您自己的解决方案/证明!)。

OK。我改变问题。如何定义具有基点的圆和具有路径类型的循环。这段代码需要导入HoTT。专用感应S1:Type1:=|基准:S1 |回路:基准=基准。给出错误消息error:构造函数循环的类型无效;一定是“S1”。@PhilippeGaucher很抱歉错过了这个;这是我在HoTT邮件列表中找到的关于这个主题的一个例子。上面假设ZERO=ZERO是从零到零的路径类型,而不是一个定理。这就是为什么我问这个问题:语法是什么?我仍然不知道答案。HoTT中的高感应类型由一些点和路径以及高维路径自由生成。这在标准Coq中确实不存在。
Module Export Circle.

Private Inductive S1 : Type1 :=
| base : S1.

Axiom loop : base = base.

Definition S1_ind (P : S1 -> Type) (b : P base) (l : loop # b = b)
  : forall (x:S1), P x
  := fun x => match x with base => fun _ => b end l.

Axiom S1_ind_beta_loop
  : forall (P : S1 -> Type) (b : P base) (l : loop # b = b),
  apD (S1_ind P b l) loop = l.

End Circle.