应用战术的作品,但目标和假设的变量不同

时间:2019-06-09 21:41:14

标签: coq logical-foundations

使用IndProp的leb_complete定理,我发现了以下怪异现象:

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”!我很困惑,请解释一下这里发生了什么。

1 个答案:

答案 0 :(得分:4)

m中的IHn'只是一个虚拟变量。 IHn'量化所有自然数:forall m : nat, [...]。尤其是m'nat,因此该假设适用m替换为m'的情况。

m中的IHn'与您所处的上下文不同(尤其是与m中的Em : m = S m'不同)。它们恰好具有相同的名称。