(似乎my previous question有太多不相關的信息,所以我試圖抽象出詳細信息,但我不確定它仍然是同一個問題,但我會刪除其他問題,如果相同的解決方案適用於這兩種)無法自動執行在Coq中手動運行的引理
我試圖來思考一些自定義的列表和謂詞:
Inductive alphabet := A.
Definition sentence : Type := list alphabet.
Variable pred1 : sentence -> Prop.
Variable pred2 : sentence -> Prop.
Variable conclusion : Prop.
現在,用下面的假設,
Hypothesis H1 : forall (X : sentence),
pred1 X -> pred2 (X ++ X).
Hypothesis H2 : forall X,
pred2 X -> conclusion.
我要證明
Example manual : pred1 [A] -> conclusion.
這顯然是正確的,因爲conclusion
如下每當一些sentence
有pred2
和pred1
任何sentence
意味着該sentence
的重複有pred2
。一個手工編寫證明是
intro. eapply H2. apply H1. exact H. Qed.
注意,證明使用無非是intro
,apply
,eapply
和exact
。這意味着只要H1
和H2
在上下文中可用,證明應該允許直接的自動化。例如,半自動版本
Example semiauto : pred1 [A] -> conclusion.
pose proof H1. pose proof H2. eauto. Qed.
完全按照您的預期工作。現在,讓我們嘗試一個帶有提示的完全自動化版本:
Hint Resolve H1 H2.
Example auto : pred1 [A] -> conclusion.
eauto.
intro.
eauto.
eapply H2.
eauto.
apply H1.
eauto. Qed.
這很奇怪。 eauto
不僅在開始時失敗,而且在除最後一步以外的每一步都失敗。爲什麼會發生?
一些猜測:由於H1
包括形式X ++ X
,這可能會導致統一問題。當Coq明確引入上下文時,Coq可能會執行一些隱式清理,但不會在僅提示DB時執行。
任何想法?
我沒有答案,但'eauto使用H1,H2.'解決了你的目標。我不知道爲什麼它不會提示提示數據庫中的提示... – larsr
將'eauto'的調試方式,即'調試eauto使用H1,H2.'顯示發生的搜索。並且在校樣模式下,「打印提示」會打印哪些提示適用於每個時刻。出於某種原因,'H1'和'H2'是適用的,但'eauto'不會嘗試它們。 – larsr