[英]apply tactic cannot find an instance for a variable
我一直在嘗試各種場景中的apply
策略,並且當前提是這樣的時候似乎陷入了以下情況:
H1 : a
H2 : a -> forall e : nat, b -> g e
============================
...
當我嘗試apply H2 in H1.
,它給了我錯誤:
Error: Unable to find an instance for the variable e.
任何方式讓我帶來forall e : nat, b -> ge
作為前提的一部分。 這是具有上述場景的完整工作代碼:
Lemma test : forall {a b c : Prop} {g : nat} (f : nat -> Prop),
a /\ (a -> forall {e : nat}, b -> f e) -> c.
Proof.
intros a b c f g.
intros [H1 H2].
(* apply H2 in H1. *)
Abort.
Coq參考手冊, §8.2.5 :
該策略
apply
長期in
IDENT嘗試匹配IDENT類型的結論,對術語類型的非依賴的前提下,由右至左審判他們。 如果成功,則假設標識的陳述將被術語類型的結論所取代。
現在,上述的描述,你的情況下,我們得到以下,勒柯克試圖取代H1 : a
與結束H2
,即ge
。 要做到這一點,它需要用一些值來實例化通用量化變量e
,Coq無法明確推斷 - 因此你看到的錯誤信息。
另一種看待它的方法是嘗試使用另一種變體apply ... in ...
:
eapply H2 in H1.
這會給你兩個子目標:
...
H2 : a -> forall e : nat, b -> g e
H1 : g ?e
============================
c
和
...
H1 : a
H2 : a -> forall e : nat, b -> g e
============================
b
第一個子目標的H1
假設顯示了Coq在普通apply in
策略中的eapply in
,但在eapply in
,變量e
被一個存在變量( ?e
)取代。 如果您還不熟悉存在變量,那么它們是您對Coq的承諾,您將在以后為它們構建術語。 您應該通過統一隱式地構建術語。
無論如何, specialize (H2 H1).
可能是你想做的事情,或類似的事情
pose proof (H2 H1) as H; clear H1; rename H into H1.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.