]> www.ginac.de Git - ginac.git/blobdiff - ginac/expairseq.cpp
Fix some apparent typos and misindentations.
[ginac.git] / ginac / expairseq.cpp
index 7c6e5223653889730407aa0fd5a246417cc06f6d..c7b3e9ed251318e6f52c8791840beb078b49fa4e 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of sequences of expression pairs. */
 
 /*
- *  GiNaC Copyright (C) 1999-2011 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -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; i<num; i++)
                                vp->push_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);
@@ -1508,7 +1524,7 @@ bool expairseq::is_canonical() const
                return 1;
        
 #if EXPAIRSEQ_USE_HASHTAB
-       if (hashtabsize > 0) return 1; // not canoncalized
+       if (hashtabsize > 0) return 1; // not canonicalized
 #endif // EXPAIRSEQ_USE_HASHTAB
        
        epvector::const_iterator it = seq.begin(), itend = seq.end();