[英]How to leave a goal unfinished in Coq
在 Isabelle 中,您可以通过两种方式让目标未完成:
Coq 中是否有类似的功能可以让我留下一个未完成的目标,稍后再回来? 这对于在不填写所有细节的情况下勾画证明的结构很有用。 请注意如何在 Coq 中切换当前目标中的方法? 修改证明结构。 那不是我要找的。
在 Coq 中有多种方法可以终止证明。 您可能知道Qed
断言证明已完成。 当您希望证明具有计算内容时,也有Defined
。
您正在寻找的东西是:
Admitted
承认该证明,以便以后使用;Abort
证明引理的Abort
。它们可以这样使用:
Lemma foo : forall n, n = 0.
Proof.
intro n. destruct n.
- reflexivity.
-
Abort.
Lemma bar : forall n, n = n.
Admitted.
在这两种情况下,您都可以在Admitted
/ Abort
之前使用部分证明脚本,或者根本没有。
正如@HTNW 指出的那样,您还可以在证明的子目标中使用等价的策略admit
和give_up
。 使用这些,证明然而,必须使用缔结或者Admitted
或Abort
。
Lemma lem : forall A, A + A -> A.
Proof.
intros A h.
destruct h.
- admit.
- give_up.
Admitted.
在任何情况下,这个解决方案都抛弃了部分证明。 如果出于某种原因您想继续使用部分证明(例如,如果您想用它进行计算),一个常见的技巧是使用公理来关闭您想留待以后使用的目标。
Axiom cheating : forall A, A.
Tactic Notation "cheat" := apply cheating.
Lemma lem : forall A, A + A -> A.
Proof.
intros A h.
destruct h.
- cheat.
- cheat.
Defined. (* This is now ok *)
不过,您必须小心使用该技巧。 您可以使用Print Assumptions lem
来检查引理是否已在没有公理的情况下得到证明。 如果它说“在上下文下关闭”你很好,否则它会列出它所依赖的公理,如果出现cheating
你知道它没有完全被证明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.