关于Coq的精炼策略

时间:2015-02-12 17:54:41

标签: coq

考虑以下几行(在Coq中):

Variable A : Type.
Variable  f g : A -> A.
Axiom Hfg : forall x, f x = g x.
Variable a b : A.
Axiom t : g a = g b.
Goal f a = g b.

战术refine (eq_trans (Hfg _) t)解决了目标。也就是说,Coq能够在没有帮助的情况下用a替换洞。但是战术refine (eq_trans (Hfg a) _)取代了目标g a = g b的上述目标。

但是,Coq无法单独找到t。同意战术refine (eq_trans (Hfg _) _)

Coq是否有特殊原因可以猜到第一洞而不是第二洞?

2 个答案:

答案 0 :(得分:3)

(我不是100%肯定我在这里写的东西,但是)Coq从不“猜测”任何东西,但它可以从更复杂的信息中推断信息。你的一般方案是你要求Coq使用平等的传递性来解决你的目标。因此,Coq需要两个平等声明才能成功。

在第一种情况下,您可以为Coq提供解决目标所需的一切,即t : g a = g bHfg _ : f _ = g _。由于eq_trans强制_a,因此无需任何证据。

在第二种情况下,您只需提取coq Hfg a : f a = g a,因此它会错过g a = g b来解决目标。是的,它是在上下文中,但除非您明确询问,否则Coq不会使用自动化。

答案 1 :(得分:1)

您的目标需要两个公理Hfgt。如果明确给出Coq或者如果它在提示数据库中找到公理,Coq将只在证明中使用公理。因此,您的证明需要同时显示Hfgt

refine (eq_trans (Hfg _) t)包含两个公理。 Hfg的参数由术语的类型强加:

  • eq_trans的格式为?1 = ?2 -> ?2 = ?3 -> ?1 = ?3,并将t的类型与?2 = ?3统一,产生?2 := g a?3 := g b。< / LI>
  • Hfg _的格式为f ?4 = g ?4,并与?1 = ?2统一,会产生?4 := a,然后?1 := f a

Coq能够进行此类推理,因此该术语是完全类型化的并完成证明。

相反,使用refine (eq_trans (Hfg a) _)时,Coq会应用它给出的内容,并看到证明中还有一个洞:它需要g a = g b的证明。这是一个公理,但是Coq不会自动应用它:它让你可以选择决定是否使用这个证据,或者,或许还有其他证据来证明这一点。

证明这一目标的一种自然方式是使用rewrite tactic

Goal f a = g b.
rewrite Hfg.
rewrite t.
reflexivity.
Qed.

您可以通过使用Hint Rewrite然后应用autorewrite声明公理,让Coq找到合适的等值。请注意autorewrite盲目地应用等值,它不受目标的影响。

Hint Rewrite Hfg t : my_equalities.
Goal f a = g b.
autorewrite with my_equalities.
reflexivity.
Qed.

或者,您可以应用congruence tactic,它负责链接多个等式。你需要首先将公理纳入假设。

Goal f a = g b.
generalize Hfg t; intros.
congruence.
Qed.