【发布时间】:2014-04-08 05:49:02
【问题描述】:
我是 coq 的初学者,所以这可能是一个微不足道的问题。在编写定理时,有时我无法弄清楚我需要调用哪些术语。一个简单的例子,
Theorem silly1 : forall (n m o p : nat),
n = m ->
[n;o] = [n;p] ->
[n;o] = [m;p].
Proof.
intros n m o p eq1 eq2.
rewrite <- eq1.
apply eq2. Qed.
我知道基于目标,我可能需要在 (n m o p) 上调用 intros,但为什么我需要在 eq1 和 eq2 上使用它。
此外,在其他一些定理中,您可能需要对类型参数、假设或归纳假设使用介绍。示例
Theorem trans_eq : forall (X:Type) (n m o : X),
n = m -> m = o -> n = o.
Proof.
intros X n m o eq1 eq2. rewrite -> eq1. rewrite -> eq2.
reflexivity. Qed.
Theorem silly3' : forall (n : nat),
(beq_nat n 5 = true -> beq_nat (S (S n)) 7 = true) ->
true = beq_nat n 5 ->
true = beq_nat (S (S n)) 7.
Proof.
intros n eq H.
symmetry in H. apply eq in H. symmetry in H.
apply H. Qed.
所以我想我要问的是......当我开始证明一个定理时,我应该如何通过目标进行推理,以确定我需要调用哪些术语?
【问题讨论】:
-
如果引入太多参数,最坏的情况是生成的证明项是
eta-expanded。没有问题。
标签: coq