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无法猜测您要使用哪个自然数

当我运行下面的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
。您有两种解决方案:

  • 手动使用H语法中带有(k:=foo)的
    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.