如何通过申请创建新假设?

时间:2014-06-25 08:45:14

标签: coq

当我运行下面的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.

我在最后一行收到以下错误消息:

  

错误:无法找到变量k的实例。

任何人都可以向我解释为什么会发生这种情况以及为了在上下文中将forall k: nat, k <= k作为新假设而必须做些什么?

提前致谢, 马库斯。

2 个答案:

答案 0 :(得分:1)

由于您的引理x包含内部通用量化(最后forall k部分), Coq无法猜测您想要使用哪个自然数。将x应用于H,您只需提供ij。你有两个解决方案:

  1. 使用k语法手动提供相关的apply x with (k := foo) in H

  2. 要求Coq使用eapply策略引入“元变量”(将其视为稍后将填充的打字孔)。

  3. 希望它有所帮助, 诉

答案 1 :(得分:0)

而不是apply x in H,您可以使用pose proof (x _ _ H)。这将为您提供您正在寻找的假设。

来自Coq战术手册,

  

apply term in ident尝试匹配结论   类型为ident的非依赖类型   term类型的前提,从右到左尝试它们。

我认为这里要注意的关键点是apply仅适用于非依赖前提,而您希望它匹配的前提i=j依赖。但是,Coq返回的特定错误消息令人困惑。