Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Coq中使用HoTT路径诱导?_Coq_Type Theory - Fatal编程技术网

如何在Coq中使用HoTT路径诱导?

如何在Coq中使用HoTT路径诱导?,coq,type-theory,Coq,Type Theory,因为我有 Definition f (s:Unit) : tt=tt := match s with tt => idpath end. Definition g (p:tt=tt) : Unit := match p with idpath => tt end. 我想为所有(p:tt=tt),(f o g)p=p证明 我想使用霍特书中1.12.1中描述的路径归纳法来实现它 显然,对于p为idpath的情况,我们可以证明 assert( (f o g) idpath = idpat

因为我有

Definition f (s:Unit) : tt=tt := match s with tt => idpath end.
Definition g (p:tt=tt) : Unit := match p with idpath => tt end.
我想为所有(p:tt=tt),(f o g)p=p证明

我想使用霍特书中1.12.1中描述的路径归纳法来实现它

显然,对于
p
idpath
的情况,我们可以证明

assert( (f o g) idpath = idpath).
simpl.
reflexivity.
但是我如何在Coq中使用路径归纳来将整个证明打包在一起呢

到目前为止的全部证据:(用什么代替
承认
?)


Coq中路径诱导的模拟是
匹配
结构。下面是我们如何使用它来定义(基于)路径归纳,如HoTT手册中所述

Set Implicit Arguments.

Definition J {A} {x : A} (P : forall y, x = y -> Type)
                 (H : P x eq_refl) : forall y p, P y p :=
  fun y p => match p with eq_refl => H end.
这个定义的类型表示,每当我们想证明
pyp
,其中

  • y:A
  • p:x=y
    ,以及
  • P:forall y,x=y->Type
它足以表明
pxeq\u refl
成立。我们可以使用
J
来表示
g
函数是常数。(我已经对定义进行了重新表述,以与Coq标准库给出的定义相匹配。)

这个证明的棘手部分是找出
J
p
参数应该是什么,这也是通过路径归纳进行的其他证明的情况。在这里,我必须展开
g
的定义,因为它需要类型为
tt=tt
的参数,而上面使用的
q
具有类型
tt=y
。在任何情况下,您都可以看到
pttp
定义上等于
gp=tt
,这就是我们想要证明的

我们可以玩一个小把戏来证明,对于任何
p:tt=tt
,p=eq\u refl
。结合前面的结果,它将给出您想要的结果

Definition result (p : tt = tt) : p = eq_refl :=
  J (fun y q =>
       unit_rect (fun z => tt = z -> Prop)
                 (fun u => u = eq_refl)
                 y q)
    eq_refl p.
同样,关键是
p
参数。我们利用
unit
的归纳原理,即只要我们能找到
ttt
的元素,就可以定义类型为
tx
(对于
T:unit->type
x:tt
)的东西。回想一下,应用
J
的结果应该具有类型

P tt p
在这种情况下,这只是

unit_rect (fun z => tt = z -> Prop)
          (fun u => u = eq_refl)
          tt p
= (p = eq_refl)
根据
unit_rect
的计算规则

不幸的是,这种证明很难用Coq的策略语言复制,因为它常常难以推断出
p
应该是什么。您自己通常更容易计算出该值,并明确地写下证明项

我不太明白为什么,但是如果你用
match
写下证明术语,那么Coq也能更好地理解这个注释。比较:

Definition result' (p : tt = tt) : p = eq_refl :=
  match p with eq_refl => eq_refl end.
虽然这看起来简单得多,但当您尝试打印它时,您将看到Coq推断的实际术语要复杂得多。试试看

编辑
啊,我刚刚意识到你在尝试使用Coq的HoTT版本。我没有安装那个版本,但我认为让我的解决方案适应它应该不会太难

Coq中路径诱导的模拟是
匹配
结构。下面是我们如何使用它来定义(基于)路径归纳,如HoTT手册中所述

Set Implicit Arguments.

Definition J {A} {x : A} (P : forall y, x = y -> Type)
                 (H : P x eq_refl) : forall y p, P y p :=
  fun y p => match p with eq_refl => H end.
这个定义的类型表示,每当我们想证明
pyp
,其中

  • y:A
  • p:x=y
    ,以及
  • P:forall y,x=y->Type
它足以表明
pxeq\u refl
成立。我们可以使用
J
来表示
g
函数是常数。(我已经对定义进行了重新表述,以与Coq标准库给出的定义相匹配。)

这个证明的棘手部分是找出
J
p
参数应该是什么,这也是通过路径归纳进行的其他证明的情况。在这里,我必须展开
g
的定义,因为它需要类型为
tt=tt
的参数,而上面使用的
q
具有类型
tt=y
。在任何情况下,您都可以看到
pttp
定义上等于
gp=tt
,这就是我们想要证明的

我们可以玩一个小把戏来证明,对于任何
p:tt=tt
,p=eq\u refl。结合前面的结果,它将给出您想要的结果

Definition result (p : tt = tt) : p = eq_refl :=
  J (fun y q =>
       unit_rect (fun z => tt = z -> Prop)
                 (fun u => u = eq_refl)
                 y q)
    eq_refl p.
同样,关键是
p
参数。我们利用
unit
的归纳原理,即只要我们能找到
ttt
的元素,就可以定义类型为
tx
(对于
T:unit->type
x:tt
)的东西。回想一下,应用
J
的结果应该具有类型

P tt p
在这种情况下,这只是

unit_rect (fun z => tt = z -> Prop)
          (fun u => u = eq_refl)
          tt p
= (p = eq_refl)
根据
unit_rect
的计算规则

不幸的是,这种证明很难用Coq的策略语言复制,因为它常常难以推断出
p
应该是什么。您自己通常更容易计算出该值,并明确地写下证明项

我不太明白为什么,但是如果你用
match
写下证明术语,那么Coq也能更好地理解这个注释。比较:

Definition result' (p : tt = tt) : p = eq_refl :=
  match p with eq_refl => eq_refl end.
虽然这看起来简单得多,但当您尝试打印它时,您将看到Coq推断的实际术语要复杂得多。试试看

编辑
啊,我刚刚意识到你在尝试使用Coq的HoTT版本。我没有安装那个版本,但我认为让我的解决方案适应它应该不会太难

下一次,如果您的代码中有一个链接,这会有所帮助。@ArthurAzevedoDeAmorim缺少HoTT导入。已修复。下次,如果您的代码中有一个错误,它将有所帮助。@ArthurAzevedoDeAmorim缺少HoTT导入。修正了。亚瑟,“热版Coq”只是Coq+一个不同的stdlib,所以这里没有太大的区别。此外,match在类型推理中有许多特殊的启发式方法,它们不构成