我想我不能正確地推斷出你有的一般問題,給出你的描述和例子。
如果你已經知道H : f = g
,你可以不管你想展示一些關於f
和g
,或者只是elim H
在一次改寫一切用它來rewrite H
。你不需要assert
輔助定理,如果你這樣做,你顯然需要類似assert
或pose proof
。
如果該等式隱藏在某個eta擴展的下面,就像在您的示例中一樣,請刪除該圖層,然後按上述方式繼續。以下是這樣做的兩(多出來的)可能的方式:
intros A B P Q a H. assert (P = Q) as H0 by apply H. rewrite H0; reflexivity.
這解決您的例子證明由荷蘭國際集團assert
平等,然後重寫。另一種可能是定義eta減少助手(沒有找到預定義的助手)並使用它們。這將更加冗長,但可能適用於更復雜的情況。
如果定義
Lemma eta_reduce : forall (A B : Type) (f : A -> B),
(fun x => f x) = f.
intros. reflexivity.
Defined.
Tactic Notation "eta" constr(f) "in" ident(H) :=
pattern (fun x => f x) in H;
rewrite -> eta_reduce in H.
,你可以做到以下幾點:。
intros A B P Q a H. eta P in H. eta Q in H. rewrite H; reflexivity.
(即符號是有點鬆散的大炮,並在錯誤的地方可能改寫不要依賴如果出現異常,請手動執行pattern
和rewrite
。)
如果你想讓(AFAIK)與'f_equal'完全相反,就有'equal_f'。如果你需要導入Coq.Logic.FunctionalExtensionality.',你可以通過'intros A B P Q a H.解決你的例子。在equal H中應用equal_f。請注意,該模塊添加了功能擴展性的公理,它可能與您選擇的公理相匹配或不相容。 ;-) – nobody 2012-07-23 20:08:44
謝謝。我認爲這就是我一直在尋找的:) – Alex 2012-08-01 12:57:33