Тактика: застрял в eqb_trans - PullRequest
1 голос
/ 19 апреля 2019

Пытаясь решить 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".

Почему это не работает?Как исправить?

1 Ответ

2 голосов
/ 19 апреля 2019

Когда вы применяете лемму к цели, заключение леммы должно объединяться с целью, а не с ее предпосылкой. Вывод этой леммы имеет вид _ = _, а ваша цель - (_ =? _) = true. Эти два не могут быть объединены, что приводит к ошибке, которую вы видите.

Чтобы доказать eqb_trans, вам нужно обратное значение eqb_true, а именно

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

, что после некоторого упрощения эквивалентно

forall n, (n =? n) = true.
...