如何在Coq中使用HoTT路径归纳?

时间:2017-11-16 22:14:39

标签: coq type-theory

在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中描述的路径归纳法来实现它。

很明显,对于pidpath的情况,我们可以证明

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.

1 个答案:

答案 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的归纳原则,它说我们可以在找到{的unitT xT : 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。我没有安装该版本,但我认为不应该太难以使我的解决方案适应它。