[英]About the refine tactic in 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) _)
將上述目標替換為目標ga = gb
。
但是,Coq無法獨自找到t
。 用於refine (eq_trans (Hfg _) _)
策略的同上refine (eq_trans (Hfg _) _)
。
Coq是否有特定原因能夠猜測第一個孔而不是第二個孔?
(我不是100%肯定我在這里寫的是什么,但是)Coq從來不會“猜測”任何東西,但是它可以從更復雜的信息中推斷出信息。 您在這里的一般方案是讓Coq使用平等的及物性來解決您的目標。 因此,Coq需要兩個相等的語句才能成功。
在第一種情況下,您需要為Coq提供解決目標所需的一切,即t : ga = gb
和Hfg _ : f _ = g _
。 由於eq_trans
強制_
為a
,因此沒有什么可證明的。
在第二種情況下,您只輸入coq Hfg a : fa = ga
因此它錯過了ga = gb
來解決目標。 是的,它在上下文中,但是Coq不會使用自動化,除非您明確要求。
您的目標需要兩個公理Hfg
和t
。 如果Coq是明確給出的,或者在提示數據庫中找到了公理,則Coq只會在證明中使用公理。 因此,您的證明需要同時顯示Hfg
和t
。
refine (eq_trans (Hfg _) t)
包含兩個公理。 Hfg
的論點由以下術語的類型決定:
eq_trans
具有形式為?1 = ?2 -> ?2 = ?3 -> ?1 = ?3
的類型,並且將t
的類型與?2 = ?3
統一可得到?2 := ga
和?3 := gb
。 Hfg _
的形式為f ?4 = g ?4
,將其與?1 = ?2
統一可得到?4 := a
,從而得到?1 := fa
。 Coq能夠進行這種類型推斷,因此該術語已完全鍵入並完成了證明。
相比之下,在使用refine (eq_trans (Hfg a) _)
,Coq應用給出的值,並在證明中留下了一個漏洞:它需要ga = gb
的證明。 這是一個公理,但是Coq不會自動應用它:它使您可以選擇是使用此證明還是該事實的其他證明。
證明這一目標的自然方法是使用rewrite
策略 。
Goal f a = g b.
rewrite Hfg.
rewrite t.
reflexivity.
Qed.
通過使用Hint Rewrite
聲明公理,然后應用autorewrite
可以讓Coq找到合適的autorewrite
。 請注意,自動autorewrite
盲目地應用相等性,它不受目標的影響。
Hint Rewrite Hfg t : my_equalities.
Goal f a = g b.
autorewrite with my_equalities.
reflexivity.
Qed.
另外,您也可以應用congruence
的策略 ,這需要鏈接多個等式的照顧。 您需要首先將公理納入假設。
Goal f a = g b.
generalize Hfg t; intros.
congruence.
Qed.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.