Играя с теоремой leb_complete из IndProp, я обнаружил следующую странность:
Theorem leb_complete : forall n m,
n <=? m = true -> n <= m.
Proof.
induction n as [|n'].
- intros. apply O_le_n.
- induction m as [| m'] eqn:Em.
+ intros H. discriminate H.
+ intros H. apply n_le_m__Sn_le_Sm.
Производит следующее:
1 subgoal (ID 155)
n' : nat
IHn' : forall m : nat, (n' <=? m) = true -> n' <= m
m, m' : nat
Em : m = S m'
IHm' : m = m' -> (S n' <=? m') = true -> S n' <= m'
H : (S n' <=? S m') = true
============================
n' <= m'
Все хорошо. Теперь, когда я запускаю apply IHn'.
, он работает и выдает следующее:
(n' <=? m') = true
Почему это работает? В IHn 'у нас есть
n' <= m - in IHn'
n' <= m' - in the goal
Переменные m и m'
различны, но все равно работает. Когда я пытался
`rewrite -> Em in IHn'.
выдал ошибку:
Found no subterm matching "m" in IHn'.
Но в IHn 'есть переменная "m"! Я запутался, пожалуйста, объясните, что здесь происходит.