Coq 如何从应用中创建新的假设?
当我运行下面的Coq脚本时(原始脚本的简化):Coq 如何从应用中创建新的假设?,coq,Coq,当我运行下面的Coq脚本时(原始脚本的简化): Inductive w(g:nat):nat->Prop:= |z:WG0。 引理x: forall(i j:nat),w i j->(forall k:nat,k w m n。 证明。 介绍m n H。 在H中应用x。 我在最后一行收到以下错误消息: 错误:找不到变量k的实例 谁能解释一下为什么会发生这种情况,以及我必须做些什么才能得到所有k:nat,k因为你的引理x包含一个内部的通用量化(最后的所有k部分), Coq无法猜测您要使用哪个自然数
Inductive w(g:nat):nat->Prop:=
|z:WG0。
引理x:
forall(i j:nat),w i j->(forall k:nat,k w m n。
证明。
介绍m n H。
在H中应用x。
我在最后一行收到以下错误消息:
错误:找不到变量k的实例
谁能解释一下为什么会发生这种情况,以及我必须做些什么才能得到所有k:nat,k因为你的引理
x
包含一个内部的通用量化(最后的所有k
部分),
Coq无法猜测您要使用哪个自然数。通过将x
应用于H
,您只提供i
和j
。您有两种解决方案:
apply x提供相关的k
eapply
策略,要求Coq引入一个“元变量”(将其视为一个类型化的漏洞,您将在稍后填充)V.而不是
在H中应用x
,你可以使用防姿势(x\uh)
。这将为你提供你想要的假设
根据Coq战术手册
在ident中应用术语
尝试匹配结论
针对非依赖项的ident
类型
术语类型的前提,从右向左尝试
我认为这里需要注意的关键点是,apply
仅适用于非依赖前提,而您希望它匹配的前提,I=j
,是依赖的。但是,Coq返回的特定错误消息令人困惑。非常感谢您的回答。但是,我仍然不理解Coq为什么不返回(对于k:nat,k我真的不知道。你应该问问Coq俱乐部邮件列表上的开发者。)。
Inductive w (g: nat): nat -> Prop:=
| z: w g 0.
Lemma x:
forall (i j: nat), w i j -> (forall k: nat, k <= k).
Proof.
Admitted.
Lemma y:
forall (m n: nat),
w m n -> w m n.
Proof.
intros m n H.
apply x in H.