Coq如何漂亮地打印使用策略构建的术语?

Coq如何漂亮地打印使用策略构建的术语?,coq,Coq,我是Coq的新手,正在做一些练习,以便更熟悉它 我的理解是,在Coq中证明一个命题“真的”是在Gallina中写下一个类型,然后用策略将术语以确定性的方式组合在一起 我想知道是否有一种方法可以得到一个漂亮的印刷版的实际术语,而所有的策略都被删除了 在下面的示例中,最终生成类型为plus_comm(xy:N):plus xy=plus yx的匿名术语。。。我想。如果我想看它,我该怎么办?从某种意义上说,我很好奇“德苏加”的策略是什么 下面是有问题的代码,基本上是从YouTube上的教程中逐字提取的

我是Coq的新手,正在做一些练习,以便更熟悉它

我的理解是,在Coq中证明一个命题“真的”是在Gallina中写下一个类型,然后用策略将术语以确定性的方式组合在一起

我想知道是否有一种方法可以得到一个漂亮的印刷版的实际术语,而所有的策略都被删除了

在下面的示例中,最终生成类型为
plus_comm(xy:N):plus xy=plus yx
的匿名术语。。。我想。如果我想看它,我该怎么办?从某种意义上说,我很好奇“德苏加”的策略是什么

下面是有问题的代码,基本上是从YouTube上的教程中逐字提取的


首先,
plus_comm
不是该类型的一部分。您将获得一个名为
plus\u comm
的术语,该术语的类型为
对于所有x y:N,加x y=加y x。
您可以使用以下命令进行检查

Check plus_comm.
因此,定义
plus_comm
引理的另一种方法是

Lemma plus_comm : forall x y : N, plus x y = plus y x.
作为旁注:在这种情况下,您需要在
校对。
部分之后添加
简介x y.
(或者只添加
简介。

战术(以及将它们粘合在一起的手段)是一种称为Ltac的元语言,因为它们用于生成另一种语言的术语,称为Gallina,这是Coq的规范语言

例如,
forall xy:N,plus xy=plus yx
是Gallina语句的一个实例,也是
plus
函数的主体。要获取附加到
plus_comm
的术语,请使用
Print
命令:

Print plus_comm.

plus_comm = 
fun x y : N =>
N_ind (fun x0 : N => plus x0 y = plus y x0)
  (eq_ind_r (fun n : N => y = n) eq_refl (plus_0 y))
  (fun (x0 : N) (IHx : plus x0 y = plus y x0) =>
   eq_ind_r (fun n : N => S n = plus y (S x0))
     (eq_ind_r (fun n : N => S (plus y x0) = n) eq_refl (plus_S y x0))
     IHx) x
     : forall x y : N, plus x y = plus y x
这本书不容易读,但有了一些经验,你就能理解它

顺便说一句,下面是我们如何证明引理没有使用战术:

Definition plus_comm : forall x y : N, plus x y = plus y x :=
  fix IH (x y : N) :=
    match x return plus x y = plus y x with
    | O => eq_sym (plus_0 y)
    | S x => eq_ind _ (fun p => S p = plus y (S x)) (eq_sym (plus_S y x)) _ (eq_sym (IH x y))
    end.
为了解释一些事情:
fix
是定义递归函数的方法,
eq_-sym
用于将
x=y
更改为
y=x
,而
eq_-ind
对应于
重写
策略

Definition plus_comm : forall x y : N, plus x y = plus y x :=
  fix IH (x y : N) :=
    match x return plus x y = plus y x with
    | O => eq_sym (plus_0 y)
    | S x => eq_ind _ (fun p => S p = plus y (S x)) (eq_sym (plus_S y x)) _ (eq_sym (IH x y))
    end.