如何将(介绍)假设返回到目标公式?

时间:2015-09-14 14:31:53

标签: coq

证明:

Parameter A B : Prop.
Goal A->B.
intro A.

我明白了:

 1 subgoals
A : A
______________________________________(1/1)
B

如何将A返回目标栏目?返回:

1 subgoals
______________________________________(1/1)
A -> B

2 个答案:

答案 0 :(得分:5)

使用revert策略:

revert A.

这正是intro的倒数,参见the reference manual.

答案 1 :(得分:2)

您可以使用revert策略。

鉴于Coq过多的策略,每个都有不同的角落案例和不同的文档质量,你不知道使用哪种策略是很常见的。

在这种情况下,我发现将你的证据看作一个程序是很有用的(参见Curry-Howard Isomorphism),并问自己你要用什么术语来解决你的目标。这种方法的优点是Coq的术语语言更容易学习(因为没有那么多不同类型的术语)并且表达足以解决所有可用策略解决的目标(有时证明更冗长)。 p>

您可以使用refine策略以术语语言编写您的证明。 refine的论点是一个带洞_的术语。 refine使用该术语释放当前目标,并为术语中的每个洞生成子目标。一旦你知道refine如何运作,你所要做的就是想出一个符合你想要的术语。例如:

  • 使用h还原假设refine (_ h)
  • 使用h引入假设refine (fun h => _)
  • 使用h复制假设refine ((fun h' => _) h)

请注意,Coq的策略往往在幕后做了很多魔术。例如,revert策略在处理因变量时比上面的refine“更聪明”:

Goal forall n:nat, n >= 0.
  intro n; revert n.      (* forall n : nat, n >= 0 *)
Restart.
  intro n; refine (_ n).  (* nat -> n >= 0 *)
Restart.
  intro n'; refine ((_ : forall n, n >= 0) n').   (* forall n : nat, n >= 0 *)
Abort.