Coq未能通过申请策略

时间:2019-01-16 10:32:20

标签: apply coq coq-tactic

我试图证明以下关于自然数的简单定理:

((i + j) = (i + k)) -> (j = k)

这是我在Coq中所拥有的:

Theorem cancel : forall (i j k : nat),
  ((add i j) = (add i k)) -> (j = k).
Proof.
intros i j k.
induction i.
simpl.
apply A_IMPLIES_A.
simpl.

然后是子目标:

S (add i j) = S (add i k) -> j = k

所以我想我应该使用eq_add_S,其中指出S m = S n -> m = n。 但是,当我尝试使用apply eq_add_S这样做时,出现以下错误:

Error:
In environment
i, j, k : nat
IHi : add i j = add i k -> j = k
Unable to unify "k" with "add i k".

所以我想我无法理解我想要的是m = (add i j)n = (add i k)Coq为何无法读懂我的想法?或更严重的是,我该如何帮助他呢?谢谢!

2 个答案:

答案 0 :(得分:2)

问题不是Coq不能猜测mn使用什么值,而是您的目标没有合适的形状来实例化该定理。当您编写apply eq_add_S时,Coq会尝试将S n = S m -> n = mS (add i j) = S (add i k) -> j = k统一,这是无法完成的。

您需要的是通过将eq_add_S引入目标的前提中。

Proof.
intros i j k H. (* H : add i j = add i k *)
induction i as [|i IH].
- apply H.
- apply eq_add_S in H.
  (* ...  *)

答案 1 :(得分:0)

我将解决方案作为单独的答案发布,希望其他用户可以从中受益。在这里:

std::fs::File