2

试图解决 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".

为什么它不起作用?怎么修?

4

2 回答 2

4

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

为了证明eqb_trans,你需要 的逆eqb_true,即

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

经过一些简化后,它相当于

forall n, (n =? n) = true.
于 2019-04-19T14:47:37.020 回答
2
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
于 2019-08-21T10:15:19.100 回答