Now tactics supporting locations can also specify the goal among the locations by using the name `⊢` or `|-`. Also `rw at *` is implemented so that it will rewrite any hypotheses or the goal for which the whole sequence of rewrites succeeds. (This is different from `rw at h1 h2 ... hn |-`, which requires that all rewrites run to completion on each specified target.)
43 lines
1.9 KiB
Text
43 lines
1.9 KiB
Text
/-
|
||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Leonardo de Moura
|
||
-/
|
||
prelude
|
||
import init.meta.relation_tactics init.meta.occurrences
|
||
|
||
namespace tactic
|
||
/-- Configuration options for the `rewrite` tactic. -/
|
||
structure rewrite_cfg extends apply_cfg :=
|
||
(md := reducible)
|
||
(symm := ff)
|
||
(occs := occurrences.all)
|
||
|
||
/-- Rewrite the expression `e` using `h`.
|
||
The unification is performed using the transparency mode in `cfg`.
|
||
If `cfg.approx` is `tt`, then fallback to first-order unification, and approximate context during unification.
|
||
`cfg.new_goals` specifies which unassigned metavariables become new goals, and their order.
|
||
If `cfg.instances` is `tt`, then use type class resolution to instantiate unassigned meta-variables.
|
||
The fields `cfg.auto_param` and `cfg.opt_param` are ignored by this tactic (See `tactic.rewrite`).
|
||
It a triple `(new_e, prf, metas)` where `prf : e = new_e`, and `metas` is a list of all introduced meta variables,
|
||
even the assigned ones.
|
||
|
||
TODO(Leo): improve documentation and explain symm/occs -/
|
||
meta constant rewrite_core (h : expr) (e : expr) (cfg : rewrite_cfg := {}) : tactic (expr × expr × list expr)
|
||
|
||
meta def rewrite (h : expr) (e : expr) (cfg : rewrite_cfg := {}) : tactic (expr × expr × list expr) :=
|
||
do (new_t, prf, metas) ← rewrite_core h e cfg,
|
||
try_apply_opt_auto_param cfg.to_apply_cfg metas,
|
||
return (new_t, prf, metas)
|
||
|
||
meta def rewrite_target (h : expr) (cfg : rewrite_cfg := {}) : tactic unit :=
|
||
do t ← target,
|
||
(new_t, prf, _) ← rewrite h t cfg,
|
||
replace_target new_t prf
|
||
|
||
meta def rewrite_hyp (h : expr) (hyp : expr) (cfg : rewrite_cfg := {}) : tactic expr :=
|
||
do hyp_type ← infer_type hyp,
|
||
(new_hyp_type, prf, _) ← rewrite h hyp_type cfg,
|
||
replace_hyp hyp new_hyp_type prf
|
||
|
||
end tactic
|