战术:坚持eqb_trans

Tactics: stuck in eqb_trans

正在尝试解决eqb_trans我卡住了:

Theorem eqb_trans : forall n m p,
  n =? m = true ->
  m =? p = true ->
  n =? p = true.

很明显,我们应该用eqb_true来解决:

Theorem eqb_true : forall n m,
    n =? m = true -> n = m.
--------------------------------------------
Proof.
  intros n m p H1 H2. apply eqb_true in H1.
  apply eqb_true with (n:=m)(m:=p) in H2.

此时我们有:

n, m, p : nat
H1 : n = m
H2 : m = p
============================
(n =? p) = true

现在我想在目标上使用 eqb_true:

apply eqb_true with (m:=p).

但是这里出现错误:

Unable to unify "?M1056 = p" with "(n =? p) = true".

为什么不起作用?如何解决?

当您将引理应用于目标时,引理的结论必须与目标而不是前提相统一。这个引理的结论是 _ = _ 的形式,而你的目标是 (_ =? _) = true。这两个不能统一,导致你看到的错误。

要证明eqb_trans,需要eqb_true的逆,即

forall n m, n = m -> (n =? m) = true,

经过一些简化,等同于

forall n, (n =? n) = true.
Theorem eqb_trans : forall n m p,
    n =? m = true ->
    m =? p = true ->
    n =? p = true.
Proof.
  intros n m p.
  repeat rewrite  Nat.eqb_eq.
  intros.
  rewrite H.
  exact H0.
Qed.

-- 检查Nat.eqb_eq.

Nat.eqb_eq                                                                                          
 : forall n m : nat, (n =? m) = true <-> n = m