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