0

编辑:我找到了!我忘记了强制。请忽略这个:)

我正在学习 ssreflect 并坚持如何在这里进行。我的证明状态如下:

 n, n0 : nat
  ============================
  n = n0 -> n == n0

起初,我尝试了 move/eqP,因为我认为这会将 eqP “应用”到 n=n0,其中“应用”的意思是“从 eqP 给出的反射中获取 n==n0”。然而,这种尝试产生了:

Illegal application (Non-functional construction): 
The expression "eqP ?i" of type "?x = ?y"
cannot be applied to the term
 "?y0" : "?T0"

我对 y0 和 T0 应该是什么感到困惑。我也试过

intros H. eapply (introT eqP) in H.

产生了错误

Unable to apply lemma of type "?x = ?y -> ?x == ?y"
on hypothesis of type "n = n0".

我试图将显式参数 n0 和 n 传递给 eqP,只是为了看看它是否可以工作,

pose proof (eqP n n0). 但这给出了一个错误

In environment
n, n0 : nat
H : n = n0
The term "n" has type "nat"
while it is expected to have type
 "is_true (?x == ?y)".

因此,似乎 eqP 既想要又不想要 ?x 和 ?y 的显式实例化。我真的很感激一些概念上的解释,为什么 move/eqP 的行为不像我认为的那样,以及 eqP 和 (introT eqP) 的类型实际上发生了什么。

如果相关,我正在导入

From mathcomp Require Import ssrnat ssreflect ssrfun ssrbool eqtype. 

来自 ssreflect。

谢谢你。

4

1 回答 1

1

愚蠢的错误!我有一种我忘记的强制;我的实际证明状态是 Nat n = Nat n0 -> n ==n0。

于 2020-06-14T13:48:38.847 回答