考虑以下几行(在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是否有特殊原因可以猜到第一洞而不是第二洞?
答案 0 :(得分:3)
(我不是100%肯定我在这里写的东西,但是)Coq从不“猜测”任何东西,但它可以从更复杂的信息中推断信息。你的一般方案是你要求Coq使用平等的传递性来解决你的目标。因此,Coq需要两个平等声明才能成功。
在第一种情况下,您可以为Coq提供解决目标所需的一切,即t : g a = g b
和Hfg _ : f _ = g _
。由于eq_trans
强制_
为a
,因此无需任何证据。
在第二种情况下,您只需提取coq Hfg a : f a = g a
,因此它会错过g a = g b
来解决目标。是的,它是在上下文中,但除非您明确询问,否则Coq不会使用自动化。
答案 1 :(得分:1)
您的目标需要两个公理Hfg
和t
。如果明确给出Coq或者如果它在提示数据库中找到公理,Coq将只在证明中使用公理。因此,您的证明需要同时显示Hfg
和t
。
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.