Coq 战术:卡在eqb_trans中

Coq 战术:卡在eqb_trans中,coq,logical-foundations,Coq,Logical Foundations,试图解决eqb_trans I遇到了问题: 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. -------------------------------------------- Pr

试图解决eqb_trans I遇到了问题:

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".

为什么不起作用?如何修正?

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

要证明
eqb_trans
,您需要
eqb_true
的相反形式,即

forall n m, n = m -> (n =? m) = true,
经过一些简化,这相当于

forall n, (n =? n) = true.
--检查自然等式

Nat.eqb_eq                                                                                          
 : forall n m : nat, (n =? m) = true <-> n = m
Nat.eqb_eq
:对于所有n m:nat,(n=?m)=真n=m
Nat.eqb_eq                                                                                          
 : forall n m : nat, (n =? m) = true <-> n = m