如何在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在类型推理中有许多特殊的启发式方法,它们不构成