战术:坚持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
正在尝试解决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