diff options
| author | herbelin | 2009-11-09 09:42:24 +0000 |
|---|---|---|
| committer | herbelin | 2009-11-09 09:42:24 +0000 |
| commit | cb2f5d06481f9021f600eaefbdc6b33118bd346d (patch) | |
| tree | 8ae02c329fc3530368137996398c2c576a368574 /tactics/equality.ml | |
| parent | c70d2b83582f5ea7b2218843859ad230afdb96a0 (diff) | |
Quick fix for restoring a left-to-right rewriting lemma compatible
with the guard condition + typo in the generation of _rec schemes in
the impredicative case.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12484 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'tactics/equality.ml')
| -rw-r--r-- | tactics/equality.ml | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/tactics/equality.ml b/tactics/equality.ml index 8ad73c672c..7db7513729 100644 --- a/tactics/equality.ml +++ b/tactics/equality.ml @@ -176,13 +176,22 @@ let register_is_applied_rewrite_relation = (:=) is_applied_rewrite_relation eliminate lbeq on sort_of_gl. *) let find_elim hdcncl lft2rgt dep cls = - let scheme_name = match dep, lft2rgt, (cls = None) with - | false, true, true | false, false, false -> rew_l2r_scheme_kind - | false, false, true | false, true, false -> rew_r2l_scheme_kind - | true, true, true -> rew_l2r_dep_scheme_kind - | true, true, false -> rew_r2l_forward_dep_scheme_kind - | true, false, true -> rew_r2l_dep_scheme_kind - | true, false, false -> rew_l2r_forward_dep_scheme_kind + let inccl = (cls = None) in + let scheme_name = match dep, lft2rgt, inccl with + (* Non dependent case with symmetric equality *) + | false, Some true, true | false, Some false, false -> rew_l2r_scheme_kind + | false, Some false, true | false, Some true, false -> rew_r2l_scheme_kind + (* Dependent case with symmetric equality *) + | true, Some true, true -> rew_l2r_dep_scheme_kind + | true, Some true, false -> rew_r2l_forward_dep_scheme_kind + | true, Some false, true -> rew_r2l_dep_scheme_kind + | true, Some false, false -> rew_l2r_forward_dep_scheme_kind + (* Non dependent case with non-symmetric rewriting lemma *) + | false, None, true -> rew_r2l_scheme_kind + | false, None, false -> rew_asym_scheme_kind + (* Dependent case with non-symmetric rewriting lemma *) + | true, None, true -> rew_r2l_dep_scheme_kind + | true, None, false -> rew_l2r_forward_dep_scheme_kind in match kind_of_term hdcncl with | Ind ind -> mkConst (find_scheme scheme_name ind) @@ -195,7 +204,8 @@ let type_of_clause gl = function let leibniz_rewrite_ebindings_clause cls lft2rgt tac sigma c t l with_evars gl hdcncl = let dep = occur_term c (type_of_clause gl cls) in let elim = find_elim hdcncl lft2rgt dep cls in - general_elim_clause with_evars tac cls sigma c t l lft2rgt + general_elim_clause with_evars tac cls sigma c t l + (match lft2rgt with None -> false | Some b -> b) {elimindex = None; elimbody = (elim,NoBindings)} gl let adjust_rewriting_direction args lft2rgt = @@ -204,11 +214,11 @@ let adjust_rewriting_direction args lft2rgt = (* more natural to see -> as the rewriting to the constant *) if not lft2rgt then error "Rewriting non-symmetric equality not allowed from right-to-left."; - not lft2rgt + None end else (* other equality *) - lft2rgt + Some lft2rgt let rewrite_side_tac tac sidetac = side_tac tac (Option.map fst sidetac) @@ -1069,7 +1079,7 @@ let swapEquandsInConcl gls = let bareRevSubstInConcl lbeq body (t,e1,e2) gls = (* find substitution scheme *) - let eq_elim = find_elim lbeq.eq false false None in + let eq_elim = find_elim lbeq.eq (Some false) false None in (* build substitution predicate *) let p = lambda_create (pf_env gls) (t,body) in (* apply substitution scheme *) |
