Fix substitution step in ho matching (#2825)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 14 Mar 2019 18:36:56 +0000 (13:36 -0500)
committerGitHub <noreply@github.com>
Thu, 14 Mar 2019 18:36:56 +0000 (13:36 -0500)
src/theory/quantifiers/ematching/ho_trigger.cpp

index 2fcfa19d9ee4fcfe698c3623d830cad32ecd4cf1..ebc0081bec081815e949eb84324652835ef26891 100644 (file)
@@ -270,6 +270,11 @@ bool HigherOrderTrigger::sendInstantiation(InstMatch& m)
         // Assert( f==value );
         for (unsigned k = 0, size = args.size(); k < size; k++)
         {
+          // must now subsitute back, to handle cases like
+          // (@ x y) matching (@ t (@ t s))
+          // where the above substitution would produce (@ x (@ x s)),
+          // but the argument should be (@ t s).
+          args[k] = args[k].substitute(var, value);
           Node val = args[k];
           std::map<unsigned, Node>::iterator itf = fixed_vals.find(k);
           if (itf == fixed_vals.end())