如果您可能擺脫單獨的平等,請嘗試set (name := val)
。使用unfold
而不是rewrite
將值返回原位。
如果你需要的平等超過rewrite <-
,我知道沒有內置的戰術,這樣做。儘管如此,你可以手動完成,或者建立一個戰術/符號。我只是把它扔在一起。 (注:我不是專家,這可能是更容易做到。)
Tactic Notation "remember_as_eq" constr(expr) ident(vname) ident(eqname) :=
let v := fresh in
let HHelp := fresh in
set (v := expr);
(assert (HHelp : sigT (fun x => x = v)) by (apply (existT _ v); reflexivity));
inversion HHelp as [vname eqname];
unfold v in *; clear v HHelp;
rewrite <- eqname in *.
用作remember_as_eq (2+2) four Heqfour
得到相同的結果與remember (2+2) as four
。
注意:已更新以處理更多情況,舊版本在值和目標類型的某些組合上失敗。如果您發現另一個可與rewrite
一起使用的案例,請留下評論,但不要使用此案例。
請注意,如果您更喜歡使用它作爲記憶(2 + 2),您也可以將它定義爲'Tactic Notation「記住」constr(expr)「爲」ident(vname)「四個與Eq Heqfour',但是這將會解析器並且影響內建的'remember _ as _.'。如果你使用'Tactic Notation'記住「ident(eqname)」的「constr(expr)」爲「ident(vname)'(或'withEq'而不是'with'或...),那麼排序很奇怪,但是老'記'仍然可以訪問。 – nobody 2012-07-22 17:16:22