diff options
| author | Matthieu Sozeau | 2014-09-25 00:12:26 +0200 |
|---|---|---|
| committer | Matthieu Sozeau | 2014-09-27 21:56:58 +0200 |
| commit | 3fe4912b568916676644baeb982a3e10c592d887 (patch) | |
| tree | 291c25d55d62c94af8fc3eb5a6d6df1150bc893f /pretyping | |
| parent | a95210435f336d89f44052170a7c65563e6e35f2 (diff) | |
Keyed unification option, compiling the whole standard library
(but deactivated still).
Set Keyed Unification to activate the option, which changes
subterm selection to _always_ use full conversion _after_ finding a
subterm whose head/key matches the key of the term we're looking for.
This applies to rewrite and higher-order unification in
apply/elim/destruct.
Most proof scripts already abide by these semantics. For those that
don't, it's usually only a matter of using:
Declare Equivalent Keys f g.
This make keyed unification consider f and g to match as keys.
This takes care of most cases of abbreviations: typically Def foo :=
bar and rewriting with a bar-headed lhs in a goal mentioning foo works
once they're set equivalent.
For canonical structures, these hints should be automatically declared.
For non-global-reference headed terms, the key is the constructor name
(Sort, Prod...). Evars and metas are no keys.
INCOMPATIBILITIES:
In FMapFullAVL, a Function definition doesn't go through with keyed
unification on.
Diffstat (limited to 'pretyping')
| -rw-r--r-- | pretyping/unification.ml | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/pretyping/unification.ml b/pretyping/unification.ml index efa64ca1ea..735d4b68ab 100644 --- a/pretyping/unification.ml +++ b/pretyping/unification.ml @@ -1457,11 +1457,17 @@ let make_abstraction env evd ccl abs = make_abstraction_core name (make_eq_test env evd c) (evd,c) ty occs check_occs env ccl -let keyed_unify env evd kop cl = - if not !keyed_unification then true - else - let k2 = Keys.constr_key cl in - Keys.equiv_keys kop k2 +let keyed_unify env evd kop = + if not !keyed_unification then fun cl -> true + else + match kop with + | None -> fun _ -> true + | Some kop -> + fun cl -> + let kc = Keys.constr_key cl in + match kc with + | None -> false + | Some kc -> Keys.equiv_keys kop kc (* Tries to find an instance of term [cl] in term [op]. Unifies [cl] to every subterm of [op] until it finds a match. |
