X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fexpairseq.cpp;h=7dc55824e52f4252377d27386d70877f7ca927d8;hp=ab14b555d1681d312bc6de93522dbbfb6e46aea7;hb=c42b47b4e23aea926597a9b4bee686d66d066470;hpb=23c3c2c716953d6e4b12548994e210e8d57057ad diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index ab14b555..7dc55824 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -394,6 +394,12 @@ bool expairseq::match(const ex & pattern, exmap & repl_lst) const } } + // Even if the expression does not match the pattern, some of + // its subexpressions could match it. For example, x^5*y^(-1) + // does not match the pattern $0^5, but its subexpression x^5 + // does. So, save repl_lst in order to not add bogus entries. + exmap tmp_repl = repl_lst; + // Unfortunately, this is an O(N^2) operation because we can't // sort the pattern in a useful way... @@ -411,7 +417,7 @@ bool expairseq::match(const ex & pattern, exmap & repl_lst) const continue; exvector::iterator it = ops.begin(), itend = ops.end(); while (it != itend) { - if (it->match(p, repl_lst)) { + if (it->match(p, tmp_repl)) { ops.erase(it); goto found; } @@ -432,10 +438,16 @@ found: ; for (size_t i=0; ipush_back(split_ex_to_pair(ops[i])); ex rest = thisexpairseq(vp, default_overall_coeff()); - for (exmap::const_iterator it = repl_lst.begin(); it != repl_lst.end(); ++it) { - if (it->first.is_equal(global_wildcard)) - return rest.is_equal(it->second); + for (exmap::const_iterator it = tmp_repl.begin(); it != tmp_repl.end(); ++it) { + if (it->first.is_equal(global_wildcard)) { + if (rest.is_equal(it->second)) { + repl_lst = tmp_repl; + return true; + } + return false; + } } + repl_lst = tmp_repl; repl_lst[global_wildcard] = rest; return true; @@ -443,7 +455,11 @@ found: ; // No global wildcard, then the match fails if there are any // unmatched terms left - return ops.empty(); + if (ops.empty()) { + repl_lst = tmp_repl; + return true; + } + return false; } } return inherited::match(pattern, repl_lst); @@ -453,7 +469,7 @@ ex expairseq::subs(const exmap & m, unsigned options) const { std::auto_ptr vp = subschildren(m, options); if (vp.get()) - return ex_to(thisexpairseq(vp, overall_coeff, true)); + return ex_to(thisexpairseq(vp, overall_coeff, (options & subs_options::no_index_renaming) == 0)); else if ((options & subs_options::algebraic) && is_exactly_a(*this)) return static_cast(this)->algebraic_subs_mul(m, options); else