簡體   English   中英

關於Coq的優化策略

[英]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 = gbHfg _ : f _ = g _ 由於eq_trans強制_a ,因此沒有什么可證明的。

在第二種情況下,您只輸入coq Hfg a : fa = ga因此它錯過了ga = gb來解決目標。 是的,它在上下文中,但是Coq不會使用自動化,除非您明確要求。

您的目標需要兩個公理Hfgt 如果Coq是明確給出的,或者在提示數據庫中找到了公理,則Coq只會在證明中使用公理。 因此,您的證明需要同時顯示Hfgt

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM