From: Andrew Reynolds Date: Mon, 29 Apr 2019 21:40:31 +0000 (-0500) Subject: Optimization for evaluation with unfolding (#2979) X-Git-Tag: cvc5-1.0.0~4161 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b351cce04bc13e00b4b63f1bba403b5d549d56bf;p=cvc5.git Optimization for evaluation with unfolding (#2979) --- diff --git a/src/theory/quantifiers/sygus/term_database_sygus.cpp b/src/theory/quantifiers/sygus/term_database_sygus.cpp index b1e6dc96d..af820b0fc 100644 --- a/src/theory/quantifiers/sygus/term_database_sygus.cpp +++ b/src/theory/quantifiers/sygus/term_database_sygus.cpp @@ -1633,6 +1633,33 @@ Node TermDbSygus::evaluateWithUnfolding( while (ret.getKind() == DT_SYGUS_EVAL && ret[0].getKind() == APPLY_CONSTRUCTOR) { + if (ret == n && ret[0].isConst()) + { + Trace("dt-eval-unfold-debug") + << "Optimize: evaluate constant head " << ret << std::endl; + // can just do direct evaluation here + std::vector args; + bool success = true; + for (unsigned i = 1, nchild = ret.getNumChildren(); i < nchild; i++) + { + if (!ret[i].isConst()) + { + success = false; + break; + } + args.push_back(ret[i]); + } + if (success) + { + TypeNode rt = ret[0].getType(); + Node bret = sygusToBuiltin(ret[0], rt); + Node rete = evaluateBuiltin(rt, bret, args); + visited[n] = rete; + Trace("dt-eval-unfold-debug") + << "Return " << rete << " for " << n << std::endl; + return rete; + } + } ret = unfold( ret ); } if( ret.getNumChildren()>0 ){