在Coq我有
Definition f (s:Unit) : tt=tt := match s with tt => idpath end.
Definition g (p:tt=tt) : Unit := match p with idpath => tt end.
我想证明forall (p:tt=tt), (f o g) p = p
。
我想使用HoTT书中1.12.1中描述的路径归纳法来实现它。
很明显,对于p
为idpath
的情况,我们可以证明
assert( (f o g) idpath = idpath).
simpl.
reflexivity.
但是如何在Coq中使用路径归纳将整个证据打包在一起?
到目前为止的整个证据:(放什么而不是admit
?)
Require Import HoTT.
Definition f (s:Unit) : tt=tt := match s with tt => idpath end.
Definition g (p:tt=tt) : Unit := match p with idpath => tt end.
Theorem myTheorem : forall (p:tt=tt), (f o g) p = p.
assert( (f o g) idpath = idpath).
simpl.
reflexivity.
admit.
答案 0 :(得分:2)
Coq中路径归纳的类比是match
构造。以下是我们如何使用它来定义(基于)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.
这个定义的类型表明,每当我们想要证明P y p
时,
y : A
,p : x = y
和P : forall y, x = y -> Type
,足以显示P x eq_refl
成立。我们可以使用J
来表明您的g
函数是常量。 (我已经重新定义了与Coq标准库给出的定义相匹配的定义。)
Definition f (s : unit) : tt = tt := match s with tt => eq_refl end.
Definition g (p : tt = tt) : unit := match p return unit with eq_refl => tt end.
Definition g_tt p : g p = tt :=
J (fun y q => match q return unit with eq_refl => tt end = tt)
eq_refl p.
这个证明的棘手部分是找出P
的{{1}}参数应该是什么,这也是通过路径归纳进行的其他证明的情况。在这里,我必须展开J
的定义,因为它需要g
类型的参数,而上面使用的tt = tt
类型为q
。无论如何,您可以看到tt = y
在定义上等于P tt p
,这是我们想要证明的。
我们可以发挥技巧,为g p = tt
显示p = eq_refl
。结合之前的结果,它将准确提供您想要的结果。
p : tt = tt
再一次,症结是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
(T x
和T : unit -> Type
)时定义某种内容。 {1}}。回想一下x : tt
的这个应用程序的结果应该是
T tt
在这种情况下只是
J
通过P tt p
的计算规则。
不幸的是,使用Coq的策略语言难以复制这种证据,因为它通常无法推断unit_rect (fun z => tt = z -> Prop)
(fun u => u = eq_refl)
tt p
= (p = eq_refl)
应该是什么。通常更容易弄清楚这个值应该是什么,并明确记下证明术语。
我不太明白为什么,但是如果你用unit_rect
写下证明词,Coq在找出这个注释方面要好得多。比较:
P
虽然这看起来更简单,但是当您尝试打印时,您会看到Coq推断出的实际术语要复杂得多。试试吧!
啊,我刚刚意识到你正在尝试使用HoTT版本的Coq。我没有安装该版本,但我认为不应该太难以使我的解决方案适应它。